示例#1
0
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;
}