public byte[] getOnlinePin(byte [] data) {
Log.d("getOnlinePin", "Getting pin block");
DUKPTResult result = pindukptResult;
byte [] encryptedPinBlock = result.getResult();
byte [] ksn = result.getKsn();
Log.d("getOnlinePin", "KSN is : " + hex(ksn) + " and encrypted pinblock is " + hex(encryptedPinBlock));
StringBuilder message = new StringBuilder();
message.append("<CrdhldrOnLinePIN>" +
"<NcrptdPINBlck>" +
"<CnttTp>EVLP</CnttTp>" +
"<EnvlpdData>" +
"<Vrsn>1</Vrsn>" +
"<Rcpt>" +
"<KEK>" +
"<Vrsn>1</Vrsn>" +
"<KEKId>" +
"<KeyId>SpecV1TestKey<<KeyId>nexoAESD128TestKey</KeyId>" +
"<KeyVrsn>2010060715<<KeyVrsn>20190522</KeyVrsn>" +
"<SeqNb>1</SeqNb>" +
"<DerivtnId>" + Base64.encodeToString(Arrays.copyOfRange(ksn, 0, 5), Base64.NO_WRAP) + "</DerivtnId>" +
"</KEKId>" +
"<KeyNcrptnAlgo>" +
"<Algo>DKP9<<Algo>DA12</Algo>" +
"</KeyNcrptnAlgo>" +
"<NcrptdKey>" + Base64.encodeToString(Arrays.copyOfRange(ksn, 5, 12), Base64.NO_WRAP) + "</NcrptdKey>" +
"</KEK>" +
"</Rcpt>" +
"<NcrptdCntt>" +
"<CnttTp>DATA</CnttTp>" +
"<CnttNcrptnAlgo>" +
"<Algo>E3DC<<Algo>EA2C</Algo>" +
"</CnttNcrptnAlgo>" +
"<NcrptdData>" + Base64.encodeToString(encryptedPinBlock, Base64.NO_WRAP) + "</NcrptdData>" +
"</NcrptdCntt>" +
"</EnvlpdData>" +
"</NcrptdPINBlck>" +
"<PINFrmt>ISO4</PINFrmt>" +
"</CrdhldrOnLinePIN>");
TlvTree cardholderpin = TlvTree.Empty();
cardholderpin.AddEnum(0xDF9F34, 0);
cardholderpin.AddAscii(0xDF9F14, message.toString());
Log.d("getOnlinePin", cardholderpin.Stringify());
return cardholderpin.AsBytes();
} |