Home | History | Annotate | Line # | Download | only in tools
      1 #!/bin/sh -ex
      2 
      3 # Copyright (c) 2021-2022 Yubico AB. All rights reserved.
      4 # Use of this source code is governed by a BSD-style
      5 # license that can be found in the LICENSE file.
      6 # SPDX-License-Identifier: BSD-2-Clause
      7 
      8 # usage: ./test.sh "$(mktemp -d fido2test-XXXXXXXX)" device
      9 
     10 # Please note that this test script:
     11 # - is incomplete;
     12 # - assumes CTAP 2.1-like hmac-secret;
     13 # - should pass as-is on a YubiKey with a PIN set;
     14 # - may otherwise require set +e above;
     15 # - can be executed with UV=1 to run additional UV tests;
     16 # - was last tested on 2024-06-15 with firmware 5.7.1.
     17 
     18 cd "$1"
     19 DEV="$2"
     20 TYPE="es256"
     21 #TYPE="es384"
     22 #TYPE="eddsa"
     23 
     24 make_cred() {
     25 	sed /^$/d > cred_param << EOF
     26 $(dd if=/dev/urandom bs=32 count=1 2>/dev/null | base64)
     27 $1
     28 some user name
     29 $(dd if=/dev/urandom bs=32 count=1 2>/dev/null | base64)
     30 EOF
     31 	fido2-cred -M "$2" "${DEV}" "${TYPE}" > "$3" < cred_param
     32 }
     33 
     34 verify_cred() {
     35 	fido2-cred -V "$1" "${TYPE}" > cred_out < "$2" || return 1
     36 	head -1 cred_out > "$3"
     37 	tail -n +2 cred_out > "$4"
     38 }
     39 
     40 get_assert() {
     41 	sed /^$/d > assert_param << EOF
     42 $(dd if=/dev/urandom bs=32 count=1 2>/dev/null | base64)
     43 $1
     44 $(cat "$3")
     45 $(cat "$4")
     46 EOF
     47 	# we want to expand $2
     48 	# shellcheck disable=SC2086
     49 	fido2-assert -G $2 "${DEV}" > "$5" < assert_param
     50 }
     51 
     52 verify_assert() {
     53 	fido2-assert -V "$1" "$2" "${TYPE}" < "$3"
     54 }
     55 
     56 dd if=/dev/urandom bs=32 count=1 | base64 > hmac-salt
     57 
     58 # u2f
     59 if [ "${TYPE}" = "es256" ]; then
     60 	make_cred no.tld "-u" u2f
     61 	make_cred no.tld "-ru" /dev/null && exit 1
     62 	make_cred no.tld "-uc1" /dev/null && exit 1
     63 	make_cred no.tld "-uc2" /dev/null && exit 1
     64 	verify_cred "--"  u2f u2f-cred u2f-pubkey
     65 	verify_cred "-h" u2f /dev/null /dev/null && exit 1
     66 	verify_cred "-v" u2f /dev/null /dev/null && exit 1
     67 	verify_cred "-c0" u2f /dev/null /dev/null
     68 	verify_cred "-c1" u2f /dev/null /dev/null && exit 1
     69 	verify_cred "-c2" u2f /dev/null /dev/null && exit 1
     70 	verify_cred "-c3" u2f /dev/null /dev/null && exit 1
     71 fi
     72 
     73 # wrap (non-resident)
     74 make_cred no.tld "--" wrap
     75 verify_cred "--" wrap wrap-cred wrap-pubkey
     76 verify_cred "-h" wrap /dev/null /dev/null && exit 1
     77 verify_cred "-v" wrap /dev/null /dev/null && exit 1
     78 verify_cred "-c0" wrap /dev/null /dev/null
     79 verify_cred "-c1" wrap /dev/null /dev/null && exit 1
     80 verify_cred "-c2" wrap /dev/null /dev/null && exit 1
     81 verify_cred "-c3" wrap /dev/null /dev/null && exit 1
     82 
     83 # wrap (non-resident) + hmac-secret
     84 make_cred no.tld "-h" wrap-hs
     85 verify_cred "--" wrap-hs /dev/null /dev/null && exit 1
     86 verify_cred "-h" wrap-hs wrap-hs-cred wrap-hs-pubkey
     87 verify_cred "-v" wrap-hs /dev/null /dev/null && exit 1
     88 verify_cred "-hv" wrap-hs /dev/null /dev/null && exit 1
     89 verify_cred "-hc0" wrap-hs /dev/null /dev/null
     90 verify_cred "-c0" wrap-hs /dev/null /dev/null && exit 1
     91 verify_cred "-c1" wrap-hs /dev/null /dev/null && exit 1
     92 verify_cred "-c2" wrap-hs /dev/null /dev/null && exit 1
     93 verify_cred "-c3" wrap-hs /dev/null /dev/null && exit 1
     94 
     95 # resident
     96 make_cred no.tld "-r" rk
     97 verify_cred "--" rk rk-cred rk-pubkey
     98 verify_cred "-h" rk /dev/null /dev/null && exit 1
     99 verify_cred "-v" rk /dev/null /dev/null
    100 verify_cred "-hv" rk /dev/null /dev/null && exit 1
    101 verify_cred "-c0" rk /dev/null /dev/null
    102 verify_cred "-c1" rk /dev/null /dev/null && exit 1
    103 verify_cred "-c2" rk /dev/null /dev/null && exit 1
    104 verify_cred "-c3" rk /dev/null /dev/null && exit 1
    105 
    106 # resident + hmac-secret
    107 make_cred no.tld "-hr" rk-hs
    108 verify_cred  "--" rk-hs rk-hs-cred rk-hs-pubkey && exit 1
    109 verify_cred "-h" rk-hs /dev/null /dev/null
    110 verify_cred "-v" rk-hs /dev/null /dev/null && exit 1
    111 verify_cred "-hv" rk-hs /dev/null /dev/null
    112 verify_cred "-hc0" rk-hs /dev/null /dev/null
    113 verify_cred "-c0" rk-hs /dev/null /dev/null && exit 1
    114 verify_cred "-c1" rk-hs /dev/null /dev/null && exit 1
    115 verify_cred "-c2" rk-hs /dev/null /dev/null && exit 1
    116 verify_cred "-c3" rk-hs /dev/null /dev/null && exit 1
    117 
    118 # u2f
    119 if [ "${TYPE}" = "es256" ]; then
    120 	get_assert no.tld "-u" u2f-cred /dev/null u2f-assert
    121 	get_assert no.tld "-u -t up=false" u2f-cred /dev/null /dev/null && exit 1
    122 	verify_assert "--"  u2f-pubkey u2f-assert
    123 	verify_assert "-p"  u2f-pubkey u2f-assert
    124 fi
    125 
    126 # wrap (non-resident)
    127 get_assert no.tld "--" wrap-cred /dev/null wrap-assert
    128 verify_assert "--" wrap-pubkey wrap-assert
    129 get_assert no.tld "-t pin=true" wrap-cred /dev/null wrap-assert
    130 verify_assert "--" wrap-pubkey wrap-assert
    131 verify_assert "-v" wrap-pubkey wrap-assert
    132 get_assert no.tld "-t pin=false" wrap-cred /dev/null wrap-assert
    133 verify_assert "--" wrap-pubkey wrap-assert
    134 get_assert no.tld "-t up=true" wrap-cred /dev/null wrap-assert
    135 verify_assert "-p" wrap-pubkey wrap-assert
    136 get_assert no.tld "-t up=true -t pin=true" wrap-cred /dev/null wrap-assert
    137 verify_assert "--" wrap-pubkey wrap-assert
    138 verify_assert "-p" wrap-pubkey wrap-assert
    139 verify_assert "-v" wrap-pubkey wrap-assert
    140 verify_assert "-pv" wrap-pubkey wrap-assert
    141 get_assert no.tld "-t up=true -t pin=false" wrap-cred /dev/null wrap-assert
    142 verify_assert "--" wrap-pubkey wrap-assert
    143 verify_assert "-p" wrap-pubkey wrap-assert
    144 get_assert no.tld "-t up=false" wrap-cred /dev/null wrap-assert
    145 verify_assert "--" wrap-pubkey wrap-assert
    146 verify_assert "-p" wrap-pubkey wrap-assert && exit 1
    147 get_assert no.tld "-t up=false -t pin=true" wrap-cred /dev/null wrap-assert
    148 verify_assert "-p" wrap-pubkey wrap-assert && exit 1
    149 verify_assert "-v" wrap-pubkey wrap-assert
    150 verify_assert "-pv" wrap-pubkey wrap-assert && exit 1
    151 get_assert no.tld "-t up=false -t pin=false" wrap-cred /dev/null wrap-assert
    152 verify_assert "-p" wrap-pubkey wrap-assert && exit 1
    153 get_assert no.tld "-h" wrap-cred hmac-salt wrap-assert
    154 verify_assert "--" wrap-pubkey wrap-assert && exit 1
    155 verify_assert "-h" wrap-pubkey wrap-assert
    156 get_assert no.tld "-h -t pin=true" wrap-cred hmac-salt wrap-assert
    157 verify_assert "--" wrap-pubkey wrap-assert && exit 1
    158 verify_assert "-h" wrap-pubkey wrap-assert
    159 verify_assert "-hv" wrap-pubkey wrap-assert
    160 get_assert no.tld "-h -t pin=false" wrap-cred hmac-salt wrap-assert
    161 verify_assert "--" wrap-pubkey wrap-assert && exit 1
    162 verify_assert "-h" wrap-pubkey wrap-assert
    163 get_assert no.tld "-h -t up=true" wrap-cred hmac-salt wrap-assert
    164 verify_assert "--" wrap-pubkey wrap-assert && exit 1
    165 verify_assert "-h" wrap-pubkey wrap-assert
    166 verify_assert "-hp" wrap-pubkey wrap-assert
    167 get_assert no.tld "-h -t up=true -t pin=true" wrap-cred hmac-salt wrap-assert
    168 verify_assert "--" wrap-pubkey wrap-assert && exit 1
    169 verify_assert "-h" wrap-pubkey wrap-assert
    170 verify_assert "-hp" wrap-pubkey wrap-assert
    171 verify_assert "-hv" wrap-pubkey wrap-assert
    172 verify_assert "-hpv" wrap-pubkey wrap-assert
    173 get_assert no.tld "-h -t up=true -t pin=false" wrap-cred hmac-salt wrap-assert
    174 verify_assert "--" wrap-pubkey wrap-assert && exit 1
    175 verify_assert "-h" wrap-pubkey wrap-assert
    176 verify_assert "-hp" wrap-pubkey wrap-assert
    177 get_assert no.tld "-h -t up=false" wrap-cred hmac-salt wrap-assert && exit 1
    178 get_assert no.tld "-h -t up=false -t pin=true" wrap-cred hmac-salt wrap-assert && exit 1
    179 get_assert no.tld "-h -t up=false -t pin=false" wrap-cred hmac-salt wrap-assert && exit 1
    180 
    181 if [ "x${UV}" != "x" ]; then
    182 	get_assert no.tld "-t uv=true" wrap-cred /dev/null wrap-assert
    183 	verify_assert "-v" wrap-pubkey wrap-assert
    184 	get_assert no.tld "-t uv=true -t pin=true" wrap-cred /dev/null wrap-assert
    185 	verify_assert "-v" wrap-pubkey wrap-assert
    186 	get_assert no.tld "-t uv=true -t pin=false" wrap-cred /dev/null wrap-assert
    187 	verify_assert "-v" wrap-pubkey wrap-assert
    188 	get_assert no.tld "-t uv=false" wrap-cred /dev/null wrap-assert
    189 	verify_assert "--" wrap-pubkey wrap-assert
    190 	get_assert no.tld "-t uv=false -t pin=true" wrap-cred /dev/null wrap-assert
    191 	verify_assert "-v" wrap-pubkey wrap-assert
    192 	get_assert no.tld "-t uv=false -t pin=false" wrap-cred /dev/null wrap-assert
    193 	verify_assert "--" wrap-pubkey wrap-assert
    194 	get_assert no.tld "-t up=true -t uv=true" wrap-cred /dev/null wrap-assert
    195 	verify_assert "-pv" wrap-pubkey wrap-assert
    196 	get_assert no.tld "-t up=true -t uv=true -t pin=true" wrap-cred /dev/null wrap-assert
    197 	verify_assert "-pv" wrap-pubkey wrap-assert
    198 	get_assert no.tld "-t up=true -t uv=true -t pin=false" wrap-cred /dev/null wrap-assert
    199 	verify_assert "-pv" wrap-pubkey wrap-assert
    200 	get_assert no.tld "-t up=true -t uv=false" wrap-cred /dev/null wrap-assert
    201 	verify_assert "-p" wrap-pubkey wrap-assert
    202 	get_assert no.tld "-t up=true -t uv=false -t pin=true" wrap-cred /dev/null wrap-assert
    203 	verify_assert "-pv" wrap-pubkey wrap-assert
    204 	get_assert no.tld "-t up=true -t uv=false -t pin=false" wrap-cred /dev/null wrap-assert
    205 	verify_assert "-p" wrap-pubkey wrap-assert
    206 	get_assert no.tld "-t up=false -t uv=true" wrap-cred /dev/null wrap-assert
    207 	verify_assert "-v" wrap-pubkey wrap-assert
    208 	get_assert no.tld "-t up=false -t uv=true -t pin=true" wrap-cred /dev/null wrap-assert
    209 	verify_assert "-v" wrap-pubkey wrap-assert
    210 	get_assert no.tld "-t up=false -t uv=true -t pin=false" wrap-cred /dev/null wrap-assert
    211 	verify_assert "-v" wrap-pubkey wrap-assert
    212 	get_assert no.tld "-t up=false -t uv=false" wrap-cred /dev/null wrap-assert
    213 	verify_assert "--" wrap-pubkey wrap-assert && exit 1
    214 	get_assert no.tld "-t up=false -t uv=false -t pin=true" wrap-cred /dev/null wrap-assert
    215 	verify_assert "-v" wrap-pubkey wrap-assert
    216 	get_assert no.tld "-t up=false -t uv=false -t pin=false" wrap-cred /dev/null wrap-assert
    217 	verify_assert "--" wrap-pubkey wrap-assert && exit 1
    218 	get_assert no.tld "-h -t uv=true" wrap-cred hmac-salt wrap-assert
    219 	verify_assert "-hv" wrap-pubkey wrap-assert
    220 	get_assert no.tld "-h -t uv=true -t pin=true" wrap-cred hmac-salt wrap-assert
    221 	verify_assert "-hv" wrap-pubkey wrap-assert
    222 	get_assert no.tld "-h -t uv=true -t pin=false" wrap-cred hmac-salt wrap-assert
    223 	verify_assert "-hv" wrap-pubkey wrap-assert
    224 	get_assert no.tld "-h -t uv=false" wrap-cred hmac-salt wrap-assert
    225 	verify_assert "-h" wrap-pubkey wrap-assert
    226 	get_assert no.tld "-h -t uv=false -t pin=true" wrap-cred hmac-salt wrap-assert
    227 	verify_assert "-hv" wrap-pubkey wrap-assert
    228 	get_assert no.tld "-h -t uv=false -t pin=false" wrap-cred hmac-salt wrap-assert
    229 	verify_assert "-h" wrap-pubkey wrap-assert
    230 	get_assert no.tld "-h -t up=true -t uv=true" wrap-cred hmac-salt wrap-assert
    231 	verify_assert "-hpv" wrap-pubkey wrap-assert
    232 	get_assert no.tld "-h -t up=true -t uv=true -t pin=true" wrap-cred hmac-salt wrap-assert
    233 	verify_assert "-hpv" wrap-pubkey wrap-assert
    234 	get_assert no.tld "-h -t up=true -t uv=true -t pin=false" wrap-cred hmac-salt wrap-assert
    235 	verify_assert "-hpv" wrap-pubkey wrap-assert
    236 	get_assert no.tld "-h -t up=true -t uv=false" wrap-cred hmac-salt wrap-assert
    237 	verify_assert "-hp" wrap-pubkey wrap-assert
    238 	get_assert no.tld "-h -t up=true -t uv=false -t pin=true" wrap-cred hmac-salt wrap-assert
    239 	verify_assert "-hpv" wrap-pubkey wrap-assert
    240 	get_assert no.tld "-h -t up=true -t uv=false -t pin=false" wrap-cred hmac-salt wrap-assert
    241 	verify_assert "-hp" wrap-pubkey wrap-assert
    242 	get_assert no.tld "-h -t up=false -t uv=true" wrap-cred hmac-salt wrap-assert && exit 1
    243 	get_assert no.tld "-h -t up=false -t uv=true -t pin=true" wrap-cred hmac-salt wrap-assert && exit 1
    244 	get_assert no.tld "-h -t up=false -t uv=true -t pin=false" wrap-cred hmac-salt wrap-assert && exit 1
    245 	get_assert no.tld "-h -t up=false -t uv=false" wrap-cred hmac-salt wrap-assert && exit 1
    246 	get_assert no.tld "-h -t up=false -t uv=false -t pin=true" wrap-cred hmac-salt wrap-assert && exit 1
    247 	get_assert no.tld "-h -t up=false -t uv=false -t pin=false" wrap-cred hmac-salt wrap-assert && exit 1
    248 fi
    249 
    250 # resident
    251 get_assert no.tld "-r" /dev/null /dev/null wrap-assert
    252 get_assert no.tld "-r -t pin=true" /dev/null /dev/null wrap-assert
    253 get_assert no.tld "-r -t pin=false" /dev/null /dev/null wrap-assert
    254 get_assert no.tld "-r -t up=true" /dev/null /dev/null wrap-assert
    255 get_assert no.tld "-r -t up=true -t pin=true" /dev/null /dev/null wrap-assert
    256 get_assert no.tld "-r -t up=true -t pin=false" /dev/null /dev/null wrap-assert
    257 get_assert no.tld "-r -t up=false" /dev/null /dev/null wrap-assert
    258 get_assert no.tld "-r -t up=false -t pin=true" /dev/null /dev/null wrap-assert
    259 get_assert no.tld "-r -t up=false -t pin=false" /dev/null /dev/null wrap-assert
    260 get_assert no.tld "-r -h" /dev/null hmac-salt wrap-assert
    261 get_assert no.tld "-r -h -t pin=true" /dev/null hmac-salt wrap-assert
    262 get_assert no.tld "-r -h -t pin=false" /dev/null hmac-salt wrap-assert
    263 get_assert no.tld "-r -h -t up=true" /dev/null hmac-salt wrap-assert
    264 get_assert no.tld "-r -h -t up=true -t pin=true" /dev/null hmac-salt wrap-assert
    265 get_assert no.tld "-r -h -t up=true -t pin=false" /dev/null hmac-salt wrap-assert
    266 get_assert no.tld "-r -h -t up=false" /dev/null hmac-salt wrap-assert && exit 1
    267 get_assert no.tld "-r -h -t up=false -t pin=true" /dev/null hmac-salt wrap-assert && exit 1
    268 get_assert no.tld "-r -h -t up=false -t pin=false" /dev/null hmac-salt wrap-assert && exit 1
    269 
    270 if [ "x${UV}" != "x" ]; then
    271 	get_assert no.tld "-r -t uv=true" /dev/null /dev/null wrap-assert
    272 	get_assert no.tld "-r -t uv=true -t pin=true" /dev/null /dev/null wrap-assert
    273 	get_assert no.tld "-r -t uv=true -t pin=false" /dev/null /dev/null wrap-assert
    274 	get_assert no.tld "-r -t uv=false" /dev/null /dev/null wrap-assert
    275 	get_assert no.tld "-r -t uv=false -t pin=true" /dev/null /dev/null wrap-assert
    276 	get_assert no.tld "-r -t uv=false -t pin=false" /dev/null /dev/null wrap-assert
    277 	get_assert no.tld "-r -t up=true -t uv=true" /dev/null /dev/null wrap-assert
    278 	get_assert no.tld "-r -t up=true -t uv=true -t pin=true" /dev/null /dev/null wrap-assert
    279 	get_assert no.tld "-r -t up=true -t uv=true -t pin=false" /dev/null /dev/null wrap-assert
    280 	get_assert no.tld "-r -t up=true -t uv=false" /dev/null /dev/null wrap-assert
    281 	get_assert no.tld "-r -t up=true -t uv=false -t pin=true" /dev/null /dev/null wrap-assert
    282 	get_assert no.tld "-r -t up=true -t uv=false -t pin=false" /dev/null /dev/null wrap-assert
    283 	get_assert no.tld "-r -t up=false -t uv=true" /dev/null /dev/null wrap-assert
    284 	get_assert no.tld "-r -t up=false -t uv=true -t pin=true" /dev/null /dev/null wrap-assert
    285 	get_assert no.tld "-r -t up=false -t uv=true -t pin=false" /dev/null /dev/null wrap-assert
    286 	get_assert no.tld "-r -t up=false -t uv=false" /dev/null /dev/null wrap-assert
    287 	get_assert no.tld "-r -t up=false -t uv=false -t pin=true" /dev/null /dev/null wrap-assert
    288 	get_assert no.tld "-r -t up=false -t uv=false -t pin=false" /dev/null /dev/null wrap-assert
    289 	get_assert no.tld "-r -h -t uv=true" /dev/null hmac-salt wrap-assert
    290 	get_assert no.tld "-r -h -t uv=true -t pin=true" /dev/null hmac-salt wrap-assert
    291 	get_assert no.tld "-r -h -t uv=true -t pin=false" /dev/null hmac-salt wrap-assert
    292 	get_assert no.tld "-r -h -t uv=false" /dev/null hmac-salt wrap-assert
    293 	get_assert no.tld "-r -h -t uv=false -t pin=true" /dev/null hmac-salt wrap-assert
    294 	get_assert no.tld "-r -h -t uv=false -t pin=false" /dev/null hmac-salt wrap-assert
    295 	get_assert no.tld "-r -h -t up=true -t uv=true" /dev/null hmac-salt wrap-assert
    296 	get_assert no.tld "-r -h -t up=true -t uv=true -t pin=true" /dev/null hmac-salt wrap-assert
    297 	get_assert no.tld "-r -h -t up=true -t uv=true -t pin=false" /dev/null hmac-salt wrap-assert
    298 	get_assert no.tld "-r -h -t up=true -t uv=false" /dev/null hmac-salt wrap-assert
    299 	get_assert no.tld "-r -h -t up=true -t uv=false -t pin=true" /dev/null hmac-salt wrap-assert
    300 	get_assert no.tld "-r -h -t up=true -t uv=false -t pin=false" /dev/null hmac-salt wrap-assert
    301 	get_assert no.tld "-r -h -t up=false -t uv=true" /dev/null hmac-salt wrap-assert && exit 1
    302 	get_assert no.tld "-r -h -t up=false -t uv=true -t pin=true" /dev/null hmac-salt wrap-assert && exit 1
    303 	get_assert no.tld "-r -h -t up=false -t uv=true -t pin=false" /dev/null hmac-salt wrap-assert && exit 1
    304 	get_assert no.tld "-r -h -t up=false -t uv=false" /dev/null hmac-salt wrap-assert && exit 1
    305 	get_assert no.tld "-r -h -t up=false -t uv=false -t pin=true" /dev/null hmac-salt wrap-assert && exit 1
    306 	get_assert no.tld "-r -h -t up=false -t uv=false -t pin=false" /dev/null hmac-salt wrap-assert && exit 1
    307 fi
    308 
    309 exit 0
    310