added get_publicKeyInfo() method
authorAndreas Steffen <andreas.steffen@strongswan.org>
Fri, 12 Oct 2007 22:49:39 +0000 (22:49 -0000)
committerAndreas Steffen <andreas.steffen@strongswan.org>
Fri, 12 Oct 2007 22:49:39 +0000 (22:49 -0000)
src/libstrongswan/crypto/rsa/rsa_public_key.c
src/libstrongswan/crypto/rsa/rsa_public_key.h

index 6515960..ad87ac7 100644 (file)
@@ -274,54 +274,54 @@ end:
        return res;
 }
 
+
 /**
- * Implementation of rsa_public_key.get_key.
+ * Implementation of rsa_public_key_t.get_modulus.
  */
-static status_t get_key(const private_rsa_public_key_t *this, chunk_t *key)
+static mpz_t *get_modulus(const private_rsa_public_key_t *this)
 {
-       chunk_t n, e;
-
-       n.len = this->k;
-       n.ptr = mpz_export(NULL, NULL, 1, n.len, 1, 0, this->n);
-       e.len = this->k;
-       e.ptr = mpz_export(NULL, NULL, 1, e.len, 1, 0, this->e);
-       
-       key->len = this->k * 2;
-       key->ptr = malloc(key->len);
-       memcpy(key->ptr, n.ptr, n.len);
-       memcpy(key->ptr + n.len, e.ptr, e.len);
-       free(n.ptr);
-       free(e.ptr);
-       
-       return SUCCESS;
+       return (mpz_t*)&this->n;
 }
 
 /**
- * Implementation of rsa_public_key.save_key.
+ * Implementation of rsa_public_key_t.get_keysize.
  */
-static status_t save_key(const private_rsa_public_key_t *this, char *file)
+static size_t get_keysize(const private_rsa_public_key_t *this)
 {
-       return NOT_SUPPORTED;
+       return this->k;
 }
 
 /**
- * Implementation of rsa_public_key.get_modulus.
+ * Build a DER-encoded publicKeyInfo object from an RSA public key.
+ * Also used in rsa_private_key.c.
  */
-static mpz_t *get_modulus(const private_rsa_public_key_t *this)
+chunk_t rsa_public_key_info_to_asn1(const mpz_t n, const mpz_t e)
 {
-       return (mpz_t*)&this->n;
+       chunk_t rawKey = asn1_wrap(ASN1_SEQUENCE, "mm",
+                                                                asn1_integer_from_mpz(n),
+                                                                asn1_integer_from_mpz(e));
+       chunk_t publicKey;
+
+       u_char *pos = build_asn1_object(&publicKey, ASN1_BIT_STRING, 1 + rawKey.len);
+
+       *pos++ = 0x00;
+       memcpy(pos, rawKey.ptr, rawKey.len);
+       free(rawKey.ptr);
+
+       return asn1_wrap(ASN1_SEQUENCE, "cm", ASN1_rsaEncryption_id,
+                                                                                 publicKey);
 }
 
 /**
- * Implementation of rsa_public_key.get_keysize.
+ * Implementation of rsa_public_key_t.get_publicKeyInfo.
  */
