⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkcs11-object.c

📁 读写Smart卡加解密接口的程序
💻 C
📖 第 1 页 / 共 3 页
字号:
CK_RV C_Digest(CK_SESSION_HANDLE hSession,     /* the session's handle */	       CK_BYTE_PTR       pData,        /* data to be digested */	       CK_ULONG          ulDataLen,    /* bytes of data to be digested */	       CK_BYTE_PTR       pDigest,      /* receives the message digest */	       CK_ULONG_PTR      pulDigestLen) /* receives byte length of digest */{        int rv;	struct sc_pkcs11_session *session;	rv = sc_pkcs11_lock();	if (rv != CKR_OK)		return rv;	rv = pool_find(&session_pool, hSession, (void**) &session);	if (rv != CKR_OK)		goto out;	rv = sc_pkcs11_md_update(session, pData, ulDataLen);	if (rv == CKR_OK)		rv = sc_pkcs11_md_final(session, pDigest, pulDigestLen);out:	sc_debug(context, "C_Digest returns %d\n", rv);	sc_pkcs11_unlock();        return rv;}CK_RV C_DigestUpdate(CK_SESSION_HANDLE hSession,  /* the session's handle */		     CK_BYTE_PTR       pPart,     /* data to be digested */		     CK_ULONG          ulPartLen) /* bytes of data to be digested */{        int rv;	struct sc_pkcs11_session *session;	rv = sc_pkcs11_lock();	if (rv != CKR_OK)		return rv;	rv = pool_find(&session_pool, hSession, (void**) &session);	if (rv == CKR_OK)		rv = sc_pkcs11_md_update(session, pPart, ulPartLen);        sc_debug(context, "C_DigestUpdate returns %d\n", rv);	sc_pkcs11_unlock();        return rv;}CK_RV C_DigestKey(CK_SESSION_HANDLE hSession,  /* the session's handle */		  CK_OBJECT_HANDLE  hKey)      /* handle of secret key to digest */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_DigestFinal(CK_SESSION_HANDLE hSession,     /* the session's handle */		    CK_BYTE_PTR       pDigest,      /* receives the message digest */		    CK_ULONG_PTR      pulDigestLen) /* receives byte count of digest */{        int rv;	struct sc_pkcs11_session *session;	rv = sc_pkcs11_lock();	if (rv != CKR_OK)		return rv;	rv = pool_find(&session_pool, hSession, (void**) &session);	if (rv == CKR_OK)		rv = sc_pkcs11_md_final(session, pDigest, pulDigestLen);        sc_debug(context, "C_DigestFinal returns %d\n", rv);	sc_pkcs11_unlock();        return rv;}CK_RV C_SignInit(CK_SESSION_HANDLE hSession,    /* the session's handle */		 CK_MECHANISM_PTR  pMechanism,  /* the signature mechanism */		 CK_OBJECT_HANDLE  hKey)        /* handle of the signature key */{        CK_BBOOL can_sign;	CK_KEY_TYPE key_type;	CK_ATTRIBUTE sign_attribute = { CKA_SIGN, &can_sign, sizeof(can_sign) };	CK_ATTRIBUTE key_type_attr = { CKA_KEY_TYPE, &key_type, sizeof(key_type) };	struct sc_pkcs11_session *session;	struct sc_pkcs11_object *object;        int rv;	rv = sc_pkcs11_lock();	if (rv != CKR_OK)		return rv;	rv = pool_find(&session_pool, hSession, (void**) &session);	if (rv != CKR_OK)		goto out;	rv = pool_find(&session->slot->object_pool, hKey, (void**) &object);	if (rv != CKR_OK)		goto out;	if (object->ops->sign == NULL_PTR) {                rv = CKR_KEY_TYPE_INCONSISTENT;		goto out;	}	rv = object->ops->get_attribute(session, object, &sign_attribute);        if (rv != CKR_OK || !can_sign) {                rv = CKR_KEY_TYPE_INCONSISTENT;		goto out;	}	rv = object->ops->get_attribute(session, object, &key_type_attr);        if (rv != CKR_OK) {                rv = CKR_KEY_TYPE_INCONSISTENT;		goto out;	}	rv = sc_pkcs11_sign_init(session, pMechanism, object, key_type);out:	sc_debug(context, "Sign initialization returns %d\n", rv);	sc_pkcs11_unlock();        return rv;}CK_RV C_Sign(CK_SESSION_HANDLE hSession,        /* the session's handle */	     CK_BYTE_PTR       pData,           /* the data (digest) to be signed */	     CK_ULONG          ulDataLen,       /* count of bytes to be signed */	     CK_BYTE_PTR       pSignature,      /* receives the signature */	     CK_ULONG_PTR      pulSignatureLen) /* receives byte count of signature */{        int rv;	struct sc_pkcs11_session *session;	CK_ULONG length;	rv = sc_pkcs11_lock();	if (rv != CKR_OK)		return rv;	rv = pool_find(&session_pool, hSession, (void**) &session);	if (rv != CKR_OK)		goto out;	/* According to the pkcs11 specs, we must not do any calls that	 * change our crypto state if the caller is just asking for the	 * signature buffer size, or if the result would be	 * CKR_BUFFER_TOO_SMALL. Thus we cannot do the sign_update call	 * below. */	if ((rv = sc_pkcs11_sign_size(session, &length)) != CKR_OK)		goto out;	if (pSignature == NULL || length > *pulSignatureLen) {		*pulSignatureLen = length;		rv = pSignature? CKR_BUFFER_TOO_SMALL : CKR_OK;		goto out;	}	rv = sc_pkcs11_sign_update(session, pData, ulDataLen);	if (rv == CKR_OK)		rv = sc_pkcs11_sign_final(session, pSignature, pulSignatureLen);out:	sc_debug(context, "Signing result was %d\n", rv);	sc_pkcs11_unlock();        return rv;}CK_RV C_SignUpdate(CK_SESSION_HANDLE hSession,  /* the session's handle */		   CK_BYTE_PTR       pPart,     /* the data (digest) to be signed */		   CK_ULONG          ulPartLen) /* count of bytes to be signed */{	struct sc_pkcs11_session *session;        int rv;	rv = sc_pkcs11_lock();	if (rv != CKR_OK)		return rv;	rv = pool_find(&session_pool, hSession, (void**) &session);	if (rv == CKR_OK)		rv = sc_pkcs11_sign_update(session, pPart, ulPartLen);	sc_debug(context, "C_SignUpdate returns %d\n", rv);	sc_pkcs11_unlock();        return rv;}CK_RV C_SignFinal(CK_SESSION_HANDLE hSession,        /* the session's handle */		  CK_BYTE_PTR       pSignature,      /* receives the signature */		  CK_ULONG_PTR      pulSignatureLen) /* receives byte count of signature */{	struct sc_pkcs11_session *session;	CK_ULONG length;        int rv;	rv = sc_pkcs11_lock();	if (rv != CKR_OK)		return rv;	rv = pool_find(&session_pool, hSession, (void**) &session);	if (rv != CKR_OK)		goto out;	/* According to the pkcs11 specs, we must not do any calls that	 * change our crypto state if the caller is just asking for the	 * signature buffer size, or if the result would be	 * CKR_BUFFER_TOO_SMALL.	 */	if ((rv = sc_pkcs11_sign_size(session, &length)) != CKR_OK)		goto out;	if (pSignature == NULL || length > *pulSignatureLen) {		*pulSignatureLen = length;		rv = pSignature? CKR_BUFFER_TOO_SMALL : CKR_OK;	} else {		rv = sc_pkcs11_sign_final(session, pSignature, pulSignatureLen);	}out:	sc_debug(context, "C_SignFinal returns %d\n", rv);	sc_pkcs11_unlock();        return rv;}CK_RV C_SignRecoverInit(CK_SESSION_HANDLE hSession,   /* the session's handle */			CK_MECHANISM_PTR  pMechanism, /* the signature mechanism */			CK_OBJECT_HANDLE  hKey)       /* handle of the signature key */{        CK_BBOOL can_sign;	CK_KEY_TYPE key_type;	CK_ATTRIBUTE sign_attribute = { CKA_SIGN, &can_sign, sizeof(can_sign) };	CK_ATTRIBUTE key_type_attr = { CKA_KEY_TYPE, &key_type, sizeof(key_type) };	struct sc_pkcs11_session *session;	struct sc_pkcs11_object *object;        int rv;	rv = sc_pkcs11_lock();	if (rv != CKR_OK)		return rv;	rv = pool_find(&session_pool, hSession, (void**) &session);	if (rv != CKR_OK)		goto out;	rv = pool_find(&session->slot->object_pool, hKey, (void**) &object);	if (rv != CKR_OK)		goto out;	if (object->ops->sign == NULL_PTR) {                rv = CKR_KEY_TYPE_INCONSISTENT;		goto out;	}	rv = object->ops->get_attribute(session, object, &sign_attribute);        if (rv != CKR_OK || !can_sign) {                rv = CKR_KEY_TYPE_INCONSISTENT;		goto out;	}	rv = object->ops->get_attribute(session, object, &key_type_attr);        if (rv != CKR_OK) {                rv = CKR_KEY_TYPE_INCONSISTENT;		goto out;	}	/* XXX: need to tell the signature algorithm that we want	 * to recover the signature */        sc_debug(context, "SignRecover operation initialized\n");	rv = sc_pkcs11_sign_init(session, pMechanism, object, key_type);out:	sc_debug(context, "Sign initialization returns %d\n", rv);	sc_pkcs11_unlock();        return rv;}CK_RV C_SignRecover(CK_SESSION_HANDLE hSession,        /* the session's handle */		    CK_BYTE_PTR       pData,           /* the data (digest) to be signed */		    CK_ULONG          ulDataLen,       /* count of bytes to be signed */		    CK_BYTE_PTR       pSignature,      /* receives the signature */		    CK_ULONG_PTR      pulSignatureLen) /* receives byte count of signature */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_EncryptInit(CK_SESSION_HANDLE hSession,    /* the session's handle */		    CK_MECHANISM_PTR  pMechanism,  /* the encryption mechanism */		    CK_OBJECT_HANDLE  hKey)        /* handle of encryption key */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_Encrypt(CK_SESSION_HANDLE hSession,            /* the session's handle */		CK_BYTE_PTR       pData,               /* the plaintext data */		CK_ULONG          ulDataLen,           /* bytes of plaintext data */		CK_BYTE_PTR       pEncryptedData,      /* receives encrypted data */		CK_ULONG_PTR      pulEncryptedDataLen) /* receives encrypted byte count */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_EncryptUpdate(CK_SESSION_HANDLE hSession,           /* the session's handle */		      CK_BYTE_PTR       pPart,              /* the plaintext data */		      CK_ULONG          ulPartLen,          /* bytes of plaintext data */		      CK_BYTE_PTR       pEncryptedPart,     /* receives encrypted data */		      CK_ULONG_PTR      pulEncryptedPartLen)/* receives encrypted byte count */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_EncryptFinal(CK_SESSION_HANDLE hSession,                /* the session's handle */		     CK_BYTE_PTR       pLastEncryptedPart,      /* receives encrypted last part */		     CK_ULONG_PTR      pulLastEncryptedPartLen) /* receives byte count */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_DecryptInit(CK_SESSION_HANDLE hSession,    /* the session's handle */		    CK_MECHANISM_PTR  pMechanism,  /* the decryption mechanism */		    CK_OBJECT_HANDLE  hKey)        /* handle of the decryption key */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_Decrypt(CK_SESSION_HANDLE hSession,           /* the session's handle */		CK_BYTE_PTR       pEncryptedData,     /* input encrypted data */		CK_ULONG          ulEncryptedDataLen, /* count of bytes of input */		CK_BYTE_PTR       pData,              /* receives decrypted output */		CK_ULONG_PTR      pulDataLen)         /* receives decrypted byte count */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_DecryptUpdate(CK_SESSION_HANDLE hSession,            /* the session's handle */		      CK_BYTE_PTR       pEncryptedPart,      /* input encrypted data */		      CK_ULONG          ulEncryptedPartLen,  /* count of bytes of input */		      CK_BYTE_PTR       pPart,               /* receives decrypted output */		      CK_ULONG_PTR      pulPartLen)          /* receives decrypted byte count */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_DecryptFinal(CK_SESSION_HANDLE hSession,       /* the session's handle */		     CK_BYTE_PTR       pLastPart,      /* receives decrypted output */		     CK_ULONG_PTR      pulLastPartLen)  /* receives decrypted byte count */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_DigestEncryptUpdate(CK_SESSION_HANDLE hSession,            /* the session's handle */			    CK_BYTE_PTR       pPart,               /* the plaintext data */			    CK_ULONG          ulPartLen,           /* bytes of plaintext data */			    CK_BYTE_PTR       pEncryptedPart,      /* receives encrypted data */			    CK_ULONG_PTR      pulEncryptedPartLen) /* receives encrypted byte count */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_DecryptDigestUpdate(CK_SESSION_HANDLE hSession,            /* the session's handle */			    CK_BYTE_PTR       pEncryptedPart,      /* input encrypted data */			    CK_ULONG          ulEncryptedPartLen,  /* count of bytes of input */			    CK_BYTE_PTR       pPart,               /* receives decrypted output */			    CK_ULONG_PTR      pulPartLen)          /* receives decrypted byte count */{        return CKR_FUNCTION_NOT_SUPPORTED;}CK_RV C_SignEncryptUpdate(CK_SESSION_HANDLE hSession,            /* the session's handle */			  CK_BYTE_PTR       pPart,               /* the plaintext data */			  CK_ULONG          ulPartLen,           /* bytes of plaintext data */

⌨️ 快捷键说明

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