Exemple #1
0
/*
 * 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 );
}
Exemple #2
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 );
}