pkcs11.c

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,963 行 · 第 1/5 页

C
1,963
字号
				(pk11_isTrue(object,CKA_TOKEN))) {	return CKR_SESSION_READ_ONLY;    }    if (pk11_isTrue(object, CKA_TOKEN)) {	if (slot->DB_loaded == PR_FALSE) {	    /* we are creating a token object, make sure we load the database	     * first so we don't get duplicates....	     * ... NOTE: This assumes we are logged in as well!	     */	    pk11_importKeyDB(slot);	    slot->DB_loaded = PR_TRUE;	}    }	    /* PKCS #11 object ID's are unique for all objects on a     * token */    PK11_USE_THREADS(PR_Lock(slot->objectLock);)    object->handle = slot->tokenIDCount++;    PK11_USE_THREADS(PR_Unlock(slot->objectLock);)    /* get the object class */    attribute = pk11_FindAttribute(object,CKA_CLASS);    if (attribute == NULL) {	return CKR_TEMPLATE_INCOMPLETE;    }    object->objclass = *(CK_OBJECT_CLASS *)attribute->attrib.pValue;    pk11_FreeAttribute(attribute);    /* now handle the specific. Get a session handle for these functions     * to use */    switch (object->objclass) {    case CKO_DATA:	crv = pk11_handleDataObject(session,object);    case CKO_CERTIFICATE:	crv = pk11_handleCertObject(session,object);	break;    case CKO_PRIVATE_KEY:    case CKO_PUBLIC_KEY:    case CKO_SECRET_KEY:	crv = pk11_handleKeyObject(session,object);	break;    default:	crv = CKR_ATTRIBUTE_VALUE_INVALID;	break;    }    /* can't fail from here on out unless the pk_handlXXX functions have     * failed the request */    if (crv != CKR_OK) {	return crv;    }    /* now link the object into the slot and session structures */    object->slot = slot;    pk11_AddObject(session,object);    return CKR_OK;}/* import a private key as an object. We don't call handle object. * because we the private key came from the key DB and we don't want to * write back out again */static PK11Object *pk11_importPrivateKey(PK11Slot *slot,SECKEYLowPrivateKey *lowPriv,							SECItem *dbKey){    PK11Object *privateKey;    CK_KEY_TYPE key_type;    CK_BBOOL cktrue = CK_TRUE;    CK_BBOOL ckfalse = CK_FALSE;    CK_BBOOL sign = CK_TRUE;    CK_BBOOL recover = CK_TRUE;    CK_BBOOL decrypt = CK_TRUE;    CK_BBOOL derive = CK_FALSE;    CK_RV crv = CKR_OK;    CK_OBJECT_CLASS privClass = CKO_PRIVATE_KEY;    unsigned char cka_id[SHA1_LENGTH];    /*     * now lets create an object to hang the attributes off of     */    privateKey = pk11_NewObject(slot); /* fill in the handle later */    if (privateKey == NULL) {	pk11_FreeObject(privateKey);	return NULL;    }    /* Netscape Private Attribute for dealing with database storeage */	    if (pk11_AddAttributeType(privateKey, CKA_NETSCAPE_DB,					pk11_item_expand(dbKey)) ) {	 pk11_FreeObject(privateKey);	 return NULL;    }    /* now force the CKA_ID */    SHA1_HashBuf(cka_id, (unsigned char *)dbKey->data, (uint32)dbKey->len);    if (pk11_AddAttributeType(privateKey, CKA_ID, cka_id, sizeof(cka_id))) {	 pk11_FreeObject(privateKey);	 return NULL;    }    /* Fill in the common Default values */    if (pk11_AddAttributeType(privateKey,CKA_CLASS, &privClass,					sizeof(CK_OBJECT_CLASS)) != CKR_OK) {	 pk11_FreeObject(privateKey);	 return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_TOKEN, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_PRIVATE, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_MODIFIABLE, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_LABEL, NULL, 0) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_START_DATE, NULL, 0) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_END_DATE, NULL, 0) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_DERIVE, &ckfalse,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    /* local: well we really don't know for sure... it could have been an      * imported key, but it's not a useful attribute anyway. */    if (pk11_AddAttributeType(privateKey,CKA_LOCAL, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_SUBJECT, NULL, 0) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_SENSITIVE, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_EXTRACTABLE, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    /* is this really true? Maybe we should just say false here? */    if (pk11_AddAttributeType(privateKey,CKA_ALWAYS_SENSITIVE, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_NEVER_EXTRACTABLE, &ckfalse,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    /* Now Set up the parameters to generate the key (based on mechanism) */    /* NOTE: for safety sake we *DO NOT* remember critical attributes. PKCS #11     * will look them up again from the database when it needs them.     */    switch (lowPriv->keyType) {    case rsaKey:	/* format the keys */	key_type = CKK_RSA;	sign = CK_TRUE;	recover = CK_TRUE;	decrypt = CK_TRUE;	derive = CK_FALSE;        /* now fill in the RSA dependent parameters in the public key */        crv = pk11_AddAttributeType(privateKey,CKA_MODULUS,			   pk11_item_expand(&lowPriv->u.rsa.modulus));	if (crv != CKR_OK) break;        crv = pk11_AddAttributeType(privateKey,CKA_PRIVATE_EXPONENT,NULL,0);	if (crv != CKR_OK) break;        crv = pk11_AddAttributeType(privateKey,CKA_PUBLIC_EXPONENT,			   pk11_item_expand(&lowPriv->u.rsa.publicExponent));	if (crv != CKR_OK) break;        crv = pk11_AddAttributeType(privateKey,CKA_PRIME_1,NULL,0);	if (crv != CKR_OK) break;        crv = pk11_AddAttributeType(privateKey,CKA_PRIME_2,NULL,0);	if (crv != CKR_OK) break;        crv = pk11_AddAttributeType(privateKey,CKA_EXPONENT_1,NULL,0);	if (crv != CKR_OK) break;        crv = pk11_AddAttributeType(privateKey,CKA_EXPONENT_2,NULL,0);	if (crv != CKR_OK)  break;        crv = pk11_AddAttributeType(privateKey,CKA_COEFFICIENT,NULL,0);	break;    case dsaKey:	key_type = CKK_DSA;	sign = CK_TRUE;	recover = CK_FALSE;	decrypt = CK_FALSE;	derive = CK_FALSE;	crv = pk11_AddAttributeType(privateKey,CKA_PRIME,			   pk11_item_expand(&lowPriv->u.dsa.params.prime));	if (crv != CKR_OK) break;	crv = pk11_AddAttributeType(privateKey,CKA_SUBPRIME,			   pk11_item_expand(&lowPriv->u.dsa.params.subPrime));	if (crv != CKR_OK) break;	crv = pk11_AddAttributeType(privateKey,CKA_BASE,			   pk11_item_expand(&lowPriv->u.dsa.params.base));	if (crv != CKR_OK) break;	crv = pk11_AddAttributeType(privateKey,CKA_VALUE,NULL,0);	if (crv != CKR_OK) break;	break;    case dhKey:	key_type = CKK_DH;	sign = CK_FALSE;	decrypt = CK_FALSE;	recover = CK_FALSE;	derive = CK_TRUE;	crv = CKR_MECHANISM_INVALID;	break;    default:	crv = CKR_MECHANISM_INVALID;    }    if (crv != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_SIGN, &sign,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_SIGN_RECOVER, &recover,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_DECRYPT, &decrypt,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_UNWRAP, &decrypt,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_DERIVE, &derive,					      sizeof(CK_BBOOL)) != CKR_OK) {	pk11_FreeObject(privateKey);	return NULL;    }    if (pk11_AddAttributeType(privateKey,CKA_KEY_TYPE,&key_type,					     sizeof(CK_KEY_TYPE)) != CKR_OK) {	 pk11_FreeObject(privateKey);	 return NULL;    }    PK11_USE_THREADS(PR_Lock(slot->objectLock);)    privateKey->handle = slot->tokenIDCount++;    privateKey->handle |= (PK11_TOKEN_MAGIC | PK11_TOKEN_TYPE_PRIV);    PK11_USE_THREADS(PR_Unlock(slot->objectLock);)    privateKey->objclass = privClass;    privateKey->slot = slot;    privateKey->inDB = PR_TRUE;    return privateKey;}/* import a private key or cert as a public key object.*/static PK11Object *pk11_importPublicKey(PK11Slot *slot,	SECKEYLowPrivateKey *lowPriv, CERTCertificate *cert, SECItem *dbKey){    PK11Object *publicKey = NULL;    CK_KEY_TYPE key_type;    CK_BBOOL cktrue = CK_TRUE;    CK_BBOOL ckfalse = CK_FALSE;    CK_BBOOL verify = CK_TRUE;    CK_BBOOL recover = CK_TRUE;    CK_BBOOL encrypt = CK_TRUE;    CK_BBOOL derive = CK_FALSE;    CK_RV crv = CKR_OK;    CK_OBJECT_CLASS pubClass = CKO_PUBLIC_KEY;    unsigned char cka_id[SHA1_LENGTH];    KeyType keyType = nullKey;    SECKEYPublicKey *pubKey = NULL;    CK_ATTRIBUTE theTemplate[2];    PK11ObjectListElement *objectList = NULL;    if (lowPriv == NULL) {	pubKey = CERT_ExtractPublicKey(cert);	if (pubKey == NULL) {	    goto failed;	}	/* pk11_GetPubItem returns data associated with the public key.	 * one only needs to free the public key. This comment is here	 * because this sematic would be non-obvious otherwise. All callers	 * should include this comment.	 */	dbKey = pk11_GetPubItem(pubKey);	if (dbKey == NULL) {	    goto failed;	}    }    SHA1_HashBuf(cka_id, (unsigned char *)dbKey->data, (uint32)dbKey->len);    theTemplate[0].type = CKA_ID;    theTemplate[0].pValue = cka_id;    theTemplate[0].ulValueLen = sizeof(cka_id);    theTemplate[1].type = CKA_CLASS;    theTemplate[1].pValue = &pubClass;    theTemplate[1].ulValueLen = sizeof(CK_OBJECT_CLASS);    crv = pk11_searchObjectList(&objectList,slot->tokObjects,		slot->objectLock, theTemplate, 2, slot->isLoggedIn);    if ((crv == CKR_OK) && (objectList != NULL)) {	goto failed;    }    /*     * now lets create an object to hang the attributes off of     */    publicKey = pk11_NewObject(slot); /* fill in the handle later */    if (publicKey == NULL) {	goto failed;    }    /* now force the CKA_ID */    if (pk11_AddAttributeType(publicKey, CKA_ID, cka_id, sizeof(cka_id))) {	goto failed;    }    /* Fill in the common Default values */    if (pk11_AddAttributeType(publicKey,CKA_CLASS,&pubClass,					sizeof(CK_OBJECT_CLASS)) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_TOKEN, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_PRIVATE, &ckfalse,					      sizeof(CK_BBOOL)) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_MODIFIABLE, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_LABEL, NULL, 0) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_START_DATE, NULL, 0) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_END_DATE, NULL, 0) != CKR_OK) {	goto failed;    }    /* local: well we really don't know for sure... it could have been an      * imported key, but it's not a useful attribute anyway. */    if (pk11_AddAttributeType(publicKey,CKA_LOCAL, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_SUBJECT, NULL, 0) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_SENSITIVE, &ckfalse,					      sizeof(CK_BBOOL)) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_EXTRACTABLE, &cktrue,					      sizeof(CK_BBOOL)) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_ALWAYS_SENSITIVE, &ckfalse,					      sizeof(CK_BBOOL)) != CKR_OK) {	goto failed;    }    if (pk11_AddAttributeType(publicKey,CKA_NEVER_EXTRACTABLE, &ckfalse,					      sizeof(CK_BBOOL)) != CKR_OK) {	goto failed;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?