implemented IKEv1 RSA signing in openssl_rsa_private_key.c

This commit is contained in:
Andreas Steffen
2009-06-10 15:29:57 +02:00
parent 3e3de01b28
commit dfa5fb0358
@@ -78,50 +78,54 @@ openssl_rsa_public_key_t *openssl_rsa_public_key_create_from_n_e(BIGNUM *n, BIGN
* Build an EMPSA PKCS1 signature described in PKCS#1 * Build an EMPSA PKCS1 signature described in PKCS#1
*/ */
static bool build_emsa_pkcs1_signature(private_openssl_rsa_private_key_t *this, static bool build_emsa_pkcs1_signature(private_openssl_rsa_private_key_t *this,
int type, chunk_t data, chunk_t *out) int type, chunk_t data, chunk_t *sig)
{ {
bool success = FALSE; bool success = FALSE;
u_char *sig = NULL;
u_int len; *sig = chunk_alloc(RSA_size(this->rsa));
const EVP_MD *hasher = EVP_get_digestbynid(type);
if (type == NID_undef)
{
if (RSA_private_encrypt(data.len, data.ptr, sig->ptr, this->rsa,
RSA_PKCS1_PADDING) == sig->len)
{
success = TRUE;
}
}
else
{
EVP_MD_CTX *ctx;
EVP_PKEY *key;
const EVP_MD *hasher;
hasher = EVP_get_digestbynid(type);
if (!hasher) if (!hasher)
{ {
return FALSE; return FALSE;
} }
EVP_MD_CTX *ctx = EVP_MD_CTX_create(); ctx = EVP_MD_CTX_create();
EVP_PKEY *key = EVP_PKEY_new(); key = EVP_PKEY_new();
if (!ctx || !key) if (!ctx || !key)
{ {
goto error; goto error;
} }
if (!EVP_PKEY_set1_RSA(key, this->rsa)) if (!EVP_PKEY_set1_RSA(key, this->rsa))
{ {
goto error; goto error;
} }
if (!EVP_SignInit_ex(ctx, hasher, NULL)) if (!EVP_SignInit_ex(ctx, hasher, NULL))
{ {
goto error; goto error;
} }
if (!EVP_SignUpdate(ctx, data.ptr, data.len)) if (!EVP_SignUpdate(ctx, data.ptr, data.len))
{ {
goto error; goto error;
} }
if (EVP_SignFinal(ctx, sig->ptr, &sig->len, key))
sig = malloc(EVP_PKEY_size(key));
if (EVP_SignFinal(ctx, sig, &len, key))
{ {
out->ptr = sig;
out->len = len;
success = TRUE; success = TRUE;
} }
else
{
free(sig);
}
error: error:
if (key) if (key)
@@ -132,6 +136,11 @@ error:
{ {
EVP_MD_CTX_destroy(ctx); EVP_MD_CTX_destroy(ctx);
} }
}
if (!success)
{
free(sig->ptr);
}
return success; return success;
} }
@@ -151,6 +160,8 @@ static bool sign(private_openssl_rsa_private_key_t *this, signature_scheme_t sch
{ {
switch (scheme) switch (scheme)
{ {
case SIGN_RSA_EMSA_PKCS1_NULL:
return build_emsa_pkcs1_signature(this, NID_undef, data, signature);
case SIGN_DEFAULT: case SIGN_DEFAULT:
case SIGN_RSA_EMSA_PKCS1_SHA1: case SIGN_RSA_EMSA_PKCS1_SHA1:
return build_emsa_pkcs1_signature(this, NID_sha1, data, signature); return build_emsa_pkcs1_signature(this, NID_sha1, data, signature);