Skip to content

Commit b8e241f

Browse files
committed
Fix PKCS11 two-steps test flow
1 parent 0a18394 commit b8e241f

4 files changed

Lines changed: 136 additions & 40 deletions

File tree

.github/workflows/trustzone-emulator-tests.yml

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
3434
make clean distclean
3535
cp config/examples/stm32h5-tz.config .config
36-
make wolfboot.bin PKCS11_TESTAPP=1
36+
make PKCS11_TESTAPP=1
3737
3838
first_log=/tmp/m33mu-pkcs11-first.log
3939
second_log=/tmp/m33mu-pkcs11-second.log
@@ -42,18 +42,30 @@ jobs:
4242
rm -rf "$persist_dir"
4343
mkdir -p "$persist_dir"
4444
45+
dump_log() {
46+
local log_file="$1"
47+
if [ -f "$log_file" ]; then
48+
echo "--- $log_file ---"
49+
cat "$log_file"
50+
fi
51+
}
52+
4553
(
4654
cd "$persist_dir"
4755
m33mu "$GITHUB_WORKSPACE/wolfboot.bin" \
4856
"$GITHUB_WORKSPACE/test-app/image_v1_signed.bin:0x60000" \
49-
--persist --uart-stdout --timeout 120 --expect-bkpt 0x7f \
57+
--persist --uart-stdout --timeout 120 --expect-bkpt 0x7d \
5058
>"$first_log" 2>&1
5159
)
5260
53-
grep -q "pkcs11: first boot path, creating persistent objects" "$first_log"
54-
grep -q "pkcs11: created persistent PKCS11 objects" "$first_log"
55-
grep -q "pkcs11: success" "$first_log"
56-
grep -q "\\[EXPECT BKPT\\] Success" "$first_log"
61+
grep -q "pkcs11: first boot path, creating persistent objects" "$first_log" && \
62+
grep -q "pkcs11: created persistent PKCS11 objects" "$first_log" && \
63+
grep -q "pkcs11: success" "$first_log" && \
64+
grep -q "\\[BKPT\\] imm=0x7d" "$first_log" && \
65+
grep -q "\\[EXPECT BKPT\\] Success" "$first_log" || {
66+
dump_log "$first_log"
67+
exit 1
68+
}
5769
5870
(
5971
cd "$persist_dir"
@@ -63,10 +75,14 @@ jobs:
6375
>"$second_log" 2>&1
6476
)
6577
66-
grep -q "pkcs11: second boot path, restoring persistent objects" "$second_log"
67-
grep -q "pkcs11: restored persistent PKCS11 objects" "$second_log"
68-
grep -q "pkcs11: success" "$second_log"
69-
grep -q "\\[EXPECT BKPT\\] Success" "$second_log"
78+
grep -q "pkcs11: second boot path, restoring persistent objects" "$second_log" && \
79+
grep -q "pkcs11: restored persistent PKCS11 objects" "$second_log" && \
80+
grep -q "pkcs11: success" "$second_log" && \
81+
grep -q "\\[BKPT\\] imm=0x7f" "$second_log" && \
82+
grep -q "\\[EXPECT BKPT\\] Success" "$second_log" || {
83+
dump_log "$second_log"
84+
exit 1
85+
}
7086
7187
- name: Clean and build stm32u5 (TZ + wolfcrypt)
7288
run: |

test-app/app_stm32h5.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1282,7 +1282,9 @@ void main(void)
12821282

12831283
#ifdef WOLFBOOT_PKCS11_TESTAPP
12841284
ret = test_pkcs11_start();
1285-
if (ret == 0)
1285+
if (ret == PKCS11_TEST_FIRST_BOOT_OK)
1286+
asm volatile ("bkpt #0x7d");
1287+
else if (ret == PKCS11_TEST_SECOND_BOOT_OK)
12861288
asm volatile ("bkpt #0x7f");
12871289
else
12881290
asm volatile ("bkpt #0x7e");

test-app/test_pkcs11.c

Lines changed: 101 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,27 @@
1717

1818
#include "test_pkcs11.h"
1919

20+
#include "wolfpkcs11/pkcs11.h"
21+
2022
#include <wolfssl/wolfcrypt/types.h>
2123
#include <wolfssl/wolfcrypt/settings.h>
24+
#include <wolfssl/wolfcrypt/wc_port.h>
25+
#include <wolfssl/wolfcrypt/wc_pkcs11.h>
26+
#include <wolfssl/wolfcrypt/sha256.h>
2227
#include <string.h>
2328
#include <stdio.h>
2429

25-
#include "wolfpkcs11/pkcs11.h"
26-
2730
extern const char pkcs11_library_name[];
2831
extern const CK_FUNCTION_LIST wolfpkcs11nsFunctionList;
2932

