Skip to content

Commit

Permalink
crypto: add test case for AES key wrapping
Browse files Browse the repository at this point in the history
Add test cases for AES key wrapping and only detect output length in
cipher case. The reason being is the returned output length is
insufficient in AES key unwrapping case.

PR-URL: nodejs#20587
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
  • Loading branch information
yhwang authored and tniessen committed May 13, 2018
1 parent 60c5ada commit 8177b22
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/node_crypto.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3007,7 +3007,7 @@ CipherBase::UpdateResult CipherBase::Update(const char* data,
int buff_len = len + EVP_CIPHER_CTX_block_size(ctx_.get());
// For key wrapping algorithms, get output size by calling
// EVP_CipherUpdate() with null output.
if (mode == EVP_CIPH_WRAP_MODE &&
if (kind_ == kCipher && mode == EVP_CIPH_WRAP_MODE &&
EVP_CipherUpdate(ctx_.get(),
nullptr,
&buff_len,
Expand Down
62 changes: 62 additions & 0 deletions test/parallel/test-crypto-aes-wrap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');

const assert = require('assert');
const crypto = require('crypto');

const test = [
{
algorithm: 'aes128-wrap',
key: 'b26f309fbe57e9b3bb6ae5ef31d54450',
iv: '3fd838af4093d749',
text: '12345678123456781234567812345678'
},
{
algorithm: 'id-aes128-wrap-pad',
key: 'b26f309fbe57e9b3bb6ae5ef31d54450',
iv: '3fd838af',
text: '12345678123456781234567812345678123'
},
{
algorithm: 'aes192-wrap',
key: '40978085d68091f7dfca0d7dfc7a5ee76d2cc7f2f345a304',
iv: '3fd838af4093d749',
text: '12345678123456781234567812345678'
},
{
algorithm: 'id-aes192-wrap-pad',
key: '40978085d68091f7dfca0d7dfc7a5ee76d2cc7f2f345a304',
iv: '3fd838af',
text: '12345678123456781234567812345678123'
},
{
algorithm: 'aes256-wrap',
key: '29c9eab5ed5ad44134a1437fe2e673b4d88a5b7c72e68454fea08721392b7323',
iv: '3fd838af4093d749',
text: '12345678123456781234567812345678'
},
{
algorithm: 'id-aes256-wrap-pad',
key: '29c9eab5ed5ad44134a1437fe2e673b4d88a5b7c72e68454fea08721392b7323',
iv: '3fd838af',
text: '12345678123456781234567812345678123'
},
];

test.forEach((data) => {
const cipher = crypto.createCipheriv(
data.algorithm,
Buffer.from(data.key, 'hex'),
Buffer.from(data.iv, 'hex'));
const ciphertext = cipher.update(data.text, 'utf8');

const decipher = crypto.createDecipheriv(
data.algorithm,
Buffer.from(data.key, 'hex'),
Buffer.from(data.iv, 'hex'));
const msg = decipher.update(ciphertext, 'buffer', 'utf8');

assert.strictEqual(msg, data.text, `${data.algorithm} test case failed`);
});

0 comments on commit 8177b22

Please sign in to comment.