reduce memory allocations in aes block cipher, optimize performance test

This commit is contained in:
Tankred Hase 2014-02-26 00:20:46 +01:00
parent f6a72b0058
commit 3d423655c4
2 changed files with 29 additions and 28 deletions

View File

@ -457,41 +457,36 @@ function keyExpansion(key) {
}; };
} }
function AESencrypt(block, ctx) { function AESencrypt(block, ctx, t) {
var r; var r, rounds, b;
var t0, t1, t2, t3;
var b = packBytes(block); b = packBytes(block);
var rounds = ctx.rounds; rounds = ctx.rounds;
var b0 = b[0];
var b1 = b[1];
var b2 = b[2];
var b3 = b[3];
for (r = 0; r < rounds - 1; r++) { for (r = 0; r < rounds - 1; r++) {
t0 = b0 ^ ctx.rk[r][0]; t[0] = b[0] ^ ctx.rk[r][0];
t1 = b1 ^ ctx.rk[r][1]; t[1] = b[1] ^ ctx.rk[r][1];
t2 = b2 ^ ctx.rk[r][2]; t[2] = b[2] ^ ctx.rk[r][2];
t3 = b3 ^ ctx.rk[r][3]; t[3] = b[3] ^ ctx.rk[r][3];
b0 = T1[t0 & 255] ^ T2[(t1 >> 8) & 255] ^ T3[(t2 >> 16) & 255] ^ T4[t3 >>> 24]; b[0] = T1[t[0] & 255] ^ T2[(t[1] >> 8) & 255] ^ T3[(t[2] >> 16) & 255] ^ T4[t[3] >>> 24];
b1 = T1[t1 & 255] ^ T2[(t2 >> 8) & 255] ^ T3[(t3 >> 16) & 255] ^ T4[t0 >>> 24]; b[1] = T1[t[1] & 255] ^ T2[(t[2] >> 8) & 255] ^ T3[(t[3] >> 16) & 255] ^ T4[t[0] >>> 24];
b2 = T1[t2 & 255] ^ T2[(t3 >> 8) & 255] ^ T3[(t0 >> 16) & 255] ^ T4[t1 >>> 24]; b[2] = T1[t[2] & 255] ^ T2[(t[3] >> 8) & 255] ^ T3[(t[0] >> 16) & 255] ^ T4[t[1] >>> 24];
b3 = T1[t3 & 255] ^ T2[(t0 >> 8) & 255] ^ T3[(t1 >> 16) & 255] ^ T4[t2 >>> 24]; b[3] = T1[t[3] & 255] ^ T2[(t[0] >> 8) & 255] ^ T3[(t[1] >> 16) & 255] ^ T4[t[2] >>> 24];
} }
// last round is special // last round is special
r = rounds - 1; r = rounds - 1;
t0 = b0 ^ ctx.rk[r][0]; t[0] = b[0] ^ ctx.rk[r][0];
t1 = b1 ^ ctx.rk[r][1]; t[1] = b[1] ^ ctx.rk[r][1];
t2 = b2 ^ ctx.rk[r][2]; t[2] = b[2] ^ ctx.rk[r][2];
t3 = b3 ^ ctx.rk[r][3]; t[3] = b[3] ^ ctx.rk[r][3];
b[0] = F1(t0, t1, t2, t3) ^ ctx.rk[rounds][0]; b[0] = F1(t[0], t[1], t[2], t[3]) ^ ctx.rk[rounds][0];
b[1] = F1(t1, t2, t3, t0) ^ ctx.rk[rounds][1]; b[1] = F1(t[1], t[2], t[3], t[0]) ^ ctx.rk[rounds][1];
b[2] = F1(t2, t3, t0, t1) ^ ctx.rk[rounds][2]; b[2] = F1(t[2], t[3], t[0], t[1]) ^ ctx.rk[rounds][2];
b[3] = F1(t3, t0, t1, t2) ^ ctx.rk[rounds][3]; b[3] = F1(t[3], t[0], t[1], t[2]) ^ ctx.rk[rounds][3];
return unpackBytes(b); return unpackBytes(b);
} }
@ -500,9 +495,10 @@ function makeClass(length) {
var c = function(key) { var c = function(key) {
this.key = keyExpansion(key); this.key = keyExpansion(key);
this._temp = new Uint32Array(this.blockSize / 4);
this.encrypt = function(block) { this.encrypt = function(block) {
return AESencrypt(block, this.key); return AESencrypt(block, this.key, this._temp);
}; };
}; };

View File

@ -88,13 +88,18 @@ describe('Basic', function() {
console.profile("encrypt/sign/verify/decrypt"); console.profile("encrypt/sign/verify/decrypt");
} }
var encrypted = openpgp.signAndEncryptMessage([pubKey], privKey, message); // sign and encrypt
var msg, encrypted;
msg = openpgp.message.fromBinary(message);
msg = msg.sign([privKey]);
msg = msg.encrypt([pubKey]);
encrypted = openpgp.armor.encode(openpgp.enums.armor.message, msg.packets.write());
if (console.profileEnd) { if (console.profileEnd) {
console.profileEnd(); console.profileEnd();
} }
var msg = openpgp.message.readArmored(encrypted); msg = openpgp.message.readArmored(encrypted);
var keyids = msg.getEncryptionKeyIds(); var keyids = msg.getEncryptionKeyIds();