CryptX

 view release on metacpan or  search on metacpan

src/ltc/pk/rsa/rsa_import_x509.c  view on Meta::CPAN

   }
   if ((err = s_rsa_decode_parameters(&d, &key->params)) != CRYPT_OK) {
      return err;
   }
   key->pss_oaep = 1;
   return CRYPT_OK;
}

static LTC_INLINE int s_rsa_import_spki(const unsigned char *in, unsigned long inlen, rsa_key *key)
{
   int err;
   if (s_rsa_1_5_import_spki(in, inlen, key) == CRYPT_OK) {
      return CRYPT_OK;
   }

   if ((err = s_rsa_pss_import_spki(in, inlen, key)) == CRYPT_OK) {
      return CRYPT_OK;
   }
   return err;
}

/**
  Import an RSA key from SubjectPublicKeyInfo
  @param in      The packet to import from
  @param inlen   It's length (octets)
  @param key     [out] Destination for newly imported key
  @return CRYPT_OK if successful, upon error allocated memory is freed
*/
int rsa_import_spki(const unsigned char *in, unsigned long inlen, rsa_key *key)
{
   int           err;

   LTC_ARGCHK(in          != NULL);
   LTC_ARGCHK(key         != NULL);
   LTC_ARGCHK(ltc_mp.name != NULL);

   /* init key */
   if ((err = rsa_init(key)) != CRYPT_OK) {
      return err;
   }

   if ((err = s_rsa_import_spki(in, inlen, key)) == CRYPT_OK) {
      key->type = PK_PUBLIC;
      return CRYPT_OK;
   }

   rsa_free(key);

   return err;
}

/**
  Import an RSA key from a X.509 certificate
  @param in      The packet to import from
  @param inlen   It's length (octets)
  @param key     [out] Destination for newly imported key
  @return CRYPT_OK if successful, upon error allocated memory is freed
*/
int rsa_import_x509(const unsigned char *in, unsigned long inlen, rsa_key *key)
{
   ltc_asn1_list *decoded_list;
   const ltc_asn1_list *spki;
   int           err;

   LTC_ARGCHK(in          != NULL);
   LTC_ARGCHK(key         != NULL);
   LTC_ARGCHK(ltc_mp.name != NULL);

   /* init key */
   if ((err = rsa_init(key)) != CRYPT_OK) {
      return err;
   }

   /* First try to decode as SubjectPublicKeyInfo */
   if (s_rsa_import_spki(in, inlen, key) == CRYPT_OK) {
      key->type = PK_PUBLIC;
      return CRYPT_OK;
   }

   /* Now try to extract the SubjectPublicKeyInfo from the Certificate */
   if ((err = x509_decode_spki(in, inlen, &decoded_list, &spki)) != CRYPT_OK) {
      rsa_free(key);
      return err;
   }
   err = s_rsa_import_spki(spki->data, spki->size, key);

   der_free_sequence_flexi(decoded_list);
   if (err != CRYPT_OK) {
      rsa_free(key);
      return err;
   }
   key->type = PK_PUBLIC;
   return CRYPT_OK;
}

#endif /* LTC_MRSA */



( run in 2.413 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )