// // CommonCryptoSymmetricWrap.c // CCRegressions // // Created by Richard Murphy on 1/13/12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // #include #include "testbyteBuffer.h" #include "testmore.h" #include "capabilities.h" #if (CCSYMWRAP == 0) entryPoint(CommonSymmetricWrap,"Symmetric Wrap") #else #include 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]; // printf("Wrapped Size %lu\n", 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"); // printByteBuffer(bb, "Result: "); // printByteBuffer(wrapped_key, "Expected: "); 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); accum |= wrapTest(kek, key, NULL); 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