added rsa_public_key_create(mpz_t n, mpz_t e)

This commit is contained in:
Andreas Steffen 2008-01-21 00:34:41 +00:00
parent d349a3d11a
commit b5d8c9779a
2 changed files with 63 additions and 21 deletions

View File

@ -110,8 +110,6 @@ struct private_rsa_public_key_t {
chunk_t (*rsavp1) (const private_rsa_public_key_t *this, chunk_t data);
};
private_rsa_public_key_t *rsa_public_key_create_empty(void);
/**
* Implementation of private_rsa_public_key_t.rsaep and private_rsa_public_key_t.rsavp1
*/
@ -312,6 +310,23 @@ chunk_t rsa_public_key_info_to_asn1(const mpz_t n, const mpz_t e)
publicKey);
}
/**
* Form the RSA keyid as a SHA-1 hash of a publicKeyInfo object
* Also used in rsa_private_key.c.
*/
chunk_t rsa_public_key_id_create(mpz_t n, mpz_t e)
{
chunk_t keyid;
chunk_t publicKeyInfo = rsa_public_key_info_to_asn1(n, e);
hasher_t *hasher = hasher_create(HASH_SHA1);
hasher->allocate_hash(hasher, publicKeyInfo, &keyid);
hasher->destroy(hasher);
free(publicKeyInfo.ptr);
return keyid;
}
/**
* Implementation of rsa_public_key_t.get_publicKeyInfo.
*/
@ -328,6 +343,9 @@ static chunk_t get_keyid(const private_rsa_public_key_t *this)
return this->keyid;
}
/* forward declaration used by rsa_public_key_t.clone */
private_rsa_public_key_t *rsa_public_key_create_empty(void);
/**
* Implementation of rsa_public_key_t.clone.
*/
@ -377,6 +395,20 @@ private_rsa_public_key_t *rsa_public_key_create_empty(void)
return this;
}
/*
* See header
*/
rsa_public_key_t *rsa_public_key_create(mpz_t n, mpz_t e)
{
private_rsa_public_key_t *this = rsa_public_key_create_empty();
mpz_init_set(this->n, n);
mpz_init_set(this->e, e);
this->k = (mpz_sizeinbase(n, 2) + 7) / BITS_PER_BYTE;
this->keyid = rsa_public_key_id_create(n, e);
return &this->public;
}
/*
* See header
*/
@ -412,19 +444,9 @@ rsa_public_key_t *rsa_public_key_create_from_chunk(chunk_t blob)
}
objectID++;
}
this->k = (mpz_sizeinbase(this->n, 2) + 7) / 8;
/* form the keyid as a SHA-1 hash of a publicKeyInfo object */
{
chunk_t publicKeyInfo = rsa_public_key_info_to_asn1(this->n, this->e);
hasher_t *hasher = hasher_create(HASH_SHA1);
hasher->allocate_hash(hasher, publicKeyInfo, &this->keyid);
hasher->destroy(hasher);
free(publicKeyInfo.ptr);
}
this->k = (mpz_sizeinbase(this->n, 2) + 7) / BITS_PER_BYTE;
this->keyid = rsa_public_key_id_create(this->n, this->e);
return &this->public;
}

View File

@ -40,20 +40,29 @@ typedef struct rsa_public_key_t rsa_public_key_t;
* the EMSA encoding (see PKCS1)
*
* @b Constructors:
* - rsa_public_key_create()
* - rsa_public_key_create_from_chunk()
* - rsa_public_key_create_from_file()
* - rsa_private_key_t.get_public_key()
*
* @see rsa_private_key_t
*
* @todo Implement getkey() and savekey()
*
*
* @ingroup rsa
*/
struct rsa_public_key_t {
/**
* @brief Verify a EMSA-PKCS1 encodined signature.
* @brief Encrypt a data block using EME-PKCS1 encoding.
*
*
* @param this calling object
* @param data plaintext input data
* @param out encrypted output data
* @return
* - SUCCESS
* - FAILED if data block is too large
*/
status_t (*pkcs1_encrypt) (rsa_public_key_t *this, chunk_t in, chunk_t *out);
/**
* @brief Verify an EMSA-PKCS1 encoded signature.
*
* Processes the supplied signature with the RSAVP1 function,
* selects the hash algorithm form the resultign ASN1-OID and
@ -122,6 +131,17 @@ struct rsa_public_key_t {
void (*destroy) (rsa_public_key_t *this);
};
/**
* @brief Create a RSA public key from modulus and public exponent.
*
* @param n modulus
* @param e public exponent
* @return created rsa_public_key_t
*
* @ingroup rsa
*/
rsa_public_key_t *rsa_public_key_create(mpz_t n, mpz_t e);
/**
* @brief Load an RSA public key from a chunk.
*