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