11
#include "pkcs11types.h"
17
void dump_session_info( CK_SESSION_INFO *info )
19
printf(" CK_SESSION_INFO:\n");
20
printf(" slotID: %ld\n", info->slotID );
22
switch (info->state) {
23
case CKS_RO_PUBLIC_SESSION: printf("CKS_RO_PUBLIC_SESSION\n");
25
case CKS_RW_PUBLIC_SESSION: printf("CKS_RW_PUBLIC_SESSION\n");
27
case CKS_RO_USER_FUNCTIONS: printf("CKS_RO_USER_FUNCTIONS\n");
29
case CKS_RW_USER_FUNCTIONS: printf("CKS_RW_USER_FUNCTIONS\n");
31
case CKS_RW_SO_FUNCTIONS: printf("CKS_RW_SO_FUNCTIONS\n");
34
printf(" flags: %p\n", (void *)info->flags );
35
printf(" ulDeviceError: %ld\n", info->ulDeviceError );
42
int do_OpenSession( void )
46
CK_SESSION_HANDLE handle;
49
printf("do_OpenSession...\n");
52
flags = CKF_SERIAL_SESSION; // read-only session
54
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &handle );
56
show_error(" C_OpenSession #1", rc );
60
rc = funcs->C_CloseSession( handle );
62
show_error(" C_CloseSession #1", rc );
66
printf("Looks okay...\n");
74
int do_OpenSession2( void )
78
CK_SESSION_HANDLE h1, h2;
81
printf("do_OpenSession2...\n");
84
flags = CKF_SERIAL_SESSION; // read-only session
86
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h1 );
88
show_error(" C_OpenSession #1", rc );
92
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
93
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h2 );
95
show_error(" C_OpenSession #2", rc );
99
rc = funcs->C_CloseSession( h1 );
101
show_error(" C_CloseSession #1", rc );
105
rc = funcs->C_CloseSession( h2 );
107
show_error(" C_CloseSession #2", rc );
111
printf("Looks okay...\n");
119
int do_CloseAllSessions( void )
123
CK_SESSION_HANDLE h1, h2, h3;
126
printf("do_CloseAllSessions...\n");
129
flags = CKF_SERIAL_SESSION; // read-only session
131
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h1 );
133
show_error(" C_OpenSession #1", rc );
137
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
138
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h2 );
140
show_error(" C_OpenSession #2", rc );
144
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
145
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h3 );
147
show_error(" C_OpenSession #3", rc );
151
rc = funcs->C_CloseAllSessions( slot_id );
153
show_error(" C_CloseAllSessions", rc );
157
printf("Looks okay...\n");
165
int do_GetSessionInfo( void )
169
CK_SESSION_HANDLE h1, h2, h3;
170
CK_SESSION_INFO info;
173
printf("do_GetSessionInfo...\n");
176
flags = CKF_SERIAL_SESSION; // read-only session
178
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h1 );
180
show_error(" C_OpenSession #1", rc );
184
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
185
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h2 );
187
show_error(" C_OpenSession #2", rc );
191
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
192
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h3 );
194
show_error(" C_OpenSession #3", rc );
198
rc = funcs->C_GetSessionInfo( h1, &info );
200
show_error(" C_GetSessionInfo #1", rc );
204
dump_session_info( &info );
206
rc = funcs->C_GetSessionInfo( h2, &info );
208
show_error(" C_GetSessionInfo #2", rc );
212
dump_session_info( &info );
214
rc = funcs->C_GetSessionInfo( h2, &info );
216
show_error(" C_GetSessionInfo #3", rc );
220
dump_session_info( &info );
222
rc = funcs->C_CloseAllSessions( slot_id );
224
show_error(" C_CloseAllSessions", rc );
228
printf("Looks okay...\n");
235
// This is a messy function but it does alot of tests:
237
// 1) Create 1 RO session and 2 RW sessions
238
// 2) Log the USER into session #1. Verify that all 3 become USER sessions.
239
// 3) Try to login again, this time to session #2. Verify that it fails
240
// 4) Logout session #1
241
// 5) Try to logout from session #2. Verify that this fails.
242
// 6) Try to log the SO into session #1. Verify that it fails (RO session exists)
243
// 7) Try to log the SO into session #2. Verify that it fails (RO session exists)
244
// 8) Close all sessions
245
// 9) Creaate 2 RW sessions
246
// A) Log the SO into one. Verify that both are now SO sessions.
247
// B) Create a 3rd RW session. Verify that it immediately becomes an SO session
248
// C) Try to create a RO session. Verify that it fails (SO session exists)
249
// D) Close all sessions and return
251
int do_LoginLogout( void )
255
CK_SESSION_HANDLE h1, h2, h3, h4;
256
CK_SESSION_INFO info;
258
CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
259
CK_ULONG user_pin_len;
260
CK_BYTE so_pin[PKCS11_MAX_PIN_LEN];
263
printf("do_LoginLogout...\n");
265
if (get_user_pin(user_pin))
266
return CKR_FUNCTION_FAILED;
267
user_pin_len = (CK_ULONG)strlen((char *)user_pin);
269
if (get_so_pin(so_pin))
270
return CKR_FUNCTION_FAILED;
271
so_pin_len = (CK_ULONG)strlen((char *)so_pin);
274
flags = CKF_SERIAL_SESSION; // read-only session
277
// create 3 sessions. 1 RO, two RW
279
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h1 );
281
show_error(" C_OpenSession #1", rc );
285
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
286
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h2 );
288
show_error(" C_OpenSession #2", rc );
292
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
293
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h3 );
295
show_error(" C_OpenSession #3", rc );
300
// log the first session in. all sessions should become USER sessions
302
rc = funcs->C_Login( h1, CKU_USER, user_pin, user_pin_len );
304
show_error(" C_Login #1", rc );
308
rc = funcs->C_GetSessionInfo( h1, &info );
310
show_error(" C_GetSessionInfo #1", rc );
314
dump_session_info( &info );
316
rc = funcs->C_GetSessionInfo( h2, &info );
318
show_error(" C_GetSessionInfo #2", rc );
322
dump_session_info( &info );
324
rc = funcs->C_GetSessionInfo( h2, &info );
326
show_error(" C_GetSessionInfo #3", rc );
330
dump_session_info( &info );
334
// now, try to log in session #2. this should fail (already logged in)
336
rc = funcs->C_Login( h2, CKU_USER, user_pin, user_pin_len );
337
if (rc != CKR_USER_ALREADY_LOGGED_IN) {
338
show_error(" C_Login #2", rc );
339
printf(" Expected CKR_USER_ALREADY_LOGGED_IN\n");
344
// now, try to logout twice
346
rc = funcs->C_Logout( h1 );
348
show_error(" C_Logout #1", rc );
352
rc = funcs->C_Logout( h2 );
353
if (rc != CKR_USER_NOT_LOGGED_IN) {
354
show_error(" C_Logout #2", rc );
355
printf(" Expected CKR_USER_NOT_LOGGED_IN\n");
360
// now, try to log the SO in. this should fail since H1 is a RO session
362
rc = funcs->C_Login( h1, CKU_SO, so_pin, so_pin_len );
363
if (rc != CKR_SESSION_READ_ONLY_EXISTS) {
364
show_error(" C_Login #4", rc );
365
printf(" Expected CKR_SESSION_READ_ONLY_EXISTS\n");
369
rc = funcs->C_Login( h2, CKU_SO, so_pin, so_pin_len );
370
if (rc != CKR_SESSION_READ_ONLY_EXISTS) {
371
show_error(" C_Login #5", rc );
372
printf(" Expected CKR_SESSION_READ_ONLY_EXISTS\n");
377
// log completely out
380
rc = funcs->C_CloseAllSessions( slot_id );
382
show_error(" C_CloseAllSessions #1", rc );
387
// now, start two RW sessions
389
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
390
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h1 );
392
show_error(" C_OpenSession #4", rc );
396
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
397
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h2 );
399
show_error(" C_OpenSession #5", rc );
404
// now, try to log the SO in. this should work
406
rc = funcs->C_Login( h1, CKU_SO, so_pin, so_pin_len );
408
show_error(" C_Login #6", rc );
412
rc = funcs->C_GetSessionInfo( h1, &info );
414
show_error(" C_GetSessionInfo #4", rc );
418
dump_session_info( &info );
420
rc = funcs->C_GetSessionInfo( h2, &info );
422
show_error(" C_GetSessionInfo #5", rc );
426
dump_session_info( &info );
429
// now, create a 3rd RW session. verify that it is automatically an SO session
431
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
432
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h3 );
434
show_error(" C_OpenSession #6", rc );
438
rc = funcs->C_GetSessionInfo( h3, &info );
440
show_error(" C_GetSessionInfo #6", rc );
444
dump_session_info( &info );
447
// now, try to create a 4th session. RO this time. Should fail
449
flags = CKF_SERIAL_SESSION;
450
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &h4 );
451
if (rc != CKR_SESSION_READ_WRITE_SO_EXISTS) {
452
show_error(" C_OpenSession #6", rc );
453
printf(" Expected CKR_SESSION_READ_WRITE_SO_EXISTS\n");
459
// we're done...close all sessions
461
rc = funcs->C_CloseAllSessions( slot_id );
463
show_error(" C_CloseAllSessions #2: %d", rc );
468
printf("Looks okay...\n");
476
int do_OperationState1( void )
479
CK_SESSION_HANDLE session1, session2;
481
CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
482
CK_ULONG user_pin_len;
485
CK_BYTE original[1024];
486
CK_BYTE crypt1 [1024];
487
CK_BYTE crypt2 [1024];
491
CK_BYTE *op_state = NULL;
492
CK_ULONG op_state_len;
494
CK_ULONG orig_len, crypt1_len, crypt2_len, trash1_len, trash2_len;
498
CK_OBJECT_HANDLE h_key;
501
printf("do_OperationState1...\n");
507
// All the hash values should be the same
508
// 1) session #1 starts a multi-part encryption
509
// 2) save session #1 operation state
510
// 3) session #1 passes garbage to encrypt update
511
// 4) session #2's operation state is set to what we saved
512
// 5) sessoin #2 finishes the encryption operation
514
// Session #2's results should be the same as the single-part version
517
// create two USER RW sessions
519
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
520
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session1 );
522
show_error(" C_OpenSession #1", rc );
526
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session2 );
528
show_error(" C_OpenSession #2", rc );
532
if (get_user_pin(user_pin))
533
return CKR_FUNCTION_FAILED;
534
user_pin_len = (CK_ULONG)strlen((char *)user_pin);
536
rc = funcs->C_Login( session1, CKU_USER, user_pin, user_pin_len );
538
show_error(" C_Login #1", rc );
542
orig_len = sizeof(original);
543
for (i=0; i < orig_len; i++)
544
original[i] = i % 255;
546
trash1_len = sizeof(trash1);
547
memcpy( trash1, "asdflkjasdlkjadslkj", trash1_len );
550
// first generate a DES key
552
mech.mechanism = CKM_DES_KEY_GEN;
553
mech.ulParameterLen = 0;
554
mech.pParameter = NULL;
556
rc = funcs->C_GenerateKey( session1, &mech, NULL, 0, &h_key );
558
show_error(" C_GenerateKey #1", rc );
562
// now encrypt the original data all at once using CBC
564
mech.mechanism = CKM_DES_CBC;
565
mech.ulParameterLen = 8;
566
mech.pParameter = "asdfqwer";
568
rc = funcs->C_EncryptInit( session1, &mech, h_key );
570
show_error(" C_EncryptInit #1", rc );
574
crypt1_len = sizeof(crypt1);
575
rc = funcs->C_Encrypt( session1, original, orig_len, crypt1, &crypt1_len );
577
show_error(" C_Encrypt #1", rc );
582
// now, begin encrypting multipart
584
rc = funcs->C_EncryptInit( session1, &mech, h_key );
586
show_error(" C_EncryptInit #2", rc );
590
crypt2_len = sizeof(crypt2);
591
rc = funcs->C_EncryptUpdate( session1, original, orig_len / 2,
592
crypt2, &crypt2_len );
594
show_error(" C_EncryptUpdate #1", rc );
598
// save session #1's operation state
600
rc = funcs->C_GetOperationState( session1, NULL, &op_state_len );
602
show_error(" C_GetOperationState #1", rc );
606
op_state = (CK_BYTE *)malloc(op_state_len);
608
show_error(" HOST MEMORY ERROR", CKR_HOST_MEMORY );
612
rc = funcs->C_GetOperationState( session1, op_state, &op_state_len );
614
show_error(" C_GetOperationState #1", rc );
618
// now, encrypt some garbage. this will affect the CBC even if
619
// we throw the encrypted garbage away
621
trash2_len = sizeof(trash2);
622
rc = funcs->C_EncryptUpdate( session1, trash1, trash1_len,
623
trash2, &trash2_len );
625
show_error(" C_EncryptUpdate #2", rc );
629
// restore session #1's operation state that we just saved back
630
// into session #2 and continue with the encryption
632
rc = funcs->C_SetOperationState( session2, op_state, op_state_len,
635
show_error(" C_SetOperationState #1", rc );
641
// now, encrypt the rest of the original data
644
crypt2_len = sizeof(crypt2) - crypt2_len;
645
rc = funcs->C_EncryptUpdate( session2,
646
original + orig_len/2, orig_len/2,
647
crypt2 + i, &crypt2_len );
649
show_error(" C_EncryptUpdate #3", rc );
655
trash2_len = sizeof(trash2);
656
rc = funcs->C_EncryptFinal( session2, trash2, &trash2_len );
658
show_error(" C_EncryptFinal #1", rc );
662
if (crypt2_len != crypt1_len) {
663
printf(" ERROR: Lengths don't match\n");
667
if (memcmp(crypt1, crypt2, crypt1_len) != 0) {
668
printf(" ERROR: crypt1 != crypt2\n");
672
rc = funcs->C_CloseSession( session1 );
674
show_error(" C_CloseSession #1", rc );
678
rc = funcs->C_CloseSession( session2 );
680
show_error(" C_CloseSession #2", rc );
684
printf("Looks okay...\n");
691
int do_OperationState2( void )
694
CK_SESSION_HANDLE session1, session2, session3;
696
CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
697
CK_ULONG user_pin_len;
700
CK_BYTE original[1024];
706
CK_ULONG digest1_len, digest2_len, digest3_len;
708
CK_BYTE *op_state1 = NULL;
709
CK_BYTE *op_state2 = NULL;
710
CK_ULONG op_state1_len;
711
CK_ULONG op_state2_len;
718
printf("do_OperationState2...\n");
723
// 1) session #1 digests the first 499 bytes
724
// 2) session #2 digests the first 27 bytes
725
// 3) session #3 digests the whole thing
726
// 3) we save both operation states
727
// 4) we set the operation states to the 'other' session thereby
728
// switching sessions. Session #2 picks up where session #1 was
729
// saved, session #1 picks up where session #2 was saved.
730
// 5) session #1 digests the final (1024 - 27) bytes
731
// 6) session #2 digests the final (1024 - 499) bytes
733
// All the hash values should be the same
736
// create three USER RW sessions
738
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
739
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session1 );
741
show_error(" C_OpenSession #1", rc );
745
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session2 );
747
show_error(" C_OpenSession #2", rc );
751
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session3 );
753
show_error(" C_OpenSession #3", rc );
757
if (get_user_pin(user_pin))
758
return CKR_FUNCTION_FAILED;
759
user_pin_len = (CK_ULONG)strlen((char *)user_pin);
761
rc = funcs->C_Login( session1, CKU_USER, user_pin, user_pin_len );
763
show_error(" C_Login #1", rc );
767
orig_len = sizeof(original);
768
for (i=0; i < orig_len; i++)
769
original[i] = i % 255;
771
mech.mechanism = CKM_MD5;
772
mech.pParameter = NULL;
773
mech.ulParameterLen = 0;
775
rc = funcs->C_DigestInit( session1, &mech );
777
show_error(" C_DigestInit #1", rc );
781
rc = funcs->C_DigestInit( session2, &mech );
783
show_error(" C_DigestInit #2", rc );
787
rc = funcs->C_DigestInit( session3, &mech );
789
show_error(" C_DigestInit #3", rc );
793
rc = funcs->C_DigestUpdate( session1, original, 499 );
795
show_error(" C_DigestUpdate #1", rc );
799
rc = funcs->C_DigestUpdate( session2, original, 27 );
801
show_error(" C_DigestUpdate #2", rc );
805
orig_len = sizeof(original);
806
digest3_len = sizeof(digest3);
807
rc = funcs->C_Digest( session3, original, orig_len,
808
digest3, &digest3_len );
810
show_error(" C_Digest #1", rc );
814
// save the operation states of sessions 1 and 2
816
rc = funcs->C_GetOperationState( session1, NULL, &op_state1_len );
818
show_error(" C_GetOperationState #1", rc );
821
op_state1 = (CK_BYTE *)malloc(op_state1_len);
823
show_error(" HOST MEMORY ERROR", CKR_HOST_MEMORY );
826
rc = funcs->C_GetOperationState( session1, op_state1, &op_state1_len );
828
show_error(" C_GetOperationState #2", rc );
832
rc = funcs->C_GetOperationState( session2, NULL, &op_state2_len );
834
show_error(" C_GetOperationState #3", rc );
837
op_state2 = (CK_BYTE *)malloc(op_state2_len);
839
show_error(" HOST MEMORY ERROR", CKR_HOST_MEMORY );
842
rc = funcs->C_GetOperationState( session2, op_state2, &op_state2_len );
844
show_error(" C_GetOperationState #4", rc );
850
rc = funcs->C_SetOperationState( session1, op_state2, op_state2_len,
853
show_error(" C_SetOperationState #2", rc );
857
rc = funcs->C_SetOperationState( session2, op_state1, op_state1_len,
860
show_error(" C_SetOperationState #3", rc );
864
// now, finish the digest operations
866
rc = funcs->C_DigestUpdate( session2, original+499, (orig_len - 499) );
868
show_error(" C_DigestUpdate #3", rc );
872
rc = funcs->C_DigestUpdate( session1, original+27, orig_len - 27 );
874
show_error(" C_DigestUpdate #4", rc );
878
digest1_len = sizeof(digest1);
879
rc = funcs->C_DigestFinal( session1, digest1, &digest1_len );
881
show_error(" C_DigestFinal #1", rc );
885
digest2_len = sizeof(digest2);
886
rc = funcs->C_DigestFinal( session2, digest2, &digest2_len );
888
show_error(" C_DigestFinal #2", rc );
892
if (digest1_len != digest2_len || digest1_len != digest3_len) {
893
printf(" ERROR: digested lengths don't match\n");
897
if (memcmp(digest1, digest2, digest1_len) != 0) {
898
printf(" ERROR: digest1 != digest2\n");
902
if (memcmp(digest1, digest3, digest1_len) != 0) {
903
printf(" ERROR: digest1 != digest3\n");
907
rc = funcs->C_CloseSession( session1 );
909
show_error(" C_CloseSession #3", rc );
912
rc = funcs->C_CloseSession( session2 );
914
show_error(" C_CloseSession #4", rc );
917
rc = funcs->C_CloseSession( session3 );
919
show_error(" C_CloseSession #5", rc );
923
printf("Looks okay...\n");
930
int do_OperationState3( void )
933
CK_SESSION_HANDLE session1, session2, session3;
935
CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
936
CK_ULONG user_pin_len;
939
CK_BYTE original[1024];
945
CK_ULONG orig_len, junk_len;
946
CK_ULONG digest1_len, digest2_len, digest3_len;
948
CK_BYTE *op_state2 = NULL;
949
CK_ULONG op_state2_len;
953
CK_MECHANISM mech1, mech2;
954
CK_OBJECT_HANDLE key;
957
printf("do_OperationState3...\n");
962
// 1) session #1 starts a multi-part encrypt
963
// 2) session #2 starts a multi-part digest
964
// 3) session #3 digests the whole thing
965
// 4) assign session #2's operating state to session #1
966
// 5) session #1 tries C_EncryptUpdate. Should fail.
967
// 6) session #1 finishes the multi-part digest
968
// 7) session #2 finishes the multi-part digest
970
// All the hash values should be the same
973
// create three USER RW sessions
975
flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
976
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session1 );
978
show_error(" C_OpenSession #1", rc );
982
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session2 );
984
show_error(" C_OpenSession #2", rc );
988
rc = funcs->C_OpenSession( slot_id, flags, NULL, NULL, &session3 );
990
show_error(" C_OpenSession #3", rc );
994
if (get_user_pin(user_pin))
995
return CKR_FUNCTION_FAILED;
996
user_pin_len = (CK_ULONG)strlen((char *)user_pin);
998
rc = funcs->C_Login( session1, CKU_USER, user_pin, user_pin_len );
1000
show_error(" C_Login #1", rc );
1004
orig_len = sizeof(original);
1005
for (i=0; i < orig_len; i++)
1006
original[i] = i % 255;
1009
mech1.mechanism = CKM_DES_KEY_GEN;
1010
mech1.pParameter = NULL;
1011
mech1.ulParameterLen = 0;
1013
rc = funcs->C_GenerateKey( session1, &mech1, NULL, 0, &key );
1015
show_error(" C_GenerateKey #1", rc );
1020
mech1.mechanism = CKM_DES_ECB;
1021
mech1.pParameter = NULL;
1022
mech1.ulParameterLen = 0;
1024
rc = funcs->C_EncryptInit( session1, &mech1, key );
1026
show_error(" C_EncryptInit #1", rc );
1030
mech2.mechanism = CKM_MD5;
1031
mech2.pParameter = NULL;
1032
mech2.ulParameterLen = 0;
1034
rc = funcs->C_DigestInit( session2, &mech2 );
1036
show_error(" C_DigestInit #1", rc );
1040
rc = funcs->C_DigestInit( session3, &mech2 );
1042
show_error(" C_DigestInit #2", rc );
1046
rc = funcs->C_DigestUpdate( session2, original, 499 );
1048
show_error(" C_DigestUpdate #1", rc );
1052
orig_len = sizeof(original);
1053
digest3_len = sizeof(digest3);
1054
rc = funcs->C_Digest( session3, original, orig_len,
1055
digest3, &digest3_len );
1057
show_error(" C_Digest #1", rc );
1062
rc = funcs->C_GetOperationState( session2, NULL, &op_state2_len );
1064
show_error(" C_GetOperationState #1", rc );
1067
op_state2 = (CK_BYTE *)malloc(op_state2_len);
1069
show_error(" HOST MEMORY ERROR #1", CKR_HOST_MEMORY );
1072
rc = funcs->C_GetOperationState( session2, op_state2, &op_state2_len );
1074
show_error(" C_GetOperationState #2", rc );
1078
rc = funcs->C_SetOperationState( session1, op_state2, op_state2_len, 0, 0 );
1080
show_error(" C_SetOperationState #1", rc );
1084
// session #1 should not be set to do digest not encryption
1086
junk_len = sizeof(junk);
1087
rc = funcs->C_EncryptUpdate( session1, original, 499, junk, &junk_len );
1088
if (rc != CKR_OPERATION_NOT_INITIALIZED) {
1089
show_error(" C_EncryptUpdate #1", rc );
1090
printf(" Expected CKR_OPERATION_NOT_INITIALIZED\n" );
1095
// now, finish the digest operations
1097
rc = funcs->C_DigestUpdate( session1, original+499, (orig_len - 499) );
1099
show_error(" C_DigestUpdate #2", rc );
1103
rc = funcs->C_DigestUpdate( session2, original+499, (orig_len - 499) );
1105
show_error(" C_DigestUpdate #3", rc );
1110
digest1_len = sizeof(digest1);
1111
rc = funcs->C_DigestFinal( session1, digest1, &digest1_len );
1113
show_error(" C_DigestFinal #1", rc );
1117
digest2_len = sizeof(digest2);
1118
rc = funcs->C_DigestFinal( session2, digest2, &digest2_len );
1120
show_error(" C_DigestFinal #2", rc );
1124
if (digest1_len != digest2_len || digest1_len != digest3_len) {
1125
printf(" ERROR: digested lengths don't match\n");
1129
if (memcmp(digest1, digest2, digest1_len) != 0) {
1130
printf(" ERROR: digest1 != digest2\n");
1134
if (memcmp(digest1, digest3, digest1_len) != 0) {
1135
printf(" ERROR: digest1 != digest3\n");
1139
rc = funcs->C_CloseSession( session1 );
1141
show_error(" C_CloseSession #3", rc );
1144
rc = funcs->C_CloseSession( session2 );
1146
show_error(" C_CloseSession #4", rc );
1149
rc = funcs->C_CloseSession( session3 );
1151
show_error(" C_CloseSession #5", rc );
1155
printf("Looks okay...\n");
1160
int sess_mgmt_functions()
1167
rc = do_OpenSession();
1171
process_time( t1, t2 );
1175
rc = do_OpenSession2();
1179
process_time( t1, t2 );
1183
rc = do_CloseAllSessions();
1187
process_time( t1, t2 );
1190
rc = do_GetSessionInfo();
1194
process_time( t1, t2 );
1198
rc = do_LoginLogout();
1202
process_time( t1, t2 );
1206
rc = do_OperationState1();
1210
process_time( t1, t2 );
1214
rc = do_OperationState2();
1218
process_time( t1, t2 );
1222
rc = do_OperationState3();
1226
process_time( t1, t2 );