1 /* 2 * Copyright (c) 2022 Yubico AB. All rights reserved. 3 * Use of this source code is governed by a BSD-style 4 * license that can be found in the LICENSE file. 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8 #undef NDEBUG 9 10 #include <assert.h> 11 #include <string.h> 12 13 #include <openssl/sha.h> 14 15 #define _FIDO_INTERNAL 16 17 #include <fido.h> 18 19 /* 20 * zlib compressed data (RFC1950); see https://www.ietf.org/rfc/rfc6713.txt 21 */ 22 static /* const */ unsigned char rfc1950_blob[694] = { 23 0x78, 0x9c, 0xb5, 0x52, 0x3b, 0x6f, 0xdb, 0x30, 24 0x10, 0xde, 0xf5, 0x2b, 0x0e, 0x99, 0x12, 0x40, 25 0x75, 0x13, 0x4f, 0x45, 0x3b, 0xd1, 0x12, 0x6d, 26 0x1d, 0x20, 0x8b, 0x2a, 0x49, 0xd9, 0xf5, 0x28, 27 0x4b, 0x4c, 0x42, 0xc0, 0x12, 0x03, 0x3d, 0x12, 28 0xe4, 0xdf, 0xf7, 0xc8, 0x3a, 0x88, 0xd3, 0x0c, 29 0x9d, 0xea, 0xc1, 0x3e, 0xf3, 0x8e, 0xdf, 0xeb, 30 0x98, 0xb8, 0xa7, 0xd7, 0xc1, 0x3e, 0x3c, 0x4e, 31 0x70, 0xdd, 0xdc, 0xc0, 0xf2, 0xf6, 0xee, 0xdb, 32 0x97, 0xe5, 0xed, 0x72, 0x09, 0x87, 0xf9, 0x68, 33 0x1b, 0x07, 0x6c, 0xb5, 0x00, 0x76, 0x3a, 0x41, 34 0x18, 0x19, 0x61, 0x30, 0xa3, 0x19, 0x9e, 0x4d, 35 0xbb, 0x88, 0x22, 0x69, 0x5a, 0x3b, 0x4e, 0x83, 36 0x3d, 0xce, 0x93, 0x75, 0x3d, 0xd4, 0x7d, 0x0b, 37 0xf3, 0x68, 0xc0, 0xf6, 0x30, 0xba, 0x79, 0x68, 38 0x4c, 0x38, 0x39, 0xda, 0xbe, 0x1e, 0x5e, 0xe1, 39 0xde, 0x0d, 0xdd, 0x18, 0xc3, 0x8b, 0x9d, 0x1e, 40 0xc1, 0x0d, 0xe1, 0xd7, 0xcd, 0x53, 0xd4, 0xb9, 41 0xd6, 0xde, 0xdb, 0xa6, 0xf6, 0x00, 0x31, 0xd4, 42 0x83, 0x81, 0x27, 0x33, 0x74, 0x76, 0x9a, 0x4c, 43 0x0b, 0x4f, 0x83, 0x7b, 0xb6, 0x2d, 0x15, 0xd3, 44 0x63, 0x3d, 0xd1, 0x97, 0x21, 0x90, 0xd3, 0xc9, 45 0xbd, 0xd8, 0xfe, 0x01, 0x1a, 0xd7, 0xb7, 0xd6, 46 0x5f, 0x1a, 0xfd, 0xa5, 0xa8, 0x33, 0xd3, 0xf7, 47 0x28, 0x02, 0x80, 0xbb, 0x05, 0x7c, 0x54, 0x35, 48 0x82, 0xbb, 0x7f, 0x93, 0xd3, 0xb8, 0xd6, 0x40, 49 0x37, 0x8f, 0x13, 0x99, 0x98, 0x6a, 0x92, 0xe9, 50 0x31, 0xeb, 0xa3, 0x7b, 0xf6, 0xad, 0x73, 0x06, 51 0x1e, 0x84, 0x3e, 0xbd, 0x9b, 0x6c, 0x63, 0x62, 52 0x9a, 0xb0, 0x23, 0x9c, 0x08, 0xcf, 0xc3, 0x5c, 53 0x92, 0xf6, 0xed, 0x5f, 0x8a, 0x88, 0xb4, 0x39, 54 0xd5, 0xb6, 0x33, 0xc3, 0xc2, 0x63, 0x2c, 0x3f, 55 0x0b, 0x21, 0xc2, 0x8b, 0x30, 0xde, 0x84, 0x90, 56 0xcb, 0x76, 0x26, 0x71, 0xff, 0x47, 0x0b, 0x91, 57 0x9e, 0x51, 0xfc, 0x44, 0xeb, 0x9a, 0xb9, 0x33, 58 0xfd, 0x54, 0xbf, 0xed, 0xeb, 0x2b, 0xad, 0xc2, 59 0x51, 0x67, 0x80, 0xae, 0x9e, 0xcc, 0x60, 0xeb, 60 0xd3, 0xf8, 0x1e, 0x7b, 0xd8, 0x15, 0x35, 0xcf, 61 0x00, 0x97, 0x66, 0x68, 0xf9, 0x3a, 0x43, 0x05, 62 0x4a, 0xac, 0xf5, 0x9e, 0x49, 0x0e, 0x54, 0x97, 63 0x52, 0xec, 0x30, 0xe5, 0x29, 0xac, 0x0e, 0xa0, 64 0x33, 0x0e, 0x89, 0x28, 0x0f, 0x12, 0x37, 0x99, 65 0x86, 0x4c, 0xe4, 0x29, 0x97, 0x0a, 0x58, 0x91, 66 0xd2, 0x69, 0xa1, 0x25, 0xae, 0x2a, 0x2d, 0xa4, 67 0x8a, 0xae, 0x98, 0xa2, 0x9b, 0x57, 0xa1, 0xc1, 68 0x8a, 0x03, 0xf0, 0x5f, 0xa5, 0xe4, 0x4a, 0x81, 69 0x90, 0x80, 0xdb, 0x32, 0x47, 0x02, 0x23, 0x74, 70 0xc9, 0x0a, 0x8d, 0x5c, 0xc5, 0x80, 0x45, 0x92, 71 0x57, 0x29, 0x16, 0x9b, 0x18, 0x08, 0x00, 0x0a, 72 0xa1, 0xa3, 0x1c, 0xb7, 0xa8, 0x69, 0x4c, 0x8b, 73 0x38, 0x90, 0x7e, 0xbe, 0x06, 0x62, 0x0d, 0x5b, 74 0x2e, 0x93, 0x8c, 0xfe, 0xb2, 0x15, 0xe6, 0xa8, 75 0x0f, 0x81, 0x6f, 0x8d, 0xba, 0xf0, 0x5c, 0x6b, 76 0x21, 0x23, 0x06, 0x25, 0x93, 0x1a, 0x93, 0x2a, 77 0x67, 0x12, 0xca, 0x4a, 0x96, 0x42, 0x71, 0xf0, 78 0xb6, 0x52, 0x54, 0x49, 0xce, 0x70, 0xcb, 0xd3, 79 0x05, 0xb1, 0x13, 0x23, 0xf0, 0x1d, 0x2f, 0x34, 80 0xa8, 0x8c, 0xe5, 0xf9, 0x47, 0x97, 0xd1, 0x1f, 81 0x97, 0x5e, 0xfb, 0xa5, 0x47, 0x58, 0x71, 0xc8, 82 0x91, 0xad, 0x72, 0xee, 0x99, 0x82, 0xcb, 0x14, 83 0x25, 0x4f, 0xb4, 0xb7, 0xf3, 0x5e, 0x25, 0x94, 84 0x1c, 0xe9, 0xcb, 0xe3, 0x48, 0x95, 0x3c, 0x41, 85 0x2a, 0x28, 0x0c, 0x4e, 0x66, 0x98, 0x3c, 0xc4, 86 0x67, 0x4c, 0xc5, 0x7f, 0x56, 0x34, 0x44, 0x4d, 87 0x48, 0xd9, 0x96, 0x6d, 0xc8, 0xdb, 0xf5, 0x3f, 88 0x22, 0xa1, 0x9d, 0x24, 0x95, 0xe4, 0x5b, 0xaf, 89 0x99, 0x72, 0x50, 0xd5, 0x4a, 0x69, 0xd4, 0x95, 90 0xe6, 0xb0, 0x11, 0x22, 0x0d, 0x41, 0x2b, 0x2e, 91 0x77, 0x98, 0x70, 0xf5, 0x03, 0x72, 0xa1, 0x42, 92 0x5a, 0x95, 0xe2, 0x71, 0x94, 0x32, 0xcd, 0x02, 93 0x31, 0x41, 0x50, 0x54, 0xd4, 0xa6, 0x7a, 0x55, 94 0x29, 0x0c, 0xa1, 0x61, 0xa1, 0xb9, 0x94, 0x55, 95 0xa9, 0x51, 0x14, 0x37, 0xb4, 0xdf, 0x3d, 0xc5, 96 0x42, 0x1a, 0x19, 0x5d, 0x4d, 0x43, 0xba, 0xa2, 97 0xf0, 0x56, 0xe9, 0x91, 0x70, 0x21, 0x0f, 0x1e, 98 0xd4, 0x67, 0x10, 0xc2, 0x8f, 0x61, 0x9f, 0x71, 99 0x3a, 0x97, 0x3e, 0xd0, 0x90, 0x14, 0xf3, 0x11, 100 0x28, 0x4a, 0x2c, 0xd1, 0x97, 0x63, 0xc4, 0x47, 101 0x01, 0xea, 0xe8, 0xdd, 0x23, 0x14, 0x7c, 0x93, 102 0xe3, 0x86, 0x17, 0x09, 0xf7, 0x5d, 0xe1, 0x51, 103 0xf6, 0xa8, 0xf8, 0x0d, 0xed, 0x0a, 0x95, 0x1f, 104 0xc0, 0x40, 0x4b, 0xdb, 0x27, 0xce, 0x2a, 0x58, 105 0xf6, 0x3b, 0x22, 0x55, 0x51, 0x28, 0x2f, 0x5e, 106 0x6c, 0x1c, 0x36, 0x09, 0xb8, 0x06, 0x96, 0xee, 107 0xd0, 0xcb, 0x3e, 0x0f, 0xd3, 0xee, 0x15, 0x9e, 108 0xdf, 0x49, 0x88, 0x2c, 0xc9, 0xce, 0x71, 0x2f, 109 0xa2, 0xdf, 0xdf, 0xd7, 0x8e, 0x9c, 110 }; 111 112 /* 113 * expected sha256 of rfc1950_blob after decompression 114 */ 115 static const unsigned char rfc1950_blob_hash[SHA256_DIGEST_LENGTH] = { 116 0x61, 0xc0, 0x4e, 0x14, 0x01, 0xb6, 0xc5, 0x2d, 117 0xba, 0x15, 0xf6, 0x27, 0x4c, 0xa1, 0xcc, 0xfc, 118 0x39, 0xed, 0xd7, 0x12, 0xb6, 0x02, 0x3d, 0xb6, 119 0xd9, 0x85, 0xd0, 0x10, 0x9f, 0xe9, 0x3e, 0x75, 120 121 }; 122 123 static const size_t rfc1950_blob_origsiz = 1322; 124 125 static /* const */ unsigned char random_words[515] = { 126 0x61, 0x74, 0x68, 0x69, 0x72, 0x73, 0x74, 0x20, 127 0x54, 0x68, 0x6f, 0x20, 0x63, 0x6f, 0x74, 0x20, 128 0x73, 0x70, 0x6f, 0x66, 0x66, 0x79, 0x20, 0x4a, 129 0x61, 0x76, 0x61, 0x6e, 0x20, 0x62, 0x72, 0x65, 130 0x64, 0x65, 0x73, 0x20, 0x4c, 0x41, 0x4d, 0x20, 131 0x6d, 0x69, 0x73, 0x2d, 0x68, 0x75, 0x6d, 0x69, 132 0x6c, 0x69, 0x74, 0x79, 0x20, 0x73, 0x70, 0x69, 133 0x67, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x76, 0x6f, 134 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x6c, 0x79, 0x20, 135 0x49, 0x6f, 0x64, 0x61, 0x6d, 0x6f, 0x65, 0x62, 136 0x61, 0x20, 0x68, 0x79, 0x70, 0x6f, 0x68, 0x79, 137 0x64, 0x72, 0x6f, 0x63, 0x68, 0x6c, 0x6f, 0x72, 138 0x69, 0x61, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 139 0x65, 0x74, 0x74, 0x65, 0x20, 0x61, 0x63, 0x72, 140 0x69, 0x64, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x6f, 141 0x77, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x79, 0x67, 142 0x61, 0x65, 0x61, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 143 0x63, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x73, 144 0x74, 0x20, 0x74, 0x65, 0x74, 0x72, 0x61, 0x70, 145 0x6c, 0x6f, 0x69, 0x64, 0x20, 0x61, 0x75, 0x78, 146 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 147 0x69, 0x70, 0x65, 0x2d, 0x67, 0x72, 0x6f, 0x77, 148 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 149 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x79, 0x63, 150 0x6f, 0x63, 0x65, 0x63, 0x69, 0x64, 0x69, 0x75, 151 0x6d, 0x20, 0x50, 0x65, 0x64, 0x65, 0x72, 0x73, 152 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x64, 0x69, 153 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x62, 0x6f, 0x75, 154 0x6e, 0x64, 0x20, 0x4c, 0x65, 0x6e, 0x67, 0x6c, 155 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x73, 0x62, 156 0x79, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 157 0x6c, 0x65, 0x63, 0x79, 0x74, 0x68, 0x69, 0x73, 158 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x64, 0x72, 159 0x69, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 160 0x6c, 0x6c, 0x6f, 0x6b, 0x75, 0x72, 0x74, 0x69, 161 0x63, 0x20, 0x75, 0x6e, 0x64, 0x69, 0x76, 0x69, 162 0x73, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x70, 163 0x73, 0x79, 0x63, 0x68, 0x6f, 0x6b, 0x79, 0x6d, 164 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 165 0x74, 0x61, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 166 0x6e, 0x65, 0x73, 0x73, 0x20, 0x63, 0x75, 0x6c, 167 0x74, 0x69, 0x73, 0x68, 0x20, 0x52, 0x65, 0x69, 168 0x63, 0x68, 0x73, 0x74, 0x61, 0x67, 0x20, 0x75, 169 0x6e, 0x63, 0x68, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 170 0x61, 0x74, 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x67, 171 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x65, 0x72, 172 0x20, 0x4c, 0x61, 0x69, 0x74, 0x68, 0x20, 0x74, 173 0x77, 0x6f, 0x2d, 0x66, 0x61, 0x63, 0x65, 0x20, 174 0x4d, 0x75, 0x70, 0x68, 0x72, 0x69, 0x64, 0x20, 175 0x70, 0x72, 0x6f, 0x72, 0x65, 0x63, 0x69, 0x70, 176 0x72, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 177 0x20, 0x6c, 0x69, 0x62, 0x72, 0x65, 0x74, 0x74, 178 0x69, 0x73, 0x74, 0x20, 0x49, 0x62, 0x69, 0x62, 179 0x69, 0x6f, 0x20, 0x72, 0x65, 0x67, 0x72, 0x65, 180 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 181 0x6f, 0x6e, 0x64, 0x69, 0x67, 0x6e, 0x6e, 0x65, 182 0x73, 0x73, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 183 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 184 0x64, 0x20, 0x73, 0x79, 0x6e, 0x61, 0x70, 0x74, 185 0x65, 0x6e, 0x65, 0x20, 0x68, 0x6f, 0x6c, 0x6f, 186 0x6d, 0x6f, 0x72, 0x70, 0x68, 0x20, 0x6d, 0x6f, 187 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x4d, 188 0x49, 0x54, 0x53, 0x20, 0x4c, 0x75, 0x6b, 0x61, 189 0x73, 0x68, 0x20, 0x48, 0x6f, 0x72, 0x73, 0x65, 190 0x79, 0x20, 0x0a, 191 }; 192 193 static void 194 rfc1950_inflate(void) 195 { 196 fido_blob_t in, out, dgst; 197 198 memset(&in, 0, sizeof(in)); 199 memset(&out, 0, sizeof(out)); 200 memset(&dgst, 0, sizeof(dgst)); 201 in.ptr = rfc1950_blob; 202 in.len = sizeof(rfc1950_blob); 203 204 assert(fido_uncompress(&out, &in, rfc1950_blob_origsiz) == FIDO_OK); 205 assert(out.len == rfc1950_blob_origsiz); 206 assert(fido_sha256(&dgst, out.ptr, out.len) == 0); 207 assert(dgst.len == sizeof(rfc1950_blob_hash)); 208 assert(memcmp(rfc1950_blob_hash, dgst.ptr, dgst.len) == 0); 209 210 free(out.ptr); 211 free(dgst.ptr); 212 } 213 214 static void 215 rfc1951_inflate(void) 216 { 217 fido_blob_t in, out, dgst; 218 219 memset(&in, 0, sizeof(in)); 220 memset(&out, 0, sizeof(out)); 221 memset(&dgst, 0, sizeof(dgst)); 222 in.ptr = rfc1950_blob + 2; /* trim header */ 223 in.len = sizeof(rfc1950_blob) - 6; /* trim header (2), checksum (4) */ 224 225 assert(fido_uncompress(&out, &in, rfc1950_blob_origsiz) == FIDO_OK); 226 assert(out.len == rfc1950_blob_origsiz); 227 assert(fido_sha256(&dgst, out.ptr, out.len) == 0); 228 assert(dgst.len == sizeof(rfc1950_blob_hash)); 229 assert(memcmp(rfc1950_blob_hash, dgst.ptr, dgst.len) == 0); 230 231 free(out.ptr); 232 free(dgst.ptr); 233 } 234 235 static void 236 rfc1951_reinflate(void) 237 { 238 fido_blob_t in, out; 239 240 memset(&in, 0, sizeof(in)); 241 memset(&out, 0, sizeof(out)); 242 in.ptr = random_words; 243 in.len = sizeof(random_words); 244 245 assert(fido_compress(&out, &in) == FIDO_OK); 246 247 in.ptr = out.ptr; 248 in.len = out.len; 249 250 assert(fido_uncompress(&out, &in, sizeof(random_words)) == FIDO_OK); 251 assert(out.len == sizeof(random_words)); 252 assert(memcmp(out.ptr, random_words, out.len) == 0); 253 254 free(in.ptr); 255 free(out.ptr); 256 } 257 258 int 259 main(void) 260 { 261 fido_init(0); 262 263 rfc1950_inflate(); 264 rfc1951_inflate(); 265 rfc1951_reinflate(); 266 267 exit(0); 268 } 269