-static size_t get_keysize(const private_rsa_public_key_t *this)
+static chunk_t get_publicKeyInfo(const private_rsa_public_key_t *this)
 {
-       return this->k;
+       return rsa_public_key_info_to_asn1(this->n, this->e);
 }
 
 /**
- * Implementation of rsa_public_key.get_keyid.
+ * Implementation of rsa_public_key_t.get_keyid.
  */
 static chunk_t get_keyid(const private_rsa_public_key_t *this)
 {
@@ -329,7 +329,7 @@ static chunk_t get_keyid(const private_rsa_public_key_t *this)
 }
 
 /**
- * Implementation of rsa_public_key.clone.
+ * Implementation of rsa_public_key_t.clone.
  */
 static rsa_public_key_t* _clone(const private_rsa_public_key_t *this)
 {
@@ -344,7 +344,7 @@ static rsa_public_key_t* _clone(const private_rsa_public_key_t *this)
 }
 
 /**
- * Implementation of rsa_public_key.destroy.
+ * Implementation of rsa_public_key_t.destroy.
  */
 static void destroy(private_rsa_public_key_t *this)
 {
@@ -363,10 +363,9 @@ private_rsa_public_key_t *rsa_public_key_create_empty(void)
        
        /* public functions */
        this->public.verify_emsa_pkcs1_signature = (status_t (*) (const rsa_public_key_t*,hash_algorithm_t,chunk_t,chunk_t))verify_emsa_pkcs1_signature;
-       this->public.get_key = (status_t (*) (const rsa_public_key_t*,chunk_t*))get_key;
-       this->public.save_key = (status_t (*) (const rsa_public_key_t*,char*))save_key;
        this->public.get_modulus = (mpz_t *(*) (const rsa_public_key_t*))get_modulus;
        this->public.get_keysize = (size_t (*) (const rsa_public_key_t*))get_keysize;
+       this->public.get_publicKeyInfo = (chunk_t (*) (const rsa_public_key_t*))get_publicKeyInfo;
        this->public.get_keyid = (chunk_t (*) (const rsa_public_key_t*))get_keyid;
        this->public.clone = (rsa_public_key_t* (*) (const rsa_public_key_t*))_clone;
        this->public.destroy = (void (*) (rsa_public_key_t*))destroy;
@@ -378,27 +377,6 @@ private_rsa_public_key_t *rsa_public_key_create_empty(void)
        return this;
 }
 
-/**
- * Build a DER-encoded publicKeyInfo object from an RSA public key.
- * Also used in rsa_private_key.c.
- */
-chunk_t rsa_public_key_info_to_asn1(const mpz_t n, const mpz_t e)
-{
-       chunk_t rawKey = asn1_wrap(ASN1_SEQUENCE, "mm",
-                                                                asn1_integer_from_mpz(n),
-                                                                asn1_integer_from_mpz(e));
-       chunk_t publicKey;
-
-       u_char *pos = build_asn1_object(&publicKey, ASN1_BIT_STRING, 1 + rawKey.len);
-
-       *pos++ = 0x00;
-       memcpy(pos, rawKey.ptr, rawKey.len);
-       free(rawKey.ptr);
-
-       return asn1_wrap(ASN1_SEQUENCE, "cm", ASN1_rsaEncryption_id,
-                                                                                 publicKey);
-}
-
 /*
  * See header
  */
index 02300b5..cd6e371 100644 (file)
@@ -75,33 +75,6 @@ struct rsa_public_key_t {
                                                                                         chunk_t data, chunk_t signature);
        
        /**
-        * @brief Gets the key.
-        * 
-        * Currently uses a proprietary format which is only inteded
-        * for testing. This should be replaced with a proper
-        * ASN1 encoded key format, when charon gets the ASN1 
-        * capabilities.
-        * 
-        * @param this                          calling object
-        * @param key                           key (in a propriarity format)
-        * @return                                      
-        *                                                      - SUCCESS
-        *                                                      - INVALID_STATE, if key not set
-        */
-       status_t (*get_key) (const rsa_public_key_t *this, chunk_t *key);
-       
-       /**
-        * @brief Saves a key to a file.
-        * 
-        * Not implemented!
-        * 
-        * @param this                          calling object
-        * @param file                          file to which the key should be written.
-        * @return                                      NOT_SUPPORTED
-        */
-       status_t (*save_key) (const rsa_public_key_t *this, char *file);
-       
-       /**
         * @brief Get the modulus of the key.
         * 
         * @param this                          calling object
@@ -118,6 +91,14 @@ struct rsa_public_key_t {
        size_t (*get_keysize) (const rsa_public_key_t *this);
 
        /**
+        * @brief Get the DER encoded publicKeyInfo object.
+        * 
+        * @param this                          calling object
+        * @return                                      DER encoded publicKeyInfo object
+        */
+       chunk_t (*get_publicKeyInfo) (const rsa_public_key_t *this);
+
+       /**
         * @brief Get the keyid formed as the SHA-1 hash of a publicKeyInfo object.
         * 
         * @param this                          calling object