Compare commits

..
Author SHA1 Message Date
Michele Balistreri 9e0f11f71c chain code in pubkeys 2022-11-14 09:20:59 +01:00
Michele Balistreri 64aece4837 init with alt pin 2022-11-10 13:49:06 +01:00
Michele Balistreri 7d968cf969 support export chain code (#28) 2022-11-10 08:11:03 +01:00
2 changed files with 44 additions and 13 deletions
@@ -66,13 +66,13 @@ public class BIP32KeyPair {
tlv.unreadLastTag(); tlv.unreadLastTag();
privKey = tlv.readPrimitive(TLV_PRIV_KEY); privKey = tlv.readPrimitive(TLV_PRIV_KEY);
tag = tlv.readTag(); tag = tlv.readTag();
if (tag == TLV_CHAIN_CODE) {
tlv.unreadLastTag();
chainCode = tlv.readPrimitive(TLV_CHAIN_CODE);
}
} }
if (tag == TLV_CHAIN_CODE) {
tlv.unreadLastTag();
chainCode = tlv.readPrimitive(TLV_CHAIN_CODE);
}
return new BIP32KeyPair(privKey, chainCode, pubKey); return new BIP32KeyPair(privKey, chainCode, pubKey);
} }
@@ -815,9 +815,25 @@ public class KeycardCommandSet {
* @throws IOException communication error * @throws IOException communication error
*/ */
public APDUResponse init(String pin, String puk, String pairingPassword, byte pinRetries, byte pukRetries) throws IOException { public APDUResponse init(String pin, String puk, String pairingPassword, byte pinRetries, byte pukRetries) throws IOException {
return this.init(pin, puk, pairingPasswordToSecret(pairingPassword), pinRetries, pukRetries); return this.init(pin, null, puk, pairingPasswordToSecret(pairingPassword), pinRetries, pukRetries);
} }
/**
* Sends the INIT command to the card.
*
* @param pin the PIN
* @param altPin the alternative PIN
* @param puk the PUK
* @param pairingPassword pairing password
* @param pinRetries the number of allowed PIN retries
* @param pukRetries the number of allowed PUK retries
* @return the raw card response
* @throws IOException communication error
*/
public APDUResponse init(String pin, String altPin, String puk, String pairingPassword, byte pinRetries, byte pukRetries) throws IOException {
return this.init(pin, altPin, puk, pairingPasswordToSecret(pairingPassword), pinRetries, pukRetries);
}
/** /**
* Sends the INIT command to the card. * Sends the INIT command to the card.
* *
@@ -828,13 +844,14 @@ public class KeycardCommandSet {
* @throws IOException communication error * @throws IOException communication error
*/ */
public APDUResponse init(String pin, String puk, byte[] sharedSecret) throws IOException { public APDUResponse init(String pin, String puk, byte[] sharedSecret) throws IOException {
return init(pin, puk, sharedSecret, (byte) 0, (byte) 0); return init(pin, null, puk, sharedSecret, (byte) 0, (byte) 0);
} }
/** /**
* Sends the INIT command to the card. If either pinRetries or pukRetries is zero, neither will be sent. * Sends the INIT command to the card. If either pinRetries or pukRetries is zero, neither will be sent.
* *
* @param pin the PIN * @param pin the PIN
* @param pin the alternative
* @param puk the PUK * @param puk the PUK
* @param sharedSecret the shared secret for pairing * @param sharedSecret the shared secret for pairing
* @param pinRetries the number of allowed PIN retries * @param pinRetries the number of allowed PIN retries
@@ -842,15 +859,29 @@ public class KeycardCommandSet {
* @return the raw card response * @return the raw card response
* @throws IOException communication error * @throws IOException communication error
*/ */
public APDUResponse init(String pin, String puk, byte[] sharedSecret, byte pinRetries, byte pukRetries) throws IOException { public APDUResponse init(String pin, String altPin, String puk, byte[] sharedSecret, byte pinRetries, byte pukRetries) throws IOException {
boolean addRetries = !((pinRetries == 0) || (pukRetries == 0)); int baselen = pin.length() + puk.length() + sharedSecret.length;
byte[] initData = Arrays.copyOf(pin.getBytes(), pin.length() + puk.length() + sharedSecret.length + (addRetries ? 2 : 0)); int extlen;
if (altPin != null) {
extlen = 2 + altPin.length();
} else if ((pinRetries != 0) || (pukRetries != 0)) {
extlen = 2;
} else {
extlen = 0;
}
byte[] initData = Arrays.copyOf(pin.getBytes(), baselen + extlen);
System.arraycopy(puk.getBytes(), 0, initData, pin.length(), puk.length()); System.arraycopy(puk.getBytes(), 0, initData, pin.length(), puk.length());
System.arraycopy(sharedSecret, 0, initData, pin.length() + puk.length(), sharedSecret.length); System.arraycopy(sharedSecret, 0, initData, pin.length() + puk.length(), sharedSecret.length);
if (addRetries) { if (extlen > 0) {
initData[initData.length - 2] = pinRetries; initData[baselen] = pinRetries;
initData[initData.length - 1] = pukRetries; initData[baselen + 1] = pukRetries;
if (extlen > 2) {
System.arraycopy(altPin.getBytes(), 0, initData, baselen + 2, altPin.length());
}
} }
APDUCommand init = new APDUCommand(0x80, INS_INIT, 0, 0, secureChannel.oneShotEncrypt(initData)); APDUCommand init = new APDUCommand(0x80, INS_INIT, 0, 0, secureChannel.oneShotEncrypt(initData));