Skip to content

Commit

Permalink
Add PRF for TLS 1.2.
Browse files Browse the repository at this point in the history
  • Loading branch information
mattcollier authored and dlongley committed Apr 24, 2015
1 parent 6f3cdcb commit 7b60b2a
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 3 deletions.
32 changes: 29 additions & 3 deletions js/tls.js
Original file line number Diff line number Diff line change
Expand Up @@ -4328,6 +4328,8 @@ for(var key in tls) {

// expose prf_tls1 for testing
forge.tls.prf_tls1 = prf_TLS1;
// expose prf_TLS_1_2 for testing
forge.tls.prf_TLS_1_2 = prf_TLS_1_2;

// expose hmac method and factory
forge.tls.hmac = tls_hmac;
Expand Down Expand Up @@ -4552,9 +4554,33 @@ function prf_TLS1(secret, label, seed, length) {
*
* @return the pseudo random bytes in a byte buffer.
*/
function prf_sha256(secret, label, seed, length) {
// FIXME: implement me for TLS 1.2+
throw new Error('Not implemented.');
function prf_TLS_1_2(hashAlgorithm, secret, label, seed, length) {
var rval = new ByteBuffer();
var ai = new ByteBuffer();
var hmac = forge.hmac.create();
var labelBuffer = new ByteBuffer(label, 'utf8');
seed = ByteBuffer.concat([labelBuffer, seed]);

// determine the number of iterations that must be performed to generate
// enough output bytes
var digestLength = forge.md.getAlgorithm(hashAlgorithm).digestLength;
var requiredItr = Math.ceil(length / digestLength);
hmac.start(hashAlgorithm, secret);
var mdBytes = new ByteBuffer();
ai.putBytes(seed.bytes(), 'binary');
for(var i = 0; i < requiredItr; ++i) {
// HMAC_hash(secret, A(i-1))
hmac.start(null, null);
hmac.update(ai.getBytes(), 'binary');
ai.putBuffer(hmac.digest());
// HMAC_hash(secret, A(i) + seed)
hmac.start(null, null);
hmac.update(ai.bytes(), 'binary');
hmac.update(seed.bytes(), 'binary');
mdBytes.putBuffer(hmac.digest());
}
rval.putBytes(mdBytes.getBytes(length));
return rval;
}

/**
Expand Down
39 changes: 39 additions & 0 deletions nodejs/test/tls.js
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,45 @@ function Tests(ASSERT, forge) {
end.client.handshake();
});

it('should test TLS 1.2 PRF', function() {
// Note: This test vector is originally from:
// https://www.ietf.org/mail-archive/web/tls/current/msg03416.html
var hashesToTest = [ 'sha256', 'sha384', 'sha512' ];
var secretsToTest = [ '9bbe436ba940f017b17652849a71db35',
'b80b733d6ceefcdc71566ea48e5567df',
'b0323523c1853599584d88568bbb05eb' ];
var seedsToTest = [ 'a0ba9f936cda311827a6f796ffd5198c',
'cd665cf6a8447dd6ff8b27555edb7465',
'd4640e12e4bcdbfb437f03e6ae418ee5' ];
var byteLengthsToTest = [ 100, 148, 196 ];
var expectedOutputs = [
'e3f229ba727be17b8d122620557cd453c2aab21d07c3d495329b52d4e61edb5a' +
'6b301791e90d35c9c9a46b4e14baf9af0fa022f7077def17abfd3797c0564bab' +
'4fbc91666e9def9b97fce34f796789baa48082d122ee42c5a72e5a5110fff701' +
'87347b66',
'7b0c18e9ced410ed1804f2cfa34a336a1c14dffb4900bb5fd7942107e81c83cd' +
'e9ca0faa60be9fe34f82b1233c9146a0e534cb400fed2700884f9dc236f80edd' +
'8bfa961144c9e8d792eca722a7b32fc3d416d473ebc2c5fd4abfdad05d918425' +
'9b5bf8cd4d90fa0d31e2dec479e4f1a26066f2eea9a69236a3e52655c9e9aee6' +
'91c8f3a26854308d5eaa3be85e0990703d73e56f',
'1261f588c798c5c201ff036e7a9cb5edcd7fe3f94c669a122a4638d7d508b283' +
'042df6789875c7147e906d868bc75c45e20eb40c1cf4a1713b27371f68432592' +
'f7dc8ea8ef223e12ea8507841311bf68653d0cfc4056d811f025c45ddfa6e6fe' +
'c702f054b409d6f28dd0a3233e498da41a3e75c5630eedbe22fe254e33a1b0e9' +
'f6b9826675bec7d01a845658dc9c397545401d40b9f46c7a400ee1b8f81ca0a6' +
'0d1a397a1028bff5d2ef5066126842fb8da4197632bdb54ff6633f86bbc836e6' +
'40d4d898'
];
for(var i = 0; i < hashesToTest.length; i++ ) {
var hashAlgorithm = hashesToTest[i];
var secret = new forge.util.ByteBuffer(secretsToTest[i], 'hex');
var seed = new forge.util.ByteBuffer(seedsToTest[i], 'hex');
var byteLength = byteLengthsToTest[i];
var bytes = forge.tls.prf_TLS_1_2(hashAlgorithm, secret, 'test label', seed, byteLength);
ASSERT.equal(bytes.toString('hex'), expectedOutputs[i]);
}
});

// TODO: add session resumption test
});
}
Expand Down

0 comments on commit 7b60b2a

Please sign in to comment.