1 1.1 riastrad /* $NetBSD: chacha_selftest.c,v 1.1 2020/07/25 22:46:34 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /*- 4 1.1 riastrad * Copyright (c) 2020 The NetBSD Foundation, Inc. 5 1.1 riastrad * All rights reserved. 6 1.1 riastrad * 7 1.1 riastrad * Redistribution and use in source and binary forms, with or without 8 1.1 riastrad * modification, are permitted provided that the following conditions 9 1.1 riastrad * are met: 10 1.1 riastrad * 1. Redistributions of source code must retain the above copyright 11 1.1 riastrad * notice, this list of conditions and the following disclaimer. 12 1.1 riastrad * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 riastrad * notice, this list of conditions and the following disclaimer in the 14 1.1 riastrad * documentation and/or other materials provided with the distribution. 15 1.1 riastrad * 16 1.1 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 riastrad * POSSIBILITY OF SUCH DAMAGE. 27 1.1 riastrad */ 28 1.1 riastrad 29 1.1 riastrad #include "chacha_impl.h" 30 1.1 riastrad 31 1.1 riastrad #ifdef _KERNEL 33 1.1 riastrad 34 1.1 riastrad #include <lib/libkern/libkern.h> 35 1.1 riastrad 36 1.1 riastrad #else 37 1.1 riastrad 38 1.1 riastrad #include <stdio.h> 39 1.1 riastrad #include <string.h> 40 1.1 riastrad 41 1.1 riastrad static void 42 1.1 riastrad hexdump(int (*prf)(const char *, ...) __printflike(1,2), const char *prefix, 43 1.1 riastrad const void *buf, size_t len) 44 1.1 riastrad { 45 1.1 riastrad const uint8_t *p = buf; 46 1.1 riastrad size_t i; 47 1.1 riastrad 48 1.1 riastrad (*prf)("%s (%zu bytes @ %p)\n", prefix, len, buf); 49 1.1 riastrad for (i = 0; i < len; i++) { 50 1.1 riastrad if (i % 16 == 8) 51 1.1 riastrad (*prf)(" "); 52 1.1 riastrad else 53 1.1 riastrad (*prf)(" "); 54 1.1 riastrad (*prf)("%02hhx", p[i]); 55 1.1 riastrad if ((i + 1) % 16 == 0) 56 1.1 riastrad (*prf)("\n"); 57 1.1 riastrad } 58 1.1 riastrad if (i % 16) 59 1.1 riastrad (*prf)("\n"); 60 1.1 riastrad } 61 1.1 riastrad 62 1.1 riastrad #endif 63 1.1 riastrad 64 1.1 riastrad /* https://tools.ietf.org/html/draft-strombergson-chacha-test-vectors-00 */ 66 1.1 riastrad static int 67 1.1 riastrad chacha_core_selftest(const struct chacha_impl *ci) 68 1.1 riastrad { 69 1.1 riastrad /* TC1, 32-byte key, rounds=12, keystream block 1 */ 70 1.1 riastrad static const uint8_t zero[32]; 71 1.1 riastrad static const uint8_t expected0[64] = { 72 1.1 riastrad 0x9b,0xf4,0x9a,0x6a, 0x07,0x55,0xf9,0x53, 73 1.1 riastrad 0x81,0x1f,0xce,0x12, 0x5f,0x26,0x83,0xd5, 74 1.1 riastrad 0x04,0x29,0xc3,0xbb, 0x49,0xe0,0x74,0x14, 75 1.1 riastrad 0x7e,0x00,0x89,0xa5, 0x2e,0xae,0x15,0x5f, 76 1.1 riastrad 0x05,0x64,0xf8,0x79, 0xd2,0x7a,0xe3,0xc0, 77 1.1 riastrad 0x2c,0xe8,0x28,0x34, 0xac,0xfa,0x8c,0x79, 78 1.1 riastrad 0x3a,0x62,0x9f,0x2c, 0xa0,0xde,0x69,0x19, 79 1.1 riastrad 0x61,0x0b,0xe8,0x2f, 0x41,0x13,0x26,0xbe, 80 1.1 riastrad }; 81 1.1 riastrad /* TC7, 32-byte key, rounds=12, keystream block 2 */ 82 1.1 riastrad static const uint8_t k1[32] = { 83 1.1 riastrad 0x00,0x11,0x22,0x33, 0x44,0x55,0x66,0x77, 84 1.1 riastrad 0x88,0x99,0xaa,0xbb, 0xcc,0xdd,0xee,0xff, 85 1.1 riastrad 0xff,0xee,0xdd,0xcc, 0xbb,0xaa,0x99,0x88, 86 1.1 riastrad 0x77,0x66,0x55,0x44, 0x33,0x22,0x11,0x00, 87 1.1 riastrad }; 88 1.1 riastrad static const uint8_t in1[16] = { 89 1.1 riastrad 0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 90 1.1 riastrad 0x0f,0x1e,0x2d,0x3c, 0x4b,0x59,0x68,0x77, 91 1.1 riastrad }; 92 1.1 riastrad static const uint8_t expected1[64] = { 93 1.1 riastrad 0xcd,0x9a,0x2a,0xa9, 0xea,0x93,0xc2,0x67, 94 1.1 riastrad 0x5e,0x82,0x88,0x14, 0x08,0xde,0x85,0x2c, 95 1.1 riastrad 0x62,0xfa,0x74,0x6a, 0x30,0xe5,0x2b,0x45, 96 1.1 riastrad 0xa2,0x69,0x62,0xcf, 0x43,0x51,0xe3,0x04, 97 1.1 riastrad 0xd3,0x13,0x20,0xbb, 0xd6,0xaa,0x6c,0xc8, 98 1.1 riastrad 0xf3,0x26,0x37,0xf9, 0x59,0x34,0xe4,0xc1, 99 1.1 riastrad 0x45,0xef,0xd5,0x62, 0x31,0xef,0x31,0x61, 100 1.1 riastrad 0x03,0x28,0x36,0xf4, 0x96,0x71,0x83,0x3e, 101 1.1 riastrad }; 102 1.1 riastrad uint8_t out[64]; 103 1.1 riastrad int result = 0; 104 1.1 riastrad 105 1.1 riastrad (*ci->ci_chacha_core)(out, zero, zero, chacha_const32, 12); 106 1.1 riastrad if (memcmp(out, expected0, 64)) { 107 1.1 riastrad hexdump(printf, "chacha core 1", out, sizeof out); 108 1.1 riastrad result = -1; 109 1.1 riastrad } 110 1.1 riastrad 111 1.1 riastrad (*ci->ci_chacha_core)(out, in1, k1, chacha_const32, 12); 112 1.1 riastrad if (memcmp(out, expected1, 64)) { 113 1.1 riastrad hexdump(printf, "chacha core 2", out, sizeof out); 114 1.1 riastrad result = -1; 115 1.1 riastrad } 116 1.1 riastrad 117 1.1 riastrad return result; 118 1.1 riastrad } 119 1.1 riastrad 120 1.1 riastrad static int 122 1.1 riastrad hchacha_selftest(const struct chacha_impl *ci) 123 1.1 riastrad { 124 1.1 riastrad /* https://tools.ietf.org/html/draft-irtf-cfrg-xchacha-03, 2.2.1 */ 125 1.1 riastrad static const uint8_t k[32] = { 126 1.1 riastrad 0x00,0x01,0x02,0x03, 0x04,0x05,0x06,0x07, 127 1.1 riastrad 0x08,0x09,0x0a,0x0b, 0x0c,0x0d,0x0e,0x0f, 128 1.1 riastrad 0x10,0x11,0x12,0x13, 0x14,0x15,0x16,0x17, 129 1.1 riastrad 0x18,0x19,0x1a,0x1b, 0x1c,0x1d,0x1e,0x1f, 130 1.1 riastrad }; 131 1.1 riastrad static const uint8_t in[16] = { 132 1.1 riastrad 0x00,0x00,0x00,0x09, 0x00,0x00,0x00,0x4a, 133 1.1 riastrad 0x00,0x00,0x00,0x00, 0x31,0x41,0x59,0x27, 134 1.1 riastrad }; 135 1.1 riastrad static const uint8_t expected[32] = { 136 1.1 riastrad 0x82,0x41,0x3b,0x42, 0x27,0xb2,0x7b,0xfe, 137 1.1 riastrad 0xd3,0x0e,0x42,0x50, 0x8a,0x87,0x7d,0x73, 138 1.1 riastrad 0xa0,0xf9,0xe4,0xd5, 0x8a,0x74,0xa8,0x53, 139 1.1 riastrad 0xc1,0x2e,0xc4,0x13, 0x26,0xd3,0xec,0xdc, 140 1.1 riastrad }; 141 1.1 riastrad uint8_t out[32]; 142 1.1 riastrad int result = 0; 143 1.1 riastrad 144 1.1 riastrad (*ci->ci_hchacha)(out, in, k, chacha_const32, 20); 145 1.1 riastrad if (memcmp(out, expected, 32)) { 146 1.1 riastrad hexdump(printf, "hchacha", out, sizeof out); 147 1.1 riastrad result = -1; 148 1.1 riastrad } 149 1.1 riastrad 150 1.1 riastrad return result; 151 1.1 riastrad } 152 1.1 riastrad 153 1.1 riastrad static int 155 1.1 riastrad chacha_stream_selftest(const struct chacha_impl *ci) 156 1.1 riastrad { 157 1.1 riastrad 158 1.1 riastrad /* XXX */ 159 1.1 riastrad return 0; 160 1.1 riastrad } 161 1.1 riastrad 162 1.1 riastrad static int 164 1.1 riastrad xchacha_stream_selftest(const struct chacha_impl *ci) 165 1.1 riastrad { 166 1.1 riastrad /* https://tools.ietf.org/html/draft-irtf-cfrg-xchacha-03, A.2.1 */ 167 1.1 riastrad static const uint8_t k[32] = { 168 1.1 riastrad 0x80,0x81,0x82,0x83, 0x84,0x85,0x86,0x87, 169 1.1 riastrad 0x88,0x89,0x8a,0x8b, 0x8c,0x8d,0x8e,0x8f, 170 1.1 riastrad 0x90,0x91,0x92,0x93, 0x94,0x95,0x96,0x97, 171 1.1 riastrad 0x98,0x99,0x9a,0x9b, 0x9c,0x9d,0x9e,0x9f, 172 1.1 riastrad }; 173 1.1 riastrad static const uint8_t nonce[24] = { 174 1.1 riastrad 0x40,0x41,0x42,0x43, 0x44,0x45,0x46,0x47, 175 1.1 riastrad 0x48,0x49,0x4a,0x4b, 0x4c,0x4d,0x4e,0x4f, 176 1.1 riastrad 0x50,0x51,0x52,0x53, 0x54,0x55,0x56,0x58, 177 1.1 riastrad }; 178 1.1 riastrad static const uint8_t p[608] = { 179 1.1 riastrad 0x54,0x68,0x65,0x20, 0x64,0x68,0x6f,0x6c, 180 1.1 riastrad 0x65,0x20,0x28,0x70, 0x72,0x6f,0x6e,0x6f, 181 1.1 riastrad 0x75,0x6e,0x63,0x65, 0x64,0x20,0x22,0x64, 182 1.1 riastrad 0x6f,0x6c,0x65,0x22, 0x29,0x20,0x69,0x73, 183 1.1 riastrad 0x20,0x61,0x6c,0x73, 0x6f,0x20,0x6b,0x6e, 184 1.1 riastrad 0x6f,0x77,0x6e,0x20, 0x61,0x73,0x20,0x74, 185 1.1 riastrad 0x68,0x65,0x20,0x41, 0x73,0x69,0x61,0x74, 186 1.1 riastrad 0x69,0x63,0x20,0x77, 0x69,0x6c,0x64,0x20, 187 1.1 riastrad 0x64,0x6f,0x67,0x2c, 0x20,0x72,0x65,0x64, 188 1.1 riastrad 0x20,0x64,0x6f,0x67, 0x2c,0x20,0x61,0x6e, 189 1.1 riastrad 0x64,0x20,0x77,0x68, 0x69,0x73,0x74,0x6c, 190 1.1 riastrad 0x69,0x6e,0x67,0x20, 0x64,0x6f,0x67,0x2e, 191 1.1 riastrad 0x20,0x49,0x74,0x20, 0x69,0x73,0x20,0x61, 192 1.1 riastrad 0x62,0x6f,0x75,0x74, 0x20,0x74,0x68,0x65, 193 1.1 riastrad 0x20,0x73,0x69,0x7a, 0x65,0x20,0x6f,0x66, 194 1.1 riastrad 0x20,0x61,0x20,0x47, 0x65,0x72,0x6d,0x61, 195 1.1 riastrad 0x6e,0x20,0x73,0x68, 0x65,0x70,0x68,0x65, 196 1.1 riastrad 0x72,0x64,0x20,0x62, 0x75,0x74,0x20,0x6c, 197 1.1 riastrad 0x6f,0x6f,0x6b,0x73, 0x20,0x6d,0x6f,0x72, 198 1.1 riastrad 0x65,0x20,0x6c,0x69, 0x6b,0x65,0x20,0x61, 199 1.1 riastrad 0x20,0x6c,0x6f,0x6e, 0x67,0x2d,0x6c,0x65, 200 1.1 riastrad 0x67,0x67,0x65,0x64, 0x20,0x66,0x6f,0x78, 201 1.1 riastrad 0x2e,0x20,0x54,0x68, 0x69,0x73,0x20,0x68, 202 1.1 riastrad 0x69,0x67,0x68,0x6c, 0x79,0x20,0x65,0x6c, 203 1.1 riastrad 0x75,0x73,0x69,0x76, 0x65,0x20,0x61,0x6e, 204 1.1 riastrad 0x64,0x20,0x73,0x6b, 0x69,0x6c,0x6c,0x65, 205 1.1 riastrad 0x64,0x20,0x6a,0x75, 0x6d,0x70,0x65,0x72, 206 1.1 riastrad 0x20,0x69,0x73,0x20, 0x63,0x6c,0x61,0x73, 207 1.1 riastrad 0x73,0x69,0x66,0x69, 0x65,0x64,0x20,0x77, 208 1.1 riastrad 0x69,0x74,0x68,0x20, 0x77,0x6f,0x6c,0x76, 209 1.1 riastrad 0x65,0x73,0x2c,0x20, 0x63,0x6f,0x79,0x6f, 210 1.1 riastrad 0x74,0x65,0x73,0x2c, 0x20,0x6a,0x61,0x63, 211 1.1 riastrad 0x6b,0x61,0x6c,0x73, 0x2c,0x20,0x61,0x6e, 212 1.1 riastrad 0x64,0x20,0x66,0x6f, 0x78,0x65,0x73,0x20, 213 1.1 riastrad 0x69,0x6e,0x20,0x74, 0x68,0x65,0x20,0x74, 214 1.1 riastrad 0x61,0x78,0x6f,0x6e, 0x6f,0x6d,0x69,0x63, 215 1.1 riastrad 0x20,0x66,0x61,0x6d, 0x69,0x6c,0x79,0x20, 216 1.1 riastrad 0x43,0x61,0x6e,0x69, 0x64,0x61,0x65,0x2e, 217 1.1 riastrad 218 1.1 riastrad 0x54,0x68,0x65,0x20, 0x64,0x68,0x6f,0x6c, 219 1.1 riastrad 0x65,0x20,0x28,0x70, 0x72,0x6f,0x6e,0x6f, 220 1.1 riastrad 0x75,0x6e,0x63,0x65, 0x64,0x20,0x22,0x64, 221 1.1 riastrad 0x6f,0x6c,0x65,0x22, 0x29,0x20,0x69,0x73, 222 1.1 riastrad 0x20,0x61,0x6c,0x73, 0x6f,0x20,0x6b,0x6e, 223 1.1 riastrad 0x6f,0x77,0x6e,0x20, 0x61,0x73,0x20,0x74, 224 1.1 riastrad 0x68,0x65,0x20,0x41, 0x73,0x69,0x61,0x74, 225 1.1 riastrad 0x69,0x63,0x20,0x77, 0x69,0x6c,0x64,0x20, 226 1.1 riastrad 0x64,0x6f,0x67,0x2c, 0x20,0x72,0x65,0x64, 227 1.1 riastrad 0x20,0x64,0x6f,0x67, 0x2c,0x20,0x61,0x6e, 228 1.1 riastrad 0x64,0x20,0x77,0x68, 0x69,0x73,0x74,0x6c, 229 1.1 riastrad 0x69,0x6e,0x67,0x20, 0x64,0x6f,0x67,0x2e, 230 1.1 riastrad 0x20,0x49,0x74,0x20, 0x69,0x73,0x20,0x61, 231 1.1 riastrad 0x62,0x6f,0x75,0x74, 0x20,0x74,0x68,0x65, 232 1.1 riastrad 0x20,0x73,0x69,0x7a, 0x65,0x20,0x6f,0x66, 233 1.1 riastrad 0x20,0x61,0x20,0x47, 0x65,0x72,0x6d,0x61, 234 1.1 riastrad 0x6e,0x20,0x73,0x68, 0x65,0x70,0x68,0x65, 235 1.1 riastrad 0x72,0x64,0x20,0x62, 0x75,0x74,0x20,0x6c, 236 1.1 riastrad 0x6f,0x6f,0x6b,0x73, 0x20,0x6d,0x6f,0x72, 237 1.1 riastrad 0x65,0x20,0x6c,0x69, 0x6b,0x65,0x20,0x61, 238 1.1 riastrad 0x20,0x6c,0x6f,0x6e, 0x67,0x2d,0x6c,0x65, 239 1.1 riastrad 0x67,0x67,0x65,0x64, 0x20,0x66,0x6f,0x78, 240 1.1 riastrad 0x2e,0x20,0x54,0x68, 0x69,0x73,0x20,0x68, 241 1.1 riastrad 0x69,0x67,0x68,0x6c, 0x79,0x20,0x65,0x6c, 242 1.1 riastrad 0x75,0x73,0x69,0x76, 0x65,0x20,0x61,0x6e, 243 1.1 riastrad 0x64,0x20,0x73,0x6b, 0x69,0x6c,0x6c,0x65, 244 1.1 riastrad 0x64,0x20,0x6a,0x75, 0x6d,0x70,0x65,0x72, 245 1.1 riastrad 0x20,0x69,0x73,0x20, 0x63,0x6c,0x61,0x73, 246 1.1 riastrad 0x73,0x69,0x66,0x69, 0x65,0x64,0x20,0x77, 247 1.1 riastrad 0x69,0x74,0x68,0x20, 0x77,0x6f,0x6c,0x76, 248 1.1 riastrad 0x65,0x73,0x2c,0x20, 0x63,0x6f,0x79,0x6f, 249 1.1 riastrad 0x74,0x65,0x73,0x2c, 0x20,0x6a,0x61,0x63, 250 1.1 riastrad 0x6b,0x61,0x6c,0x73, 0x2c,0x20,0x61,0x6e, 251 1.1 riastrad 0x64,0x20,0x66,0x6f, 0x78,0x65,0x73,0x20, 252 1.1 riastrad 0x69,0x6e,0x20,0x74, 0x68,0x65,0x20,0x74, 253 1.1 riastrad 0x61,0x78,0x6f,0x6e, 0x6f,0x6d,0x69,0x63, 254 1.1 riastrad 0x20,0x66,0x61,0x6d, 0x69,0x6c,0x79,0x20, 255 1.1 riastrad 0x43,0x61,0x6e,0x69, 0x64,0x61,0x65,0x2e, 256 1.1 riastrad }; 257 1.1 riastrad static const uint8_t expected[608] = { 258 1.1 riastrad 0x45,0x59,0xab,0xba, 0x4e,0x48,0xc1,0x61, 259 1.1 riastrad 0x02,0xe8,0xbb,0x2c, 0x05,0xe6,0x94,0x7f, 260 1.1 riastrad 0x50,0xa7,0x86,0xde, 0x16,0x2f,0x9b,0x0b, 261 1.1 riastrad 0x7e,0x59,0x2a,0x9b, 0x53,0xd0,0xd4,0xe9, 262 1.1 riastrad 0x8d,0x8d,0x64,0x10, 0xd5,0x40,0xa1,0xa6, 263 1.1 riastrad 0x37,0x5b,0x26,0xd8, 0x0d,0xac,0xe4,0xfa, 264 1.1 riastrad 0xb5,0x23,0x84,0xc7, 0x31,0xac,0xbf,0x16, 265 1.1 riastrad 0xa5,0x92,0x3c,0x0c, 0x48,0xd3,0x57,0x5d, 266 1.1 riastrad 0x4d,0x0d,0x2c,0x67, 0x3b,0x66,0x6f,0xaa, 267 1.1 riastrad 0x73,0x10,0x61,0x27, 0x77,0x01,0x09,0x3a, 268 1.1 riastrad 0x6b,0xf7,0xa1,0x58, 0xa8,0x86,0x42,0x92, 269 1.1 riastrad 0xa4,0x1c,0x48,0xe3, 0xa9,0xb4,0xc0,0xda, 270 1.1 riastrad 0xec,0xe0,0xf8,0xd9, 0x8d,0x0d,0x7e,0x05, 271 1.1 riastrad 0xb3,0x7a,0x30,0x7b, 0xbb,0x66,0x33,0x31, 272 1.1 riastrad 0x64,0xec,0x9e,0x1b, 0x24,0xea,0x0d,0x6c, 273 1.1 riastrad 0x3f,0xfd,0xdc,0xec, 0x4f,0x68,0xe7,0x44, 274 1.1 riastrad 0x30,0x56,0x19,0x3a, 0x03,0xc8,0x10,0xe1, 275 1.1 riastrad 0x13,0x44,0xca,0x06, 0xd8,0xed,0x8a,0x2b, 276 1.1 riastrad 0xfb,0x1e,0x8d,0x48, 0xcf,0xa6,0xbc,0x0e, 277 1.1 riastrad 0xb4,0xe2,0x46,0x4b, 0x74,0x81,0x42,0x40, 278 1.1 riastrad 0x7c,0x9f,0x43,0x1a, 0xee,0x76,0x99,0x60, 279 1.1 riastrad 0xe1,0x5b,0xa8,0xb9, 0x68,0x90,0x46,0x6e, 280 1.1 riastrad 0xf2,0x45,0x75,0x99, 0x85,0x23,0x85,0xc6, 281 1.1 riastrad 0x61,0xf7,0x52,0xce, 0x20,0xf9,0xda,0x0c, 282 1.1 riastrad 0x09,0xab,0x6b,0x19, 0xdf,0x74,0xe7,0x6a, 283 1.1 riastrad 0x95,0x96,0x74,0x46, 0xf8,0xd0,0xfd,0x41, 284 1.1 riastrad 0x5e,0x7b,0xee,0x2a, 0x12,0xa1,0x14,0xc2, 285 1.1 riastrad 0x0e,0xb5,0x29,0x2a, 0xe7,0xa3,0x49,0xae, 286 1.1 riastrad 0x57,0x78,0x20,0xd5, 0x52,0x0a,0x1f,0x3f, 287 1.1 riastrad 0xb6,0x2a,0x17,0xce, 0x6a,0x7e,0x68,0xfa, 288 1.1 riastrad 0x7c,0x79,0x11,0x1d, 0x88,0x60,0x92,0x0b, 289 1.1 riastrad 0xc0,0x48,0xef,0x43, 0xfe,0x84,0x48,0x6c, 290 1.1 riastrad 0xcb,0x87,0xc2,0x5f, 0x0a,0xe0,0x45,0xf0, 291 1.1 riastrad 0xcc,0xe1,0xe7,0x98, 0x9a,0x9a,0xa2,0x20, 292 1.1 riastrad 0xa2,0x8b,0xdd,0x48, 0x27,0xe7,0x51,0xa2, 293 1.1 riastrad 0x4a,0x6d,0x5c,0x62, 0xd7,0x90,0xa6,0x63, 294 1.1 riastrad 0x93,0xb9,0x31,0x11, 0xc1,0xa5,0x5d,0xd7, 295 1.1 riastrad 0x42,0x1a,0x10,0x18, 0x49,0x74,0xc7,0xc5, 296 1.1 riastrad 297 1.1 riastrad 0x08,0x38,0x2d,0x64, 0x35,0x8d,0x21,0x77, 298 1.1 riastrad 0x2e,0xb9,0x73,0xa8, 0x8f,0xb6,0x2b,0xf8, 299 1.1 riastrad 0xce,0xfa,0xb4,0xca, 0x6f,0x0c,0x26,0xbb, 300 1.1 riastrad 0x7f,0xd6,0x6d,0xb2, 0xa0,0xbe,0xb0,0x5a, 301 1.1 riastrad 0x1a,0x6e,0x39,0xcb, 0xd5,0xda,0xf2,0xfc, 302 1.1 riastrad 0x0b,0x74,0x31,0x3d, 0x2e,0xcd,0x5f,0x94, 303 1.1 riastrad 0xc2,0x9f,0x30,0xdb, 0x11,0x5e,0x41,0x53, 304 1.1 riastrad 0x8c,0x6d,0x30,0xba, 0x97,0xa0,0xc5,0x07, 305 1.1 riastrad 0x70,0x78,0x02,0x5a, 0xc1,0x69,0x70,0x8f, 306 1.1 riastrad 0x22,0x85,0xcb,0x98, 0xbc,0x6a,0x51,0xfb, 307 1.1 riastrad 0xc6,0xa7,0xc3,0x3d, 0x76,0xe4,0x93,0x9a, 308 1.1 riastrad 0x21,0xe2,0xc6,0x12, 0xe1,0x3a,0xcc,0xfb, 309 1.1 riastrad 0x6f,0xa6,0x57,0xc0, 0x09,0x8c,0x6f,0xf3, 310 1.1 riastrad 0x8d,0x83,0x21,0x1b, 0x71,0xa9,0xc1,0x93, 311 1.1 riastrad 0x88,0x35,0xfc,0x18, 0x1f,0x94,0xa2,0x57, 312 1.1 riastrad 0x3a,0x4e,0xd0,0xc0, 0xbc,0x92,0xa7,0x9c, 313 1.1 riastrad 0x52,0x8a,0x82,0x9d, 0x44,0x75,0x7b,0xa0, 314 1.1 riastrad 0xcf,0x3d,0x2d,0xbf, 0xf9,0x6f,0x71,0x56, 315 1.1 riastrad 0x38,0xb0,0x63,0x5e, 0x55,0xcd,0x28,0x12, 316 1.1 riastrad 0xc5,0xea,0x52,0xf4, 0xdc,0xf7,0xdc,0x3d, 317 1.1 riastrad 0xd8,0x96,0x09,0xe8, 0x2a,0xcc,0x00,0x16, 318 1.1 riastrad 0x88,0x77,0x82,0x10, 0xed,0x7d,0xd8,0x8b, 319 1.1 riastrad 0xf5,0xd3,0xe1,0xfc, 0x49,0x66,0x36,0x8d, 320 1.1 riastrad 0x55,0xd2,0x33,0xb8, 0x6d,0xff,0xe3,0xd3, 321 1.1 riastrad 0x55,0x80,0x0e,0xd8, 0x95,0x32,0x32,0x55, 322 1.1 riastrad 0x83,0xe7,0x58,0x6f, 0xec,0xc3,0x8c,0xf8, 323 1.1 riastrad 0x52,0x16,0xdc,0x0d, 0x29,0x02,0xe5,0x27, 324 1.1 riastrad 0x35,0xc2,0xbb,0xe2, 0xe2,0x3b,0xf5,0x19, 325 1.1 riastrad 0xcd,0x44,0x83,0xe8, 0x21,0x55,0xd0,0x10, 326 1.1 riastrad 0x15,0x68,0x8e,0x46, 0xa3,0x2f,0xa5,0x7c, 327 1.1 riastrad 0xa8,0x2c,0xc6,0x8f, 0x14,0xcd,0xb3,0x79, 328 1.1 riastrad 0x92,0x32,0x71,0xac, 0xd9,0xaf,0x9c,0x4d, 329 1.1 riastrad 0x00,0x88,0xd1,0x42, 0xd5,0x23,0xfa,0xe6, 330 1.1 riastrad 0x7f,0x38,0xa2,0x56, 0x99,0xbe,0x6f,0xcf, 331 1.1 riastrad 0xe0,0xaa,0x44,0x11, 0x8a,0xc8,0x3a,0x99, 332 1.1 riastrad 0x48,0x6d,0x33,0x0e, 0x94,0xf2,0xb9,0x87, 333 1.1 riastrad 0xed,0x4f,0x6a,0x9c, 0x33,0x93,0x6d,0xe4, 334 1.1 riastrad 0x92,0x76,0xab,0xfa, 0xce,0x5b,0x17,0x14, 335 1.1 riastrad }; 336 1.1 riastrad uint8_t c[608]; 337 1.1 riastrad unsigned i; 338 1.1 riastrad int result = 0; 339 1.1 riastrad 340 1.1 riastrad /* 341 1.1 riastrad * 608 = 96 (mod 256) 342 1.1 riastrad * 607 = 95 (mod 256), = 7 (mod 8) 343 1.1 riastrad * 543 = 31 (mod 256), = 7 (mod 8) 344 1.1 riastrad * 511 = 255 (mod 256), = 7 (mod 8) 345 1.1 riastrad * 346 1.1 riastrad * This exercises several branches when there are special cases 347 1.1 riastrad * for integral numbers of 4-byte words, integral numbers of 348 1.1 riastrad * 64-byte blocks, and integral numbers of 256-byte chunks. 349 1.1 riastrad */ 350 1.1 riastrad 351 1.1 riastrad (*ci->ci_xchacha_stream)(c, 608, 0, nonce, k, 20); 352 1.1 riastrad for (i = 0; i < 608; i++) 353 1.1 riastrad c[i] ^= p[i]; 354 1.1 riastrad if (memcmp(c, expected, 608)) { 355 1.1 riastrad for (i = 0; i < 608; i++) 356 1.1 riastrad c[i] ^= p[i]; 357 1.1 riastrad hexdump(printf, "xchacha_stream", c, 608); 358 1.1 riastrad for (i = 0; i < 608; i++) 359 1.1 riastrad c[i] = expected[i] ^ p[i]; 360 1.1 riastrad hexdump(printf, "expected", c, 608); 361 1.1 riastrad result = -1; 362 1.1 riastrad } 363 1.1 riastrad 364 1.1 riastrad (*ci->ci_xchacha_stream)(c, 607, 0, nonce, k, 20); 365 1.1 riastrad for (i = 0; i < 607; i++) 366 1.1 riastrad c[i] ^= p[i]; 367 1.1 riastrad if (memcmp(c, expected, 607)) { 368 1.1 riastrad for (i = 0; i < 607; i++) 369 1.1 riastrad c[i] ^= p[i]; 370 1.1 riastrad hexdump(printf, "xchacha_stream", c, 607); 371 1.1 riastrad for (i = 0; i < 607; i++) 372 1.1 riastrad c[i] = expected[i] ^ p[i]; 373 1.1 riastrad hexdump(printf, "expected", c, 607); 374 1.1 riastrad result = -1; 375 1.1 riastrad } 376 1.1 riastrad 377 1.1 riastrad (*ci->ci_xchacha_stream)(c, 543, 0, nonce, k, 20); 378 1.1 riastrad for (i = 0; i < 543; i++) 379 1.1 riastrad c[i] ^= p[i]; 380 1.1 riastrad if (memcmp(c, expected, 543)) { 381 1.1 riastrad for (i = 0; i < 543; i++) 382 1.1 riastrad c[i] ^= p[i]; 383 1.1 riastrad hexdump(printf, "xchacha_stream", c, 543); 384 1.1 riastrad for (i = 0; i < 543; i++) 385 1.1 riastrad c[i] = expected[i] ^ p[i]; 386 1.1 riastrad hexdump(printf, "expected", c, 543); 387 1.1 riastrad result = -1; 388 1.1 riastrad } 389 1.1 riastrad 390 1.1 riastrad (*ci->ci_xchacha_stream)(c, 511, 0, nonce, k, 20); 391 1.1 riastrad for (i = 0; i < 511; i++) 392 1.1 riastrad c[i] ^= p[i]; 393 1.1 riastrad if (memcmp(c, expected, 511)) { 394 1.1 riastrad for (i = 0; i < 511; i++) 395 1.1 riastrad c[i] ^= p[i]; 396 1.1 riastrad hexdump(printf, "xchacha_stream", c, 511); 397 1.1 riastrad for (i = 0; i < 511; i++) 398 1.1 riastrad c[i] = expected[i] ^ p[i]; 399 1.1 riastrad hexdump(printf, "expected", c, 511); 400 1.1 riastrad result = -1; 401 1.1 riastrad } 402 1.1 riastrad 403 1.1 riastrad (*ci->ci_xchacha_stream)(c, 63, 0, nonce, k, 20); 404 1.1 riastrad for (i = 0; i < 63; i++) 405 1.1 riastrad c[i] ^= p[i]; 406 1.1 riastrad if (memcmp(c, expected, 63)) { 407 1.1 riastrad for (i = 0; i < 63; i++) 408 1.1 riastrad c[i] ^= p[i]; 409 1.1 riastrad hexdump(printf, "xchacha_stream", c, 63); 410 1.1 riastrad for (i = 0; i < 63; i++) 411 1.1 riastrad c[i] = expected[i] ^ p[i]; 412 1.1 riastrad hexdump(printf, "expected", c, 63); 413 1.1 riastrad result = -1; 414 1.1 riastrad } 415 1.1 riastrad 416 1.1 riastrad (*ci->ci_xchacha_stream_xor)(c, p, 608, 0, nonce, k, 20); 417 1.1 riastrad if (memcmp(c, expected, 608)) { 418 1.1 riastrad hexdump(printf, "xchacha_stream_xor", c, 608); 419 1.1 riastrad hexdump(printf, "expected", expected, 608); 420 1.1 riastrad result = -1; 421 1.1 riastrad } 422 1.1 riastrad 423 1.1 riastrad memset(c, 0, sizeof c); 424 1.1 riastrad (*ci->ci_xchacha_stream_xor)(c, p, 607, 0, nonce, k, 20); 425 1.1 riastrad if (memcmp(c, expected, 607)) { 426 1.1 riastrad hexdump(printf, "xchacha_stream_xor", c, 607); 427 1.1 riastrad hexdump(printf, "expected", expected, 607); 428 1.1 riastrad result = -1; 429 1.1 riastrad } 430 1.1 riastrad 431 1.1 riastrad memset(c, 0, sizeof c); 432 1.1 riastrad (*ci->ci_xchacha_stream_xor)(c, p, 543, 0, nonce, k, 20); 433 1.1 riastrad if (memcmp(c, expected, 543)) { 434 1.1 riastrad hexdump(printf, "xchacha_stream_xor", c, 543); 435 1.1 riastrad hexdump(printf, "expected", expected, 543); 436 1.1 riastrad result = -1; 437 1.1 riastrad } 438 1.1 riastrad 439 1.1 riastrad memset(c, 0, sizeof c); 440 1.1 riastrad (*ci->ci_xchacha_stream_xor)(c, p, 511, 0, nonce, k, 20); 441 1.1 riastrad if (memcmp(c, expected, 511)) { 442 1.1 riastrad hexdump(printf, "xchacha_stream_xor", c, 511); 443 1.1 riastrad hexdump(printf, "expected", expected, 511); 444 1.1 riastrad result = -1; 445 1.1 riastrad } 446 1.1 riastrad 447 1.1 riastrad memset(c, 0, sizeof c); 448 1.1 riastrad (*ci->ci_xchacha_stream_xor)(c, p, 63, 0, nonce, k, 20); 449 1.1 riastrad if (memcmp(c, expected, 63)) { 450 1.1 riastrad hexdump(printf, "xchacha_stream_xor", c, 63); 451 1.1 riastrad hexdump(printf, "expected", expected, 63); 452 1.1 riastrad result = -1; 453 1.1 riastrad } 454 1.1 riastrad 455 1.1 riastrad return result; 456 1.1 riastrad } 457 1.1 riastrad 458 1.1 riastrad int 460 1.1 riastrad chacha_selftest(const struct chacha_impl *ci) 461 1.1 riastrad { 462 1.1 riastrad int result = 0; 463 1.1 riastrad 464 1.1 riastrad result |= chacha_core_selftest(ci); 465 result |= chacha_stream_selftest(ci); 466 result |= hchacha_selftest(ci); 467 result |= xchacha_stream_selftest(ci); 468 469 return result; 470 } 471