krl.sh 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. # $OpenBSD: krl.sh,v 1.11 2019/12/16 02:39:05 djm Exp $
  2. # Placed in the Public Domain.
  3. tid="key revocation lists"
  4. # Use ed25519 by default since it's fast and it's supported when building
  5. # w/out OpenSSL. Populate ktype[2-4] with the other types if supported.
  6. ktype1=ed25519
  7. ktype2=ed25519
  8. ktype3=ed25519
  9. ktype4=ed25519
  10. ktype5=ed25519
  11. ktype6=ed25519
  12. for t in $SSH_KEYTYPES; do
  13. case "$t" in
  14. ecdsa*) ktype2=ecdsa ;;
  15. ssh-rsa) ktype3=rsa ;;
  16. ssh-dss) ktype4=dsa ;;
  17. sk-ssh-ed25519@openssh.com) ktype5=ed25519-sk ;;
  18. sk-ecdsa-sha2-nistp256@openssh.com) ktype6=ecdsa-sk ;;
  19. esac
  20. done
  21. # Do most testing with ssh-keygen; it uses the same verification code as sshd.
  22. # Old keys will interfere with ssh-keygen.
  23. rm -f $OBJ/revoked-* $OBJ/krl-*
  24. # Generate a CA key
  25. $SSHKEYGEN -t $ktype1 -f $OBJ/revoked-ca -C "" -N "" > /dev/null ||
  26. fatal "$SSHKEYGEN CA failed"
  27. $SSHKEYGEN -t $ktype2 -f $OBJ/revoked-ca2 -C "" -N "" > /dev/null ||
  28. fatal "$SSHKEYGEN CA2 failed"
  29. # A specification that revokes some certificates by serial numbers
  30. # The serial pattern is chosen to ensure the KRL includes list, range and
  31. # bitmap sections.
  32. cat << EOF >> $OBJ/revoked-serials
  33. serial: 1-4
  34. serial: 10
  35. serial: 15
  36. serial: 30
  37. serial: 50
  38. serial: 90
  39. serial: 999
  40. # The following sum to 500-799
  41. serial: 500
  42. serial: 501
  43. serial: 502
  44. serial: 503-600
  45. serial: 700-797
  46. serial: 798
  47. serial: 799
  48. serial: 599-701
  49. # Some multiple consecutive serial number ranges
  50. serial: 10000-20000
  51. serial: 30000-40000
  52. EOF
  53. # A specification that revokes some certificated by key ID.
  54. touch $OBJ/revoked-keyid
  55. for n in 1 2 3 4 10 15 30 50 90 $(jot 500 300) 999 1000 1001 1002; do
  56. test "x$n" = "x499" && continue
  57. # Fill in by-ID revocation spec.
  58. echo "id: revoked $n" >> $OBJ/revoked-keyid
  59. done
  60. keygen()
  61. {
  62. N=$1
  63. f=$OBJ/revoked-$(printf "%04d" $N)
  64. # Vary the keytype. We use mostly ed25519 since this is fast and well
  65. # supported.
  66. keytype=$ktype1
  67. case $N in
  68. 2 | 10 | 510 | 1001) keytype=$ktype2 ;;
  69. 4 | 30 | 520 | 1002) keytype=$ktype3 ;;
  70. 8 | 50 | 530 | 1003) keytype=$ktype4 ;;
  71. 16 | 70 | 540 | 1004) keytype=$ktype5 ;;
  72. 32 | 90 | 550 | 1005) keytype=$ktype6 ;;
  73. esac
  74. $SSHKEYGEN -t $keytype -f $f -C "" -N "" > /dev/null ||
  75. fatal "$SSHKEYGEN failed"
  76. # Sign cert
  77. $SSHKEYGEN -s $OBJ/revoked-ca -z $n -I "revoked $N" $f > /dev/null 2>&1 ||
  78. fatal "$SSHKEYGEN sign failed"
  79. echo $f
  80. }
  81. # Generate some keys.
  82. verbose "$tid: generating test keys"
  83. REVOKED_SERIALS="1 4 10 50 90 500 510 520 550 799 999"
  84. for n in $REVOKED_SERIALS; do
  85. f=$(keygen $n)
  86. RKEYS="$RKEYS ${f}.pub"
  87. RCERTS="$RCERTS ${f}-cert.pub"
  88. done
  89. UNREVOKED_SERIALS="5 9 14 16 29 49 51 499 800 1010 1011"
  90. UNREVOKED=""
  91. for n in $UNREVOKED_SERIALS; do
  92. f=$(keygen $n)
  93. UKEYS="$UKEYS ${f}.pub"
  94. UCERTS="$UCERTS ${f}-cert.pub"
  95. done
  96. # Specifications that revoke keys by hash.
  97. touch $OBJ/revoked-sha1 $OBJ/revoked-sha256 $OBJ/revoked-hash
  98. for rkey in $RKEYS; do
  99. (
  100. printf "sha1: "
  101. cat $rkey
  102. ) >> $OBJ/revoked-sha1
  103. (
  104. printf "sha256: "
  105. cat $rkey
  106. ) >> $OBJ/revoked-sha256
  107. (
  108. printf "hash: "
  109. $SSHKEYGEN -lf $rkey |
  110. awk '{ print $2 }'
  111. ) >> $OBJ/revoked-hash
  112. done
  113. genkrls()
  114. {
  115. OPTS=$1
  116. $SSHKEYGEN $OPTS -kf $OBJ/krl-empty - < /dev/null \
  117. > /dev/null || fatal "$SSHKEYGEN KRL failed"
  118. $SSHKEYGEN $OPTS -kf $OBJ/krl-keys $RKEYS \
  119. > /dev/null || fatal "$SSHKEYGEN KRL failed"
  120. $SSHKEYGEN $OPTS -kf $OBJ/krl-cert $RCERTS \
  121. > /dev/null || fatal "$SSHKEYGEN KRL failed"
  122. $SSHKEYGEN $OPTS -kf $OBJ/krl-all $RKEYS $RCERTS \
  123. > /dev/null || fatal "$SSHKEYGEN KRL failed"
  124. $SSHKEYGEN $OPTS -kf $OBJ/krl-ca $OBJ/revoked-ca.pub \
  125. > /dev/null || fatal "$SSHKEYGEN KRL failed"
  126. $SSHKEYGEN $OPTS -kf $OBJ/krl-sha1 $OBJ/revoked-sha1 \
  127. > /dev/null 2>&1 || fatal "$SSHKEYGEN KRL failed"
  128. $SSHKEYGEN $OPTS -kf $OBJ/krl-sha256 $OBJ/revoked-sha256 \
  129. > /dev/null 2>&1 || fatal "$SSHKEYGEN KRL failed"
  130. $SSHKEYGEN $OPTS -kf $OBJ/krl-hash $OBJ/revoked-hash \
  131. > /dev/null 2>&1 || fatal "$SSHKEYGEN KRL failed"
  132. # This should fail as KRLs from serial/key-id spec need the CA specified.
  133. $SSHKEYGEN $OPTS -kf $OBJ/krl-serial $OBJ/revoked-serials \
  134. > /dev/null 2>&1 && fatal "$SSHKEYGEN KRL succeeded unexpectedly"
  135. $SSHKEYGEN $OPTS -kf $OBJ/krl-keyid $OBJ/revoked-keyid \
  136. > /dev/null 2>&1 && fatal "$SSHKEYGEN KRL succeeded unexpectedly"
  137. # These should succeed; they specify an explicit CA key.
  138. $SSHKEYGEN $OPTS -kf $OBJ/krl-serial -s $OBJ/revoked-ca \
  139. $OBJ/revoked-serials > /dev/null || fatal "$SSHKEYGEN KRL failed"
  140. $SSHKEYGEN $OPTS -kf $OBJ/krl-keyid -s $OBJ/revoked-ca.pub \
  141. $OBJ/revoked-keyid > /dev/null || fatal "$SSHKEYGEN KRL failed"
  142. # These should succeed; they specify an wildcard CA key.
  143. $SSHKEYGEN $OPTS -kf $OBJ/krl-serial-wild -s NONE $OBJ/revoked-serials \
  144. > /dev/null || fatal "$SSHKEYGEN KRL failed"
  145. $SSHKEYGEN $OPTS -kf $OBJ/krl-keyid-wild -s NONE $OBJ/revoked-keyid \
  146. > /dev/null || fatal "$SSHKEYGEN KRL failed"
  147. # Revoke the same serials with the second CA key to ensure a multi-CA
  148. # KRL is generated.
  149. $SSHKEYGEN $OPTS -kf $OBJ/krl-serial -u -s $OBJ/revoked-ca2 \
  150. $OBJ/revoked-serials > /dev/null || fatal "$SSHKEYGEN KRL failed"
  151. }
  152. ## XXX dump with trace and grep for set cert serials
  153. ## XXX test ranges near (u64)-1, etc.
  154. verbose "$tid: generating KRLs"
  155. genkrls
  156. check_krl()
  157. {
  158. KEY=$1
  159. KRL=$2
  160. EXPECT_REVOKED=$3
  161. TAG=$4
  162. $SSHKEYGEN -Qf $KRL $KEY > /dev/null
  163. result=$?
  164. if test "x$EXPECT_REVOKED" = "xy" -a $result -eq 0; then
  165. fatal "key $KEY not revoked by KRL $KRL: $TAG"
  166. elif test "x$EXPECT_REVOKED" = "xn" -a $result -ne 0; then
  167. fatal "key $KEY unexpectedly revoked by KRL $KRL: $TAG"
  168. fi
  169. }
  170. test_rev()
  171. {
  172. FILES=$1
  173. TAG=$2
  174. KEYS_RESULT=$3
  175. ALL_RESULT=$4
  176. HASH_RESULT=$5
  177. SERIAL_RESULT=$6
  178. KEYID_RESULT=$7
  179. CERTS_RESULT=$8
  180. CA_RESULT=$9
  181. SERIAL_WRESULT=$10
  182. KEYID_WRESULT=$11
  183. verbose "$tid: checking revocations for $TAG"
  184. for f in $FILES; do
  185. check_krl $f $OBJ/krl-empty no "$TAG"
  186. check_krl $f $OBJ/krl-keys $KEYS_RESULT "$TAG"
  187. check_krl $f $OBJ/krl-all $ALL_RESULT "$TAG"
  188. check_krl $f $OBJ/krl-sha1 $HASH_RESULT "$TAG"
  189. check_krl $f $OBJ/krl-sha256 $HASH_RESULT "$TAG"
  190. check_krl $f $OBJ/krl-hash $HASH_RESULT "$TAG"
  191. check_krl $f $OBJ/krl-serial $SERIAL_RESULT "$TAG"
  192. check_krl $f $OBJ/krl-keyid $KEYID_RESULT "$TAG"
  193. check_krl $f $OBJ/krl-cert $CERTS_RESULT "$TAG"
  194. check_krl $f $OBJ/krl-ca $CA_RESULT "$TAG"
  195. check_krl $f $OBJ/krl-serial-wild $SERIAL_WRESULT "$TAG"
  196. check_krl $f $OBJ/krl-keyid-wild $KEYID_WRESULT "$TAG"
  197. done
  198. }
  199. test_all()
  200. {
  201. # wildcard
  202. # keys all hash sr# ID cert CA srl ID
  203. test_rev "$RKEYS" "revoked keys" y y y n n n n n n
  204. test_rev "$UKEYS" "unrevoked keys" n n n n n n n n n
  205. test_rev "$RCERTS" "revoked certs" y y y y y y y y y
  206. test_rev "$UCERTS" "unrevoked certs" n n n n n n y n n
  207. }
  208. test_all
  209. # Check update. Results should be identical.
  210. verbose "$tid: testing KRL update"
  211. for f in $OBJ/krl-keys $OBJ/krl-cert $OBJ/krl-all \
  212. $OBJ/krl-ca $OBJ/krl-serial $OBJ/krl-keyid \
  213. $OBJ/krl-serial-wild $OBJ/krl-keyid-wild; do
  214. cp -f $OBJ/krl-empty $f
  215. genkrls -u
  216. done
  217. test_all