1*9171d7d9Sdjm#	$OpenBSD: agent-pkcs11-cert.sh,v 1.1 2023/12/18 14:50:08 djm Exp $
2*9171d7d9Sdjm#	Placed in the Public Domain.
3*9171d7d9Sdjm
4*9171d7d9Sdjmtid="pkcs11 agent certificate test"
5*9171d7d9Sdjm
6*9171d7d9SdjmSSH_AUTH_SOCK="$OBJ/agent.sock"
7*9171d7d9Sdjmexport SSH_AUTH_SOCK
8*9171d7d9SdjmLC_ALL=C
9*9171d7d9Sdjmexport LC_ALL
10*9171d7d9Sdjmp11_setup || skip "No PKCS#11 library found"
11*9171d7d9Sdjm
12*9171d7d9Sdjmrm -f $SSH_AUTH_SOCK $OBJ/agent.log
13*9171d7d9Sdjmrm -f $OBJ/output_* $OBJ/expect_*
14*9171d7d9Sdjmrm -f $OBJ/ca*
15*9171d7d9Sdjm
16*9171d7d9Sdjmtrace "generate CA key and certify keys"
17*9171d7d9Sdjm$SSHKEYGEN -q -t ed25519 -C ca -N '' -f $OBJ/ca ||  fatal "ssh-keygen CA failed"
18*9171d7d9Sdjm$SSHKEYGEN -qs $OBJ/ca -I "ecdsa_key" -n $USER -z 1 ${SSH_SOFTHSM_DIR}/EC.pub ||
19*9171d7d9Sdjm	fatal "certify ECDSA key failed"
20*9171d7d9Sdjm$SSHKEYGEN -qs $OBJ/ca -I "rsa_key" -n $USER -z 2 ${SSH_SOFTHSM_DIR}/RSA.pub ||
21*9171d7d9Sdjm	fatal "certify RSA key failed"
22*9171d7d9Sdjm$SSHKEYGEN -qs $OBJ/ca -I "ca_ca" -n $USER -z 3 $OBJ/ca.pub ||
23*9171d7d9Sdjm	fatal "certify CA key failed"
24*9171d7d9Sdjm
25*9171d7d9Sdjmrm -f $SSH_AUTH_SOCK
26*9171d7d9Sdjmtrace "start agent"
27*9171d7d9Sdjm${SSHAGENT} ${EXTRA_AGENT_ARGS} -d -a $SSH_AUTH_SOCK > $OBJ/agent.log 2>&1 &
28*9171d7d9SdjmAGENT_PID=$!
29*9171d7d9Sdjmtrap "kill $AGENT_PID" EXIT
30*9171d7d9Sdjmfor x in 0 1 2 3 4 ; do
31*9171d7d9Sdjm	# Give it a chance to start
32*9171d7d9Sdjm	${SSHADD} -l > /dev/null 2>&1
33*9171d7d9Sdjm	r=$?
34*9171d7d9Sdjm	test $r -eq 1 && break
35*9171d7d9Sdjm	sleep 1
36*9171d7d9Sdjmdone
37*9171d7d9Sdjmif [ $r -ne 1 ]; then
38*9171d7d9Sdjm	fatal "ssh-add -l did not fail with exit code 1 (got $r)"
39*9171d7d9Sdjmfi
40*9171d7d9Sdjm
41*9171d7d9Sdjmtrace "load pkcs11 keys and certs"
42*9171d7d9Sdjm# Note: deliberately contains non-cert keys and non-matching cert on commandline
43*9171d7d9Sdjmp11_ssh_add -qs ${TEST_SSH_PKCS11} \
44*9171d7d9Sdjm    $OBJ/ca.pub \
45*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/EC.pub \
46*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/EC-cert.pub \
47*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/RSA.pub \
48*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/RSA-cert.pub ||
49*9171d7d9Sdjm	fatal "failed to add keys"
50*9171d7d9Sdjm# Verify their presence
51*9171d7d9Sdjmcut -d' ' -f1-2 \
52*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/EC.pub \
53*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/RSA.pub \
54*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/EC-cert.pub \
55*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/RSA-cert.pub | sort > $OBJ/expect_list
56*9171d7d9Sdjm$SSHADD -L | cut -d' ' -f1-2 | sort > $OBJ/output_list
57*9171d7d9Sdjmdiff $OBJ/expect_list $OBJ/output_list
58*9171d7d9Sdjm
59*9171d7d9Sdjm# Verify that all can perform signatures.
60*9171d7d9Sdjmfor x in ${SSH_SOFTHSM_DIR}/EC.pub ${SSH_SOFTHSM_DIR}/RSA.pub \
61*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/EC-cert.pub ${SSH_SOFTHSM_DIR}/RSA-cert.pub ; do
62*9171d7d9Sdjm	$SSHADD -T $x || fail "Signing failed for $x"
63*9171d7d9Sdjmdone
64*9171d7d9Sdjm
65*9171d7d9Sdjm# Delete plain keys.
66*9171d7d9Sdjm$SSHADD -qd ${SSH_SOFTHSM_DIR}/EC.pub ${SSH_SOFTHSM_DIR}/RSA.pub
67*9171d7d9Sdjm# Verify that certs can still perform signatures.
68*9171d7d9Sdjmfor x in ${SSH_SOFTHSM_DIR}/EC-cert.pub ${SSH_SOFTHSM_DIR}/RSA-cert.pub ; do
69*9171d7d9Sdjm	$SSHADD -T $x || fail "Signing failed for $x"
70*9171d7d9Sdjmdone
71*9171d7d9Sdjm
72*9171d7d9Sdjm$SSHADD -qD >/dev/null || fatal "clear agent failed"
73*9171d7d9Sdjm
74*9171d7d9Sdjmtrace "load pkcs11 certs only"
75*9171d7d9Sdjmp11_ssh_add -qCs ${TEST_SSH_PKCS11} \
76*9171d7d9Sdjm    $OBJ/ca.pub \
77*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/EC.pub \
78*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/EC-cert.pub \
79*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/RSA.pub \
80*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/RSA-cert.pub ||
81*9171d7d9Sdjm	fatal "failed to add keys"
82*9171d7d9Sdjm# Verify their presence
83*9171d7d9Sdjmcut -d' ' -f1-2 \
84*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/EC-cert.pub \
85*9171d7d9Sdjm    ${SSH_SOFTHSM_DIR}/RSA-cert.pub | sort > $OBJ/expect_list
86*9171d7d9Sdjm$SSHADD -L | cut -d' ' -f1-2 | sort > $OBJ/output_list
87*9171d7d9Sdjmdiff $OBJ/expect_list $OBJ/output_list
88*9171d7d9Sdjm
89*9171d7d9Sdjm# Verify that certs can perform signatures.
90*9171d7d9Sdjmfor x in ${SSH_SOFTHSM_DIR}/EC-cert.pub ${SSH_SOFTHSM_DIR}/RSA-cert.pub ; do
91*9171d7d9Sdjm	$SSHADD -T $x || fail "Signing failed for $x"
92*9171d7d9Sdjmdone
93