1// 2// CommonCryptoSymmetricWrap.c 3// CCRegressions 4// 5// Created by Richard Murphy on 1/13/12. 6// Copyright (c) 2012 __MyCompanyName__. All rights reserved. 7// 8 9#include <stdio.h> 10#include "testbyteBuffer.h" 11#include "testmore.h" 12#include "capabilities.h" 13 14#if (CCSYMWRAP == 0) 15entryPoint(CommonSymmetricWrap,"Symmetric Wrap") 16#else 17 18#include <CommonCrypto/CommonSymmetricKeywrap.h> 19 20 21static int 22wrapTest(char *kekstr, char *keystr, char *wrapped_keystr) 23{ 24 byteBuffer kek, key, wrapped_key, bb; 25 26 kek = hexStringToBytes(kekstr); 27 key = hexStringToBytes(keystr); 28 if(wrapped_keystr) wrapped_key = hexStringToBytes(wrapped_keystr); 29 else wrapped_key = hexStringToBytes("0x00"); 30 const uint8_t *iv = CCrfc3394_iv; 31 const size_t ivLen = CCrfc3394_ivLen; 32 size_t wrapped_size = CCSymmetricWrappedSize(kCCWRAPAES, key->len); 33 uint8_t wrapped[wrapped_size]; 34 35 // printf("Wrapped Size %lu\n", wrapped_size); 36 37 ok(CCSymmetricKeyWrap(kCCWRAPAES, iv , ivLen, kek->bytes, kek->len, key->bytes, key->len, wrapped, &wrapped_size) == 0, "function is successful"); 38 if(wrapped_keystr) { 39 bb = bytesToBytes(wrapped, wrapped_size); 40 if(!strcmp(wrapped_keystr, "")) printByteBuffer(bb, "Result: "); 41 ok(bytesAreEqual(bb, wrapped_key), "Equal to expected wrapping"); 42 // printByteBuffer(bb, "Result: "); 43 // printByteBuffer(wrapped_key, "Expected: "); 44 free(bb); 45 } 46 47 size_t unwrapped_size = CCSymmetricUnwrappedSize(kCCWRAPAES, wrapped_size); 48 uint8_t unwrapped[unwrapped_size]; 49 50 ok(CCSymmetricKeyUnwrap(kCCWRAPAES, iv, ivLen, kek->bytes, kek->len, wrapped, wrapped_size, unwrapped, &unwrapped_size) == 0, "function is successful"); 51 bb = bytesToBytes(unwrapped, unwrapped_size); 52 ok(bytesAreEqual(bb, key), "Equal to original key"); 53 free(bb); 54 free(kek); 55 free(key); 56 free(wrapped_key); 57 58 return 0; 59} 60 61 62 63 64 65static int kTestTestCount = 35; 66 67int 68CommonSymmetricWrap(int argc, char *const *argv) 69{ 70 char *kek, *key, *wrapped_key; 71 int accum = 0; 72 int verbose = 0; 73 plan_tests(kTestTestCount); 74 75 if(verbose) diag("Test 1"); 76 kek = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"; 77 key = "00112233445566778899aabbccddeeff000102030405060708090a0b0c0d0e0f"; 78 wrapped_key = "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21"; 79 accum |= wrapTest(kek, key, wrapped_key); 80 81 if(verbose) diag("Test 2"); 82 kek = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"; 83 key = "00112233445566778899aabbccddeeff00010203040506070"; 84 wrapped_key = "a8f9bc1612c68b3ff6e6f4fbe30e71e4769c8b80a32cb8958cd5d17d6b254da1"; 85 accum |= wrapTest(kek, key, wrapped_key); 86 87 if(verbose) diag("Test 3"); 88 byteBuffer keybuf = mallocByteBuffer(2048); 89 for(int i=0; i<2048; i++) keybuf->bytes[i] = i%256; 90 key = bytesToHexString(keybuf); 91 accum |= wrapTest(kek, key, NULL); 92 93 if(verbose) diag("Test Vectors from RFC 3394"); 94 if(verbose) diag("4.1 Wrap 128 bits of Key Data with a 128-bit KEK"); 95 kek = "000102030405060708090A0B0C0D0E0F"; 96 key = "00112233445566778899AABBCCDDEEFF"; 97 wrapped_key = "1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5"; 98 accum |= wrapTest(kek, key, wrapped_key); 99 100 if(verbose) diag("4.2 Wrap 128 bits of Key Data with a 192-bit KEK"); 101 kek = "000102030405060708090A0B0C0D0E0F1011121314151617"; 102 key = "00112233445566778899AABBCCDDEEFF"; 103 wrapped_key = "96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D"; 104 accum |= wrapTest(kek, key, wrapped_key); 105 106 if(verbose) diag("4.3 Wrap 128 bits of Key Data with a 256-bit KEK"); 107 kek = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"; 108 key = "00112233445566778899AABBCCDDEEFF"; 109 wrapped_key = "64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7"; 110 accum |= wrapTest(kek, key, wrapped_key); 111 112 if(verbose) diag("4.4 Wrap 192 bits of Key Data with a 192-bit KEK"); 113 kek = "000102030405060708090A0B0C0D0E0F1011121314151617"; 114 key = "00112233445566778899AABBCCDDEEFF0001020304050607"; 115 wrapped_key = "031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2"; 116 accum |= wrapTest(kek, key, wrapped_key); 117 118 if(verbose) diag("4.5 Wrap 192 bits of Key Data with a 256-bit KEK"); 119 kek = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"; 120 key = "00112233445566778899AABBCCDDEEFF0001020304050607"; 121 wrapped_key = "A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1"; 122 accum |= wrapTest(kek, key, wrapped_key); 123 124 if(verbose) diag("4.6 Wrap 256 bits of Key Data with a 256-bit KEK"); 125 kek = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"; 126 key = "00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F"; 127 wrapped_key = "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21"; 128 accum |= wrapTest(kek, key, wrapped_key); 129 130 return accum; 131} 132#endif 133