OpenSSL RSA_METHOD结构:app_data字段有什么用?

时间:2015-12-17 20:25:04

标签: openssl rsa

参考OpenSSL RSA_METHOD结构, app_data 字段的建议用途是什么?文档很少见。我也在寻找以有意义的方式使用该字段的任何示例代码。

 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;

1 个答案:

答案 0 :(得分:1)

  

参考OpenSSL RSA_METHOD结构,app_data字段的建议用法是什么?

就RSA而言,我不相信有建议用途。我相信它存在于那些需要它的人:

include/openssl/rsa.h-    /* may be needed! */
include/openssl/rsa.h:    char *app_data;

我认为app_data通常存在于需要携带额外上下文的特定应用程序,例如ENGINE实现和使用密钥对。例如,这是来自GOST的引擎:

engines/ccgost/gost_crypt.c:192:    ctx->app_data = ctx->cipher_data;

它还经常在SSL上下文中使用以提供额外的状态。例如:

...
ssl/d1_pkt.c:1390:            s->s3->in_read_app_data = 2;
ssl/s3_lib.c:3104:    s->s3->in_read_app_data = 0;
ssl/s3_lib.c:4415:    s->s3->in_read_app_data = 1;
ssl/s3_lib.c:4419:    if ((ret == -1) && (s->s3->in_read_app_data == 2)) {
ssl/s3_lib.c:4433:        s->s3->in_read_app_data = 0;
ssl/s3_pkt.c:1623:            s->s3->in_read_app_data = 2;
...

我认为它涵盖在ssl(3)手册页中;见SSL_CTX_get_app_dataSSL_CTX_set_app_dataSSL_SESSION_get_app_dataSSL_SESSION_set_app_data和朋友。

至少有59个数据结构提供它:

openssl-1.0.2e$ grep -IR app_data * | egrep "(char*|void*)" | wc -l
      59
  

文档很少见。

是的。以下是我可以在其上找到的评论(省略了一些/* ?? */):

crypto/evp/evp.h-    /* Application data */
crypto/evp/evp.h:    void *app_data;

crypto/evp/evp.h:    void *app_data;             /* application stuff */

demos/tunala/tunala.c-    /*
demos/tunala/tunala.c:     * We use the SSL's "app_data" to indicate a call-back induced "kill"