/* * Check if contexts holding a public and private key match */ int shrsa_check_pub_priv( const shrsa_context *pub, const shrsa_context *prv ) { if( shrsa_check_pubkey( pub ) != 0 || shrsa_check_privkey( prv ) != 0 ) { return( RSA_ERR_RSA_KEY_CHECK_FAILED ); } if( shmpi_cmp_shmpi( &pub->N, &prv->N ) != 0 || shmpi_cmp_shmpi( &pub->E, &prv->E ) != 0 ) { return( RSA_ERR_RSA_KEY_CHECK_FAILED ); } return( 0 ); }
/* * Parse a PKCS#1 encoded private RSA key */ static int pk_parse_key_pkcs1_der( shrsa_t *shrsa, const unsigned char *key, size_t keylen ) { int ret; size_t len; unsigned char *p, *end; p = (unsigned char *) key; end = p + keylen; /* * This function parses the RSAPrivateKey (PKCS#1) * * RSAPrivateKey ::= SEQUENCE { * version Version, * modulus INTEGER, -- n * publicExponent INTEGER, -- e * privateExponent INTEGER, -- d * prime1 INTEGER, -- p * prime2 INTEGER, -- q * exponent1 INTEGER, -- d mod (p-1) * exponent2 INTEGER, -- d mod (q-1) * coefficient INTEGER, -- (inverse of q) mod p * otherPrimeInfos OtherPrimeInfos OPTIONAL * } */ if( ( ret = asn1_get_tag( &p, end, &len, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) { return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = asn1_get_int( &p, end, &shrsa->ver ) ) != 0 ) { return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret ); } if( shrsa->ver != 0 ) { return( POLARSSL_ERR_PK_KEY_INVALID_VERSION ); } if( ( ret = asn1_get_shmpi( &p, end, &shrsa->N ) ) != 0 || ( ret = asn1_get_shmpi( &p, end, &shrsa->E ) ) != 0 || ( ret = asn1_get_shmpi( &p, end, &shrsa->D ) ) != 0 || ( ret = asn1_get_shmpi( &p, end, &shrsa->P ) ) != 0 || ( ret = asn1_get_shmpi( &p, end, &shrsa->Q ) ) != 0 || ( ret = asn1_get_shmpi( &p, end, &shrsa->DP ) ) != 0 || ( ret = asn1_get_shmpi( &p, end, &shrsa->DQ ) ) != 0 || ( ret = asn1_get_shmpi( &p, end, &shrsa->QP ) ) != 0 ) { shrsa_free( shrsa ); return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + ret ); } shrsa->len = shmpi_size( &shrsa->N ); if( p != end ) { shrsa_free( shrsa ); return( POLARSSL_ERR_PK_KEY_INVALID_FORMAT + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); } if( ( ret = shrsa_check_privkey( shrsa ) ) != 0 ) { shrsa_free( shrsa ); return( ret ); } return( 0 ); }