19126SWyllys.Ingersoll@Sun.COM /* (C) COPYRIGHT International Business Machines Corp. 2001, 2002, 2005 */ 29126SWyllys.Ingersoll@Sun.COM /* 39126SWyllys.Ingersoll@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 49126SWyllys.Ingersoll@Sun.COM * Use is subject to license terms. 59126SWyllys.Ingersoll@Sun.COM */ 69126SWyllys.Ingersoll@Sun.COM 79126SWyllys.Ingersoll@Sun.COM #include "tpmtok_int.h" 89126SWyllys.Ingersoll@Sun.COM 99126SWyllys.Ingersoll@Sun.COM CK_BBOOL initialized = FALSE; 109126SWyllys.Ingersoll@Sun.COM 119126SWyllys.Ingersoll@Sun.COM pthread_mutex_t native_mutex; 129126SWyllys.Ingersoll@Sun.COM pthread_mutex_t pkcs_mutex, obj_list_mutex, 139126SWyllys.Ingersoll@Sun.COM sess_list_mutex, login_mutex; 149126SWyllys.Ingersoll@Sun.COM 159126SWyllys.Ingersoll@Sun.COM void *xproclock; 169126SWyllys.Ingersoll@Sun.COM 179126SWyllys.Ingersoll@Sun.COM DL_NODE *sess_list = NULL; 189126SWyllys.Ingersoll@Sun.COM DL_NODE *sess_obj_list = NULL; 199126SWyllys.Ingersoll@Sun.COM DL_NODE *publ_token_obj_list = NULL; 209126SWyllys.Ingersoll@Sun.COM DL_NODE *priv_token_obj_list = NULL; 219126SWyllys.Ingersoll@Sun.COM DL_NODE *object_map = NULL; 229126SWyllys.Ingersoll@Sun.COM 239126SWyllys.Ingersoll@Sun.COM CK_STATE global_login_state = 0; 249126SWyllys.Ingersoll@Sun.COM 259126SWyllys.Ingersoll@Sun.COM LW_SHM_TYPE *global_shm; 269126SWyllys.Ingersoll@Sun.COM 279126SWyllys.Ingersoll@Sun.COM CK_ULONG next_session_handle = 1; 289126SWyllys.Ingersoll@Sun.COM CK_ULONG next_object_handle = 1; 299126SWyllys.Ingersoll@Sun.COM 309126SWyllys.Ingersoll@Sun.COM TOKEN_DATA *nv_token_data = NULL; 319126SWyllys.Ingersoll@Sun.COM 329126SWyllys.Ingersoll@Sun.COM extern CK_RV LW_Initialize(); 339126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetFunctionList(); 349126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetTokenInfo(); 359126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetMechanismList(); 369126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetMechanismInfo(); 379126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_InitToken(); 389126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_InitPIN(); 399126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SetPIN(); 409126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_OpenSession(); 419126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_CloseSession(); 429126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_CloseAllSessions(); 439126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetSessionInfo(); 449126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetOperationState(); 459126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SetOperationState(); 469126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_Login(); 479126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_Logout(); 489126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_CreateObject(); 499126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_CopyObject(); 509126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DestroyObject(); 519126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetObjectSize(); 529126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetAttributeValue(); 539126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SetAttributeValue(); 549126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_FindObjectsInit(); 559126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_FindObjects(); 569126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_FindObjectsFinal(); 579126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_EncryptInit(); 589126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_Encrypt(); 599126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_EncryptUpdate(); 609126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_EncryptFinal(); 619126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DecryptInit(); 629126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_Decrypt(); 639126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DecryptUpdate(); 649126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DecryptFinal(); 659126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DigestInit(); 669126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_Digest(); 679126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DigestUpdate(); 689126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DigestKey(); 699126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DigestFinal(); 709126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SignInit(); 719126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_Sign(); 729126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SignUpdate(); 739126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SignFinal(); 749126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SignRecoverInit(); 759126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SignRecover(); 769126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_VerifyInit(); 779126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_Verify(); 789126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_VerifyUpdate(); 799126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_VerifyFinal(); 809126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_VerifyRecoverInit(); 819126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_VerifyRecover(); 829126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DigestEncryptUpdate(); 839126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DecryptDigestUpdate(); 849126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SignEncryptUpdate(); 859126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DecryptVerifyUpdate(); 869126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GenerateKey(); 879126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GenerateKeyPair(); 889126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_WrapKey(); 899126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_UnwrapKey(); 909126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_DeriveKey(); 919126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_SeedRandom(); 929126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GenerateRandom(); 939126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_GetFunctionStatus(); 949126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_CancelFunction(); 959126SWyllys.Ingersoll@Sun.COM extern CK_RV SC_WaitForSlotEvent(); 969126SWyllys.Ingersoll@Sun.COM 979126SWyllys.Ingersoll@Sun.COM CK_BYTE ber_rsaEncryption[] = { 989126SWyllys.Ingersoll@Sun.COM 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01 999126SWyllys.Ingersoll@Sun.COM }; 1009126SWyllys.Ingersoll@Sun.COM CK_BYTE ber_md5WithRSAEncryption[] = { 1019126SWyllys.Ingersoll@Sun.COM 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04 1029126SWyllys.Ingersoll@Sun.COM }; 1039126SWyllys.Ingersoll@Sun.COM CK_BYTE ber_sha1WithRSAEncryption[] = { 1049126SWyllys.Ingersoll@Sun.COM 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05 1059126SWyllys.Ingersoll@Sun.COM }; 1069126SWyllys.Ingersoll@Sun.COM 1079126SWyllys.Ingersoll@Sun.COM CK_BYTE ber_AlgMd5[] = { 1089126SWyllys.Ingersoll@Sun.COM 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 1099126SWyllys.Ingersoll@Sun.COM 0x02, 0x05, 0x05, 0x00 1109126SWyllys.Ingersoll@Sun.COM }; 1119126SWyllys.Ingersoll@Sun.COM CK_BYTE ber_AlgSha1[] = { 1129126SWyllys.Ingersoll@Sun.COM 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 1139126SWyllys.Ingersoll@Sun.COM 0x00 1149126SWyllys.Ingersoll@Sun.COM }; 1159126SWyllys.Ingersoll@Sun.COM CK_BYTE ber_AlgIdRSAEncryption[] = { 1169126SWyllys.Ingersoll@Sun.COM 0x30, 0x0D, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 1179126SWyllys.Ingersoll@Sun.COM 0x01, 0x01, 0x01, 0x05, 0x00 1189126SWyllys.Ingersoll@Sun.COM }; 1199126SWyllys.Ingersoll@Sun.COM 1209126SWyllys.Ingersoll@Sun.COM CK_ULONG ber_rsaEncryptionLen = sizeof (ber_rsaEncryption); 1219126SWyllys.Ingersoll@Sun.COM CK_ULONG ber_md5WithRSAEncryptionLen = sizeof (ber_md5WithRSAEncryption); 1229126SWyllys.Ingersoll@Sun.COM CK_ULONG ber_sha1WithRSAEncryptionLen = sizeof (ber_sha1WithRSAEncryption); 1239126SWyllys.Ingersoll@Sun.COM 1249126SWyllys.Ingersoll@Sun.COM CK_ULONG ber_AlgMd5Len = sizeof (ber_AlgMd5); 1259126SWyllys.Ingersoll@Sun.COM CK_ULONG ber_AlgSha1Len = sizeof (ber_AlgSha1); 1269126SWyllys.Ingersoll@Sun.COM CK_ULONG ber_AlgIdRSAEncryptionLen = sizeof (ber_AlgIdRSAEncryption); 1279126SWyllys.Ingersoll@Sun.COM 1289126SWyllys.Ingersoll@Sun.COM MECH_LIST_ELEMENT mech_list[] = { 1299126SWyllys.Ingersoll@Sun.COM { CKM_RSA_PKCS_KEY_PAIR_GEN, {512, 2048, CKF_HW | 1309126SWyllys.Ingersoll@Sun.COM CKF_GENERATE_KEY_PAIR } }, 1319126SWyllys.Ingersoll@Sun.COM { CKM_RSA_PKCS, {512, 2048, CKF_HW | CKF_ENCRYPT | CKF_DECRYPT | 1329126SWyllys.Ingersoll@Sun.COM CKF_WRAP | CKF_UNWRAP | CKF_SIGN | CKF_VERIFY | 1339126SWyllys.Ingersoll@Sun.COM CKF_SIGN_RECOVER | CKF_VERIFY_RECOVER } }, 1349126SWyllys.Ingersoll@Sun.COM 1359126SWyllys.Ingersoll@Sun.COM { CKM_RSA_PKCS_OAEP, {512, 2048, CKF_HW | CKF_ENCRYPT | 1369126SWyllys.Ingersoll@Sun.COM CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP | 1379126SWyllys.Ingersoll@Sun.COM CKF_SIGN | CKF_VERIFY | CKF_SIGN_RECOVER | CKF_VERIFY_RECOVER }}, 1389126SWyllys.Ingersoll@Sun.COM 139*9453SWyllys.Ingersoll@Sun.COM #if 0 140*9453SWyllys.Ingersoll@Sun.COM /* No RSA_X_509 support for now... */ 1419126SWyllys.Ingersoll@Sun.COM { CKM_RSA_X_509, {512, 2048, CKF_HW | 1429126SWyllys.Ingersoll@Sun.COM CKF_ENCRYPT | CKF_DECRYPT | 1439126SWyllys.Ingersoll@Sun.COM CKF_WRAP | CKF_UNWRAP | 1449126SWyllys.Ingersoll@Sun.COM CKF_SIGN | CKF_VERIFY | 1459126SWyllys.Ingersoll@Sun.COM CKF_SIGN_RECOVER | CKF_VERIFY_RECOVER } }, 146*9453SWyllys.Ingersoll@Sun.COM #endif 1479126SWyllys.Ingersoll@Sun.COM 1489126SWyllys.Ingersoll@Sun.COM {CKM_MD5_RSA_PKCS, 1499126SWyllys.Ingersoll@Sun.COM {512, 2048, CKF_HW | CKF_SIGN | CKF_VERIFY } }, 1509126SWyllys.Ingersoll@Sun.COM 1519126SWyllys.Ingersoll@Sun.COM { CKM_SHA1_RSA_PKCS, 1529126SWyllys.Ingersoll@Sun.COM {512, 2048, CKF_HW | CKF_SIGN | CKF_VERIFY } }, 1539126SWyllys.Ingersoll@Sun.COM 1549126SWyllys.Ingersoll@Sun.COM {CKM_SHA_1, 1559126SWyllys.Ingersoll@Sun.COM {0, 0, CKF_DIGEST } }, 1569126SWyllys.Ingersoll@Sun.COM 1579126SWyllys.Ingersoll@Sun.COM {CKM_SHA_1_HMAC, 1589126SWyllys.Ingersoll@Sun.COM {0, 0, CKF_SIGN | CKF_VERIFY } }, 1599126SWyllys.Ingersoll@Sun.COM 1609126SWyllys.Ingersoll@Sun.COM {CKM_SHA_1_HMAC_GENERAL, 1619126SWyllys.Ingersoll@Sun.COM {0, 0, CKF_SIGN | CKF_VERIFY } }, 1629126SWyllys.Ingersoll@Sun.COM 1639126SWyllys.Ingersoll@Sun.COM {CKM_MD5, 1649126SWyllys.Ingersoll@Sun.COM {0, 0, CKF_DIGEST } }, 1659126SWyllys.Ingersoll@Sun.COM 1669126SWyllys.Ingersoll@Sun.COM {CKM_MD5_HMAC, 1679126SWyllys.Ingersoll@Sun.COM {0, 0, CKF_SIGN | CKF_VERIFY } }, 1689126SWyllys.Ingersoll@Sun.COM 1699126SWyllys.Ingersoll@Sun.COM {CKM_MD5_HMAC_GENERAL, 1709126SWyllys.Ingersoll@Sun.COM {0, 0, CKF_SIGN | CKF_VERIFY } }, 1719126SWyllys.Ingersoll@Sun.COM }; 1729126SWyllys.Ingersoll@Sun.COM 1739126SWyllys.Ingersoll@Sun.COM CK_ULONG mech_list_len = (sizeof (mech_list) / sizeof (MECH_LIST_ELEMENT)); 1749126SWyllys.Ingersoll@Sun.COM 1759126SWyllys.Ingersoll@Sun.COM /* 1769126SWyllys.Ingersoll@Sun.COM * default SO pin hash values 1779126SWyllys.Ingersoll@Sun.COM * 1789126SWyllys.Ingersoll@Sun.COM * default SO pin = "87654321" 1799126SWyllys.Ingersoll@Sun.COM */ 1809126SWyllys.Ingersoll@Sun.COM CK_BYTE default_so_pin_md5[MD5_DIGEST_LENGTH] = { 1819126SWyllys.Ingersoll@Sun.COM 0x5E, 0x86, 0x67, 0xA4, 0x39, 0xC6, 0x8F, 0x51, 1829126SWyllys.Ingersoll@Sun.COM 0x45, 0xDD, 0x2F, 0xCB, 0xEC, 0xF0, 0x22, 0x09 1839126SWyllys.Ingersoll@Sun.COM }; 1849126SWyllys.Ingersoll@Sun.COM 1859126SWyllys.Ingersoll@Sun.COM CK_BYTE default_so_pin_sha[SHA1_DIGEST_LENGTH] = { 1869126SWyllys.Ingersoll@Sun.COM 0xA7, 0xD5, 0x79, 0xBA, 0x76, 0x39, 0x80, 0x70, 1879126SWyllys.Ingersoll@Sun.COM 0xEA, 0xE6, 0x54, 0xC3, 0x0F, 0xF1, 0x53, 0xA4, 1889126SWyllys.Ingersoll@Sun.COM 0xC2, 0x73, 0x27, 0x2A 1899126SWyllys.Ingersoll@Sun.COM }; 1909126SWyllys.Ingersoll@Sun.COM 1919126SWyllys.Ingersoll@Sun.COM /* SH - 1 of "12345678" */ 1929126SWyllys.Ingersoll@Sun.COM CK_BYTE default_user_pin_sha[SHA1_DIGEST_LENGTH] = { 1939126SWyllys.Ingersoll@Sun.COM 0x7c, 0x22, 0x2f, 0xb2, 0x92, 0x7d, 0x82, 0x8a, 1949126SWyllys.Ingersoll@Sun.COM 0xf2, 0x2f, 0x59, 0x21, 0x34, 0xe8, 0x93, 0x24, 1959126SWyllys.Ingersoll@Sun.COM 0x80, 0x63, 0x7c, 0x0d 1969126SWyllys.Ingersoll@Sun.COM }; 1979126SWyllys.Ingersoll@Sun.COM 1989126SWyllys.Ingersoll@Sun.COM CK_BYTE user_pin_md5[MD5_DIGEST_LENGTH]; 1999126SWyllys.Ingersoll@Sun.COM CK_BYTE so_pin_md5[MD5_DIGEST_LENGTH]; 200