3033
static const CK_BYTE test_token_label[32] = {
3134
'E','c','c','K','e','y',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
3235
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '
3336
};
37+
static const char test_token_name[] = "EccKey";
3438
static const CK_BYTE test_so_pin[] = "0123456789ABCDEF";
35-
static const CK_BYTE test_user_pin[] = "ABCDEF0123456789";
39+
static const CK_BYTE test_user_pin[] = "0123456789ABCDEF";
40+
static const CK_BYTE test_so_pin_label[] = "SO-PIN";
3641
static const CK_BYTE test_key_id[] = { 0x57, 0x42, 0x50, 0x31 };
3742
static const CK_BYTE test_pub_label[] = "wolfBoot PKCS11 demo pub";
3843
static const CK_BYTE test_priv_label[] = "wolfBoot PKCS11 demo priv";
@@ -73,6 +78,22 @@ static int test_pkcs11_ck_ok(const char *label, CK_RV rv)
7378
return 0;
7479
}
7580

81+
static void test_pkcs11_log_blob_checksum(const struct test_pkcs11_blob *blob,
82+
const char *prefix)
83+
{
84+
byte digest[WC_SHA256_DIGEST_SIZE];
85+
word32 blob_len = (word32)(blob->payload_len + blob->sig_len);
86+
word32 i;
87+
88+
if (wc_Sha256Hash(blob->data, blob_len, digest) != 0)
89+
return;
90+
91+
printf("pkcs11: %s blob_sha256=", prefix);
92+
for (i = 0; i < (word32)sizeof(digest); i++)
93+
printf("%02x", digest[i]);
94+
printf("\r\n");
95+
}
96+
7697
static int test_pkcs11_find_one(CK_SESSION_HANDLE session,
7798
CK_ATTRIBUTE_PTR tmpl, CK_ULONG tmpl_count, CK_OBJECT_HANDLE *obj)
7899
{
@@ -159,32 +180,46 @@ static int test_pkcs11_log_obj_attr(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE
159180
return 0;
160181
}
161182

162-
static int test_pkcs11_init_token_if_needed(void)
183+
static int test_pkcs11_provision_token(void)
163184
{
185+
int ret;
164186
CK_RV rv;
165-
CK_TOKEN_INFO info;
166-
CK_SESSION_HANDLE session;
187+
CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
188+
Pkcs11Token token;
189+
Pkcs11Dev dev;
167190

168-
rv = wolfpkcs11nsFunctionList.C_GetTokenInfo(TEST_PKCS11_SLOT_ID, &info);
169-
if (rv == CKR_OK && (info.flags & CKF_TOKEN_INITIALIZED))
170-
return 0;
191+
printf("pkcs11: provisioning token\r\n");
192+
193+
dev.heap = NULL;
194+
dev.func = (CK_FUNCTION_LIST *)&wolfpkcs11nsFunctionList;
195+
196+
ret = wc_Pkcs11Token_Init(&token, &dev, (int)TEST_PKCS11_SLOT_ID,
197+
test_token_name, test_user_pin, (int)(sizeof(test_user_pin) - 1));
198+
if (ret != 0) {
199+
printf("pkcs11: wc_Pkcs11Token_Init ret=%d\r\n", ret);
200+
return -1;
201+
}
171202

172-
printf("pkcs11: initializing token\r\n");
173203
rv = wolfpkcs11nsFunctionList.C_InitToken(TEST_PKCS11_SLOT_ID,
174204
(CK_UTF8CHAR_PTR)test_so_pin, (CK_ULONG)(sizeof(test_so_pin) - 1),
175205
(CK_UTF8CHAR_PTR)test_token_label);
176-
if (test_pkcs11_ck_ok("C_InitToken", rv) < 0)
206+
if (test_pkcs11_ck_ok("C_InitToken", rv) < 0) {
207+
wc_Pkcs11Token_Final(&token);
177208
return -1;
209+
}
178210

179211
rv = wolfpkcs11nsFunctionList.C_OpenSession(TEST_PKCS11_SLOT_ID,
180212
CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL, &session);
181-
if (test_pkcs11_ck_ok("C_OpenSession(SO)", rv) < 0)
213+
if (test_pkcs11_ck_ok("C_OpenSession(SO)", rv) < 0) {
214+
wc_Pkcs11Token_Final(&token);
182215
return -1;
216+
}
183217

184218
rv = wolfpkcs11nsFunctionList.C_Login(session, CKU_SO,
185219
(CK_UTF8CHAR_PTR)test_so_pin, (CK_ULONG)(sizeof(test_so_pin) - 1));
186220
if (test_pkcs11_ck_ok("C_Login(SO)", rv) < 0) {
187221
(void)wolfpkcs11nsFunctionList.C_CloseSession(session);
222+
wc_Pkcs11Token_Final(&token);
188223
return -1;
189224
}
190225

@@ -193,11 +228,13 @@ static int test_pkcs11_init_token_if_needed(void)
193228
if (test_pkcs11_ck_ok("C_InitPIN", rv) < 0) {
194229
(void)wolfpkcs11nsFunctionList.C_Logout(session);
195230
(void)wolfpkcs11nsFunctionList.C_CloseSession(session);
231+
wc_Pkcs11Token_Final(&token);
196232
return -1;
197233
}
198234

199235
(void)wolfpkcs11nsFunctionList.C_Logout(session);
200236
(void)wolfpkcs11nsFunctionList.C_CloseSession(session);
237+
wc_Pkcs11Token_Final(&token);
201238
return 0;
202239
}
203240

@@ -310,7 +347,7 @@ static int test_pkcs11_sign_payload(CK_SESSION_HANDLE session,
310347
CK_ULONG payload_len = (CK_ULONG)(sizeof(test_payload) - 1);
311348
CK_ULONG sig_len = (CK_ULONG)(sizeof(blob->data) - payload_len);
312349

313-
mech.mechanism = CKM_ECDSA;
350+
mech.mechanism = CKM_ECDSA_SHA256;
314351
mech.pParameter = NULL;
315352
mech.ulParameterLen = 0;
316353

@@ -333,6 +370,7 @@ static int test_pkcs11_sign_payload(CK_SESSION_HANDLE session,
333370

334371
printf("pkcs11: signed payload len=%lu sig_len=%lu\r\n",
335372
(unsigned long)blob->payload_len, (unsigned long)blob->sig_len);
373+
test_pkcs11_log_blob_checksum(blob, "created");
336374
return 0;
337375
}
338376

@@ -376,6 +414,7 @@ static int test_pkcs11_load_blob(CK_SESSION_HANDLE session,
376414

377415
printf("pkcs11: restored blob payload_len=%lu sig_len=%lu\r\n",
378416
(unsigned long)blob->payload_len, (unsigned long)blob->sig_len);
417+
test_pkcs11_log_blob_checksum(blob, "restored");
379418
return 0;
380419
}
381420

@@ -385,7 +424,7 @@ static int test_pkcs11_verify_blob(CK_SESSION_HANDLE session,
385424
CK_RV rv;
386425
CK_MECHANISM mech;
387426

388-
mech.mechanism = CKM_ECDSA;
427+
mech.mechanism = CKM_ECDSA_SHA256;
389428
mech.pParameter = NULL;
390429
mech.ulParameterLen = 0;
391430

@@ -421,52 +460,76 @@ static int test_pkcs11_log_key_attrs(CK_SESSION_HANDLE session,
421460

422461
int test_pkcs11_start(void)
423462
{
463+
int wc_ret;
424464
CK_RV rv;
425465
CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
426466
CK_OBJECT_HANDLE pub_obj = CK_INVALID_HANDLE;
427467
CK_OBJECT_HANDLE priv_obj = CK_INVALID_HANDLE;
428468
CK_OBJECT_HANDLE data_obj = CK_INVALID_HANDLE;
429469
struct test_pkcs11_blob blob;
430470
int ret;
471+
int key_state;
472+
int data_state;
473+
int result = PKCS11_TEST_FAIL;
431474

432475
memset(&blob, 0, sizeof(blob));
433476

434477
printf("pkcs11: start\r\n");
435478
printf("pkcs11: secure provider=%s\r\n", pkcs11_library_name);
436479

437-
rv = wolfpkcs11nsFunctionList.C_Initialize(NULL);
438-
if (test_pkcs11_ck_ok("C_Initialize", rv) < 0)
480+
wc_ret = wolfCrypt_Init();
481+
if (wc_ret != 0) {
482+
printf("pkcs11: wolfCrypt_Init ret=%d\r\n", wc_ret);
439483
return -1;
484+
}
440485

441-
if (test_pkcs11_init_token_if_needed() < 0) {
442-
(void)wolfpkcs11nsFunctionList.C_Finalize(NULL);
486+
rv = wolfpkcs11nsFunctionList.C_Initialize(NULL);
487+
if (test_pkcs11_ck_ok("C_Initialize", rv) < 0) {
488+
wolfCrypt_Cleanup();
443489
return -1;
444490
}
445491

446492
ret = test_pkcs11_open_user_session(&session);
447493
if (ret == -2) {
448-
(void)wolfpkcs11nsFunctionList.C_Finalize(NULL);
449-
return -1;
494+
printf("pkcs11: first boot path, provisioning token\r\n");
495+
if (test_pkcs11_provision_token() < 0) {
496+
(void)wolfpkcs11nsFunctionList.C_Finalize(NULL);
497+
wolfCrypt_Cleanup();
498+
return -1;
499+
}
500+
ret = test_pkcs11_open_user_session(&session);
450501
}
451502
if (ret < 0) {
452503
(void)wolfpkcs11nsFunctionList.C_Finalize(NULL);
504+
wolfCrypt_Cleanup();
453505
return -1;
454506
}
455507

456-
ret = test_pkcs11_find_keypair(session, &pub_obj, &priv_obj);
457-
if (ret < 0) {
508+
key_state = test_pkcs11_find_keypair(session, &pub_obj, &priv_obj);
509+
if (key_state < 0) {
510+
ret = -1;
511+
goto cleanup;
512+
}
513+
514+
data_state = test_pkcs11_find_data_obj(session, &data_obj);
515+
if (data_state < 0) {
458516
(void)wolfpkcs11nsFunctionList.C_Logout(session);
459517
(void)wolfpkcs11nsFunctionList.C_CloseSession(session);
460518
(void)wolfpkcs11nsFunctionList.C_Finalize(NULL);
519+
wolfCrypt_Cleanup();
461520
return -1;
462521
}
463522

464-
if (ret == 1) {
523+
if (key_state == 1 && data_state == 1) {
465524
printf("pkcs11: first boot path, creating persistent objects\r\n");
466525
if (test_pkcs11_generate_keypair(session, &pub_obj, &priv_obj) < 0)
467526
ret = -1;
468-
if (ret == 1 || ret == 0)
527+
else
528+
ret = 0;
529+
if (ret == 0)
469530
ret = test_pkcs11_sign_payload(session, priv_obj, &blob);
531+
if (ret == 0)
532+
ret = test_pkcs11_verify_blob(session, pub_obj, &blob);
470533
if (ret == 0)
471534
ret = test_pkcs11_store_blob(session, &blob, &data_obj);
472535
if (ret == 0)
@@ -477,12 +540,12 @@ int test_pkcs11_start(void)
477540
ret = test_pkcs11_log_obj_attr(session, data_obj, "data", CKA_OBJECT_ID);
478541
if (ret == 0)
479542
printf("pkcs11: created persistent PKCS11 objects\r\n");
543+
if (ret == 0)
544+
result = PKCS11_TEST_FIRST_BOOT_OK;
480545
}
481-
else {
546+
else if (key_state == 0 && data_state == 0) {
482547
printf("pkcs11: second boot path, restoring persistent objects\r\n");
483-
ret = test_pkcs11_find_data_obj(session, &data_obj);
484-
if (ret == 0)
485-
ret = test_pkcs11_load_blob(session, data_obj, &blob);
548+
ret = test_pkcs11_load_blob(session, data_obj, &blob);
486549
if (ret == 0)
487550
ret = test_pkcs11_log_key_attrs(session, pub_obj, priv_obj);
488551
if (ret == 0)
@@ -491,18 +554,27 @@ int test_pkcs11_start(void)
491554
ret = test_pkcs11_verify_blob(session, pub_obj, &blob);
492555
if (ret == 0)
493556
printf("pkcs11: restored persistent PKCS11 objects\r\n");
557+
if (ret == 0)
558+
result = PKCS11_TEST_SECOND_BOOT_OK;
559+
}
560+
else {
561+
printf("pkcs11: inconsistent persistent state key_state=%d data_state=%d\r\n",
562+
key_state, data_state);
563+
ret = -1;
494564
}
495565

566+
cleanup:
496567
(void)wolfpkcs11nsFunctionList.C_Logout(session);
497568
(void)wolfpkcs11nsFunctionList.C_CloseSession(session);
498569
(void)wolfpkcs11nsFunctionList.C_Finalize(NULL);
570+
(void)wolfCrypt_Cleanup();
499571

500572
if (ret == 0)
501573
printf("pkcs11: success\r\n");
502574
else
503575
printf("pkcs11: failure\r\n");
504576

505-
return ret;
577+
return (ret == 0) ? result : PKCS11_TEST_FAIL;
506578
}
507579

508580
#else

test-app/test_pkcs11.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
#ifndef WOLFBOOT_TEST_PKCS11_H
22
#define WOLFBOOT_TEST_PKCS11_H
33

4+
enum test_pkcs11_result {
5+
PKCS11_TEST_FAIL = -1,
6+
PKCS11_TEST_FIRST_BOOT_OK = 1,
7+
PKCS11_TEST_SECOND_BOOT_OK = 2
8+
};
9+
410
int test_pkcs11_start(void);
511

612
#endif /* WOLFBOOT_TEST_PKCS11_H */

0 commit comments

Comments
 (0)