static gpg_err_code_t get_serial_of_tokenid( pkcs11h_token_id_t tokenid, char **serial ) { gpg_err_code_t error = GPG_ERR_GENERAL; char *serialized = NULL; char *serialpart = NULL; unsigned char *digest = NULL; size_t n; *serial = NULL; if ( (error = common_map_pkcs11_error( pkcs11h_token_serializeTokenId( NULL, &n, tokenid ) )) != GPG_ERR_NO_ERROR ) { goto cleanup; } if ((serialized = (char *)malloc(n)) == NULL) { error = GPG_ERR_ENOMEM; goto cleanup; } if ( (error = common_map_pkcs11_error( pkcs11h_token_serializeTokenId( serialized, &n, tokenid ) )) != GPG_ERR_NO_ERROR ) { goto cleanup; } if ((digest = (unsigned char *)malloc(gcry_md_get_algo_dlen(GCRY_MD_SHA1))) == NULL) { error = GPG_ERR_ENOMEM; goto cleanup; } gcry_md_hash_buffer(GCRY_MD_SHA1, digest, serialized, strlen(serialized)); /* * Take the first N bytes. */ if ((serialpart = encoding_bin2hex(digest, OPENPGP_PKCS11_SERIAL_BYTES)) == NULL) { error = GPG_ERR_ENOMEM; goto cleanup; } if ((*serial = malloc(strlen(OPENPGP_PKCS11_SERIAL) + OPENPGP_PKCS11_SERIAL_BYTES * 2 + 1)) == NULL) { error = GPG_ERR_ENOMEM; goto cleanup; } sprintf(*serial, OPENPGP_PKCS11_SERIAL, serialpart); error = GPG_ERR_NO_ERROR; cleanup: if (serialized != NULL) { free(serialized); serialized = NULL; } if (serialpart != NULL) { free(serialpart); serialpart = NULL; } if (digest != NULL) { free(digest); digest = NULL; } return error; }
CK_RV pkcs11h_certificate_serializeCertificateId ( OUT char * const sz, IN OUT size_t *max, IN const pkcs11h_certificate_id_t certificate_id ) { CK_RV rv = CKR_FUNCTION_FAILED; size_t saved_max = 0; size_t n = 0; size_t _max = 0; /*_PKCS11H_ASSERT (sz!=NULL); Not required */ _PKCS11H_ASSERT (max!=NULL); _PKCS11H_ASSERT (certificate_id!=NULL); _PKCS11H_DEBUG ( PKCS11H_LOG_DEBUG2, "PKCS#11: pkcs11h_certificate_serializeCertificateId entry sz=%p, *max="P_Z", certificate_id=%p", sz, sz != NULL ? *max : 0, (void *)certificate_id ); if (sz != NULL) { saved_max = n = *max; } *max = 0; if ( (rv = pkcs11h_token_serializeTokenId ( sz, &n, certificate_id->token_id )) != CKR_OK ) { goto cleanup; } _max = n + certificate_id->attrCKA_ID_size*2 + 1; if (sz != NULL) { if (saved_max < _max) { rv = CKR_ATTRIBUTE_VALUE_INVALID; goto cleanup; } sz[n-1] = '/'; if (certificate_id->attrCKA_ID) { rv = _pkcs11h_util_binaryToHex ( sz+n, saved_max-n, certificate_id->attrCKA_ID, certificate_id->attrCKA_ID_size ); } } *max = _max; rv = CKR_OK; cleanup: _PKCS11H_DEBUG ( PKCS11H_LOG_DEBUG2, "PKCS#11: pkcs11h_certificate_serializeCertificateId return rv=%lu-'%s', *max="P_Z", sz='%s'", rv, pkcs11h_getMessage (rv), *max, sz ); return rv; }