1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright (c) 2015, Joyent, Inc. 14 */ 15 16 /* 17 * Test chacha20 key stream with known TVs. 18 * 19 * Based on data from: 20 * https://tools.ietf.org/html/draft-strombergson-chacha-test-vectors-01 21 */ 22 23 #include <strings.h> 24 #include <chacha.h> 25 #include <assert.h> 26 27 /* Test Vector 1 */ 28 29 static uint8_t cha_key1[16] = { 30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 32 }; 33 static uint8_t cha_iv1[8] = { 34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 35 }; 36 static uint8_t cha_fbl1[] = { 37 0x89, 0x67, 0x09, 0x52, 0x60, 0x83, 0x64, 0xfd, 38 0x00, 0xb2, 0xf9, 0x09, 0x36, 0xf0, 0x31, 0xc8, 39 0xe7, 0x56, 0xe1, 0x5d, 0xba, 0x04, 0xb8, 0x49, 40 0x3d, 0x00, 0x42, 0x92, 0x59, 0xb2, 0x0f, 0x46, 41 0xcc, 0x04, 0xf1, 0x11, 0x24, 0x6b, 0x6c, 0x2c, 42 0xe0, 0x66, 0xbe, 0x3b, 0xfb, 0x32, 0xd9, 0xaa, 43 0x0f, 0xdd, 0xfb, 0xc1, 0x21, 0x23, 0xd4, 0xb9, 44 0xe4, 0x4f, 0x34, 0xdc, 0xa0, 0x5a, 0x10, 0x3f 45 }; 46 static uint8_t cha_sbl1[] = { 47 0x6c, 0xd1, 0x35, 0xc2, 0x87, 0x8c, 0x83, 0x2b, 48 0x58, 0x96, 0xb1, 0x34, 0xf6, 0x14, 0x2a, 0x9d, 49 0x4d, 0x8d, 0x0d, 0x8f, 0x10, 0x26, 0xd2, 0x0a, 50 0x0a, 0x81, 0x51, 0x2c, 0xbc, 0xe6, 0xe9, 0x75, 51 0x8a, 0x71, 0x43, 0xd0, 0x21, 0x97, 0x80, 0x22, 52 0xa3, 0x84, 0x14, 0x1a, 0x80, 0xce, 0xa3, 0x06, 53 0x2f, 0x41, 0xf6, 0x7a, 0x75, 0x2e, 0x66, 0xad, 54 0x34, 0x11, 0x98, 0x4c, 0x78, 0x7e, 0x30, 0xad 55 }; 56 57 /* Test Vector 2 */ 58 static uint8_t cha_key2[16] = { 59 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 61 }; 62 static uint8_t cha_iv2[8] = { 63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 64 }; 65 66 static uint8_t cha_fbl2[] = { 67 0xae, 0x56, 0x06, 0x0d, 0x04, 0xf5, 0xb5, 0x97, 68 0x89, 0x7f, 0xf2, 0xaf, 0x13, 0x88, 0xdb, 0xce, 69 0xff, 0x5a, 0x2a, 0x49, 0x20, 0x33, 0x5d, 0xc1, 70 0x7a, 0x3c, 0xb1, 0xb1, 0xb1, 0x0f, 0xbe, 0x70, 71 0xec, 0xe8, 0xf4, 0x86, 0x4d, 0x8c, 0x7c, 0xdf, 72 0x00, 0x76, 0x45, 0x3a, 0x82, 0x91, 0xc7, 0xdb, 73 0xeb, 0x3a, 0xa9, 0xc9, 0xd1, 0x0e, 0x8c, 0xa3, 74 0x6b, 0xe4, 0x44, 0x93, 0x76, 0xed, 0x7c, 0x42 75 }; 76 77 static uint8_t cha_sbl2[] = { 78 0xfc, 0x3d, 0x47, 0x1c, 0x34, 0xa3, 0x6f, 0xbb, 79 0xf6, 0x16, 0xbc, 0x0a, 0x0e, 0x7c, 0x52, 0x30, 80 0x30, 0xd9, 0x44, 0xf4, 0x3e, 0xc3, 0xe7, 0x8d, 81 0xd6, 0xa1, 0x24, 0x66, 0x54, 0x7c, 0xb4, 0xf7, 82 0xb3, 0xce, 0xbd, 0x0a, 0x50, 0x05, 0xe7, 0x62, 83 0xe5, 0x62, 0xd1, 0x37, 0x5b, 0x7a, 0xc4, 0x45, 84 0x93, 0xa9, 0x91, 0xb8, 0x5d, 0x1a, 0x60, 0xfb, 85 0xa2, 0x03, 0x5d, 0xfa, 0xa2, 0xa6, 0x42, 0xd5 86 }; 87 88 /* Test Vector 3 */ 89 static uint8_t cha_key3[] = { 90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 92 }; 93 static uint8_t cha_iv3[] = { 94 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 95 }; 96 97 static uint8_t cha_fbl3[] = { 98 0x16, 0x63, 0x87, 0x9e, 0xb3, 0xf2, 0xc9, 0x94, 99 0x9e, 0x23, 0x88, 0xca, 0xa3, 0x43, 0xd3, 0x61, 100 0xbb, 0x13, 0x27, 0x71, 0x24, 0x5a, 0xe6, 0xd0, 101 0x27, 0xca, 0x9c, 0xb0, 0x10, 0xdc, 0x1f, 0xa7, 102 0x17, 0x8d, 0xc4, 0x1f, 0x82, 0x78, 0xbc, 0x1f, 103 0x64, 0xb3, 0xf1, 0x27, 0x69, 0xa2, 0x40, 0x97, 104 0xf4, 0x0d, 0x63, 0xa8, 0x63, 0x66, 0xbd, 0xb3, 105 0x6a, 0xc0, 0x8a, 0xbe, 0x60, 0xc0, 0x7f, 0xe8 106 }; 107 108 static uint8_t cha_sbl3[] = { 109 0xb0, 0x57, 0x37, 0x5c, 0x89, 0x14, 0x44, 0x08, 110 0xcc, 0x74, 0x46, 0x24, 0xf6, 0x9f, 0x7f, 0x4c, 111 0xcb, 0xd9, 0x33, 0x66, 0xc9, 0x2f, 0xc4, 0xdf, 112 0xca, 0xda, 0x65, 0xf1, 0xb9, 0x59, 0xd8, 0xc6, 113 0x4d, 0xfc, 0x50, 0xde, 0x71, 0x1f, 0xb4, 0x64, 114 0x16, 0xc2, 0x55, 0x3c, 0xc6, 0x0f, 0x21, 0xbb, 115 0xfd, 0x00, 0x64, 0x91, 0xcb, 0x17, 0x88, 0x8b, 116 0x4f, 0xb3, 0x52, 0x1c, 0x4f, 0xdd, 0x87, 0x45 117 }; 118 119 /* Test Vector 4 */ 120 static uint8_t cha_key4[] = { 121 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 122 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 123 }; 124 125 static uint8_t cha_iv4[] = { 126 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 127 }; 128 129 static uint8_t cha_fbl4[] = { 130 0x99, 0x29, 0x47, 0xc3, 0x96, 0x61, 0x26, 0xa0, 131 0xe6, 0x60, 0xa3, 0xe9, 0x5d, 0xb0, 0x48, 0xde, 132 0x09, 0x1f, 0xb9, 0xe0, 0x18, 0x5b, 0x1e, 0x41, 133 0xe4, 0x10, 0x15, 0xbb, 0x7e, 0xe5, 0x01, 0x50, 134 0x39, 0x9e, 0x47, 0x60, 0xb2, 0x62, 0xf9, 0xd5, 135 0x3f, 0x26, 0xd8, 0xdd, 0x19, 0xe5, 0x6f, 0x5c, 136 0x50, 0x6a, 0xe0, 0xc3, 0x61, 0x9f, 0xa6, 0x7f, 137 0xb0, 0xc4, 0x08, 0x10, 0x6d, 0x02, 0x03, 0xee 138 }; 139 140 static uint8_t cha_sbl4[] = { 141 0x40, 0xea, 0x3c, 0xfa, 0x61, 0xfa, 0x32, 0xa2, 142 0xfd, 0xa8, 0xd1, 0x23, 0x8a, 0x21, 0x35, 0xd9, 143 0xd4, 0x17, 0x87, 0x75, 0x24, 0x0f, 0x99, 0x00, 144 0x70, 0x64, 0xa6, 0xa7, 0xf0, 0xc7, 0x31, 0xb6, 145 0x7c, 0x22, 0x7c, 0x52, 0xef, 0x79, 0x6b, 0x6b, 146 0xed, 0x9f, 0x90, 0x59, 0xba, 0x06, 0x14, 0xbc, 147 0xf6, 0xdd, 0x6e, 0x38, 0x91, 0x7f, 0x3b, 0x15, 148 0x0e, 0x57, 0x63, 0x75, 0xbe, 0x50, 0xed, 0x67 149 }; 150 151 /* Test Vector 5 */ 152 static uint8_t cha_key5[] = { 153 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 154 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 155 }; 156 static uint8_t cha_iv5[] = { 157 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 158 }; 159 160 static uint8_t cha_fbl5[] = { 161 0x35, 0x7d, 0x7d, 0x94, 0xf9, 0x66, 0x77, 0x8f, 162 0x58, 0x15, 0xa2, 0x05, 0x1d, 0xcb, 0x04, 0x13, 163 0x3b, 0x26, 0xb0, 0xea, 0xd9, 0xf5, 0x7d, 0xd0, 164 0x99, 0x27, 0x83, 0x7b, 0xc3, 0x06, 0x7e, 0x4b, 165 0x6b, 0xf2, 0x99, 0xad, 0x81, 0xf7, 0xf5, 0x0c, 166 0x8d, 0xa8, 0x3c, 0x78, 0x10, 0xbf, 0xc1, 0x7b, 167 0xb6, 0xf4, 0x81, 0x3a, 0xb6, 0xc3, 0x26, 0x95, 168 0x70, 0x45, 0xfd, 0x3f, 0xd5, 0xe1, 0x99, 0x15 169 }; 170 171 static uint8_t cha_sbl5[] = { 172 0xec, 0x74, 0x4a, 0x6b, 0x9b, 0xf8, 0xcb, 0xdc, 173 0xb3, 0x6d, 0x8b, 0x6a, 0x54, 0x99, 0xc6, 0x8a, 174 0x08, 0xef, 0x7b, 0xe6, 0xcc, 0x1e, 0x93, 0xf2, 175 0xf5, 0xbc, 0xd2, 0xca, 0xd4, 0xe4, 0x7c, 0x18, 176 0xa3, 0xe5, 0xd9, 0x4b, 0x56, 0x66, 0x38, 0x2c, 177 0x6d, 0x13, 0x0d, 0x82, 0x2d, 0xd5, 0x6a, 0xac, 178 0xb0, 0xf8, 0x19, 0x52, 0x78, 0xe7, 0xb2, 0x92, 179 0x49, 0x5f, 0x09, 0x86, 0x8d, 0xdf, 0x12, 0xcc 180 }; 181 182 /* Test Vector 6 */ 183 184 static uint8_t cha_key6[] = { 185 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 186 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa 187 }; 188 static uint8_t cha_iv6[] = { 189 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa 190 }; 191 192 static uint8_t cha_fbl6[] = { 193 0xfc, 0x79, 0xac, 0xbd, 0x58, 0x52, 0x61, 0x03, 194 0x86, 0x27, 0x76, 0xaa, 0xb2, 0x0f, 0x3b, 0x7d, 195 0x8d, 0x31, 0x49, 0xb2, 0xfa, 0xb6, 0x57, 0x66, 196 0x29, 0x93, 0x16, 0xb6, 0xe5, 0xb1, 0x66, 0x84, 197 0xde, 0x5d, 0xe5, 0x48, 0xc1, 0xb7, 0xd0, 0x83, 198 0xef, 0xd9, 0xe3, 0x05, 0x23, 0x19, 0xe0, 0xc6, 199 0x25, 0x41, 0x41, 0xda, 0x04, 0xa6, 0x58, 0x6d, 200 0xf8, 0x00, 0xf6, 0x4d, 0x46, 0xb0, 0x1c, 0x87 201 }; 202 203 static uint8_t cha_sbl6[] = { 204 0x1f, 0x05, 0xbc, 0x67, 0xe0, 0x76, 0x28, 0xeb, 205 0xe6, 0xf6, 0x86, 0x5a, 0x21, 0x77, 0xe0, 0xb6, 206 0x6a, 0x55, 0x8a, 0xa7, 0xcc, 0x1e, 0x8f, 0xf1, 207 0xa9, 0x8d, 0x27, 0xf7, 0x07, 0x1f, 0x83, 0x35, 208 0xef, 0xce, 0x45, 0x37, 0xbb, 0x0e, 0xf7, 0xb5, 209 0x73, 0xb3, 0x2f, 0x32, 0x76, 0x5f, 0x29, 0x00, 210 0x7d, 0xa5, 0x3b, 0xba, 0x62, 0xe7, 0xa4, 0x4d, 211 0x00, 0x6f, 0x41, 0xeb, 0x28, 0xfe, 0x15, 0xd6 212 }; 213 214 /* Test Vector 7 */ 215 static uint8_t cha_key7[] = { 216 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 217 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff 218 }; 219 static uint8_t cha_iv7[] = { 220 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78 221 }; 222 223 static uint8_t cha_fbl7[] = { 224 0xd1, 0xab, 0xf6, 0x30, 0x46, 0x7e, 0xb4, 0xf6, 225 0x7f, 0x1c, 0xfb, 0x47, 0xcd, 0x62, 0x6a, 0xae, 226 0x8a, 0xfe, 0xdb, 0xbe, 0x4f, 0xf8, 0xfc, 0x5f, 227 0xe9, 0xcf, 0xae, 0x30, 0x7e, 0x74, 0xed, 0x45, 228 0x1f, 0x14, 0x04, 0x42, 0x5a, 0xd2, 0xb5, 0x45, 229 0x69, 0xd5, 0xf1, 0x81, 0x48, 0x93, 0x99, 0x71, 230 0xab, 0xb8, 0xfa, 0xfc, 0x88, 0xce, 0x4a, 0xc7, 231 0xfe, 0x1c, 0x3d, 0x1f, 0x7a, 0x1e, 0xb7, 0xca 232 }; 233 234 static uint8_t cha_sbl7[] = { 235 0xe7, 0x6c, 0xa8, 0x7b, 0x61, 0xa9, 0x71, 0x35, 236 0x41, 0x49, 0x77, 0x60, 0xdd, 0x9a, 0xe0, 0x59, 237 0x35, 0x0c, 0xad, 0x0d, 0xce, 0xdf, 0xaa, 0x80, 238 0xa8, 0x83, 0x11, 0x9a, 0x1a, 0x6f, 0x98, 0x7f, 239 0xd1, 0xce, 0x91, 0xfd, 0x8e, 0xe0, 0x82, 0x80, 240 0x34, 0xb4, 0x11, 0x20, 0x0a, 0x97, 0x45, 0xa2, 241 0x85, 0x55, 0x44, 0x75, 0xd1, 0x2a, 0xfc, 0x04, 242 0x88, 0x7f, 0xef, 0x35, 0x16, 0xd1, 0x2a, 0x2c 243 }; 244 245 /* Test Vector 8 */ 246 static uint8_t cha_key8[] = { 247 0xc4, 0x6e, 0xc1, 0xb1, 0x8c, 0xe8, 0xa8, 0x78, 248 0x72, 0x5a, 0x37, 0xe7, 0x80, 0xdf, 0xb7, 0x35 249 }; 250 static uint8_t cha_iv8[] = { 251 0x1a, 0xda, 0x31, 0xd5, 0xcf, 0x68, 0x82, 0x21 252 }; 253 254 static uint8_t cha_fbl8[] = { 255 0x82, 0x6a, 0xbd, 0xd8, 0x44, 0x60, 0xe2, 0xe9, 256 0x34, 0x9f, 0x0e, 0xf4, 0xaf, 0x5b, 0x17, 0x9b, 257 0x42, 0x6e, 0x4b, 0x2d, 0x10, 0x9a, 0x9c, 0x5b, 258 0xb4, 0x40, 0x00, 0xae, 0x51, 0xbe, 0xa9, 0x0a, 259 0x49, 0x6b, 0xee, 0xef, 0x62, 0xa7, 0x68, 0x50, 260 0xff, 0x3f, 0x04, 0x02, 0xc4, 0xdd, 0xc9, 0x9f, 261 0x6d, 0xb0, 0x7f, 0x15, 0x1c, 0x1c, 0x0d, 0xfa, 262 0xc2, 0xe5, 0x65, 0x65, 0xd6, 0x28, 0x96, 0x25 263 }; 264 265 static uint8_t cha_sbl8[] = { 266 0x5b, 0x23, 0x13, 0x2e, 0x7b, 0x46, 0x9c, 0x7b, 267 0xfb, 0x88, 0xfa, 0x95, 0xd4, 0x4c, 0xa5, 0xae, 268 0x3e, 0x45, 0xe8, 0x48, 0xa4, 0x10, 0x8e, 0x98, 269 0xba, 0xd7, 0xa9, 0xeb, 0x15, 0x51, 0x27, 0x84, 270 0xa6, 0xa9, 0xe6, 0xe5, 0x91, 0xdc, 0xe6, 0x74, 271 0x12, 0x0a, 0xca, 0xf9, 0x04, 0x0f, 0xf5, 0x0f, 272 0xf3, 0xac, 0x30, 0xcc, 0xfb, 0x5e, 0x14, 0x20, 273 0x4f, 0x5e, 0x42, 0x68, 0xb9, 0x0a, 0x88, 0x04 274 }; 275 276 static void 277 chacha_test(uint8_t *key, uint8_t keylen, uint8_t *iv, uint8_t *bl0, 278 uint8_t *bl1) 279 { 280 uint8_t res0[64], res1[64]; 281 chacha_ctx_t ctx; 282 int ret; 283 284 bzero(&ctx, sizeof (ctx)); 285 bzero(res0, sizeof (res0)); 286 bzero(res1, sizeof (res1)); 287 chacha_keysetup(&ctx, key, keylen * 8, 0); 288 chacha_ivsetup(&ctx, iv); 289 chacha_encrypt_bytes(&ctx, res0, res0, sizeof (res0)); 290 chacha_encrypt_bytes(&ctx, res1, res1, sizeof (res1)); 291 ret = bcmp(res0, bl0, sizeof (res0)); 292 assert(ret == 0); 293 ret = bcmp(res1, bl1, sizeof (res0)); 294 assert(ret == 0); 295 } 296 297 int 298 main(void) 299 { 300 chacha_test(cha_key1, sizeof (cha_key1), cha_iv1, cha_fbl1, cha_sbl1); 301 chacha_test(cha_key2, sizeof (cha_key2), cha_iv2, cha_fbl2, cha_sbl2); 302 chacha_test(cha_key3, sizeof (cha_key3), cha_iv3, cha_fbl3, cha_sbl3); 303 chacha_test(cha_key4, sizeof (cha_key4), cha_iv4, cha_fbl4, cha_sbl4); 304 chacha_test(cha_key5, sizeof (cha_key5), cha_iv5, cha_fbl5, cha_sbl5); 305 chacha_test(cha_key6, sizeof (cha_key6), cha_iv6, cha_fbl6, cha_sbl6); 306 chacha_test(cha_key7, sizeof (cha_key7), cha_iv7, cha_fbl7, cha_sbl7); 307 chacha_test(cha_key8, sizeof (cha_key8), cha_iv8, cha_fbl8, cha_sbl8); 308 return (0); 309 } 310