test_crypto_ope.c (4538B)
1 /* Copyright (c) 2001-2004, Roger Dingledine. 2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 3 * Copyright (c) 2007-2021, The Tor Project, Inc. */ 4 /* See LICENSE for licensing information */ 5 6 #include "orconfig.h" 7 8 #define CRYPTO_OPE_PRIVATE 9 10 #include "lib/cc/compat_compiler.h" 11 #include "lib/crypt_ops/crypto_ope.h" 12 #include "lib/crypt_ops/crypto_cipher.h" 13 #include "lib/encoding/binascii.h" 14 #include "lib/malloc/malloc.h" 15 #include "test/test.h" 16 #include "tinytest.h" 17 18 #include <stddef.h> 19 #include <string.h> 20 21 static void 22 test_crypto_ope_consistency(void *arg) 23 { 24 (void)arg; 25 26 crypto_ope_t *ope = NULL; 27 crypto_cipher_t *aes = NULL; 28 const int TEST_VALS[] = { 5, 500, 1023, 1024, 1025, 2046, 2047, 2048, 2049, 29 10000, OPE_INPUT_MAX }; 30 unsigned i; 31 NONSTRING const uint8_t key[32] = "A fixed key, chosen arbitrarily."; 32 33 ope = crypto_ope_new(key); 34 tt_assert(ope); 35 36 uint64_t last_val = 0; 37 for (i = 0; i < ARRAY_LENGTH(TEST_VALS); ++i) { 38 aes = ope_get_cipher(ope, 0); 39 int val = TEST_VALS[i]; 40 uint64_t v1 = crypto_ope_encrypt(ope, val); 41 uint64_t v2 = sum_values_from_cipher(aes, val); 42 tt_u64_op(v1, OP_EQ, v2); 43 tt_u64_op(v2, OP_GT, last_val); 44 last_val = v2; 45 crypto_cipher_free(aes); 46 } 47 48 done: 49 crypto_cipher_free(aes); 50 crypto_ope_free(ope); 51 } 52 53 static void 54 test_crypto_ope_oob(void *arg) 55 { 56 (void)arg; 57 58 crypto_ope_t *ope = NULL; 59 NONSTRING const uint8_t key[32] = "A fixed key, chosen arbitrarily."; 60 ope = crypto_ope_new(key); 61 62 tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,INT_MIN)); 63 tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,-100)); 64 tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,0)); 65 tt_u64_op(UINT64_MAX, OP_NE, crypto_ope_encrypt(ope,1)); 66 tt_u64_op(UINT64_MAX, OP_NE, crypto_ope_encrypt(ope,7000)); 67 tt_u64_op(UINT64_MAX, OP_NE, crypto_ope_encrypt(ope,OPE_INPUT_MAX)); 68 tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,OPE_INPUT_MAX+1)); 69 tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,INT_MAX)); 70 done: 71 crypto_ope_free(ope); 72 } 73 74 static const char OPE_TEST_KEY[] = 75 "19e05891d55232c08c2cad91d612fdb9cbd6691949a0742434a76c80bc6992fe"; 76 77 /* generated by a separate python implementation. */ 78 static const struct { 79 int v; 80 uint64_t r; 81 } OPE_TEST_VECTORS[] = { 82 { 121132, UINT64_C(3971694514) }, 83 { 82283, UINT64_C(2695743564) }, 84 { 72661, UINT64_C(2381548866) }, 85 { 72941, UINT64_C(2390408421) }, 86 { 123122, UINT64_C(4036781069) }, 87 { 12154, UINT64_C(402067100) }, 88 { 121574, UINT64_C(3986197593) }, 89 { 11391, UINT64_C(376696838) }, 90 { 65845, UINT64_C(2161801517) }, 91 { 86301, UINT64_C(2828270975) }, 92 { 61284, UINT64_C(2013616892) }, 93 { 70505, UINT64_C(2313368870) }, 94 { 30438, UINT64_C(1001394664) }, 95 { 60150, UINT64_C(1977329668) }, 96 { 114800, UINT64_C(3764946628) }, 97 { 109403, UINT64_C(3585352477) }, 98 { 21893, UINT64_C(721388468) }, 99 { 123569, UINT64_C(4051780471) }, 100 { 95617, UINT64_C(3134921876) }, 101 { 48561, UINT64_C(1597596985) }, 102 { 53334, UINT64_C(1753691710) }, 103 { 92746, UINT64_C(3040874493) }, 104 { 7110, UINT64_C(234966492) }, 105 { 9612, UINT64_C(318326551) }, 106 { 106958, UINT64_C(3506124249) }, 107 { 46889, UINT64_C(1542219146) }, 108 { 87790, UINT64_C(2877361609) }, 109 { 68878, UINT64_C(2260369112) }, 110 { 47917, UINT64_C(1576681737) }, 111 { 121128, UINT64_C(3971553290) }, 112 { 108602, UINT64_C(3559176081) }, 113 { 28217, UINT64_C(929692460) }, 114 { 69498, UINT64_C(2280554161) }, 115 { 63870, UINT64_C(2098322675) }, 116 { 57542, UINT64_C(1891698992) }, 117 { 122148, UINT64_C(4004515805) }, 118 { 46254, UINT64_C(1521227949) }, 119 { 42850, UINT64_C(1408996941) }, 120 { 92661, UINT64_C(3037901517) }, 121 { 57720, UINT64_C(1897369989) }, 122 }; 123 124 static void 125 test_crypto_ope_vectors(void *arg) 126 { 127 (void)arg; 128 uint8_t key[32]; 129 crypto_ope_t *ope = NULL, *ope2 = NULL; 130 131 base16_decode((char*)key, 32, OPE_TEST_KEY, strlen(OPE_TEST_KEY)); 132 133 ope = crypto_ope_new(key); 134 key[8] += 1; 135 ope2 = crypto_ope_new(key); 136 unsigned i; 137 for (i = 0; i < ARRAY_LENGTH(OPE_TEST_VECTORS); ++i) { 138 int val = OPE_TEST_VECTORS[i].v; 139 uint64_t res = OPE_TEST_VECTORS[i].r; 140 141 tt_u64_op(crypto_ope_encrypt(ope, val), OP_EQ, res); 142 tt_u64_op(crypto_ope_encrypt(ope2, val), OP_NE, res); 143 } 144 done: 145 crypto_ope_free(ope); 146 crypto_ope_free(ope2); 147 } 148 149 struct testcase_t crypto_ope_tests[] = { 150 { "consistency", test_crypto_ope_consistency, 0, NULL, NULL }, 151 { "oob", test_crypto_ope_oob, 0, NULL, NULL }, 152 { "vectors", test_crypto_ope_vectors, 0, NULL, NULL }, 153 END_OF_TESTCASES 154 };