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