CommonCryptoSymmetricWrap.c [plain text]
#include <stdio.h>
#include "testbyteBuffer.h"
#include "testmore.h"
#include "capabilities.h"
#if (CCSYMWRAP == 0)
entryPoint(CommonSymmetricWrap,"Symmetric Wrap")
#else
#include <CommonCrypto/CommonSymmetricKeywrap.h>
static int
wrapTest(char *kekstr, char *keystr, char *wrapped_keystr)
{
byteBuffer kek, key, wrapped_key, bb;
kek = hexStringToBytes(kekstr);
key = hexStringToBytes(keystr);
if(wrapped_keystr) wrapped_key = hexStringToBytes(wrapped_keystr);
else wrapped_key = hexStringToBytes("0x00");
const uint8_t *iv = CCrfc3394_iv;
const size_t ivLen = CCrfc3394_ivLen;
size_t wrapped_size = CCSymmetricWrappedSize(kCCWRAPAES, key->len);
uint8_t wrapped[wrapped_size];
ok(CCSymmetricKeyWrap(kCCWRAPAES, iv , ivLen, kek->bytes, kek->len, key->bytes, key->len, wrapped, &wrapped_size) == 0, "function is successful");
if(wrapped_keystr) {
bb = bytesToBytes(wrapped, wrapped_size);
if(!strcmp(wrapped_keystr, "")) printByteBuffer(bb, "Result: ");
ok(bytesAreEqual(bb, wrapped_key), "Equal to expected wrapping");
free(bb);
}
size_t unwrapped_size = CCSymmetricUnwrappedSize(kCCWRAPAES, wrapped_size);
uint8_t unwrapped[unwrapped_size];
ok(CCSymmetricKeyUnwrap(kCCWRAPAES, iv, ivLen, kek->bytes, kek->len, wrapped, wrapped_size, unwrapped, &unwrapped_size) == 0, "function is successful");
bb = bytesToBytes(unwrapped, unwrapped_size);
ok(bytesAreEqual(bb, key), "Equal to original key");
free(bb);
free(kek);
free(key);
free(wrapped_key);
return 0;
}
static int kTestTestCount = 35;
int
CommonSymmetricWrap(int argc, char *const *argv)
{
char *kek, *key, *wrapped_key;
int accum = 0;
int verbose = 0;
plan_tests(kTestTestCount);
if(verbose) diag("Test 1");
kek = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f";
key = "00112233445566778899aabbccddeeff000102030405060708090a0b0c0d0e0f";
wrapped_key = "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21";
accum |= wrapTest(kek, key, wrapped_key);
if(verbose) diag("Test 2");
kek = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f";
key = "00112233445566778899aabbccddeeff00010203040506070";
wrapped_key = "a8f9bc1612c68b3ff6e6f4fbe30e71e4769c8b80a32cb8958cd5d17d6b254da1";
accum |= wrapTest(kek, key, wrapped_key);
if(verbose) diag("Test 3");
byteBuffer keybuf = mallocByteBuffer(2048);
for(int i=0; i<2048; i++) keybuf->bytes[i] = i%256;
key = bytesToHexString(keybuf);
free(keybuf);
accum |= wrapTest(kek, key, NULL);
free(key);
if(verbose) diag("Test Vectors from RFC 3394");
if(verbose) diag("4.1 Wrap 128 bits of Key Data with a 128-bit KEK");
kek = "000102030405060708090A0B0C0D0E0F";
key = "00112233445566778899AABBCCDDEEFF";
wrapped_key = "1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5";
accum |= wrapTest(kek, key, wrapped_key);
if(verbose) diag("4.2 Wrap 128 bits of Key Data with a 192-bit KEK");
kek = "000102030405060708090A0B0C0D0E0F1011121314151617";
key = "00112233445566778899AABBCCDDEEFF";
wrapped_key = "96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D";
accum |= wrapTest(kek, key, wrapped_key);
if(verbose) diag("4.3 Wrap 128 bits of Key Data with a 256-bit KEK");
kek = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F";
key = "00112233445566778899AABBCCDDEEFF";
wrapped_key = "64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7";
accum |= wrapTest(kek, key, wrapped_key);
if(verbose) diag("4.4 Wrap 192 bits of Key Data with a 192-bit KEK");
kek = "000102030405060708090A0B0C0D0E0F1011121314151617";
key = "00112233445566778899AABBCCDDEEFF0001020304050607";
wrapped_key = "031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2";
accum |= wrapTest(kek, key, wrapped_key);
if(verbose) diag("4.5 Wrap 192 bits of Key Data with a 256-bit KEK");
kek = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F";
key = "00112233445566778899AABBCCDDEEFF0001020304050607";
wrapped_key = "A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1";
accum |= wrapTest(kek, key, wrapped_key);
if(verbose) diag("4.6 Wrap 256 bits of Key Data with a 256-bit KEK");
kek = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F";
key = "00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F";
wrapped_key = "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21";
accum |= wrapTest(kek, key, wrapped_key);
return accum;
}
#endif