1 /* 2 * Copyright (c) 2018 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 */ 6 7 #include <assert.h> 8 #include <fido.h> 9 #include <string.h> 10 11 #define FAKE_DEV_HANDLE ((void *)0xdeadbeef) 12 13 static const unsigned char cdh[32] = { 14 0xf9, 0x64, 0x57, 0xe7, 0x2d, 0x97, 0xf6, 0xbb, 15 0xdd, 0xd7, 0xfb, 0x06, 0x37, 0x62, 0xea, 0x26, 16 0x20, 0x44, 0x8e, 0x69, 0x7c, 0x03, 0xf2, 0x31, 17 0x2f, 0x99, 0xdc, 0xaf, 0x3e, 0x8a, 0x91, 0x6b, 18 }; 19 20 static const unsigned char authdata[198] = { 21 0x58, 0xc4, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e, 22 0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76, 23 0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86, 24 0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d, 25 0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8, 26 0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80, 27 0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00, 28 0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde, 29 0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d, 30 0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e, 31 0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda, 32 0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83, 33 0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76, 34 0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6, 35 0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f, 36 0x25, 0xa5, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01, 37 0x21, 0x58, 0x20, 0x17, 0x5b, 0x27, 0xa6, 0x56, 38 0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55, 0x42, 0x78, 39 0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd, 0x1b, 0xb9, 40 0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22, 0x64, 0xf5, 41 0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20, 0x87, 0x5f, 42 0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f, 0xeb, 0xe3, 43 0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6, 0x1c, 0x31, 44 0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1, 0xfe, 0x5d, 45 0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2, 46 }; 47 48 static const unsigned char authdata_dupkeys[200] = { 49 0x58, 0xc6, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e, 50 0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76, 51 0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86, 52 0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d, 53 0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8, 54 0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80, 55 0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00, 56 0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde, 57 0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d, 58 0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e, 59 0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda, 60 0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83, 61 0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76, 62 0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6, 63 0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f, 64 0x25, 0xa6, 0x01, 0x02, 0x01, 0x02, 0x03, 0x26, 65 0x20, 0x01, 0x21, 0x58, 0x20, 0x17, 0x5b, 0x27, 66 0xa6, 0x56, 0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55, 67 0x42, 0x78, 0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd, 68 0x1b, 0xb9, 0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22, 69 0x64, 0xf5, 0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20, 70 0x87, 0x5f, 0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f, 71 0xeb, 0xe3, 0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6, 72 0x1c, 0x31, 0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1, 73 0xfe, 0x5d, 0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2, 74 }; 75 76 static const unsigned char authdata_unsorted_keys[198] = { 77 0x58, 0xc4, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e, 78 0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76, 79 0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86, 80 0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d, 81 0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8, 82 0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80, 83 0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00, 84 0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde, 85 0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d, 86 0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e, 87 0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda, 88 0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83, 89 0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76, 90 0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6, 91 0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f, 92 0x25, 0xa5, 0x03, 0x26, 0x01, 0x02, 0x20, 0x01, 93 0x21, 0x58, 0x20, 0x17, 0x5b, 0x27, 0xa6, 0x56, 94 0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55, 0x42, 0x78, 95 0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd, 0x1b, 0xb9, 96 0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22, 0x64, 0xf5, 97 0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20, 0x87, 0x5f, 98 0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f, 0xeb, 0xe3, 99 0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6, 0x1c, 0x31, 100 0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1, 0xfe, 0x5d, 101 0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2, 102 }; 103 104 static const unsigned char x509[742] = { 105 0x30, 0x82, 0x02, 0xe2, 0x30, 0x81, 0xcb, 0x02, 106 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 107 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 108 0x00, 0x30, 0x1d, 0x31, 0x1b, 0x30, 0x19, 0x06, 109 0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x59, 0x75, 110 0x62, 0x69, 0x63, 0x6f, 0x20, 0x55, 0x32, 0x46, 111 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 112 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x35, 113 0x31, 0x35, 0x31, 0x32, 0x35, 0x38, 0x35, 0x34, 114 0x5a, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x36, 0x31, 115 0x34, 0x31, 0x32, 0x35, 0x38, 0x35, 0x34, 0x5a, 116 0x30, 0x1d, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 117 0x55, 0x04, 0x03, 0x13, 0x12, 0x59, 0x75, 0x62, 118 0x69, 0x63, 0x6f, 0x20, 0x55, 0x32, 0x46, 0x20, 119 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x45, 0x30, 120 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 121 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 122 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 123 0x00, 0x04, 0xdb, 0x0a, 0xdb, 0xf5, 0x21, 0xc7, 124 0x5c, 0xce, 0x63, 0xdc, 0xa6, 0xe1, 0xe8, 0x25, 125 0x06, 0x0d, 0x94, 0xe6, 0x27, 0x54, 0x19, 0x4f, 126 0x9d, 0x24, 0xaf, 0x26, 0x1a, 0xbe, 0xad, 0x99, 127 0x44, 0x1f, 0x95, 0xa3, 0x71, 0x91, 0x0a, 0x3a, 128 0x20, 0xe7, 0x3e, 0x91, 0x5e, 0x13, 0xe8, 0xbe, 129 0x38, 0x05, 0x7a, 0xd5, 0x7a, 0xa3, 0x7e, 0x76, 130 0x90, 0x8f, 0xaf, 0xe2, 0x8a, 0x94, 0xb6, 0x30, 131 0xeb, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 132 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 133 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x95, 0x40, 134 0x6b, 0x50, 0x61, 0x7d, 0xad, 0x84, 0xa3, 0xb4, 135 0xeb, 0x88, 0x0f, 0xe3, 0x30, 0x0f, 0x2d, 0xa2, 136 0x0a, 0x00, 0xd9, 0x25, 0x04, 0xee, 0x72, 0xfa, 137 0x67, 0xdf, 0x58, 0x51, 0x0f, 0x0b, 0x47, 0x02, 138 0x9c, 0x3e, 0x41, 0x29, 0x4a, 0x93, 0xac, 0x29, 139 0x85, 0x89, 0x2d, 0xa4, 0x7a, 0x81, 0x32, 0x28, 140 0x57, 0x71, 0x01, 0xef, 0xa8, 0x42, 0x88, 0x16, 141 0x96, 0x37, 0x91, 0xd5, 0xdf, 0xe0, 0x8f, 0xc9, 142 0x3c, 0x8d, 0xb0, 0xcd, 0x89, 0x70, 0x82, 0xec, 143 0x79, 0xd3, 0xc6, 0x78, 0x73, 0x29, 0x32, 0xe5, 144 0xab, 0x6c, 0xbd, 0x56, 0x9f, 0xd5, 0x45, 0x91, 145 0xce, 0xc1, 0xdd, 0x8d, 0x64, 0xdc, 0xe9, 0x9c, 146 0x1f, 0x5e, 0x3c, 0xd2, 0xaf, 0x51, 0xa5, 0x82, 147 0x18, 0xaf, 0xe0, 0x37, 0xe7, 0x32, 0x9e, 0x76, 148 0x05, 0x77, 0x02, 0x7b, 0xe6, 0x24, 0xa0, 0x31, 149 0x56, 0x1b, 0xfd, 0x19, 0xc5, 0x71, 0xd3, 0xf0, 150 0x9e, 0xc0, 0x73, 0x05, 0x4e, 0xbc, 0x85, 0xb8, 151 0x53, 0x9e, 0xef, 0xc5, 0xbc, 0x9c, 0x56, 0xa3, 152 0xba, 0xd9, 0x27, 0x6a, 0xbb, 0xa9, 0x7a, 0x40, 153 0xd7, 0x47, 0x8b, 0x55, 0x72, 0x6b, 0xe3, 0xfe, 154 0x28, 0x49, 0x71, 0x24, 0xf4, 0x8f, 0xf4, 0x20, 155 0x81, 0xea, 0x38, 0xff, 0x7c, 0x0a, 0x4f, 0xdf, 156 0x02, 0x82, 0x39, 0x81, 0x82, 0x3b, 0xca, 0x09, 157 0xdd, 0xca, 0xaa, 0x0f, 0x27, 0xf5, 0xa4, 0x83, 158 0x55, 0x6c, 0x9a, 0x39, 0x9b, 0x15, 0x3a, 0x16, 159 0x63, 0xdc, 0x5b, 0xf9, 0xac, 0x5b, 0xbc, 0xf7, 160 0x9f, 0xbe, 0x0f, 0x8a, 0xa2, 0x3c, 0x31, 0x13, 161 0xa3, 0x32, 0x48, 0xca, 0x58, 0x87, 0xf8, 0x7b, 162 0xa0, 0xa1, 0x0a, 0x6a, 0x60, 0x96, 0x93, 0x5f, 163 0x5d, 0x26, 0x9e, 0x63, 0x1d, 0x09, 0xae, 0x9a, 164 0x41, 0xe5, 0xbd, 0x08, 0x47, 0xfe, 0xe5, 0x09, 165 0x9b, 0x20, 0xfd, 0x12, 0xe2, 0xe6, 0x40, 0x7f, 166 0xba, 0x4a, 0x61, 0x33, 0x66, 0x0d, 0x0e, 0x73, 167 0xdb, 0xb0, 0xd5, 0xa2, 0x9a, 0x9a, 0x17, 0x0d, 168 0x34, 0x30, 0x85, 0x6a, 0x42, 0x46, 0x9e, 0xff, 169 0x34, 0x8f, 0x5f, 0x87, 0x6c, 0x35, 0xe7, 0xa8, 170 0x4d, 0x35, 0xeb, 0xc1, 0x41, 0xaa, 0x8a, 0xd2, 171 0xda, 0x19, 0xaa, 0x79, 0xa2, 0x5f, 0x35, 0x2c, 172 0xa0, 0xfd, 0x25, 0xd3, 0xf7, 0x9d, 0x25, 0x18, 173 0x2d, 0xfa, 0xb4, 0xbc, 0xbb, 0x07, 0x34, 0x3c, 174 0x8d, 0x81, 0xbd, 0xf4, 0xe9, 0x37, 0xdb, 0x39, 175 0xe9, 0xd1, 0x45, 0x5b, 0x20, 0x41, 0x2f, 0x2d, 176 0x27, 0x22, 0xdc, 0x92, 0x74, 0x8a, 0x92, 0xd5, 177 0x83, 0xfd, 0x09, 0xfb, 0x13, 0x9b, 0xe3, 0x39, 178 0x7a, 0x6b, 0x5c, 0xfa, 0xe6, 0x76, 0x9e, 0xe0, 179 0xe4, 0xe3, 0xef, 0xad, 0xbc, 0xfd, 0x42, 0x45, 180 0x9a, 0xd4, 0x94, 0xd1, 0x7e, 0x8d, 0xa7, 0xd8, 181 0x05, 0xd5, 0xd3, 0x62, 0xcf, 0x15, 0xcf, 0x94, 182 0x7d, 0x1f, 0x5b, 0x58, 0x20, 0x44, 0x20, 0x90, 183 0x71, 0xbe, 0x66, 0xe9, 0x9a, 0xab, 0x74, 0x32, 184 0x70, 0x53, 0x1d, 0x69, 0xed, 0x87, 0x66, 0xf4, 185 0x09, 0x4f, 0xca, 0x25, 0x30, 0xc2, 0x63, 0x79, 186 0x00, 0x3c, 0xb1, 0x9b, 0x39, 0x3f, 0x00, 0xe0, 187 0xa8, 0x88, 0xef, 0x7a, 0x51, 0x5b, 0xe7, 0xbd, 188 0x49, 0x64, 0xda, 0x41, 0x7b, 0x24, 0xc3, 0x71, 189 0x22, 0xfd, 0xd1, 0xd1, 0x20, 0xb3, 0x3f, 0x97, 190 0xd3, 0x97, 0xb2, 0xaa, 0x18, 0x1c, 0x9e, 0x03, 191 0x77, 0x7b, 0x5b, 0x7e, 0xf9, 0xa3, 0xa0, 0xd6, 192 0x20, 0x81, 0x2c, 0x38, 0x8f, 0x9d, 0x25, 0xde, 193 0xe9, 0xc8, 0xf5, 0xdd, 0x6a, 0x47, 0x9c, 0x65, 194 0x04, 0x5a, 0x56, 0xe6, 0xc2, 0xeb, 0xf2, 0x02, 195 0x97, 0xe1, 0xb9, 0xd8, 0xe1, 0x24, 0x76, 0x9f, 196 0x23, 0x62, 0x39, 0x03, 0x4b, 0xc8, 0xf7, 0x34, 197 0x07, 0x49, 0xd6, 0xe7, 0x4d, 0x9a, 198 }; 199 200 const unsigned char sig[70] = { 201 0x30, 0x44, 0x02, 0x20, 0x54, 0x92, 0x28, 0x3b, 202 0x83, 0x33, 0x47, 0x56, 0x68, 0x79, 0xb2, 0x0c, 203 0x84, 0x80, 0xcc, 0x67, 0x27, 0x8b, 0xfa, 0x48, 204 0x43, 0x0d, 0x3c, 0xb4, 0x02, 0x36, 0x87, 0x97, 205 0x3e, 0xdf, 0x2f, 0x65, 0x02, 0x20, 0x1b, 0x56, 206 0x17, 0x06, 0xe2, 0x26, 0x0f, 0x6a, 0xe9, 0xa9, 207 0x70, 0x99, 0x62, 0xeb, 0x3a, 0x04, 0x1a, 0xc4, 208 0xa7, 0x03, 0x28, 0x56, 0x7c, 0xed, 0x47, 0x08, 209 0x68, 0x73, 0x6a, 0xb6, 0x89, 0x0d, 210 }; 211 212 const unsigned char pubkey[64] = { 213 0x17, 0x5b, 0x27, 0xa6, 0x56, 0xb2, 0x26, 0x0c, 214 0x26, 0x0c, 0x55, 0x42, 0x78, 0x17, 0x5d, 0x4c, 215 0xf8, 0xa2, 0xfd, 0x1b, 0xb9, 0x54, 0xdf, 0xd5, 216 0xeb, 0xbf, 0x22, 0x64, 0xf5, 0x21, 0x9a, 0xc6, 217 0x87, 0x5f, 0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f, 218 0xeb, 0xe3, 0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6, 219 0x1c, 0x31, 0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1, 220 0xfe, 0x5d, 0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2, 221 }; 222 223 const unsigned char id[64] = { 224 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde, 0xc5, 225 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d, 0x53, 226 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e, 0x7f, 227 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda, 0x68, 228 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83, 0x2c, 229 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76, 0x90, 230 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6, 0x3c, 231 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f, 0x25, 232 }; 233 234 const char rp_id[] = "localhost"; 235 const char rp_name[] = "sweet home localhost"; 236 237 static void * 238 dummy_open(const char *path) 239 { 240 (void)path; 241 242 return (FAKE_DEV_HANDLE); 243 } 244 245 static void 246 dummy_close(void *handle) 247 { 248 assert(handle == FAKE_DEV_HANDLE); 249 } 250 251 static int 252 dummy_read(void *handle, unsigned char *buf, size_t len, int ms) 253 { 254 (void)handle; 255 (void)buf; 256 (void)len; 257 (void)ms; 258 259 abort(); 260 /* NOTREACHED */ 261 } 262 263 static int 264 dummy_write(void *handle, const unsigned char *buf, size_t len) 265 { 266 (void)handle; 267 (void)buf; 268 (void)len; 269 270 abort(); 271 /* NOTREACHED */ 272 } 273 274 static fido_cred_t * 275 alloc_cred(void) 276 { 277 fido_cred_t *c; 278 279 c = fido_cred_new(); 280 assert(c != NULL); 281 282 return (c); 283 } 284 285 static void 286 free_cred(fido_cred_t *c) 287 { 288 fido_cred_free(&c); 289 assert(c == NULL); 290 } 291 292 static fido_dev_t * 293 alloc_dev(void) 294 { 295 fido_dev_t *d; 296 297 d = fido_dev_new(); 298 assert(d != NULL); 299 300 return (d); 301 } 302 303 static void 304 free_dev(fido_dev_t *d) 305 { 306 fido_dev_free(&d); 307 assert(d == NULL); 308 } 309 310 static void 311 empty_cred(void) 312 { 313 fido_cred_t *c; 314 fido_dev_t *d; 315 fido_dev_io_t io_f; 316 317 c = alloc_cred(); 318 assert(fido_cred_authdata_len(c) == 0); 319 assert(fido_cred_authdata_ptr(c) == NULL); 320 assert(fido_cred_clientdata_hash_len(c) == 0); 321 assert(fido_cred_clientdata_hash_ptr(c) == NULL); 322 assert(fido_cred_flags(c) == 0); 323 assert(fido_cred_fmt(c) == NULL); 324 assert(fido_cred_id_len(c) == 0); 325 assert(fido_cred_id_ptr(c) == NULL); 326 assert(fido_cred_pubkey_len(c) == 0); 327 assert(fido_cred_pubkey_ptr(c) == NULL); 328 assert(fido_cred_rp_id(c) == NULL); 329 assert(fido_cred_rp_name(c) == NULL); 330 assert(fido_cred_sig_len(c) == 0); 331 assert(fido_cred_sig_ptr(c) == NULL); 332 assert(fido_cred_x5c_len(c) == 0); 333 assert(fido_cred_x5c_ptr(c) == NULL); 334 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 335 336 memset(&io_f, 0, sizeof(io_f)); 337 338 io_f.open = dummy_open; 339 io_f.close = dummy_close; 340 io_f.read = dummy_read; 341 io_f.write = dummy_write; 342 343 d = alloc_dev(); 344 345 fido_dev_force_u2f(d); 346 assert(fido_dev_set_io_functions(d, &io_f) == FIDO_OK); 347 assert(fido_dev_make_cred(d, c, NULL) == FIDO_ERR_INVALID_ARGUMENT); 348 assert(fido_dev_make_cred(d, c, "") == FIDO_ERR_UNSUPPORTED_OPTION); 349 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 350 351 fido_dev_force_fido2(d); 352 assert(fido_dev_set_io_functions(d, &io_f) == FIDO_OK); 353 assert(fido_dev_make_cred(d, c, NULL) == FIDO_ERR_INVALID_ARGUMENT); 354 assert(fido_dev_make_cred(d, c, "") == FIDO_ERR_INVALID_ARGUMENT); 355 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 356 357 free_cred(c); 358 free_dev(d); 359 } 360 361 static void 362 valid_cred(void) 363 { 364 fido_cred_t *c; 365 366 c = alloc_cred(); 367 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 368 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 369 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 370 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 371 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 372 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 373 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 374 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 375 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 376 assert(fido_cred_verify(c) == FIDO_OK); 377 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 378 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 379 assert(fido_cred_id_len(c) == sizeof(id)); 380 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 381 free_cred(c); 382 } 383 384 static void 385 no_cdh(void) 386 { 387 fido_cred_t *c; 388 389 c = alloc_cred(); 390 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 391 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 392 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 393 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 394 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 395 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 396 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 397 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 398 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 399 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 400 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 401 assert(fido_cred_id_len(c) == sizeof(id)); 402 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 403 free_cred(c); 404 } 405 406 static void 407 no_rp_id(void) 408 { 409 fido_cred_t *c; 410 411 c = alloc_cred(); 412 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 413 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 414 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 415 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 416 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 417 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 418 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 419 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 420 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 421 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 422 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 423 assert(fido_cred_id_len(c) == sizeof(id)); 424 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 425 free_cred(c); 426 } 427 428 static void 429 no_rp_name(void) 430 { 431 fido_cred_t *c; 432 433 c = alloc_cred(); 434 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 435 assert(fido_cred_set_rp(c, rp_id, NULL) == FIDO_OK); 436 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 437 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 438 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 439 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 440 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 441 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 442 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 443 assert(fido_cred_verify(c) == FIDO_OK); 444 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 445 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 446 assert(fido_cred_id_len(c) == sizeof(id)); 447 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 448 free_cred(c); 449 } 450 451 static void 452 no_authdata(void) 453 { 454 fido_cred_t *c; 455 456 c = alloc_cred(); 457 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 458 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 459 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 460 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 461 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 462 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 463 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 464 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 465 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 466 assert(fido_cred_pubkey_len(c) == 0); 467 assert(fido_cred_pubkey_ptr(c) == NULL); 468 assert(fido_cred_id_len(c) == 0); 469 assert(fido_cred_id_ptr(c) == NULL); 470 free_cred(c); 471 } 472 473 static void 474 no_x509(void) 475 { 476 fido_cred_t *c; 477 478 c = alloc_cred(); 479 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 480 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 481 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 482 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 483 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 484 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 485 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 486 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 487 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 488 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 489 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 490 assert(fido_cred_id_len(c) == sizeof(id)); 491 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 492 free_cred(c); 493 } 494 495 static void 496 no_sig(void) 497 { 498 fido_cred_t *c; 499 500 c = alloc_cred(); 501 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 502 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 503 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 504 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 505 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 506 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 507 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 508 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 509 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 510 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 511 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 512 assert(fido_cred_id_len(c) == sizeof(id)); 513 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 514 free_cred(c); 515 } 516 517 static void 518 no_fmt(void) 519 { 520 fido_cred_t *c; 521 522 c = alloc_cred(); 523 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 524 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 525 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 526 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 527 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 528 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 529 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 530 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 531 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 532 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 533 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 534 assert(fido_cred_id_len(c) == sizeof(id)); 535 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 536 free_cred(c); 537 } 538 539 static void 540 wrong_options(void) 541 { 542 fido_cred_t *c; 543 544 c = alloc_cred(); 545 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 546 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 547 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 548 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 549 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 550 assert(fido_cred_set_uv(c, FIDO_OPT_TRUE) == FIDO_OK); 551 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 552 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 553 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 554 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_PARAM); 555 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 556 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 557 assert(fido_cred_id_len(c) == sizeof(id)); 558 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 559 free_cred(c); 560 } 561 562 static void 563 junk_cdh(void) 564 { 565 fido_cred_t *c; 566 unsigned char *junk; 567 568 junk = malloc(sizeof(cdh)); 569 assert(junk != NULL); 570 memcpy(junk, cdh, sizeof(cdh)); 571 junk[0] = ~junk[0]; 572 573 c = alloc_cred(); 574 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 575 assert(fido_cred_set_clientdata_hash(c, junk, sizeof(cdh)) == FIDO_OK); 576 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 577 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 578 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 579 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 580 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 581 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 582 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 583 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG); 584 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 585 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 586 assert(fido_cred_id_len(c) == sizeof(id)); 587 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 588 free_cred(c); 589 free(junk); 590 } 591 592 static void 593 junk_rp_id(void) 594 { 595 fido_cred_t *c; 596 597 c = alloc_cred(); 598 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 599 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 600 assert(fido_cred_set_rp(c, "potato", rp_name) == FIDO_OK); 601 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 602 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 603 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 604 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 605 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 606 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 607 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_PARAM); 608 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 609 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 610 assert(fido_cred_id_len(c) == sizeof(id)); 611 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 612 free_cred(c); 613 } 614 615 static void 616 junk_rp_name(void) 617 { 618 fido_cred_t *c; 619 620 c = alloc_cred(); 621 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 622 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 623 assert(fido_cred_set_rp(c, rp_id, "potato") == FIDO_OK); 624 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 625 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 626 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 627 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 628 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 629 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 630 assert(fido_cred_verify(c) == FIDO_OK); 631 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 632 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 633 assert(fido_cred_id_len(c) == sizeof(id)); 634 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 635 free_cred(c); 636 } 637 638 static void 639 junk_authdata(void) 640 { 641 fido_cred_t *c; 642 unsigned char *junk; 643 644 junk = malloc(sizeof(authdata)); 645 assert(junk != NULL); 646 memcpy(junk, authdata, sizeof(authdata)); 647 junk[0] = ~junk[0]; 648 649 c = alloc_cred(); 650 assert(fido_cred_set_authdata(c, junk, 651 sizeof(authdata)) == FIDO_ERR_INVALID_ARGUMENT); 652 assert(fido_cred_authdata_len(c) == 0); 653 assert(fido_cred_authdata_ptr(c) == NULL); 654 assert(fido_cred_flags(c) == 0); 655 assert(fido_cred_fmt(c) == NULL); 656 assert(fido_cred_id_len(c) == 0); 657 assert(fido_cred_id_ptr(c) == NULL); 658 assert(fido_cred_pubkey_len(c) == 0); 659 assert(fido_cred_pubkey_ptr(c) == NULL); 660 assert(fido_cred_rp_id(c) == NULL); 661 assert(fido_cred_rp_name(c) == NULL); 662 assert(fido_cred_sig_len(c) == 0); 663 assert(fido_cred_sig_ptr(c) == NULL); 664 assert(fido_cred_x5c_len(c) == 0); 665 assert(fido_cred_x5c_ptr(c) == NULL); 666 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 667 free_cred(c); 668 free(junk); 669 } 670 671 static void 672 junk_sig(void) 673 { 674 fido_cred_t *c; 675 unsigned char *junk; 676 677 junk = malloc(sizeof(sig)); 678 assert(junk != NULL); 679 memcpy(junk, sig, sizeof(sig)); 680 junk[0] = ~junk[0]; 681 682 c = alloc_cred(); 683 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 684 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 685 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 686 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 687 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 688 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 689 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 690 assert(fido_cred_set_sig(c, junk, sizeof(sig)) == FIDO_OK); 691 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 692 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG); 693 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 694 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 695 assert(fido_cred_id_len(c) == sizeof(id)); 696 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 697 free_cred(c); 698 free(junk); 699 } 700 701 static void 702 junk_x509(void) 703 { 704 fido_cred_t *c; 705 unsigned char *junk; 706 707 junk = malloc(sizeof(x509)); 708 assert(junk != NULL); 709 memcpy(junk, x509, sizeof(x509)); 710 junk[0] = ~junk[0]; 711 712 c = alloc_cred(); 713 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 714 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 715 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 716 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 717 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 718 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 719 assert(fido_cred_set_x509(c, junk, sizeof(x509)) == FIDO_OK); 720 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 721 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 722 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG); 723 assert(fido_cred_pubkey_len(c) == sizeof(pubkey)); 724 assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0); 725 assert(fido_cred_id_len(c) == sizeof(id)); 726 assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0); 727 free_cred(c); 728 free(junk); 729 } 730 731 /* github issue #6 */ 732 static void 733 invalid_type(void) 734 { 735 fido_cred_t *c; 736 737 c = alloc_cred(); 738 assert(fido_cred_set_type(c, COSE_RS256) == FIDO_OK); 739 assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK); 740 assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK); 741 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_ERR_INVALID_ARGUMENT); 742 assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK); 743 assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK); 744 assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK); 745 assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK); 746 assert(fido_cred_set_fmt(c, "packed") == FIDO_OK); 747 assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT); 748 assert(fido_cred_pubkey_len(c) == 0); 749 assert(fido_cred_pubkey_ptr(c) == NULL); 750 assert(fido_cred_id_len(c) == 0); 751 assert(fido_cred_id_ptr(c) == NULL); 752 free_cred(c); 753 } 754 755 /* cbor_serialize_alloc misuse */ 756 static void 757 bad_cbor_serialize(void) 758 { 759 fido_cred_t *c; 760 761 c = alloc_cred(); 762 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 763 assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK); 764 assert(fido_cred_authdata_len(c) == sizeof(authdata)); 765 free_cred(c); 766 } 767 768 static void 769 duplicate_keys(void) 770 { 771 fido_cred_t *c; 772 773 c = alloc_cred(); 774 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 775 assert(fido_cred_set_authdata(c, authdata_dupkeys, 776 sizeof(authdata_dupkeys)) == FIDO_ERR_INVALID_ARGUMENT); 777 free_cred(c); 778 } 779 780 static void 781 unsorted_keys(void) 782 { 783 fido_cred_t *c; 784 785 c = alloc_cred(); 786 assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK); 787 assert(fido_cred_set_authdata(c, authdata_unsorted_keys, 788 sizeof(authdata_unsorted_keys)) == FIDO_ERR_INVALID_ARGUMENT); 789 free_cred(c); 790 } 791 792 int 793 main(void) 794 { 795 fido_init(0); 796 797 empty_cred(); 798 valid_cred(); 799 no_cdh(); 800 no_rp_id(); 801 no_rp_name(); 802 no_authdata(); 803 no_x509(); 804 no_sig(); 805 no_fmt(); 806 junk_cdh(); 807 junk_rp_id(); 808 junk_rp_name(); 809 junk_authdata(); 810 junk_x509(); 811 junk_sig(); 812 wrong_options(); 813 invalid_type(); 814 bad_cbor_serialize(); 815 duplicate_keys(); 816 unsorted_keys(); 817 818 exit(0); 819 } 820