xref: /illumos-gate/usr/src/lib/pkcs11/pkcs11_tpm/common/globals.c (revision ab8176c2544f70ca46c1ce370963d426561222b3)
147e946e7SWyllys Ingersoll /* (C) COPYRIGHT International Business Machines Corp. 2001, 2002, 2005 */
247e946e7SWyllys Ingersoll /*
347e946e7SWyllys Ingersoll  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
447e946e7SWyllys Ingersoll  * Use is subject to license terms.
547e946e7SWyllys Ingersoll  */
647e946e7SWyllys Ingersoll 
747e946e7SWyllys Ingersoll #include "tpmtok_int.h"
847e946e7SWyllys Ingersoll 
947e946e7SWyllys Ingersoll CK_BBOOL	initialized = FALSE;
1047e946e7SWyllys Ingersoll 
1147e946e7SWyllys Ingersoll pthread_mutex_t  native_mutex;
1247e946e7SWyllys Ingersoll pthread_mutex_t   pkcs_mutex, obj_list_mutex,
1347e946e7SWyllys Ingersoll 	sess_list_mutex, login_mutex;
1447e946e7SWyllys Ingersoll 
1547e946e7SWyllys Ingersoll void *xproclock;
1647e946e7SWyllys Ingersoll 
1747e946e7SWyllys Ingersoll DL_NODE  *sess_list	= NULL;
1847e946e7SWyllys Ingersoll DL_NODE  *sess_obj_list  = NULL;
1947e946e7SWyllys Ingersoll DL_NODE  *publ_token_obj_list = NULL;
2047e946e7SWyllys Ingersoll DL_NODE  *priv_token_obj_list = NULL;
2147e946e7SWyllys Ingersoll DL_NODE  *object_map	= NULL;
2247e946e7SWyllys Ingersoll 
2347e946e7SWyllys Ingersoll CK_STATE  global_login_state = 0;
2447e946e7SWyllys Ingersoll 
2547e946e7SWyllys Ingersoll LW_SHM_TYPE *global_shm;
2647e946e7SWyllys Ingersoll 
2747e946e7SWyllys Ingersoll CK_ULONG next_session_handle = 1;
2847e946e7SWyllys Ingersoll CK_ULONG next_object_handle = 1;
2947e946e7SWyllys Ingersoll 
3047e946e7SWyllys Ingersoll TOKEN_DATA  *nv_token_data = NULL;
3147e946e7SWyllys Ingersoll 
3247e946e7SWyllys Ingersoll extern CK_RV LW_Initialize();
3347e946e7SWyllys Ingersoll extern CK_RV SC_GetFunctionList();
3447e946e7SWyllys Ingersoll extern CK_RV SC_GetTokenInfo();
3547e946e7SWyllys Ingersoll extern CK_RV SC_GetMechanismList();
3647e946e7SWyllys Ingersoll extern CK_RV SC_GetMechanismInfo();
3747e946e7SWyllys Ingersoll extern CK_RV SC_InitToken();
3847e946e7SWyllys Ingersoll extern CK_RV SC_InitPIN();
3947e946e7SWyllys Ingersoll extern CK_RV SC_SetPIN();
4047e946e7SWyllys Ingersoll extern CK_RV SC_OpenSession();
4147e946e7SWyllys Ingersoll extern CK_RV SC_CloseSession();
4247e946e7SWyllys Ingersoll extern CK_RV SC_CloseAllSessions();
4347e946e7SWyllys Ingersoll extern CK_RV SC_GetSessionInfo();
4447e946e7SWyllys Ingersoll extern CK_RV SC_GetOperationState();
4547e946e7SWyllys Ingersoll extern CK_RV SC_SetOperationState();
4647e946e7SWyllys Ingersoll extern CK_RV SC_Login();
4747e946e7SWyllys Ingersoll extern CK_RV SC_Logout();
4847e946e7SWyllys Ingersoll extern CK_RV SC_CreateObject();
4947e946e7SWyllys Ingersoll extern CK_RV SC_CopyObject();
5047e946e7SWyllys Ingersoll extern CK_RV SC_DestroyObject();
5147e946e7SWyllys Ingersoll extern CK_RV SC_GetObjectSize();
5247e946e7SWyllys Ingersoll extern CK_RV SC_GetAttributeValue();
5347e946e7SWyllys Ingersoll extern CK_RV SC_SetAttributeValue();
5447e946e7SWyllys Ingersoll extern CK_RV SC_FindObjectsInit();
5547e946e7SWyllys Ingersoll extern CK_RV SC_FindObjects();
5647e946e7SWyllys Ingersoll extern CK_RV SC_FindObjectsFinal();
5747e946e7SWyllys Ingersoll extern CK_RV SC_EncryptInit();
5847e946e7SWyllys Ingersoll extern CK_RV SC_Encrypt();
5947e946e7SWyllys Ingersoll extern CK_RV SC_EncryptUpdate();
6047e946e7SWyllys Ingersoll extern CK_RV SC_EncryptFinal();
6147e946e7SWyllys Ingersoll extern CK_RV SC_DecryptInit();
6247e946e7SWyllys Ingersoll extern CK_RV SC_Decrypt();
6347e946e7SWyllys Ingersoll extern CK_RV SC_DecryptUpdate();
6447e946e7SWyllys Ingersoll extern CK_RV SC_DecryptFinal();
6547e946e7SWyllys Ingersoll extern CK_RV SC_DigestInit();
6647e946e7SWyllys Ingersoll extern CK_RV SC_Digest();
6747e946e7SWyllys Ingersoll extern CK_RV SC_DigestUpdate();
6847e946e7SWyllys Ingersoll extern CK_RV SC_DigestKey();
6947e946e7SWyllys Ingersoll extern CK_RV SC_DigestFinal();
7047e946e7SWyllys Ingersoll extern CK_RV SC_SignInit();
7147e946e7SWyllys Ingersoll extern CK_RV SC_Sign();
7247e946e7SWyllys Ingersoll extern CK_RV SC_SignUpdate();
7347e946e7SWyllys Ingersoll extern CK_RV SC_SignFinal();
7447e946e7SWyllys Ingersoll extern CK_RV SC_SignRecoverInit();
7547e946e7SWyllys Ingersoll extern CK_RV SC_SignRecover();
7647e946e7SWyllys Ingersoll extern CK_RV SC_VerifyInit();
7747e946e7SWyllys Ingersoll extern CK_RV SC_Verify();
7847e946e7SWyllys Ingersoll extern CK_RV SC_VerifyUpdate();
7947e946e7SWyllys Ingersoll extern CK_RV SC_VerifyFinal();
8047e946e7SWyllys Ingersoll extern CK_RV SC_VerifyRecoverInit();
8147e946e7SWyllys Ingersoll extern CK_RV SC_VerifyRecover();
8247e946e7SWyllys Ingersoll extern CK_RV SC_DigestEncryptUpdate();
8347e946e7SWyllys Ingersoll extern CK_RV SC_DecryptDigestUpdate();
8447e946e7SWyllys Ingersoll extern CK_RV SC_SignEncryptUpdate();
8547e946e7SWyllys Ingersoll extern CK_RV SC_DecryptVerifyUpdate();
8647e946e7SWyllys Ingersoll extern CK_RV SC_GenerateKey();
8747e946e7SWyllys Ingersoll extern CK_RV SC_GenerateKeyPair();
8847e946e7SWyllys Ingersoll extern CK_RV SC_WrapKey();
8947e946e7SWyllys Ingersoll extern CK_RV SC_UnwrapKey();
9047e946e7SWyllys Ingersoll extern CK_RV SC_DeriveKey();
9147e946e7SWyllys Ingersoll extern CK_RV SC_SeedRandom();
9247e946e7SWyllys Ingersoll extern CK_RV SC_GenerateRandom();
9347e946e7SWyllys Ingersoll extern CK_RV SC_GetFunctionStatus();
9447e946e7SWyllys Ingersoll extern CK_RV SC_CancelFunction();
9547e946e7SWyllys Ingersoll extern CK_RV SC_WaitForSlotEvent();
9647e946e7SWyllys Ingersoll 
9747e946e7SWyllys Ingersoll CK_BYTE  ber_rsaEncryption[] = {
9847e946e7SWyllys Ingersoll     0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01
9947e946e7SWyllys Ingersoll };
10047e946e7SWyllys Ingersoll CK_BYTE  ber_md5WithRSAEncryption[] = {
10147e946e7SWyllys Ingersoll     0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04
10247e946e7SWyllys Ingersoll };
10347e946e7SWyllys Ingersoll CK_BYTE  ber_sha1WithRSAEncryption[] = {
10447e946e7SWyllys Ingersoll     0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05
10547e946e7SWyllys Ingersoll };
10647e946e7SWyllys Ingersoll 
10747e946e7SWyllys Ingersoll CK_BYTE  ber_AlgMd5[] =    {
10847e946e7SWyllys Ingersoll     0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
10947e946e7SWyllys Ingersoll     0x02, 0x05, 0x05, 0x00
11047e946e7SWyllys Ingersoll };
11147e946e7SWyllys Ingersoll CK_BYTE  ber_AlgSha1[] =   {
11247e946e7SWyllys Ingersoll     0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05,
11347e946e7SWyllys Ingersoll     0x00
11447e946e7SWyllys Ingersoll };
11547e946e7SWyllys Ingersoll CK_BYTE  ber_AlgIdRSAEncryption[] = {
11647e946e7SWyllys Ingersoll     0x30, 0x0D, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
11747e946e7SWyllys Ingersoll     0x01, 0x01, 0x01, 0x05, 0x00
11847e946e7SWyllys Ingersoll };
11947e946e7SWyllys Ingersoll 
12047e946e7SWyllys Ingersoll CK_ULONG ber_rsaEncryptionLen = sizeof (ber_rsaEncryption);
12147e946e7SWyllys Ingersoll CK_ULONG ber_md5WithRSAEncryptionLen = sizeof (ber_md5WithRSAEncryption);
12247e946e7SWyllys Ingersoll CK_ULONG ber_sha1WithRSAEncryptionLen = sizeof (ber_sha1WithRSAEncryption);
12347e946e7SWyllys Ingersoll 
12447e946e7SWyllys Ingersoll CK_ULONG ber_AlgMd5Len =    sizeof (ber_AlgMd5);
12547e946e7SWyllys Ingersoll CK_ULONG ber_AlgSha1Len =   sizeof (ber_AlgSha1);
12647e946e7SWyllys Ingersoll CK_ULONG ber_AlgIdRSAEncryptionLen = sizeof (ber_AlgIdRSAEncryption);
12747e946e7SWyllys Ingersoll 
12847e946e7SWyllys Ingersoll MECH_LIST_ELEMENT mech_list[] = {
12947e946e7SWyllys Ingersoll 	{ CKM_RSA_PKCS_KEY_PAIR_GEN,	{512, 2048, CKF_HW |
13047e946e7SWyllys Ingersoll 	    CKF_GENERATE_KEY_PAIR } },
13147e946e7SWyllys Ingersoll 	{ CKM_RSA_PKCS, {512, 2048, CKF_HW   | CKF_ENCRYPT | CKF_DECRYPT |
13247e946e7SWyllys Ingersoll 	    CKF_WRAP	 | CKF_UNWRAP  | CKF_SIGN | CKF_VERIFY  |
13347e946e7SWyllys Ingersoll 	    CKF_SIGN_RECOVER | CKF_VERIFY_RECOVER } },
13447e946e7SWyllys Ingersoll 
13547e946e7SWyllys Ingersoll 	{ CKM_RSA_PKCS_OAEP,	{512, 2048, CKF_HW   | CKF_ENCRYPT |
13647e946e7SWyllys Ingersoll 	    CKF_DECRYPT | CKF_WRAP	 | CKF_UNWRAP  |
13747e946e7SWyllys Ingersoll 	    CKF_SIGN | CKF_VERIFY | CKF_SIGN_RECOVER | CKF_VERIFY_RECOVER }},
13847e946e7SWyllys Ingersoll 
139*ab8176c2SWyllys Ingersoll #if 0
140*ab8176c2SWyllys Ingersoll 	/* No RSA_X_509 support for now... */
14147e946e7SWyllys Ingersoll 	{ CKM_RSA_X_509, {512, 2048, CKF_HW  |
14247e946e7SWyllys Ingersoll 	    CKF_ENCRYPT	| CKF_DECRYPT |
14347e946e7SWyllys Ingersoll 	    CKF_WRAP	 | CKF_UNWRAP  |
14447e946e7SWyllys Ingersoll 	    CKF_SIGN	 | CKF_VERIFY  |
14547e946e7SWyllys Ingersoll 	    CKF_SIGN_RECOVER | CKF_VERIFY_RECOVER } },
146*ab8176c2SWyllys Ingersoll #endif
14747e946e7SWyllys Ingersoll 
14847e946e7SWyllys Ingersoll 	{CKM_MD5_RSA_PKCS,
14947e946e7SWyllys Ingersoll 	{512, 2048, CKF_HW	| CKF_SIGN    | CKF_VERIFY } },
15047e946e7SWyllys Ingersoll 
15147e946e7SWyllys Ingersoll 	{ CKM_SHA1_RSA_PKCS,
15247e946e7SWyllys Ingersoll 	{512, 2048, CKF_HW	| CKF_SIGN    | CKF_VERIFY } },
15347e946e7SWyllys Ingersoll 
15447e946e7SWyllys Ingersoll 	{CKM_SHA_1,
15547e946e7SWyllys Ingersoll 	{0,    0, CKF_DIGEST } },
15647e946e7SWyllys Ingersoll 
15747e946e7SWyllys Ingersoll 	{CKM_SHA_1_HMAC,
15847e946e7SWyllys Ingersoll 	{0,    0, CKF_SIGN | CKF_VERIFY } },
15947e946e7SWyllys Ingersoll 
16047e946e7SWyllys Ingersoll 	{CKM_SHA_1_HMAC_GENERAL,
16147e946e7SWyllys Ingersoll 	{0,    0, CKF_SIGN | CKF_VERIFY } },
16247e946e7SWyllys Ingersoll 
16347e946e7SWyllys Ingersoll 	{CKM_MD5,
16447e946e7SWyllys Ingersoll 	{0,    0, CKF_DIGEST } },
16547e946e7SWyllys Ingersoll 
16647e946e7SWyllys Ingersoll 	{CKM_MD5_HMAC,
16747e946e7SWyllys Ingersoll 	{0,    0, CKF_SIGN | CKF_VERIFY } },
16847e946e7SWyllys Ingersoll 
16947e946e7SWyllys Ingersoll 	{CKM_MD5_HMAC_GENERAL,
17047e946e7SWyllys Ingersoll 	{0,    0, CKF_SIGN | CKF_VERIFY } },
17147e946e7SWyllys Ingersoll };
17247e946e7SWyllys Ingersoll 
17347e946e7SWyllys Ingersoll CK_ULONG  mech_list_len = (sizeof (mech_list) / sizeof (MECH_LIST_ELEMENT));
17447e946e7SWyllys Ingersoll 
17547e946e7SWyllys Ingersoll /*
17647e946e7SWyllys Ingersoll  * default SO pin hash values
17747e946e7SWyllys Ingersoll  *
17847e946e7SWyllys Ingersoll  * default SO pin = "87654321"
17947e946e7SWyllys Ingersoll  */
18047e946e7SWyllys Ingersoll CK_BYTE default_so_pin_md5[MD5_DIGEST_LENGTH] = {
18147e946e7SWyllys Ingersoll 	0x5E, 0x86, 0x67, 0xA4, 0x39, 0xC6, 0x8F, 0x51,
18247e946e7SWyllys Ingersoll 	0x45, 0xDD, 0x2F, 0xCB, 0xEC, 0xF0, 0x22, 0x09
18347e946e7SWyllys Ingersoll };
18447e946e7SWyllys Ingersoll 
18547e946e7SWyllys Ingersoll CK_BYTE default_so_pin_sha[SHA1_DIGEST_LENGTH] = {
18647e946e7SWyllys Ingersoll 	0xA7, 0xD5, 0x79, 0xBA, 0x76, 0x39, 0x80, 0x70,
18747e946e7SWyllys Ingersoll 	0xEA, 0xE6, 0x54, 0xC3, 0x0F, 0xF1, 0x53, 0xA4,
18847e946e7SWyllys Ingersoll 	0xC2, 0x73, 0x27, 0x2A
18947e946e7SWyllys Ingersoll };
19047e946e7SWyllys Ingersoll 
19147e946e7SWyllys Ingersoll /* SH - 1 of "12345678" */
19247e946e7SWyllys Ingersoll CK_BYTE default_user_pin_sha[SHA1_DIGEST_LENGTH] = {
19347e946e7SWyllys Ingersoll 	0x7c, 0x22, 0x2f, 0xb2, 0x92, 0x7d, 0x82, 0x8a,
19447e946e7SWyllys Ingersoll 	0xf2, 0x2f, 0x59, 0x21, 0x34, 0xe8, 0x93, 0x24,
19547e946e7SWyllys Ingersoll 	0x80, 0x63, 0x7c, 0x0d
19647e946e7SWyllys Ingersoll };
19747e946e7SWyllys Ingersoll 
19847e946e7SWyllys Ingersoll CK_BYTE user_pin_md5[MD5_DIGEST_LENGTH];
19947e946e7SWyllys Ingersoll CK_BYTE so_pin_md5[MD5_DIGEST_LENGTH];
200