static int eckey_verify_wrap( void *ctx, md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { int ret; ecdsa_context ecdsa; ecdsa_init( &ecdsa ); if( ( ret = ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 ) ret = ecdsa_verify_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len ); ecdsa_free( &ecdsa ); return( ret ); }
static int eckey_sign_wrap( void *ctx, md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; ecdsa_context ecdsa; ecdsa_init( &ecdsa ); if( ( ret = ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 ) ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ); ecdsa_free( &ecdsa ); return( ret ); }
static mrb_value mrb_ecdsa_load_pem(mrb_state *mrb, mrb_value self) { ecdsa_context *ecdsa; pk_context pkey; mrb_value pem; int ret = 0; mrb_get_args(mrb, "S", &pem); pk_init( &pkey ); ret = pk_parse_key(&pkey, RSTRING_PTR(pem), RSTRING_LEN(pem), NULL, 0); if (ret == 0) { ecdsa = DATA_CHECK_GET_PTR(mrb, self, &mrb_ecdsa_type, ecdsa_context); ret = ecdsa_from_keypair(ecdsa, pk_ec(pkey)); if (ret == 0) { return mrb_true_value(); } } pk_free( &pkey ); mrb_raise(mrb, E_RUNTIME_ERROR, "can't parse pem"); return mrb_false_value(); }