More free.

This commit is contained in:
Alessio Di Mauro
2015-08-19 13:23:01 +02:00
parent de083bb27a
commit 6a60c779da
3 changed files with 36 additions and 15 deletions
+1
View File
@@ -738,6 +738,7 @@ CK_RV get_puoa(CK_OBJECT_HANDLE obj, CK_ATTRIBUTE_PTR template) {
len = sizeof(b_tmp); len = sizeof(b_tmp);
if (get_curve_parameters(pubkey_objects[piv_objects[obj].sub_id].data, b_tmp, &len) != CKR_OK) if (get_curve_parameters(pubkey_objects[piv_objects[obj].sub_id].data, b_tmp, &len) != CKR_OK)
return CKR_FUNCTION_FAILED; return CKR_FUNCTION_FAILED;
data = b_tmp; data = b_tmp;
break; break;
+29 -9
View File
@@ -257,7 +257,12 @@ CK_ULONG do_get_rsa_modulus_length(EVP_PKEY *key) {
if (rsa == NULL) if (rsa == NULL)
return 0; return 0;
return RSA_size(rsa) * 8; // There is also RSA_bits but only in >= 1.1.0 key_len = RSA_size(rsa) * 8; // There is also RSA_bits but only in >= 1.1.0
RSA_free(rsa);
rsa = NULL;
return key_len;
} }
@@ -282,13 +287,19 @@ CK_RV do_get_public_key(EVP_PKEY *key, CK_BYTE_PTR data, CK_ULONG_PTR len) {
rsa = EVP_PKEY_get1_RSA(key); rsa = EVP_PKEY_get1_RSA(key);
if (RSA_size(rsa) > *len) if (RSA_size(rsa) > *len) {
RSA_free(rsa);
rsa = NULL;
return CKR_BUFFER_TOO_SMALL; return CKR_BUFFER_TOO_SMALL;
}
p = data; p = data;
if ((*len = i2d_RSAPublicKey(rsa, &p)) == 0) if ((*len = i2d_RSAPublicKey(rsa, &p)) == 0) {
RSA_free(rsa);
rsa = NULL;
return CKR_FUNCTION_FAILED; return CKR_FUNCTION_FAILED;
}
// TODO: this is the correct thing to do so that we strip out the exponent // TODO: this is the correct thing to do so that we strip out the exponent
// OTOH we also need a function to get the exponent out with CKA_PUBLIC_EXPONENT // OTOH we also need a function to get the exponent out with CKA_PUBLIC_EXPONENT
@@ -308,23 +319,25 @@ CK_RV do_get_public_key(EVP_PKEY *key, CK_BYTE_PTR data, CK_ULONG_PTR len) {
// Add the DER structure with length after extracting the point // Add the DER structure with length after extracting the point
data[0] = 0x04; data[0] = 0x04;
if ((*len = EC_POINT_point2oct(ecg, ecp, pcf, data + 2, *len - 2, NULL)) == 0) if ((*len = EC_POINT_point2oct(ecg, ecp, pcf, data + 2, *len - 2, NULL)) == 0) {
EC_KEY_free(eck);
eck = NULL;
return CKR_FUNCTION_FAILED; return CKR_FUNCTION_FAILED;
}
data[1] = *len; data[1] = *len;
*len += 2; *len += 2;
// TODO: free ecg and ecp? EC_KEY_free(eck);
eck = NULL;
break; break;
default: default:
return CKR_FUNCTION_FAILED; return CKR_FUNCTION_FAILED;
} }
EVP_PKEY_free(key);
key = NULL;
return CKR_OK; return CKR_OK;
} }
@@ -342,6 +355,7 @@ CK_RV do_encode_rsa_public_key(CK_BYTE_PTR data, CK_ULONG len, RSA **key) {
return CKR_OK; return CKR_OK;
} }
#include <openssl/err.h>
CK_RV do_get_curve_parameters(EVP_PKEY *key, CK_BYTE_PTR data, CK_ULONG_PTR len) { CK_RV do_get_curve_parameters(EVP_PKEY *key, CK_BYTE_PTR data, CK_ULONG_PTR len) {
@@ -354,8 +368,14 @@ CK_RV do_get_curve_parameters( EVP_PKEY *key, CK_BYTE_PTR data, CK_ULONG_PTR len
p = data; p = data;
if ((*len = i2d_ECPKParameters(ecg, &p)) == 0) if ((*len = i2d_ECPKParameters(ecg, &p)) == 0) {
EC_KEY_free(eck);
eck = NULL;
return CKR_FUNCTION_FAILED; return CKR_FUNCTION_FAILED;
}
EC_KEY_free(eck);
eck = NULL;
return CKR_OK; return CKR_OK;
} }