私はopensslエンジンを書き始めたばかりです。必要なのは、さまざまな呼び出しへの関数ポインターを定義することだけです。署名を実装する RSA エンジンの場合、次のRSA_METHOD
構造体を使用する必要があります。
typedef struct rsa_meth_st
{
const char *name;
int (*rsa_pub_enc)(int flen, unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int (*rsa_pub_dec)(int flen, unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int (*rsa_priv_enc)(int flen, unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int (*rsa_priv_dec)(int flen, unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int (*rsa_mod_exp)(BIGNUM *r0, BIGNUM *I, RSA *rsa);
int (*bn_mod_exp)(BIGNUM *r, BIGNUM *a, const BIGNUM *p,
const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
int (*init)(RSA *rsa);
int (*finish)(RSA *rsa);
int flags;
char *app_data; /* ?? */
int (*rsa_sign)(int type, unsigned char *m, unsigned int m_len,
unsigned char *sigret, unsigned int *siglen, RSA *rsa);//here m points to digest of type 'type'
int (*rsa_verify)(int type, unsigned char *m, unsigned int m_len,
unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
} RSA_METHOD;
ただし、 or構造体のようなSignInit
,SignUpdate
ポインターは表示されません。EVP_CIPHER
EVP_MD
をライブラリSignInit
にリダイレクトする必要があります。ダイジェストSignUpdate
ではなく「元の」メッセージを実装に転送する必要があります。これどうやってするの?