OpenSSL RSA_方法结构:app_数据字段的用途是什么?

OpenSSL RSA_方法结构:app_数据字段的用途是什么?,openssl,rsa,Openssl,Rsa,参考OpenSSL RSA_方法结构,app_数据字段的建议用途是什么?关于这方面的文献资料非常缺乏。我也在寻找以有意义的方式使用此字段的任何示例代码 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 (

参考OpenSSL RSA_方法结构,app_数据字段的建议用途是什么?关于这方面的文献资料非常缺乏。我也在寻找以有意义的方式使用此字段的任何示例代码

 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;
参考OpenSSL RSA_方法结构,app_数据字段的建议用途是什么

在RSA的例子中,我认为没有建议的用法。我相信它是为那些需要它的人而存在的:

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

我相信
app_data
通常适用于需要携带额外上下文的特定应用程序,比如引擎实现和使用密钥对。例如,这来自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\u CTX\u get\u app\u data
SSL\u CTX\u set\u app\u data
SSL\u SESSION\u get\u app\u data
SSL\u SESSION\u set\u app\u 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"