apdu-limit-test.js

Summary

No overview generated for 'apdu-limit-test.js'


/**
 * Determine the APDU limit of the card reader
 */

SmartCardHSM = require('scsh/sc-hsm/SmartCardHSM').SmartCardHSM;

var userPIN = new ByteString("648219", ASCII);

var crypto = new Crypto();
var card = new Card(_scsh3.reader);
card.reset(Card.RESET_COLD);
var sc = new SmartCardHSM(card);

print("Reported by card reader layer:");
print("  Reader Name            : " + card.readerName);
print("  Max C-APDU             : " + sc.maxCAPDU);
print("  Max R-APDU             : " + sc.maxRAPDU);
print("  Using limited transport: " + sc.limitedAPDUTransport);
print("Card info : " + sc.getVersionInfo());

var startOfs = 240;
var limit = 1500;
var limitCAPDU = limit + 7;
var limitRAPDU = limit + 2;

// Verify user PIN
assert(sc.verifyUserPIN(userPIN) == 0x9000, "PIN Verification failed");

print("Determine C-Data limit...");

for (var i = startOfs; i <= limit; i++) {
	try	{
		var rnd = crypto.generateRandom(i);

		var t53 = new ASN1(0x53, rnd);

		var cdata = (new ByteString("54020000", HEX)).concat(t53.getBytes());
		this.card.sendApdu(0x00, 0xD7, 0x2F, 0x80, cdata, [0x9000]);
	}
	catch(e) {
		print("Exception at Lc = " + cdata.length);
		print(e);
		var hlen = cdata.length <= 255 ? 5 : 7;
		limitCAPDU = cdata.length - 1 + hlen;
		break;
	}
}

card.reset(Card.RESET_COLD);
// Verify user PIN
sc.logout();
assert(sc.verifyUserPIN(userPIN) == 0x9000, "PIN Verification failed");

var t54 = new ASN1(0x54, ByteString.valueOf(rnd.length - 1, 2));
var t53 = new ASN1(0x53, rnd.left(rnd.length - 1));
var cdata = t54.getBytes().concat(t53.getBytes());
this.card.sendApdu(0x00, 0xD7, 0x2F, 0x80, cdata, [0x9000]);


print("Determine R-Data limit...");

for (var i = startOfs; i <= limit; i++) {
	try	{
		var t53 = new ASN1(0x53, rnd);

		var cdata = new ByteString("54020000", HEX);
		var rsp = this.card.sendApdu(0x00, 0xB1, 0x2F, 0x80, cdata, i, [0x9000]);
	}
	catch(e) {
		print("Exception at Le = " + i);
		print(e);
		limitRAPDU = i + 2;
		break;
	}
}

sc.deleteFile(ByteString.valueOf(0x2F80, 2));


print("Actual limitation:");
print("  Max C-APDU             : " + limitCAPDU);
print("  Max R-APDU             : " + (limitRAPDU > limit ? ">" : "") + limitRAPDU);


Documentation generated by JSDoc on Sat Feb 24 15:17:19 2024