aes-performance.js

Summary

Measure AES and RND performance


/**
 *  ---------
 * |.##> <##.|  SmartCard-HSM Support Scripts
 * |#       #|
 * |#       #|  Copyright (c) 2011-2015 CardContact Software & System Consulting
 * |'##> <##'|  Andreas Schwier, 32429 Minden, Germany (www.cardcontact.de)
 *  ---------
 *
 * Consult your license package for usage terms and conditions.
 *
 * @fileoverview Measure AES and RND performance
 */

var SmartCardHSM = require('scsh/sc-hsm/SmartCardHSM').SmartCardHSM;
var SmartCardHSMInitializer = require("scsh/sc-hsm/SmartCardHSM").SmartCardHSMInitializer;
var DKEK = require('scsh/sc-hsm/DKEK').DKEK;
var HSMKeyStore = require("scsh/sc-hsm/HSMKeyStore").HSMKeyStore;


assert(Dialog.prompt("OK to initialize device ?"));

// Import test key

var aes = new Key();
aes.setComponent(Key.AES, new ByteString("00112233445566778899AABBCCDDEEFF", HEX));

// Use default crypto provider
var crypto = new Crypto();

// Create card access object
var card = new Card(_scsh3.reader);

card.reset(Card.RESET_COLD);

// Create SmartCard-HSM card service
var sc = new SmartCardHSM(card);

// Attach key store
var ks = new HSMKeyStore(sc);

// Initialize with key domain
var sci = new SmartCardHSMInitializer(card);
sci.setKeyDomains(1);
sci.initialize();

// Create DKEK domain with 00.00 DKEK
sc.createDKEKKeyDomain(0, 1);
var share = new ByteString("0000000000000000000000000000000000000000000000000000000000000000", HEX);
sc.importKeyShare(0, share);

// Create DKEK encoder and import share
var dkek = new DKEK(crypto);
dkek.importDKEKShare(share);

// Encode AES key into blob
var blob = dkek.encodeAESKey(aes);

var key = ks.importAESKey("ImportedAESKey", blob, 128);

var iv = new ByteString("00000000000000000000000000000000", HEX);
var plain = new ByteString("00000000000000000000000000000000", HEX);

var iter = 100;


print("ECB (16 bytes) with " + iter + " iterations");
var ref = crypto.encrypt(aes, Crypto.AES_ECB, plain, iv);
var ts = Date.now();
for (var i = 0; i < iter; i++) {
	var enc = sc.card.sendApdu(0x80, 0x78, key.getId(), 0x10, plain, [0x9000]);

	assert(enc.equals(ref), "Reference encryption does not match");
}
var st = Date.now() - ts;
print("Elapsed " + st + " ms / " + st / iter + " ms");


var len = 1216;

var plain = crypto.generateRandom(len);

var ref = crypto.encrypt(aes, Crypto.AES_CBC, plain, iv);

print("CBC (" + len + " bytes) with " + iter + " iterations");
var ts = Date.now();
for (var i = 0; i < iter; i++) {
	var enc = sc.card.sendApdu(0x80, 0x78, key.getId(), 0x10, plain, [0x9000]);

	assert(enc.equals(ref), "Reference encryption does not match");
}
var st = Date.now() - ts;
print("Elapsed " + st + " ms / " + st / iter + " ms");


print("RND (8 bytes) with " + iter + " iterations");
var ts = Date.now();
for (var i = 0; i < iter; i++) {
	var rnd = sc.card.sendApdu(0x00, 0x84, 0x00, 0x00, 8, [0x9000]);
}

var st = Date.now() - ts;
print("Elapsed " + st + " ms / " + st / iter + " ms");


print("RND (256) with " + iter + " iterations");
var ts = Date.now();
for (var i = 0; i < iter; i++) {
	var rnd = sc.card.sendApdu(0x00, 0x84, 0x00, 0x00, 256, [0x9000]);
}

var st = Date.now() - ts;
print("Elapsed " + st + " ms / " + st / iter + " ms");


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