1 /* 2 * Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 /* 11 * Internal tests for the chacha module. EVP tests would exercise 12 * complete 32-byte blocks. This test goes per byte... 13 */ 14 15 #include <string.h> 16 #include <openssl/opensslconf.h> 17 #include "testutil.h" 18 #include "crypto/chacha.h" 19 20 static const unsigned int key[] = { 21 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c, 22 0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c 23 }; 24 25 static const unsigned int ivp[] = { 26 0x00000000, 0x00000000, 0x03020100, 0x07060504 27 }; 28 29 static const unsigned char ref[] = { 30 0xf7, 0x98, 0xa1, 0x89, 0xf1, 0x95, 0xe6, 0x69, 31 0x82, 0x10, 0x5f, 0xfb, 0x64, 0x0b, 0xb7, 0x75, 32 0x7f, 0x57, 0x9d, 0xa3, 0x16, 0x02, 0xfc, 0x93, 33 0xec, 0x01, 0xac, 0x56, 0xf8, 0x5a, 0xc3, 0xc1, 34 0x34, 0xa4, 0x54, 0x7b, 0x73, 0x3b, 0x46, 0x41, 35 0x30, 0x42, 0xc9, 0x44, 0x00, 0x49, 0x17, 0x69, 36 0x05, 0xd3, 0xbe, 0x59, 0xea, 0x1c, 0x53, 0xf1, 37 0x59, 0x16, 0x15, 0x5c, 0x2b, 0xe8, 0x24, 0x1a, 38 0x38, 0x00, 0x8b, 0x9a, 0x26, 0xbc, 0x35, 0x94, 39 0x1e, 0x24, 0x44, 0x17, 0x7c, 0x8a, 0xde, 0x66, 40 0x89, 0xde, 0x95, 0x26, 0x49, 0x86, 0xd9, 0x58, 41 0x89, 0xfb, 0x60, 0xe8, 0x46, 0x29, 0xc9, 0xbd, 42 0x9a, 0x5a, 0xcb, 0x1c, 0xc1, 0x18, 0xbe, 0x56, 43 0x3e, 0xb9, 0xb3, 0xa4, 0xa4, 0x72, 0xf8, 0x2e, 44 0x09, 0xa7, 0xe7, 0x78, 0x49, 0x2b, 0x56, 0x2e, 45 0xf7, 0x13, 0x0e, 0x88, 0xdf, 0xe0, 0x31, 0xc7, 46 0x9d, 0xb9, 0xd4, 0xf7, 0xc7, 0xa8, 0x99, 0x15, 47 0x1b, 0x9a, 0x47, 0x50, 0x32, 0xb6, 0x3f, 0xc3, 48 0x85, 0x24, 0x5f, 0xe0, 0x54, 0xe3, 0xdd, 0x5a, 49 0x97, 0xa5, 0xf5, 0x76, 0xfe, 0x06, 0x40, 0x25, 50 0xd3, 0xce, 0x04, 0x2c, 0x56, 0x6a, 0xb2, 0xc5, 51 0x07, 0xb1, 0x38, 0xdb, 0x85, 0x3e, 0x3d, 0x69, 52 0x59, 0x66, 0x09, 0x96, 0x54, 0x6c, 0xc9, 0xc4, 53 0xa6, 0xea, 0xfd, 0xc7, 0x77, 0xc0, 0x40, 0xd7, 54 0x0e, 0xaf, 0x46, 0xf7, 0x6d, 0xad, 0x39, 0x79, 55 0xe5, 0xc5, 0x36, 0x0c, 0x33, 0x17, 0x16, 0x6a, 56 0x1c, 0x89, 0x4c, 0x94, 0xa3, 0x71, 0x87, 0x6a, 57 0x94, 0xdf, 0x76, 0x28, 0xfe, 0x4e, 0xaa, 0xf2, 58 0xcc, 0xb2, 0x7d, 0x5a, 0xaa, 0xe0, 0xad, 0x7a, 59 0xd0, 0xf9, 0xd4, 0xb6, 0xad, 0x3b, 0x54, 0x09, 60 0x87, 0x46, 0xd4, 0x52, 0x4d, 0x38, 0x40, 0x7a, 61 0x6d, 0xeb, 0x3a, 0xb7, 0x8f, 0xab, 0x78, 0xc9, 62 0x42, 0x13, 0x66, 0x8b, 0xbb, 0xd3, 0x94, 0xc5, 63 0xde, 0x93, 0xb8, 0x53, 0x17, 0x8a, 0xdd, 0xd6, 64 0xb9, 0x7f, 0x9f, 0xa1, 0xec, 0x3e, 0x56, 0xc0, 65 0x0c, 0x9d, 0xdf, 0xf0, 0xa4, 0x4a, 0x20, 0x42, 66 0x41, 0x17, 0x5a, 0x4c, 0xab, 0x0f, 0x96, 0x1b, 67 0xa5, 0x3e, 0xde, 0x9b, 0xdf, 0x96, 0x0b, 0x94, 68 0xf9, 0x82, 0x9b, 0x1f, 0x34, 0x14, 0x72, 0x64, 69 0x29, 0xb3, 0x62, 0xc5, 0xb5, 0x38, 0xe3, 0x91, 70 0x52, 0x0f, 0x48, 0x9b, 0x7e, 0xd8, 0xd2, 0x0a, 71 0xe3, 0xfd, 0x49, 0xe9, 0xe2, 0x59, 0xe4, 0x43, 72 0x97, 0x51, 0x4d, 0x61, 0x8c, 0x96, 0xc4, 0x84, 73 0x6b, 0xe3, 0xc6, 0x80, 0xbd, 0xc1, 0x1c, 0x71, 74 0xdc, 0xbb, 0xe2, 0x9c, 0xcf, 0x80, 0xd6, 0x2a, 75 0x09, 0x38, 0xfa, 0x54, 0x93, 0x91, 0xe6, 0xea, 76 0x57, 0xec, 0xbe, 0x26, 0x06, 0x79, 0x0e, 0xc1, 77 0x5d, 0x22, 0x24, 0xae, 0x30, 0x7c, 0x14, 0x42, 78 0x26, 0xb7, 0xc4, 0xe8, 0xc2, 0xf9, 0x7d, 0x2a, 79 0x1d, 0x67, 0x85, 0x2d, 0x29, 0xbe, 0xba, 0x11, 80 0x0e, 0xdd, 0x44, 0x51, 0x97, 0x01, 0x20, 0x62, 81 0xa3, 0x93, 0xa9, 0xc9, 0x28, 0x03, 0xad, 0x3b, 82 0x4f, 0x31, 0xd7, 0xbc, 0x60, 0x33, 0xcc, 0xf7, 83 0x93, 0x2c, 0xfe, 0xd3, 0xf0, 0x19, 0x04, 0x4d, 84 0x25, 0x90, 0x59, 0x16, 0x77, 0x72, 0x86, 0xf8, 85 0x2f, 0x9a, 0x4c, 0xc1, 0xff, 0xe4, 0x30, 0xff, 86 0xd1, 0xdc, 0xfc, 0x27, 0xde, 0xed, 0x32, 0x7b, 87 0x9f, 0x96, 0x30, 0xd2, 0xfa, 0x96, 0x9f, 0xb6, 88 0xf0, 0x60, 0x3c, 0xd1, 0x9d, 0xd9, 0xa9, 0x51, 89 0x9e, 0x67, 0x3b, 0xcf, 0xcd, 0x90, 0x14, 0x12, 90 0x52, 0x91, 0xa4, 0x46, 0x69, 0xef, 0x72, 0x85, 91 0xe7, 0x4e, 0xd3, 0x72, 0x9b, 0x67, 0x7f, 0x80, 92 0x1c, 0x3c, 0xdf, 0x05, 0x8c, 0x50, 0x96, 0x31, 93 0x68, 0xb4, 0x96, 0x04, 0x37, 0x16, 0xc7, 0x30, 94 0x7c, 0xd9, 0xe0, 0xcd, 0xd1, 0x37, 0xfc, 0xcb, 95 0x0f, 0x05, 0xb4, 0x7c, 0xdb, 0xb9, 0x5c, 0x5f, 96 0x54, 0x83, 0x16, 0x22, 0xc3, 0x65, 0x2a, 0x32, 97 0xb2, 0x53, 0x1f, 0xe3, 0x26, 0xbc, 0xd6, 0xe2, 98 0xbb, 0xf5, 0x6a, 0x19, 0x4f, 0xa1, 0x96, 0xfb, 99 0xd1, 0xa5, 0x49, 0x52, 0x11, 0x0f, 0x51, 0xc7, 100 0x34, 0x33, 0x86, 0x5f, 0x76, 0x64, 0xb8, 0x36, 101 0x68, 0x5e, 0x36, 0x64, 0xb3, 0xd8, 0x44, 0x4a, 102 0xf8, 0x9a, 0x24, 0x28, 0x05, 0xe1, 0x8c, 0x97, 103 0x5f, 0x11, 0x46, 0x32, 0x49, 0x96, 0xfd, 0xe1, 104 0x70, 0x07, 0xcf, 0x3e, 0x6e, 0x8f, 0x4e, 0x76, 105 0x40, 0x22, 0x53, 0x3e, 0xdb, 0xfe, 0x07, 0xd4, 106 0x73, 0x3e, 0x48, 0xbb, 0x37, 0x2d, 0x75, 0xb0, 107 0xef, 0x48, 0xec, 0x98, 0x3e, 0xb7, 0x85, 0x32, 108 0x16, 0x1c, 0xc5, 0x29, 0xe5, 0xab, 0xb8, 0x98, 109 0x37, 0xdf, 0xcc, 0xa6, 0x26, 0x1d, 0xbb, 0x37, 110 0xc7, 0xc5, 0xe6, 0xa8, 0x74, 0x78, 0xbf, 0x41, 111 0xee, 0x85, 0xa5, 0x18, 0xc0, 0xf4, 0xef, 0xa9, 112 0xbd, 0xe8, 0x28, 0xc5, 0xa7, 0x1b, 0x8e, 0x46, 113 0x59, 0x7b, 0x63, 0x4a, 0xfd, 0x20, 0x4d, 0x3c, 114 0x50, 0x13, 0x34, 0x23, 0x9c, 0x34, 0x14, 0x28, 115 0x5e, 0xd7, 0x2d, 0x3a, 0x91, 0x69, 0xea, 0xbb, 116 0xd4, 0xdc, 0x25, 0xd5, 0x2b, 0xb7, 0x51, 0x6d, 117 0x3b, 0xa7, 0x12, 0xd7, 0x5a, 0xd8, 0xc0, 0xae, 118 0x5d, 0x49, 0x3c, 0x19, 0xe3, 0x8a, 0x77, 0x93, 119 0x9e, 0x7a, 0x05, 0x8d, 0x71, 0x3e, 0x9c, 0xcc, 120 0xca, 0x58, 0x04, 0x5f, 0x43, 0x6b, 0x43, 0x4b, 121 0x1c, 0x80, 0xd3, 0x65, 0x47, 0x24, 0x06, 0xe3, 122 0x92, 0x95, 0x19, 0x87, 0xdb, 0x69, 0x05, 0xc8, 123 0x0d, 0x43, 0x1d, 0xa1, 0x84, 0x51, 0x13, 0x5b, 124 0xe7, 0xe8, 0x2b, 0xca, 0xb3, 0x58, 0xcb, 0x39, 125 0x71, 0xe6, 0x14, 0x05, 0xb2, 0xff, 0x17, 0x98, 126 0x0d, 0x6e, 0x7e, 0x67, 0xe8, 0x61, 0xe2, 0x82, 127 0x01, 0xc1, 0xee, 0x30, 0xb4, 0x41, 0x04, 0x0f, 128 0xd0, 0x68, 0x78, 0xd6, 0x50, 0x42, 0xc9, 0x55, 129 0x82, 0xa4, 0x31, 0x82, 0x07, 0xbf, 0xc7, 0x00, 130 0xbe, 0x0c, 0xe3, 0x28, 0x89, 0xae, 0xc2, 0xff, 131 0xe5, 0x08, 0x5e, 0x89, 0x67, 0x91, 0x0d, 0x87, 132 0x9f, 0xa0, 0xe8, 0xc0, 0xff, 0x85, 0xfd, 0xc5, 133 0x10, 0xb9, 0xff, 0x2f, 0xbf, 0x87, 0xcf, 0xcb, 134 0x29, 0x57, 0x7d, 0x68, 0x09, 0x9e, 0x04, 0xff, 135 0xa0, 0x5f, 0x75, 0x2a, 0x73, 0xd3, 0x77, 0xc7, 136 0x0d, 0x3a, 0x8b, 0xc2, 0xda, 0x80, 0xe6, 0xe7, 137 0x80, 0xec, 0x05, 0x71, 0x82, 0xc3, 0x3a, 0xd1, 138 0xde, 0x38, 0x72, 0x52, 0x25, 0x8a, 0x1e, 0x18, 139 0xe6, 0xfa, 0xd9, 0x10, 0x32, 0x7c, 0xe7, 0xf4, 140 0x2f, 0xd1, 0xe1, 0xe0, 0x51, 0x5f, 0x95, 0x86, 141 0xe2, 0xf2, 0xef, 0xcb, 0x9f, 0x47, 0x2b, 0x1d, 142 0xbd, 0xba, 0xc3, 0x54, 0xa4, 0x16, 0x21, 0x51, 143 0xe9, 0xd9, 0x2c, 0x79, 0xfb, 0x08, 0xbb, 0x4d, 144 0xdc, 0x56, 0xf1, 0x94, 0x48, 0xc0, 0x17, 0x5a, 145 0x46, 0xe2, 0xe6, 0xc4, 0x91, 0xfe, 0xc7, 0x14, 146 0x19, 0xaa, 0x43, 0xa3, 0x49, 0xbe, 0xa7, 0x68, 147 0xa9, 0x2c, 0x75, 0xde, 0x68, 0xfd, 0x95, 0x91, 148 0xe6, 0x80, 0x67, 0xf3, 0x19, 0x70, 0x94, 0xd3, 149 0xfb, 0x87, 0xed, 0x81, 0x78, 0x5e, 0xa0, 0x75, 150 0xe4, 0xb6, 0x5e, 0x3e, 0x4c, 0x78, 0xf8, 0x1d, 151 0xa9, 0xb7, 0x51, 0xc5, 0xef, 0xe0, 0x24, 0x15, 152 0x23, 0x01, 0xc4, 0x8e, 0x63, 0x24, 0x5b, 0x55, 153 0x6c, 0x4c, 0x67, 0xaf, 0xf8, 0x57, 0xe5, 0xea, 154 0x15, 0xa9, 0x08, 0xd8, 0x3a, 0x1d, 0x97, 0x04, 155 0xf8, 0xe5, 0x5e, 0x73, 0x52, 0xb2, 0x0b, 0x69, 156 0x4b, 0xf9, 0x97, 0x02, 0x98, 0xe6, 0xb5, 0xaa, 157 0xd3, 0x3e, 0xa2, 0x15, 0x5d, 0x10, 0x5d, 0x4e 158 }; 159 160 static int test_cha_cha_internal(int n) 161 { 162 unsigned char buf[sizeof(ref)]; 163 unsigned int i = n + 1, j; 164 165 memset(buf, 0, i); 166 memcpy(buf + i, ref + i, sizeof(ref) - i); 167 168 ChaCha20_ctr32(buf, buf, i, key, ivp); 169 170 /* 171 * Idea behind checking for whole sizeof(ref) is that if 172 * ChaCha20_ctr32 oversteps i-th byte, then we'd know 173 */ 174 for (j = 0; j < sizeof(ref); j++) 175 if (!TEST_uchar_eq(buf[j], ref[j])) { 176 TEST_info("%d failed at %u (%02x)\n", i, j, buf[j]); 177 return 0; 178 } 179 return 1; 180 } 181 182 int setup_tests(void) 183 { 184 #ifdef OPENSSL_CPUID_OBJ 185 OPENSSL_cpuid_setup(); 186 #endif 187 188 ADD_ALL_TESTS(test_cha_cha_internal, sizeof(ref)); 189 return 1; 190 } 191