第十八章 DSA / 18.3 DSA数据结构

       DSA数据结构定义在crypto/dsa.h中,如下所示:

1)   DSA_SIG

签名值数据结构

              typedef struct DSA_SIG_st

        {

               BIGNUM *r;

        BIGNUM *s;

           } DSA_SIG;

              签名结果包括两部分,都是大数。

2DSA_METHOD

struct dsa_method

   {

        const char *name;

        DSA_SIG * (*dsa_do_sign)(const unsigned char *dgst, int dlen, DSA *dsa);

        int (*dsa_sign_setup)(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,                                                                BIGNUM **rp);

        int (*dsa_do_verify)(const unsigned char *dgst, int dgst_len,                                                        DSA_SIG *sig, DSA *dsa);

              /* 其他 */

       int (*dsa_paramgen)(DSA *dsa, int bits,unsigned char *seed, int seed_len,                        int *counter_ret, unsigned long *h_ret,BN_GENCB *cb);  

        int (*dsa_keygen)(DSA *dsa);

    };

本结构是一个函数集合,DSA的各种计算都通过它来实现。drypto/dsa_ossl.c中实现了一个默认的DSA_METHOD。如果用户实现了自己的DSA_METHOD,通过调用DSA_set_default_methodDSA_set_method,用户可以让openssl采用自己的DSA计算函数。

       主要项意义如下:

       nameDSA_METHOD的名字;

       dsa_do_sign:签名算法函数;

       dsa_sign_setup:根据密钥参数生成公私钥的函数;

       dsa_do_verify:签名验证函数;

       dsa_paramgen:生成密钥参数函数;

       dsa_keygen:生成公私钥函数。