1/* 2 * Copyright (c) 2011-12 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 <sys/types.h> 25#include <stdio.h> 26#include <stdlib.h> 27#include <string.h> 28#include <getopt.h> 29 30#include "ossl-evp.h" 31#include "ossl-evp-cc.h" 32 33#include "test_common.h" 34 35static int verbose = 1; 36 37static int total = 0; 38static int pass = 0; 39static int fail = 0; 40 41/* 42 * Cryptor Test Engine. 43 */ 44typedef const EVP_CIPHER * (*evp_alg_t)(void); 45 46static int _test_cryptor(evp_alg_t alg, const byteVector_t *key[], const byteVector_t *pt[], const byteVector_t *ct[], const unsigned num_tests) 47{ 48 unsigned i; 49 int rv = 0; 50 EVP_CIPHER_CTX ectx, dctx; 51 const EVP_CIPHER *c = (*alg)(); 52 53 if (NULL == c) { 54 printf("cipher not supported\n"); 55 return (1); 56 } 57 58 EVP_CIPHER_CTX_init(&ectx); 59 EVP_CIPHER_CTX_init(&dctx); 60 61 /* Setup key */ 62 for(i = 0; i < num_tests; i++) { 63 size_t blocksize = (pt[i]->len > ct[i]->len) ? pt[i]->len : ct[i]->len; 64 uint8_t blk1[blocksize], blk2[blocksize]; 65 66 if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1) { 67 if (verbose) printf("vector %u EVP_EncryptInit_ex failed\n", i); 68 continue; 69 } 70 if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1) { 71 if (verbose) printf("vector %u EVP_DecryptInit_ex failed\n", i); 72 EVP_CIPHER_CTX_cleanup(&ectx); 73 continue; 74 } 75 76 EVP_CIPHER_CTX_set_key_length(&ectx, key[i]->len); 77 EVP_CIPHER_CTX_set_key_length(&dctx, key[i]->len); 78 79 if (EVP_CipherInit_ex(&ectx, c, NULL, key[i]->value, NULL, 1) != 1) { 80 if (verbose) printf("vector %u EVP_EncryptInit_ex w/ key failed\n", i); 81 EVP_CIPHER_CTX_cleanup(&ectx); 82 EVP_CIPHER_CTX_cleanup(&dctx); 83 continue; 84 } 85 if (EVP_CipherInit_ex(&dctx, c, NULL, key[i]->value, NULL, 0) != 1) { 86 if (verbose) printf("vector %u EVP_DecryptInit_ex w/ key failed\n", i); 87 EVP_CIPHER_CTX_cleanup(&ectx); 88 EVP_CIPHER_CTX_cleanup(&dctx); 89 continue; 90 } 91 92 93 94 /* Encrypt and decrypt. */ 95 if (!EVP_Cipher(&ectx, blk1, pt[i]->value, blocksize)) { 96 if (verbose) printf("encrypting failed on vector %u\n", i); 97 rv = 1; 98 goto done; 99 } 100 if (memcmp(blk1, ct[i]->value, blocksize) != 0) { 101#if 0 102 char *s1, *s2; 103 104 if (verbose) { 105 hex_encode(blk1, blocksize, &s1); 106 hex_encode(ct[i]->value, blocksize, &s2); 107 108 printf("vector %d encrypt not the same: %s != %s\n", (int)i, s1, s2); 109 } 110#else 111 if (verbose) printf("vector %u encrypt not the same\n", i); 112#endif 113 rv = 1; 114 goto done; 115 } 116 117 if (!EVP_Cipher(&dctx, blk2, blk1, blocksize)) { 118 if (verbose) printf("decrypting failed on vector %u\n", i); 119 rv = 1; 120 goto done; 121 } 122 if (memcmp(blk2, pt[i]->value, blocksize) != 0) { 123#if 0 124 char *s1, *s2; 125 126 if (verbose) { 127 hex_encode(blk2, blocksize, &s1); 128 hex_encode(pt[i]->value, blocksize, &s2); 129 130 printf("vector %d decrypt not the same: %s != %s\n", (int)i, s1, s2); 131 } 132#else 133 if (verbose) printf("vector %u encrypt not the same\n", i); 134#endif 135 rv = 1; 136 goto done; 137 } 138 139done: 140 EVP_CIPHER_CTX_cleanup(&ectx); 141 EVP_CIPHER_CTX_cleanup(&dctx); 142 } 143 144 return (rv); 145} 146 147/* 148 * Test Vector Macros: 149 * 150 * CRYPTOR_KEY() is the key for the cryptor (in hex). 151 * Parameters: (<Digest Name>, <vector #>, <key length>, <vector data>) 152 * 153 * CRYPTOR_PT() is the plaintext (in hex). 154 * CRYPTOR_CT() is the ciphertext digest (in hex). 155 * Parameters: (<Digest Name>, <vector #>, <vector data>) 156 */ 157#define CRYPTOR_KEY(NAME, N, LEN, VALUE...) static byteVector_t _cc_ ## NAME ## _cryptor_key_ ## N = \ 158 { LEN, { VALUE } }; 159#define CRYPTOR_PT(NAME, N, LEN, VALUE...) static byteVector_t _cc_ ## NAME ## _cryptor_pt_ ## N = \ 160 { LEN, { VALUE } }; 161#define CRYPTOR_CT(NAME, N, LEN, VALUE...) static byteVector_t _cc_ ## NAME ## _cryptor_ct_ ## N = \ 162 { LEN, { VALUE } }; 163 164/* 165 * CRYPTOR_TEST() generates the testing code stub. 166 * Parameters: (<Cryptor Name>, <Number of test vectors>) 167 */ 168#define CRYPTOR_TEST(ALG_NAME, NUM_TESTS) \ 169static byteVector_t * _cc_ ## ALG_NAME ## _cryptor_key_vects[] = \ 170 { ARRAY_FOR_ ## NUM_TESTS (& _cc_ ## ALG_NAME ## _cryptor_key_ ) NULL }; \ 171 \ 172static byteVector_t * _cc_ ## ALG_NAME ## _cryptor_pt_vects[] = \ 173 { ARRAY_FOR_ ## NUM_TESTS (& _cc_ ## ALG_NAME ## _cryptor_pt_ ) NULL }; \ 174 \ 175static byteVector_t * _cc_ ## ALG_NAME ## _cryptor_ct_vects[] = \ 176 { ARRAY_FOR_ ## NUM_TESTS (& _cc_ ## ALG_NAME ## _cryptor_ct_ ) NULL }; \ 177 \ 178static int testCryptor_ ## ALG_NAME(void) { \ 179 return (_test_cryptor(EVP_ ## ALG_NAME, \ 180 _cc_ ## ALG_NAME ## _cryptor_key_vects, \ 181 _cc_ ## ALG_NAME ## _cryptor_pt_vects, \ 182 _cc_ ## ALG_NAME ## _cryptor_ct_vects, NUM_TESTS)); \ 183} 184 185/* 186 * AES (Advanced Encryption Standard - FIPS 197) test vectors. 187 */ 188CRYPTOR_KEY(aes_128_ecb, 0, 16, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 189 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f) 190CRYPTOR_PT(aes_128_ecb, 0, 16, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 191 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff) 192CRYPTOR_CT(aes_128_ecb, 0, 16, 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30, 193 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a) 194CRYPTOR_TEST(aes_128_ecb, 1) 195 196CRYPTOR_KEY(aes_192_ecb, 0, 24, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 197 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 198 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17) 199CRYPTOR_PT(aes_192_ecb, 0, 16, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 200 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff) 201CRYPTOR_CT(aes_192_ecb, 0, 16, 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0, 202 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91) 203CRYPTOR_TEST(aes_192_ecb, 1) 204 205CRYPTOR_KEY(aes_256_ecb, 0, 32, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 206 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 207 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 208 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f) 209CRYPTOR_PT(aes_256_ecb, 0, 16, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 210 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff) 211CRYPTOR_CT(aes_256_ecb, 0, 16, 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf, 212 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89) 213CRYPTOR_TEST(aes_256_ecb, 1) 214 215/* 216 * DES (Data Encryption Standard - FIPS 46-3) test vectors. 217 */ 218CRYPTOR_KEY(des_ecb, 0, 8, 0x10, 0x31, 0x6E, 0x02, 0x8C, 0x8F, 0x3B, 0x4A) 219CRYPTOR_PT(des_ecb, 0, 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 220CRYPTOR_CT(des_ecb, 0, 8, 0x82, 0xDC, 0xBA, 0xFB, 0xDE, 0xAB, 0x66, 0x02) 221 222CRYPTOR_KEY(des_ecb, 1, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 223CRYPTOR_PT(des_ecb, 1, 8, 0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00) 224CRYPTOR_CT(des_ecb, 1, 8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 225 226CRYPTOR_KEY(des_ecb, 2, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 227CRYPTOR_PT(des_ecb, 2, 8, 0xDD, 0x7F, 0x12, 0x1C, 0xA5, 0x01, 0x56, 0x19) 228CRYPTOR_CT(des_ecb, 2, 8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 229 230CRYPTOR_KEY(des_ecb, 3, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 231CRYPTOR_PT(des_ecb, 3, 8, 0x2E, 0x86, 0x53, 0x10, 0x4F, 0x38, 0x34, 0xEA) 232CRYPTOR_CT(des_ecb, 3, 8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 233 234CRYPTOR_KEY(des_ecb, 4, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 235CRYPTOR_PT(des_ecb, 4, 8, 0x4B, 0xD3, 0x88, 0xFF, 0x6C, 0xD8, 0x1D, 0x4F) 236CRYPTOR_CT(des_ecb, 4, 8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 237 238CRYPTOR_KEY(des_ecb, 5, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 239CRYPTOR_PT(des_ecb, 5, 8, 0x20, 0xB9, 0xE7, 0x67, 0xB2, 0xFB, 0x14, 0x56) 240CRYPTOR_CT(des_ecb, 5, 8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 241 242CRYPTOR_KEY(des_ecb, 6, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 243CRYPTOR_PT(des_ecb, 6, 8, 0x55, 0x57, 0x93, 0x80, 0xD7, 0x71, 0x38, 0xEF) 244CRYPTOR_CT(des_ecb, 6, 8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 245 246CRYPTOR_KEY(des_ecb, 7, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 247CRYPTOR_PT(des_ecb, 7, 8, 0x6C, 0xC5, 0xDE, 0xFA, 0xAF, 0x04, 0x51, 0x2F) 248CRYPTOR_CT(des_ecb, 7, 8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 249 250CRYPTOR_KEY(des_ecb, 8, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 251CRYPTOR_PT(des_ecb, 8, 8, 0x0D, 0x9F, 0x27, 0x9B, 0xA5, 0xD8, 0x72, 0x60) 252CRYPTOR_CT(des_ecb, 8, 8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 253 254CRYPTOR_KEY(des_ecb, 9, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 255CRYPTOR_PT(des_ecb, 9, 8, 0xD9, 0x03, 0x1B, 0x02, 0x71, 0xBD, 0x5A, 0x0A) 256CRYPTOR_CT(des_ecb, 9, 8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 257 258CRYPTOR_KEY(des_ecb, 10, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 259CRYPTOR_PT(des_ecb, 10, 8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 260CRYPTOR_CT(des_ecb, 10, 8, 0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00) 261 262CRYPTOR_KEY(des_ecb, 11, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 263CRYPTOR_PT(des_ecb, 11, 8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 264CRYPTOR_CT(des_ecb, 11, 8, 0xDD, 0x7F, 0x12, 0x1C, 0xA5, 0x01, 0x56, 0x19) 265 266CRYPTOR_KEY(des_ecb, 12, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 267CRYPTOR_PT(des_ecb, 12, 8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 268CRYPTOR_CT(des_ecb, 12, 8, 0x2E, 0x86, 0x53, 0x10, 0x4F, 0x38, 0x34, 0xEA) 269 270CRYPTOR_KEY(des_ecb, 13, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 271CRYPTOR_PT(des_ecb, 13, 8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 272CRYPTOR_CT(des_ecb, 13, 8, 0x4B, 0xD3, 0x88, 0xFF, 0x6C, 0xD8, 0x1D, 0x4F) 273 274CRYPTOR_KEY(des_ecb, 14, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 275CRYPTOR_PT(des_ecb, 14, 8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 276CRYPTOR_CT(des_ecb, 14, 8, 0x20, 0xB9, 0xE7, 0x67, 0xB2, 0xFB, 0x14, 0x56) 277 278CRYPTOR_KEY(des_ecb, 15, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 279CRYPTOR_PT(des_ecb, 15, 8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 280CRYPTOR_CT(des_ecb, 15, 8, 0x55, 0x57, 0x93, 0x80, 0xD7, 0x71, 0x38, 0xEF) 281 282CRYPTOR_KEY(des_ecb, 16, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 283CRYPTOR_PT(des_ecb, 16, 8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 284CRYPTOR_CT(des_ecb, 16, 8, 0x6C, 0xC5, 0xDE, 0xFA, 0xAF, 0x04, 0x51, 0x2F) 285 286CRYPTOR_KEY(des_ecb, 17, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 287CRYPTOR_PT(des_ecb, 17, 8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 288CRYPTOR_CT(des_ecb, 17, 8, 0x0D, 0x9F, 0x27, 0x9B, 0xA5, 0xD8, 0x72, 0x60) 289 290CRYPTOR_KEY(des_ecb, 18, 8, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01) 291CRYPTOR_PT(des_ecb, 18, 8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 292CRYPTOR_CT(des_ecb, 18, 8, 0xD9, 0x03, 0x1B, 0x02, 0x71, 0xBD, 0x5A, 0x0A) 293 294 295 /*** more test cases you could add if you are not convinced (the above test cases aren't really too good): 296 297 key plaintext ciphertext 298 0000000000000000 0000000000000000 8CA64DE9C1B123A7 299 FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 7359B2163E4EDC58 300 3000000000000000 1000000000000001 958E6E627A05557B 301 1111111111111111 1111111111111111 F40379AB9E0EC533 302 0123456789ABCDEF 1111111111111111 17668DFC7292532D 303 1111111111111111 0123456789ABCDEF 8A5AE1F81AB8F2DD 304 0000000000000000 0000000000000000 8CA64DE9C1B123A7 305 FEDCBA9876543210 0123456789ABCDEF ED39D950FA74BCC4 306 7CA110454A1A6E57 01A1D6D039776742 690F5B0D9A26939B 307 0131D9619DC1376E 5CD54CA83DEF57DA 7A389D10354BD271 308 07A1133E4A0B2686 0248D43806F67172 868EBB51CAB4599A 309 3849674C2602319E 51454B582DDF440A 7178876E01F19B2A 310 04B915BA43FEB5B6 42FD443059577FA2 AF37FB421F8C4095 311 0113B970FD34F2CE 059B5E0851CF143A 86A560F10EC6D85B 312 0170F175468FB5E6 0756D8E0774761D2 0CD3DA020021DC09 313 43297FAD38E373FE 762514B829BF486A EA676B2CB7DB2B7A 314 07A7137045DA2A16 3BDD119049372802 DFD64A815CAF1A0F 315 04689104C2FD3B2F 26955F6835AF609A 5C513C9C4886C088 316 37D06BB516CB7546 164D5E404F275232 0A2AEEAE3FF4AB77 317 1F08260D1AC2465E 6B056E18759F5CCA EF1BF03E5DFA575A 318 584023641ABA6176 004BD6EF09176062 88BF0DB6D70DEE56 319 025816164629B007 480D39006EE762F2 A1F9915541020B56 320 49793EBC79B3258F 437540C8698F3CFA 6FBF1CAFCFFD0556 321 4FB05E1515AB73A7 072D43A077075292 2F22E49BAB7CA1AC 322 49E95D6D4CA229BF 02FE55778117F12A 5A6B612CC26CCE4A 323 018310DC409B26D6 1D9D5C5018F728C2 5F4C038ED12B2E41 324 1C587F1C13924FEF 305532286D6F295A 63FAC0D034D9F793 325 0101010101010101 0123456789ABCDEF 617B3A0CE8F07100 326 1F1F1F1F0E0E0E0E 0123456789ABCDEF DB958605F8C8C606 327 E0FEE0FEF1FEF1FE 0123456789ABCDEF EDBFD1C66C29CCC7 328 0000000000000000 FFFFFFFFFFFFFFFF 355550B2150E2451 329 FFFFFFFFFFFFFFFF 0000000000000000 CAAAAF4DEAF1DBAE 330 0123456789ABCDEF 0000000000000000 D5D44FF720683D0D 331 FEDCBA9876543210 FFFFFFFFFFFFFFFF 2A2BB008DF97C2F2 332 333 http://www.ecs.soton.ac.uk/~prw99r/ez438/vectors.txt 334 ***/ 335CRYPTOR_TEST(des_ecb, 19) 336 337/* 338 * CAST Test Vectors. 339 */ 340CRYPTOR_KEY(cast5_ecb, 0, 16, 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, 341 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A) 342CRYPTOR_PT(cast5_ecb, 0, 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF) 343CRYPTOR_CT(cast5_ecb, 0, 8, 0x23, 0x8B, 0x4F, 0xE5, 0x84, 0x7E, 0x44, 0xB2) 344 345CRYPTOR_KEY(cast5_ecb, 1, 10, 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, 346 0x23, 0x45) 347CRYPTOR_PT(cast5_ecb, 1, 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF) 348CRYPTOR_CT(cast5_ecb, 1, 8, 0xEB, 0x6A, 0x71, 0x1A, 0x2C, 0x02, 0x27, 0x1B) 349 350CRYPTOR_KEY(cast5_ecb, 2, 5, 0x01, 0x23, 0x45, 0x67, 0x12) 351CRYPTOR_PT(cast5_ecb, 2, 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF) 352CRYPTOR_CT(cast5_ecb, 2, 8, 0x7A, 0xC8, 0x16, 0xD1, 0x6E, 0x9B, 0x30, 0x2E) 353 354CRYPTOR_TEST(cast5_ecb, 3) 355 356#if 0 /* NO RC2 support */ 357/* 358 * RC2 Test Vectors. 359 */ 360CRYPTOR_KEY(RC2, 0, 8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 361CRYPTOR_PT(RC2, 0, 8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01) 362CRYPTOR_CT(RC2, 0, 8, 0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2) 363 364CRYPTOR_KEY(RC2, 1, 16, 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f, 365 0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2) 366CRYPTOR_PT(RC2, 1, 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 367CRYPTOR_CT(RC2, 1, 8, 0x22, 0x69, 0x55, 0x2a, 0xb0, 0xf8, 0x5c, 0xa6) 368 369CRYPTOR_TEST(RC2, 2) 370#endif 371 372/* 373 * Blowfish Test Vectors. 374 */ 375CRYPTOR_KEY(bf_ecb, 0, 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 376CRYPTOR_PT(bf_ecb, 0, 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 377CRYPTOR_CT(bf_ecb, 0, 8, 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78) 378 379CRYPTOR_KEY(bf_ecb, 1, 8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF) 380CRYPTOR_PT(bf_ecb, 1, 8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF) 381CRYPTOR_CT(bf_ecb, 1, 8, 0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A) 382 383CRYPTOR_KEY(bf_ecb, 2, 8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 384CRYPTOR_PT(bf_ecb, 2, 8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01) 385CRYPTOR_CT(bf_ecb, 2, 8, 0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2) 386 387CRYPTOR_TEST(bf_ecb, 3) 388 389/* 390 * TDES (Triple Data Encryption Standard - NIST Special Pub 800-67) custom test. 391 * 392 * Test vectors are from Jeroen C. van Gelderen. 393 */ 394CRYPTOR_KEY(des_ede3_ecb, 0, 24, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 395 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 396 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01) 397CRYPTOR_PT(des_ede3_ecb, 0, 8, 0x95,0xF8,0xA5,0xE5,0xDD,0x31,0xD9,0x00) 398CRYPTOR_CT(des_ede3_ecb, 0, 8, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 399 400CRYPTOR_KEY(des_ede3_ecb, 1, 24, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 401 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 402 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01) 403CRYPTOR_PT(des_ede3_ecb, 1, 8, 0x9D,0x64,0x55,0x5A,0x9A,0x10,0xB8,0x52) 404CRYPTOR_CT(des_ede3_ecb, 1, 8, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00) 405 406CRYPTOR_KEY(des_ede3_ecb, 2, 24, 0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E, 407 0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E, 408 0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E) 409CRYPTOR_PT(des_ede3_ecb, 2, 8, 0x51,0x45,0x4B,0x58,0x2D,0xDF,0x44,0x0A) 410CRYPTOR_CT(des_ede3_ecb, 2, 8, 0x71,0x78,0x87,0x6E,0x01,0xF1,0x9B,0x2A) 411 412CRYPTOR_KEY(des_ede3_ecb, 3, 24, 0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6, 413 0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6, 414 0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6) 415CRYPTOR_PT(des_ede3_ecb, 3, 8, 0x42,0xFD,0x44,0x30,0x59,0x57,0x7F,0xA2) 416CRYPTOR_CT(des_ede3_ecb, 3, 8, 0xAF,0x37,0xFB,0x42,0x1F,0x8C,0x40,0x95) 417 418CRYPTOR_KEY(des_ede3_ecb, 4, 24, 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF, 419 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF, 420 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF) 421CRYPTOR_PT(des_ede3_ecb, 4, 8, 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61) 422CRYPTOR_CT(des_ede3_ecb, 4, 8, 0x3D,0x12,0x4F,0xE2,0x19,0x8B,0xA3,0x18) 423 424CRYPTOR_KEY(des_ede3_ecb, 5, 24, 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF, 425 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 426 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF) 427CRYPTOR_PT(des_ede3_ecb, 5, 8, 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61) 428CRYPTOR_CT(des_ede3_ecb, 5, 8, 0xFB,0xAB,0xA1,0xFF,0x9D,0x05,0xE9,0xB1) 429 430CRYPTOR_KEY(des_ede3_ecb, 6, 24, 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF, 431 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 432 0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10) 433CRYPTOR_PT(des_ede3_ecb, 6, 8, 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61) 434CRYPTOR_CT(des_ede3_ecb, 6, 8, 0x18,0xd7,0x48,0xe5,0x63,0x62,0x05,0x72) 435 436CRYPTOR_KEY(des_ede3_ecb, 7, 24, 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17, 437 0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98, 438 0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57) 439CRYPTOR_PT(des_ede3_ecb, 7, 8, 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65) 440CRYPTOR_CT(des_ede3_ecb, 7, 8, 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30) 441 442CRYPTOR_KEY(des_ede3_ecb, 8, 24, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 443 0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 444 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02) 445CRYPTOR_PT(des_ede3_ecb, 8, 8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 446CRYPTOR_CT(des_ede3_ecb, 8, 8, 0xe6,0xe6,0xdd,0x5b,0x7e,0x72,0x29,0x74) 447 448CRYPTOR_KEY(des_ede3_ecb, 9, 24, 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20, 449 0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01, 450 0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01) 451CRYPTOR_PT(des_ede3_ecb, 9, 8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 452CRYPTOR_CT(des_ede3_ecb, 9, 8, 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b) 453 454CRYPTOR_TEST(des_ede3_ecb, 3) 455 456 457/* 458 * RC4 test vecotors. 459 */ 460CRYPTOR_KEY(rc4, 0, 8, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef) 461CRYPTOR_PT(rc4, 0, 8, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef) 462CRYPTOR_CT(rc4, 0, 8, 0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96) 463 464CRYPTOR_KEY(rc4, 1, 8, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef) 465CRYPTOR_PT(rc4, 1, 8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 466CRYPTOR_CT(rc4, 1, 8, 0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79) 467 468CRYPTOR_KEY(rc4, 2, 8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 469CRYPTOR_PT(rc4, 2, 8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 470CRYPTOR_CT(rc4, 2, 8, 0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a) 471 472CRYPTOR_KEY(rc4, 3, 4, 0xef,0x01,0x23,0x45) 473CRYPTOR_PT(rc4, 3, 20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 474 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 475 0x00,0x00,0x00,0x00) 476CRYPTOR_CT(rc4, 3, 20, 0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf, 477 0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba, 478 0x36,0xb6,0x78,0x58) 479 480CRYPTOR_KEY(rc4, 4, 4, 0xef,0x01,0x23,0x45) 481CRYPTOR_PT(rc4, 4, 10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 482 0x00,0x00) 483CRYPTOR_CT(rc4, 4, 10, 0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf, 484 0xbd,0x61) 485 486CRYPTOR_TEST(rc4, 5) 487 488 489/* 490 * Cryptor test functions array. 491 */ 492static testFunction_t cryptorTestFunctions[] = { 493 { testCryptor_aes_128_ecb, "aes-128-ecb" }, 494 { testCryptor_aes_192_ecb, "aes-192-ecb" }, 495 { testCryptor_aes_256_ecb, "aes-256-ecb" }, 496 { testCryptor_des_ecb, "des-ecb" }, 497 { testCryptor_des_ede3_ecb, "des-ede3-ecb" }, 498 { testCryptor_cast5_ecb, "cast5-ecb" }, 499 { testCryptor_rc4, "rc4" }, 500#if 0 501 { testCryptorRC2, "RC2" }, 502#endif 503 { testCryptor_bf_ecb, "Blowfish" }, 504}; 505#define numCryptorTestFunctions (sizeof(cryptorTestFunctions) / sizeof(cryptorTestFunctions[0])) 506 507static int 508testAllCryptors(void) 509{ 510 unsigned i; 511 int err = 0; 512 513 for (i = 0; i < numCryptorTestFunctions; i++) { 514 if (NULL == cryptorTestFunctions[i].description) continue; 515 if (verbose) printf("[BEGIN] %s\n", cryptorTestFunctions[i].description); 516 err = cryptorTestFunctions[i].funcptr(); 517 total++; 518 if (err) { 519 fail++; 520 if (verbose) printf("[FAIL] %s\n", cryptorTestFunctions[i].description); 521 } else { 522 pass++; 523 if (verbose) printf("[PASS] %s\n", cryptorTestFunctions[i].description); 524 } 525 } 526 return (fail); 527} 528 529/***************************************************************************************/ 530 531/* 532 * Mode Test Engine. 533 */ 534static int _test_mode(evp_alg_t alg, const byteVector_t *key[], const byteVector_t *iv[], const byteVector_t *pt[], const byteVector_t *ct[], const unsigned num_tests) 535{ 536 unsigned i; 537 int rv = 0; 538 EVP_CIPHER_CTX ectx, dctx; 539 const EVP_CIPHER *c = (*alg)(); 540 541 if (NULL == c) { 542 printf("cipher not supported\n"); 543 return (1); 544 } 545 546 EVP_CIPHER_CTX_init(&ectx); 547 EVP_CIPHER_CTX_init(&dctx); 548 549 /* Setup key */ 550 for(i = 0; i < num_tests; i++) { 551 size_t blocksize = (pt[i]->len > ct[i]->len) ? pt[i]->len : ct[i]->len; 552 uint8_t blk1[blocksize], blk2[blocksize]; 553 554 if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1) { 555 if (verbose) printf("vector %u EVP_EncryptInit_ex failed\n", i); 556 continue; 557 } 558 if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1) { 559 if (verbose) printf("vector %u EVP_DecryptInit_ex failed\n", i); 560 EVP_CIPHER_CTX_cleanup(&ectx); 561 continue; 562 } 563 564 EVP_CIPHER_CTX_set_key_length(&ectx, key[i]->len); 565 EVP_CIPHER_CTX_set_key_length(&dctx, key[i]->len); 566 567 if (EVP_CipherInit_ex(&ectx, c, NULL, key[i]->value, iv[i]->value, 1) != 1) { 568 if (verbose) printf("vector %u EVP_EncryptInit_ex w/ key failed\n", i); 569 EVP_CIPHER_CTX_cleanup(&ectx); 570 EVP_CIPHER_CTX_cleanup(&dctx); 571 continue; 572 } 573 if (EVP_CipherInit_ex(&dctx, c, NULL, key[i]->value, iv[i]->value, 0) != 1) { 574 if (verbose) printf("vector %u EVP_DecryptInit_ex w/ key failed\n", i); 575 EVP_CIPHER_CTX_cleanup(&ectx); 576 EVP_CIPHER_CTX_cleanup(&dctx); 577 continue; 578 } 579 580 581 582 /* Encrypt and decrypt. */ 583 if (!EVP_Cipher(&ectx, blk1, pt[i]->value, blocksize)) { 584 if (verbose) printf("encrypting failed on vector %u\n", i); 585 rv = 1; 586 goto done; 587 } 588 if (memcmp(blk1, ct[i]->value, blocksize) != 0) { 589#if 0 590 char *s1, *s2; 591 592 if (verbose) { 593 hex_encode(blk1, blocksize, &s1); 594 hex_encode(ct[i]->value, blocksize, &s2); 595 596 printf("vector %d encrypt not the same: %s != %s\n", (int)i, s1, s2); 597 } 598#else 599 if (verbose) printf("vector %u encrypt not the same\n", i); 600#endif 601 rv = 1; 602 goto done; 603 } 604 605 if (!EVP_Cipher(&dctx, blk2, blk1, blocksize)) { 606 if (verbose) printf("decrypting failed on vector %u\n", i); 607 rv = 1; 608 goto done; 609 } 610 if (memcmp(blk2, pt[i]->value, blocksize) != 0) { 611#if 0 612 char *s1, *s2; 613 614 if (verbose) { 615 hex_encode(blk2, blocksize, &s1); 616 hex_encode(pt[i]->value, blocksize, &s2); 617 618 printf("vector %d decrypt not the same: %s != %s\n", (int)i, s1, s2); 619 } 620#else 621 if (verbose) printf("vector %u encrypt not the same\n", i); 622#endif 623 rv = 1; 624 goto done; 625 } 626 627done: 628 EVP_CIPHER_CTX_cleanup(&ectx); 629 EVP_CIPHER_CTX_cleanup(&dctx); 630 } 631 632 return (rv); 633} 634 635/* 636 * Test Vector Macros: 637 * 638 * MODE_KEY() is the key for the cryptor (in hex). 639 * MODE_IV() is the initialization vector (in hex). 640 * Parameters: (<Mode Name>, <vector #>, <key length>, <vector data>) 641 * 642 * MODE_PT() is the plaintext (in hex). 643 * MODE_CT() is the ciphertext digest (in hex). 644 * Parameters: (<Mode Name>, <vector #>, <vector size>, <vector data>) 645 */ 646#define MODE_KEY(NAME, N, LEN, VALUE...) static byteVector_t NAME ## _mode_key_ ## N = \ 647 { LEN, { VALUE } }; 648#define MODE_IV(NAME, N, LEN, VALUE...) static byteVector_t NAME ## _mode_iv_ ## N = \ 649 { LEN, { VALUE } }; 650#define MODE_PT(NAME, N, LEN, VALUE...) static byteVector_t NAME ## _mode_pt_ ## N = \ 651 { LEN, { VALUE } }; 652#define MODE_CT(NAME, N, LEN, VALUE...) static byteVector_t NAME ## _mode_ct_ ## N = \ 653 { LEN, { VALUE } }; 654 655/* 656 * MODE_TEST() generates the testing code stub. 657 * Parameters: (<Mode Name>, <Number of test vectors>) 658 */ 659#define MODE_TEST(ALG_NAME, NUM_TESTS) \ 660static byteVector_t * ALG_NAME ## _mode_key_vects[] = \ 661 { ARRAY_FOR_ ## NUM_TESTS (& ALG_NAME ## _mode_key_ ) NULL }; \ 662 \ 663static byteVector_t * ALG_NAME ## _mode_iv_vects[] = \ 664 { ARRAY_FOR_ ## NUM_TESTS (& ALG_NAME ## _mode_iv_ ) NULL }; \ 665 \ 666static byteVector_t * ALG_NAME ## _mode_pt_vects[] = \ 667 { ARRAY_FOR_ ## NUM_TESTS (& ALG_NAME ## _mode_pt_ ) NULL }; \ 668 \ 669static byteVector_t * ALG_NAME ## _mode_ct_vects[] = \ 670 { ARRAY_FOR_ ## NUM_TESTS (& ALG_NAME ## _mode_ct_ ) NULL }; \ 671 \ 672static int testMode_ ## ALG_NAME(void) { \ 673 return (_test_mode(EVP_ ## ALG_NAME, ALG_NAME ## _mode_key_vects, \ 674 ALG_NAME ## _mode_iv_vects, ALG_NAME ## _mode_pt_vects, \ 675 ALG_NAME ## _mode_ct_vects, NUM_TESTS)); \ 676} 677 678#if 0 679/* 680 * Counter (CTR) Mode Test Vectors. 681 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf 682 */ 683MODE_KEY(CTR, 0, 16, 0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c) 684MODE_IV(CTR, 0, 16, 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff) 685MODE_PT(CTR, 0, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 686MODE_CT(CTR, 0, 16, 0x87,0x4d,0x61,0x91,0xb6,0x20,0xe3,0x26,0x1b,0xef,0x68,0x64,0x99,0x0d,0xb6,0xce) 687 688MODE_KEY(CTR, 1, 24, 0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5, 689 0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b) 690MODE_IV(CTR, 1, 16, 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff) 691MODE_PT(CTR, 1, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 692MODE_CT(CTR, 1, 16, 0x1a,0xbc,0x93,0x24,0x17,0x52,0x1c,0xa2,0x4f,0x2b,0x04,0x59,0xfe,0x7e,0x6e,0x0b) 693 694MODE_KEY(CTR, 2, 32, 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, 695 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4) 696MODE_IV(CTR, 2, 16, 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff) 697MODE_PT(CTR, 2, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 698MODE_CT(CTR, 2, 16, 0x60,0x1e,0xc3,0x13,0x77,0x57,0x89,0xa5,0xb7,0xa7,0xf5,0x04,0xbb,0xf3,0xd2,0x28) 699 700MODE_TEST(CTR, 3) 701#endif 702 703 704/* 705 * Electronic Codebook (ECB) Mode Test Vectors. 706 * (The IV vectors are not used.) 707 */ 708MODE_KEY(aes_128_ecb, 0, 16, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 709MODE_IV(aes_128_ecb, 0, 1, 0x00) 710MODE_PT(aes_128_ecb, 0, 16, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 711MODE_CT(aes_128_ecb, 0, 16, 0x0e,0xdd,0x33,0xd3,0xc6,0x21,0xe5,0x46,0x45,0x5b,0xd8,0xba,0x14,0x18,0xbe,0xc8) 712 713MODE_KEY(aes_128_ecb, 1, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 714MODE_IV(aes_128_ecb, 1, 1, 0x00) 715MODE_PT(aes_128_ecb, 1, 16, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff) 716MODE_CT(aes_128_ecb, 1, 16, 0x69,0xc4,0xe0,0xd8,0x6a,0x7b,0x04,0x30,0xd8,0xcd,0xb7,0x80,0x70,0xb4,0xc5,0x5a) 717MODE_TEST(aes_128_ecb, 2) 718 719MODE_KEY(aes_192_ecb, 0, 24, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 720 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17) 721MODE_IV(aes_192_ecb, 0, 1, 0x00) 722MODE_PT(aes_192_ecb, 0, 16, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff) 723MODE_CT(aes_192_ecb, 0, 16, 0xdd,0xa9,0x7c,0xa4,0x86,0x4c,0xdf,0xe0,0x6e,0xaf,0x70,0xa0,0xec,0x0d,0x71,0x91) 724MODE_TEST(aes_192_ecb, 1) 725 726MODE_KEY(aes_256_ecb, 0, 32, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 727 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f) 728MODE_IV(aes_256_ecb, 0, 1, 0x00) 729MODE_PT(aes_256_ecb, 0, 16, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff) 730MODE_CT(aes_256_ecb, 0, 16, 0x8e,0xa2,0xb7,0xca,0x51,0x67,0x45,0xbf,0xea,0xfc,0x49,0x90,0x4b,0x49,0x60,0x89) 731MODE_TEST(aes_256_ecb, 1) 732 733/* 734 * Cipher Block Chaining (CBC) Mode Test Vectors. 735 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf 736 */ 737MODE_KEY(aes_128_cbc, 0, 16, 0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c) 738MODE_IV(aes_128_cbc, 0, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 739MODE_PT(aes_128_cbc, 0, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 740MODE_CT(aes_128_cbc, 0, 16, 0x76,0x49,0xab,0xac,0x81,0x19,0xb2,0x46,0xce,0xe9,0x8e,0x9b,0x12,0xe9,0x19,0x7d) 741MODE_TEST(aes_128_cbc, 1) 742 743MODE_KEY(aes_192_cbc, 0, 24, 0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5, 744 0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b) 745MODE_IV(aes_192_cbc, 0, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 746MODE_PT(aes_192_cbc, 0, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 747MODE_CT(aes_192_cbc, 0, 16, 0x4f,0x02,0x1d,0xb2,0x43,0xbc,0x63,0x3d,0x71,0x78,0x18,0x3a,0x9f,0xa0,0x71,0xe8) 748MODE_TEST(aes_192_cbc, 1) 749 750 751MODE_KEY(aes_256_cbc, 0, 32, 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, 752 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4) 753MODE_IV(aes_256_cbc, 0, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 754MODE_PT(aes_256_cbc, 0, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 755MODE_CT(aes_256_cbc, 0, 16, 0xf5,0x8c,0x4c,0x04,0xd6,0xe5,0xf1,0xba,0x77,0x9e,0xab,0xfb,0x5f,0x7b,0xfb,0xd6) 756MODE_TEST(aes_256_cbc, 1) 757 758#if 0 759/* 760 * Cipher Feedback Block, 128 bit (CFB128) Mode Test Vectors. 761 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf 762 */ 763MODE_KEY(CFB, 0, 16, 0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c) 764MODE_IV(CFB, 0, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 765MODE_PT(CFB, 0, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 766MODE_CT(CFB, 0, 16, 0x3b,0x3f,0xd9,0x2e,0xb7,0x2d,0xad,0x20,0x33,0x34,0x49,0xf8,0xe8,0x3c,0xfb,0x4a) 767 768MODE_KEY(CFB, 1, 24, 0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5, 769 0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b) 770MODE_IV(CFB, 1, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 771MODE_PT(CFB, 1, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 772MODE_CT(CFB, 1, 16, 0xcd,0xc8,0x0d,0x6f,0xdd,0xf1,0x8c,0xab,0x34,0xc2,0x59,0x09,0xc9,0x9a,0x41,0x74) 773 774MODE_KEY(CFB, 2, 32, 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, 775 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4) 776MODE_IV(CFB, 2, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 777MODE_PT(CFB, 2, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 778MODE_CT(CFB, 2, 16, 0xdc,0x7e,0x84,0xbf,0xda,0x79,0x16,0x4b,0x7e,0xcd,0x84,0x86,0x98,0x5d,0x38,0x60) 779 780MODE_TEST(CFB, 3) 781 782/* 783 * Output Feedback Block (OFB) Mode Test Vectors. 784 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf 785 */ 786MODE_KEY(OFB, 0, 16, 0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c) 787MODE_IV(OFB, 0, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 788MODE_PT(OFB, 0, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 789MODE_CT(OFB, 0, 16, 0x3b,0x3f,0xd9,0x2e,0xb7,0x2d,0xad,0x20,0x33,0x34,0x49,0xf8,0xe8,0x3c,0xfb,0x4a) 790 791MODE_KEY(OFB, 1, 24, 0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5, 792 0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b) 793MODE_IV(OFB, 1, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 794MODE_PT(OFB, 1, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 795MODE_CT(OFB, 1, 16, 0xcd,0xc8,0x0d,0x6f,0xdd,0xf1,0x8c,0xab,0x34,0xc2,0x59,0x09,0xc9,0x9a,0x41,0x74) 796 797MODE_KEY(OFB, 2, 32, 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, 798 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4) 799MODE_IV(OFB, 2, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 800MODE_PT(OFB, 2, 16, 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a) 801MODE_CT(OFB, 2, 16, 0xdc,0x7e,0x84,0xbf,0xda,0x79,0x16,0x4b,0x7e,0xcd,0x84,0x86,0x98,0x5d,0x38,0x60) 802 803MODE_TEST(OFB, 3) 804#endif /* #if 0 */ 805 806/* 807 * Cipher Feedback Block, 8 bit (CFB8) Mode Test Vectors. 808 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf 809 */ 810MODE_KEY(aes_128_cfb8, 0, 16, 0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c) 811MODE_IV(aes_128_cfb8, 0, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 812MODE_PT(aes_128_cfb8, 0, 1, 0x6b) 813MODE_CT(aes_128_cfb8, 0, 1, 0x3b) 814 815MODE_KEY(aes_128_cfb8, 1, 16, 0xdf,0x54,0xa7,0x0f,0x60,0xbd,0xe2,0x2f,0xc6,0x7a,0x23,0x49,0x25,0x9e,0x3c,0xb4) 816MODE_IV(aes_128_cfb8, 1, 16, 0x01,0x40,0xe1,0x94,0xac,0xfe,0xa9,0x77,0x8e,0xf5,0x2e,0xe8,0x78,0xbf,0x73,0x70) 817MODE_PT(aes_128_cfb8, 1, 2, 0xed,0xe4) 818MODE_CT(aes_128_cfb8, 1, 2, 0xa5,0x6f) 819MODE_TEST(aes_128_cfb8, 2) 820 821MODE_KEY(aes_192_cfb8, 0, 24, 0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5, 822 0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b) 823MODE_IV(aes_192_cfb8, 0, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 824MODE_PT(aes_192_cfb8, 0, 1, 0x6b) 825MODE_CT(aes_192_cfb8, 0, 1, 0xcd) 826MODE_TEST(aes_192_cfb8, 1) 827 828MODE_KEY(aes_256_cfb8, 0, 32, 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, 829 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4) 830MODE_IV(aes_256_cfb8, 0, 16, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f) 831MODE_PT(aes_256_cfb8, 0, 1, 0x6B) 832MODE_CT(aes_256_cfb8, 0, 1, 0xdc) 833MODE_TEST(aes_256_cfb8, 1) 834 835 836#if 0 837/* 838 * RC4 pseudo mode. 839 * (IV vector is not used.) 840 */ 841MODE_KEY(RC4, 0, 8, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef) 842MODE_IV(RC4, 0, 1, 0x00) 843MODE_PT(RC4, 0, 8, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef) 844MODE_CT(RC4, 0, 8, 0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96) 845 846MODE_KEY(RC4, 1, 8, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef) 847MODE_IV(RC4, 1, 1, 0x00) 848MODE_PT(RC4, 1, 8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 849MODE_CT(RC4, 1, 8, 0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79) 850 851MODE_KEY(RC4, 2, 8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 852MODE_IV(RC4, 2, 1, 0x00) 853MODE_PT(RC4, 2, 8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 854MODE_CT(RC4, 2, 8, 0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a) 855 856MODE_KEY(RC4, 3, 4, 0xef,0x01,0x23,0x45) 857MODE_IV(RC4, 3, 1, 0x00) 858MODE_PT(RC4, 3, 20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 859 0x00,0x00,0x00,0x00) 860MODE_CT(RC4, 3, 20, 0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba, 861 0x36,0xb6,0x78,0x58) 862 863MODE_KEY(RC4, 4, 4, 0xef,0x01,0x23,0x45) 864MODE_IV(RC4, 4, 1, 0x00) 865MODE_PT(RC4, 4, 10, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) 866MODE_CT(RC4, 4, 10, 0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61) 867 868MODE_TEST(RC4, 5) 869 870/* 871 * XTS-AES Mode. 872 * Vectors from http://csrc.nist.gov/groups/STM/cavp/documents/aes/XTSTestVectors.zip 873 */ 874MODE_KEY(XTS, 0, 32, 0x46,0xe6,0xed,0x9e,0xf4,0x2d,0xcd,0xb3, /* Combined key */ 875 0xc8,0x93,0x09,0x3c,0x28,0xe1,0xfc,0x0f, 876 0x91,0xf5,0xca,0xa3,0xb6,0xe0,0xbc,0x5a, 877 0x14,0xe7,0x83,0x21,0x5c,0x1d,0x5b,0x61) 878MODE_IV(XTS, 0, 16, 0x72,0xf3,0xb0,0x54,0xcb,0xdc,0x2f,0x9e, 879 0x3c,0x5b,0xc5,0x51,0xd4,0x4d,0xdb,0xa0) 880MODE_PT(XTS, 0, 16, 0xe3,0x77,0x8d,0x68,0xe7,0x30,0xef,0x94, 881 0x5b,0x4a,0xe3,0xbc,0x5b,0x93,0x6b,0xdd) 882MODE_CT(XTS, 0, 16, 0x97,0x40,0x9f,0x1f,0x71,0xae,0x45,0x21, 883 0xcb,0x49,0xa3,0x29,0x73,0xde,0x4d,0x05) 884 885MODE_KEY(XTS, 1, 32, 0xc1,0x7c,0x37,0x2b,0x56,0x26,0x91,0x6d, /* Combined key */ 886 0x98,0xc0,0x26,0x29,0xf5,0xd2,0x76,0x47, 887 0x45,0x57,0xe3,0xfe,0xaa,0x75,0x78,0x36, 888 0x34,0xd5,0x5f,0x15,0x4e,0x0a,0x8d,0x18) 889MODE_IV(XTS, 1, 16, 0xdc,0x05,0x22,0x15,0xba,0x65,0x5c,0xce, 890 0x70,0x7e,0x51,0x3d,0x54,0x3a,0x50,0x85) 891MODE_PT(XTS, 1, 32, 0xe9,0xb9,0xe2,0x9f,0xdf,0xa1,0xaf,0x53, 892 0x5a,0x1e,0xc5,0x0e,0xd9,0x20,0x4f,0x75, 893 0xc6,0x2f,0x40,0xa9,0xa1,0x9e,0x50,0x49, 894 0xcc,0x10,0x48,0xe7,0x04,0x7b,0x8a,0xcb) 895MODE_CT(XTS, 1, 32, 0xb7,0xb4,0x16,0xa5,0x6c,0xc3,0x2f,0x75, 896 0x3c,0x25,0x9b,0x94,0x3e,0xa0,0x7a,0x9d, 897 0xc0,0x30,0x84,0x0c,0x80,0x55,0x83,0x1e, 898 0x22,0x31,0xf7,0xbf,0xbd,0x0a,0x73,0x4b) 899 900MODE_TEST(XTS, 2) 901 902/* XXX Need test vectors for the following: */ 903/* 904MODE_NOTEST(F8) 905MODE_NOTEST(LRW) 906*/ 907#endif /* #if 0 */ 908 909/* 910 * Mode test functions array. 911 */ 912static testFunction_t modeTestFunctions[] = { 913 { testMode_aes_128_ecb, "aes-128-ecb" }, 914 { testMode_aes_192_ecb, "aes-192-ecb" }, 915 { testMode_aes_256_ecb, "aes-256-ecb" }, 916 { testMode_aes_128_cbc, "aes-128-cbc" }, 917 { testMode_aes_192_cbc, "aes-192-cbc" }, 918 { testMode_aes_256_cbc, "aes-256-cbc" }, 919#if 0 920 { testModeCFB, "CFB" }, 921 { testModeCTR, "CTR" }, 922 { testModeF8, "F8" }, 923 { testModeLRW, "LRW" }, 924 { testModeOFB, "OFB" }, 925 { testModeXTS, "XTS" }, 926 { testModeRC4, "RC4" }, 927#endif 928 { testMode_aes_128_cfb8, "aes-128-cfb8" }, 929 { testMode_aes_192_cfb8, "aes-192-cfb8" }, 930 { testMode_aes_256_cfb8, "aes-256-cfb8" }, 931}; 932#define numModeTestFunctions (sizeof(modeTestFunctions) / sizeof(modeTestFunctions[0])) 933 934static int 935testAllModes(void) 936{ 937 unsigned i; 938 int err = 0; 939 int prev_fail = fail; 940 941 for (i = 0; i < numModeTestFunctions; i++) { 942 if (NULL == modeTestFunctions[i].description) continue; 943 if (verbose) printf("[BEGIN] %s\n", modeTestFunctions[i].description); 944 err = modeTestFunctions[i].funcptr(); 945 total++; 946 if (err) { 947 fail++; 948 if (verbose) printf("[FAIL] %s\n", modeTestFunctions[i].description); 949 } else { 950 pass++; 951 if (verbose) printf("[PASS] %s\n", modeTestFunctions[i].description); 952 } 953 } 954 return (fail - prev_fail); 955} 956 957 958static struct option args[] = { 959 { "help", no_argument, NULL, 'h' }, 960 { "quite", no_argument, NULL, 'q' }, 961 { 0, 0, 0, 0 } 962}; 963 964static void 965usage (int ret) 966{ 967 fprintf(stderr, "usage: %s [--quite/-q] [--help/-h]\n", getprogname()); 968 exit (ret); 969} 970 971int 972main(int argc, char **argv) 973{ 974 int i, idx = 0, rv = 0; 975 976 setprogname(argv[0]); 977 978 while(1) { 979 int c = getopt_long(argc, argv, "hq", args, &idx); 980 981 if (c == -1) 982 break; 983 switch (c) { 984 case 'q': 985 verbose = 0; 986 break; 987 case 'h': 988 usage(0); 989 break; 990 case '?': 991 default: 992 usage(-1); 993 break; 994 } 995 } 996 997 /* 998 argc -= idx; 999 argv += idx; 1000 */ 1001 1002 if (verbose) printf("[TEST] Cryptor KATs\n"); 1003 rv = testAllCryptors() + testAllModes(); 1004 if (verbose) { 1005 printf("[SUMMARY]\n"); 1006 printf("Total: %d\n", total); 1007 printf("passed: %d\n", pass); 1008 printf("failed: %d\n", fail); 1009 } 1010 1011 return (rv); 1012} 1013 1014