1/*
2 * Copyright (c) 2010 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24#include <stdio.h>
25#include <stdint.h>
26#include <CommonCrypto/CommonCryptor.h>
27#include <CommonCrypto/CommonCryptorSPI.h>
28#include "CCCryptorTestFuncs.h"
29#include "testbyteBuffer.h"
30#include "capabilities.h"
31#include "testmore.h"
32
33#if (CCPADCTS == 0)
34entryPoint(CommonCryptoCTSPadding,"CommonCrypto CTS Padding Testing")
35
36#else
37
38static int kTestTestCount = 9;
39
40int CommonCryptoCTSPadding(int argc, char *const *argv)
41{
42	char *keyStr;
43	char *iv;
44	char *plainText;
45	char *cipherText;
46    CCMode mode;
47    CCAlgorithm alg;
48    CCPadding padding;
49    int retval, accum = 0;
50    char *test;
51    int verbose = 0;
52
53	keyStr 	   = "636869636b656e207465726979616b69";
54	iv         = "0f0e0d0c0b0a09080706050403020100";
55    mode 	   = kCCModeCBC;
56    alg		= kCCAlgorithmAES128;
57    padding = ccCBCCTS1;
58
59	plan_tests(kTestTestCount);
60
61    test = "CTS1 Test - Length 64";
62	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
63	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee2dc88b70f6ae0243d2dbcd6822a1058604b1c432a7a71395b36d820e2c3de4ee";
64    if(verbose) diag(test);
65    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
66    ok(retval == 0, test);
67    accum += retval;
68
69    test = "CTS1 Test - Length 63";
70	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
71	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee2dc88b70f6ae0243d2dbcd6822a105950b6576660739916d058623d688e27e";
72    if(verbose) diag(test);
73    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
74    ok(retval == 0, test);
75    accum += retval;
76
77    test = "CTS1 Test - Length 57";
78	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
79	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee2dc88b70f6ae0243d2db751002ef7a0f9d915d15346571eee7aa";
80    if(verbose) diag(test);
81    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
82    ok(retval == 0, test);
83    accum += retval;
84
85
86    padding = ccCBCCTS2;
87
88    test = "CTS2 Test - Length 64";
89	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
90	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee2dc88b70f6ae0243d2dbcd6822a1058604b1c432a7a71395b36d820e2c3de4ee";
91    if(verbose) diag(test);
92    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
93    ok(retval == 0, test);
94    accum += retval;
95
96    test = "CTS2 Test - Length 63";
97	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
98	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee950b6576660739916d058623d688e27e2dc88b70f6ae0243d2dbcd6822a105";
99    if(verbose) diag(test);
100    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
101    ok(retval == 0, test);
102    accum += retval;
103
104    test = "CTS2 Test - Length 57";
105	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
106	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee751002ef7a0f9d915d15346571eee7aa2dc88b70f6ae0243d2db";
107    if(verbose) diag(test);
108    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
109    ok(retval == 0, test);
110    accum += retval;
111
112    padding = ccCBCCTS3;
113
114    test = "CTS3 Test - Length 64";
115	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
116	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee04b1c432a7a71395b36d820e2c3de4ee2dc88b70f6ae0243d2dbcd6822a10586";
117    if(verbose) diag(test);
118    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
119    ok(retval == 0, test);
120    accum += retval;
121
122    test = "CTS3 Test - Length 63";
123	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
124	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee950b6576660739916d058623d688e27e2dc88b70f6ae0243d2dbcd6822a105";
125    if(verbose) diag(test);
126    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
127    ok(retval == 0, test);
128    accum += retval;
129
130    test = "CTS3 Test - Length 57";
131	plainText  = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a";
132	cipherText = "e22abba9d2a201b18dc2f57e04aba21a16e0ed6358164c59ca64d204f33247ee751002ef7a0f9d915d15346571eee7aa2dc88b70f6ae0243d2db";
133    if(verbose) diag(test);
134    retval = CCModeTestCase(keyStr, iv, mode, alg, padding, cipherText, plainText);
135    ok(retval == 0, test);
136    accum += retval;
137
138
139    return accum != 0;
140}
141#endif
142