Home | History | Annotate | Line # | Download | only in ssl
      1      1.1  christos /*
      2  1.1.1.2  christos  * Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved.
      3  1.1.1.2  christos  * Copyright (c) 2004, EdelKey Project. All Rights Reserved.
      4      1.1  christos  *
      5  1.1.1.2  christos  * Licensed under the OpenSSL license (the "License").  You may not use
      6  1.1.1.2  christos  * this file except in compliance with the License.  You can obtain a copy
      7  1.1.1.2  christos  * in the file LICENSE in the source distribution or at
      8  1.1.1.2  christos  * https://www.openssl.org/source/license.html
      9      1.1  christos  *
     10  1.1.1.2  christos  * Originally written by Christophe Renou and Peter Sylvester,
     11  1.1.1.2  christos  * for the EdelKey project.
     12      1.1  christos  */
     13      1.1  christos 
     14  1.1.1.2  christos #include <openssl/crypto.h>
     15  1.1.1.2  christos #include <openssl/rand.h>
     16  1.1.1.2  christos #include <openssl/err.h>
     17  1.1.1.2  christos #include "ssl_local.h"
     18  1.1.1.2  christos 
     19  1.1.1.2  christos #ifndef OPENSSL_NO_SRP
     20      1.1  christos # include <openssl/srp.h>
     21      1.1  christos 
     22      1.1  christos int SSL_CTX_SRP_CTX_free(struct ssl_ctx_st *ctx)
     23      1.1  christos {
     24      1.1  christos     if (ctx == NULL)
     25      1.1  christos         return 0;
     26      1.1  christos     OPENSSL_free(ctx->srp_ctx.login);
     27  1.1.1.2  christos     OPENSSL_free(ctx->srp_ctx.info);
     28      1.1  christos     BN_free(ctx->srp_ctx.N);
     29      1.1  christos     BN_free(ctx->srp_ctx.g);
     30      1.1  christos     BN_free(ctx->srp_ctx.s);
     31      1.1  christos     BN_free(ctx->srp_ctx.B);
     32      1.1  christos     BN_free(ctx->srp_ctx.A);
     33      1.1  christos     BN_free(ctx->srp_ctx.a);
     34      1.1  christos     BN_free(ctx->srp_ctx.b);
     35      1.1  christos     BN_free(ctx->srp_ctx.v);
     36  1.1.1.2  christos     memset(&ctx->srp_ctx, 0, sizeof(ctx->srp_ctx));
     37      1.1  christos     ctx->srp_ctx.strength = SRP_MINIMAL_N;
     38  1.1.1.2  christos     return 1;
     39      1.1  christos }
     40      1.1  christos 
     41      1.1  christos int SSL_SRP_CTX_free(struct ssl_st *s)
     42      1.1  christos {
     43      1.1  christos     if (s == NULL)
     44      1.1  christos         return 0;
     45      1.1  christos     OPENSSL_free(s->srp_ctx.login);
     46  1.1.1.2  christos     OPENSSL_free(s->srp_ctx.info);
     47      1.1  christos     BN_free(s->srp_ctx.N);
     48      1.1  christos     BN_free(s->srp_ctx.g);
     49      1.1  christos     BN_free(s->srp_ctx.s);
     50      1.1  christos     BN_free(s->srp_ctx.B);
     51      1.1  christos     BN_free(s->srp_ctx.A);
     52      1.1  christos     BN_free(s->srp_ctx.a);
     53      1.1  christos     BN_free(s->srp_ctx.b);
     54      1.1  christos     BN_free(s->srp_ctx.v);
     55  1.1.1.2  christos     memset(&s->srp_ctx, 0, sizeof(s->srp_ctx));
     56      1.1  christos     s->srp_ctx.strength = SRP_MINIMAL_N;
     57  1.1.1.2  christos     return 1;
     58      1.1  christos }
     59      1.1  christos 
     60      1.1  christos int SSL_SRP_CTX_init(struct ssl_st *s)
     61      1.1  christos {
     62      1.1  christos     SSL_CTX *ctx;
     63      1.1  christos 
     64      1.1  christos     if ((s == NULL) || ((ctx = s->ctx) == NULL))
     65      1.1  christos         return 0;
     66  1.1.1.2  christos 
     67  1.1.1.2  christos     memset(&s->srp_ctx, 0, sizeof(s->srp_ctx));
     68  1.1.1.2  christos 
     69      1.1  christos     s->srp_ctx.SRP_cb_arg = ctx->srp_ctx.SRP_cb_arg;
     70      1.1  christos     /* set client Hello login callback */
     71      1.1  christos     s->srp_ctx.TLS_ext_srp_username_callback =
     72      1.1  christos         ctx->srp_ctx.TLS_ext_srp_username_callback;
     73      1.1  christos     /* set SRP N/g param callback for verification */
     74      1.1  christos     s->srp_ctx.SRP_verify_param_callback =
     75      1.1  christos         ctx->srp_ctx.SRP_verify_param_callback;
     76      1.1  christos     /* set SRP client passwd callback */
     77      1.1  christos     s->srp_ctx.SRP_give_srp_client_pwd_callback =
     78      1.1  christos         ctx->srp_ctx.SRP_give_srp_client_pwd_callback;
     79      1.1  christos 
     80      1.1  christos     s->srp_ctx.strength = ctx->srp_ctx.strength;
     81      1.1  christos 
     82      1.1  christos     if (((ctx->srp_ctx.N != NULL) &&
     83      1.1  christos          ((s->srp_ctx.N = BN_dup(ctx->srp_ctx.N)) == NULL)) ||
     84      1.1  christos         ((ctx->srp_ctx.g != NULL) &&
     85      1.1  christos          ((s->srp_ctx.g = BN_dup(ctx->srp_ctx.g)) == NULL)) ||
     86      1.1  christos         ((ctx->srp_ctx.s != NULL) &&
     87      1.1  christos          ((s->srp_ctx.s = BN_dup(ctx->srp_ctx.s)) == NULL)) ||
     88      1.1  christos         ((ctx->srp_ctx.B != NULL) &&
     89      1.1  christos          ((s->srp_ctx.B = BN_dup(ctx->srp_ctx.B)) == NULL)) ||
     90      1.1  christos         ((ctx->srp_ctx.A != NULL) &&
     91      1.1  christos          ((s->srp_ctx.A = BN_dup(ctx->srp_ctx.A)) == NULL)) ||
     92      1.1  christos         ((ctx->srp_ctx.a != NULL) &&
     93      1.1  christos          ((s->srp_ctx.a = BN_dup(ctx->srp_ctx.a)) == NULL)) ||
     94      1.1  christos         ((ctx->srp_ctx.v != NULL) &&
     95      1.1  christos          ((s->srp_ctx.v = BN_dup(ctx->srp_ctx.v)) == NULL)) ||
     96      1.1  christos         ((ctx->srp_ctx.b != NULL) &&
     97      1.1  christos          ((s->srp_ctx.b = BN_dup(ctx->srp_ctx.b)) == NULL))) {
     98      1.1  christos         SSLerr(SSL_F_SSL_SRP_CTX_INIT, ERR_R_BN_LIB);
     99      1.1  christos         goto err;
    100      1.1  christos     }
    101      1.1  christos     if ((ctx->srp_ctx.login != NULL) &&
    102  1.1.1.2  christos         ((s->srp_ctx.login = OPENSSL_strdup(ctx->srp_ctx.login)) == NULL)) {
    103  1.1.1.2  christos         SSLerr(SSL_F_SSL_SRP_CTX_INIT, ERR_R_INTERNAL_ERROR);
    104  1.1.1.2  christos         goto err;
    105  1.1.1.2  christos     }
    106  1.1.1.2  christos     if ((ctx->srp_ctx.info != NULL) &&
    107  1.1.1.2  christos         ((s->srp_ctx.info = BUF_strdup(ctx->srp_ctx.info)) == NULL)) {
    108      1.1  christos         SSLerr(SSL_F_SSL_SRP_CTX_INIT, ERR_R_INTERNAL_ERROR);
    109      1.1  christos         goto err;
    110      1.1  christos     }
    111      1.1  christos     s->srp_ctx.srp_Mask = ctx->srp_ctx.srp_Mask;
    112      1.1  christos 
    113  1.1.1.2  christos     return 1;
    114      1.1  christos  err:
    115      1.1  christos     OPENSSL_free(s->srp_ctx.login);
    116  1.1.1.2  christos     OPENSSL_free(s->srp_ctx.info);
    117      1.1  christos     BN_free(s->srp_ctx.N);
    118      1.1  christos     BN_free(s->srp_ctx.g);
    119      1.1  christos     BN_free(s->srp_ctx.s);
    120      1.1  christos     BN_free(s->srp_ctx.B);
    121      1.1  christos     BN_free(s->srp_ctx.A);
    122      1.1  christos     BN_free(s->srp_ctx.a);
    123      1.1  christos     BN_free(s->srp_ctx.b);
    124      1.1  christos     BN_free(s->srp_ctx.v);
    125  1.1.1.2  christos     memset(&s->srp_ctx, 0, sizeof(s->srp_ctx));
    126  1.1.1.2  christos     return 0;
    127      1.1  christos }
    128      1.1  christos 
    129      1.1  christos int SSL_CTX_SRP_CTX_init(struct ssl_ctx_st *ctx)
    130      1.1  christos {
    131      1.1  christos     if (ctx == NULL)
    132      1.1  christos         return 0;
    133      1.1  christos 
    134  1.1.1.2  christos     memset(&ctx->srp_ctx, 0, sizeof(ctx->srp_ctx));
    135      1.1  christos     ctx->srp_ctx.strength = SRP_MINIMAL_N;
    136      1.1  christos 
    137  1.1.1.2  christos     return 1;
    138      1.1  christos }
    139      1.1  christos 
    140      1.1  christos /* server side */
    141      1.1  christos int SSL_srp_server_param_with_username(SSL *s, int *ad)
    142      1.1  christos {
    143      1.1  christos     unsigned char b[SSL_MAX_MASTER_KEY_LENGTH];
    144      1.1  christos     int al;
    145      1.1  christos 
    146      1.1  christos     *ad = SSL_AD_UNKNOWN_PSK_IDENTITY;
    147      1.1  christos     if ((s->srp_ctx.TLS_ext_srp_username_callback != NULL) &&
    148      1.1  christos         ((al =
    149      1.1  christos           s->srp_ctx.TLS_ext_srp_username_callback(s, ad,
    150      1.1  christos                                                    s->srp_ctx.SRP_cb_arg)) !=
    151      1.1  christos          SSL_ERROR_NONE))
    152      1.1  christos         return al;
    153      1.1  christos 
    154      1.1  christos     *ad = SSL_AD_INTERNAL_ERROR;
    155      1.1  christos     if ((s->srp_ctx.N == NULL) ||
    156      1.1  christos         (s->srp_ctx.g == NULL) ||
    157      1.1  christos         (s->srp_ctx.s == NULL) || (s->srp_ctx.v == NULL))
    158      1.1  christos         return SSL3_AL_FATAL;
    159      1.1  christos 
    160  1.1.1.2  christos     if (RAND_priv_bytes(b, sizeof(b)) <= 0)
    161      1.1  christos         return SSL3_AL_FATAL;
    162      1.1  christos     s->srp_ctx.b = BN_bin2bn(b, sizeof(b), NULL);
    163      1.1  christos     OPENSSL_cleanse(b, sizeof(b));
    164      1.1  christos 
    165      1.1  christos     /* Calculate:  B = (kv + g^b) % N  */
    166      1.1  christos 
    167      1.1  christos     return ((s->srp_ctx.B =
    168      1.1  christos              SRP_Calc_B(s->srp_ctx.b, s->srp_ctx.N, s->srp_ctx.g,
    169      1.1  christos                         s->srp_ctx.v)) !=
    170      1.1  christos             NULL) ? SSL_ERROR_NONE : SSL3_AL_FATAL;
    171      1.1  christos }
    172      1.1  christos 
    173      1.1  christos /*
    174      1.1  christos  * If the server just has the raw password, make up a verifier entry on the
    175      1.1  christos  * fly
    176      1.1  christos  */
    177      1.1  christos int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass,
    178      1.1  christos                                 const char *grp)
    179      1.1  christos {
    180      1.1  christos     SRP_gN *GN = SRP_get_default_gN(grp);
    181      1.1  christos     if (GN == NULL)
    182      1.1  christos         return -1;
    183      1.1  christos     s->srp_ctx.N = BN_dup(GN->N);
    184      1.1  christos     s->srp_ctx.g = BN_dup(GN->g);
    185  1.1.1.2  christos     BN_clear_free(s->srp_ctx.v);
    186  1.1.1.2  christos     s->srp_ctx.v = NULL;
    187  1.1.1.2  christos     BN_clear_free(s->srp_ctx.s);
    188  1.1.1.2  christos     s->srp_ctx.s = NULL;
    189      1.1  christos     if (!SRP_create_verifier_BN
    190      1.1  christos         (user, pass, &s->srp_ctx.s, &s->srp_ctx.v, GN->N, GN->g))
    191      1.1  christos         return -1;
    192      1.1  christos 
    193      1.1  christos     return 1;
    194      1.1  christos }
    195      1.1  christos 
    196      1.1  christos int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g,
    197      1.1  christos                              BIGNUM *sa, BIGNUM *v, char *info)
    198      1.1  christos {
    199      1.1  christos     if (N != NULL) {
    200      1.1  christos         if (s->srp_ctx.N != NULL) {
    201      1.1  christos             if (!BN_copy(s->srp_ctx.N, N)) {
    202      1.1  christos                 BN_free(s->srp_ctx.N);
    203      1.1  christos                 s->srp_ctx.N = NULL;
    204      1.1  christos             }
    205      1.1  christos         } else
    206      1.1  christos             s->srp_ctx.N = BN_dup(N);
    207      1.1  christos     }
    208      1.1  christos     if (g != NULL) {
    209      1.1  christos         if (s->srp_ctx.g != NULL) {
    210      1.1  christos             if (!BN_copy(s->srp_ctx.g, g)) {
    211      1.1  christos                 BN_free(s->srp_ctx.g);
    212      1.1  christos                 s->srp_ctx.g = NULL;
    213      1.1  christos             }
    214      1.1  christos         } else
    215      1.1  christos             s->srp_ctx.g = BN_dup(g);
    216      1.1  christos     }
    217      1.1  christos     if (sa != NULL) {
    218      1.1  christos         if (s->srp_ctx.s != NULL) {
    219      1.1  christos             if (!BN_copy(s->srp_ctx.s, sa)) {
    220      1.1  christos                 BN_free(s->srp_ctx.s);
    221      1.1  christos                 s->srp_ctx.s = NULL;
    222      1.1  christos             }
    223      1.1  christos         } else
    224      1.1  christos             s->srp_ctx.s = BN_dup(sa);
    225      1.1  christos     }
    226      1.1  christos     if (v != NULL) {
    227      1.1  christos         if (s->srp_ctx.v != NULL) {
    228      1.1  christos             if (!BN_copy(s->srp_ctx.v, v)) {
    229      1.1  christos                 BN_free(s->srp_ctx.v);
    230      1.1  christos                 s->srp_ctx.v = NULL;
    231      1.1  christos             }
    232      1.1  christos         } else
    233      1.1  christos             s->srp_ctx.v = BN_dup(v);
    234      1.1  christos     }
    235  1.1.1.2  christos     if (info != NULL) {
    236  1.1.1.2  christos         if (s->srp_ctx.info)
    237  1.1.1.2  christos             OPENSSL_free(s->srp_ctx.info);
    238  1.1.1.2  christos         if ((s->srp_ctx.info = BUF_strdup(info)) == NULL)
    239  1.1.1.2  christos             return -1;
    240  1.1.1.2  christos     }
    241      1.1  christos 
    242      1.1  christos     if (!(s->srp_ctx.N) ||
    243      1.1  christos         !(s->srp_ctx.g) || !(s->srp_ctx.s) || !(s->srp_ctx.v))
    244      1.1  christos         return -1;
    245      1.1  christos 
    246      1.1  christos     return 1;
    247      1.1  christos }
    248      1.1  christos 
    249  1.1.1.2  christos int srp_generate_server_master_secret(SSL *s)
    250      1.1  christos {
    251      1.1  christos     BIGNUM *K = NULL, *u = NULL;
    252  1.1.1.2  christos     int ret = -1, tmp_len = 0;
    253      1.1  christos     unsigned char *tmp = NULL;
    254      1.1  christos 
    255      1.1  christos     if (!SRP_Verify_A_mod_N(s->srp_ctx.A, s->srp_ctx.N))
    256      1.1  christos         goto err;
    257  1.1.1.2  christos     if ((u = SRP_Calc_u(s->srp_ctx.A, s->srp_ctx.B, s->srp_ctx.N)) == NULL)
    258      1.1  christos         goto err;
    259  1.1.1.2  christos     if ((K = SRP_Calc_server_key(s->srp_ctx.A, s->srp_ctx.v, u, s->srp_ctx.b,
    260  1.1.1.2  christos                                  s->srp_ctx.N)) == NULL)
    261      1.1  christos         goto err;
    262      1.1  christos 
    263      1.1  christos     tmp_len = BN_num_bytes(K);
    264  1.1.1.2  christos     if ((tmp = OPENSSL_malloc(tmp_len)) == NULL) {
    265  1.1.1.2  christos         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    266  1.1.1.2  christos                  SSL_F_SRP_GENERATE_SERVER_MASTER_SECRET, ERR_R_MALLOC_FAILURE);
    267      1.1  christos         goto err;
    268  1.1.1.2  christos     }
    269      1.1  christos     BN_bn2bin(K, tmp);
    270  1.1.1.2  christos     /* Calls SSLfatal() as required */
    271  1.1.1.2  christos     ret = ssl_generate_master_secret(s, tmp, tmp_len, 1);
    272      1.1  christos  err:
    273      1.1  christos     BN_clear_free(K);
    274      1.1  christos     BN_clear_free(u);
    275      1.1  christos     return ret;
    276      1.1  christos }
    277      1.1  christos 
    278      1.1  christos /* client side */
    279  1.1.1.2  christos int srp_generate_client_master_secret(SSL *s)
    280      1.1  christos {
    281      1.1  christos     BIGNUM *x = NULL, *u = NULL, *K = NULL;
    282  1.1.1.2  christos     int ret = -1, tmp_len = 0;
    283      1.1  christos     char *passwd = NULL;
    284      1.1  christos     unsigned char *tmp = NULL;
    285      1.1  christos 
    286      1.1  christos     /*
    287      1.1  christos      * Checks if b % n == 0
    288      1.1  christos      */
    289  1.1.1.2  christos     if (SRP_Verify_B_mod_N(s->srp_ctx.B, s->srp_ctx.N) == 0
    290  1.1.1.2  christos             || (u = SRP_Calc_u(s->srp_ctx.A, s->srp_ctx.B, s->srp_ctx.N))
    291  1.1.1.2  christos                == NULL
    292  1.1.1.2  christos             || s->srp_ctx.SRP_give_srp_client_pwd_callback == NULL) {
    293  1.1.1.2  christos         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    294  1.1.1.2  christos                  SSL_F_SRP_GENERATE_CLIENT_MASTER_SECRET, ERR_R_INTERNAL_ERROR);
    295  1.1.1.2  christos         goto err;
    296  1.1.1.2  christos     }
    297  1.1.1.2  christos     if ((passwd = s->srp_ctx.SRP_give_srp_client_pwd_callback(s,
    298  1.1.1.2  christos                                                       s->srp_ctx.SRP_cb_arg))
    299  1.1.1.2  christos             == NULL) {
    300  1.1.1.2  christos         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    301  1.1.1.2  christos                  SSL_F_SRP_GENERATE_CLIENT_MASTER_SECRET,
    302  1.1.1.2  christos                  SSL_R_CALLBACK_FAILED);
    303  1.1.1.2  christos         goto err;
    304  1.1.1.2  christos     }
    305  1.1.1.2  christos     if ((x = SRP_Calc_x(s->srp_ctx.s, s->srp_ctx.login, passwd)) == NULL
    306  1.1.1.2  christos             || (K = SRP_Calc_client_key(s->srp_ctx.N, s->srp_ctx.B,
    307  1.1.1.2  christos                                         s->srp_ctx.g, x,
    308  1.1.1.2  christos                                         s->srp_ctx.a, u)) == NULL) {
    309  1.1.1.2  christos         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    310  1.1.1.2  christos                  SSL_F_SRP_GENERATE_CLIENT_MASTER_SECRET, ERR_R_INTERNAL_ERROR);
    311      1.1  christos         goto err;
    312  1.1.1.2  christos     }
    313      1.1  christos 
    314      1.1  christos     tmp_len = BN_num_bytes(K);
    315  1.1.1.2  christos     if ((tmp = OPENSSL_malloc(tmp_len)) == NULL) {
    316  1.1.1.2  christos         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    317  1.1.1.2  christos                  SSL_F_SRP_GENERATE_CLIENT_MASTER_SECRET, ERR_R_MALLOC_FAILURE);
    318      1.1  christos         goto err;
    319  1.1.1.2  christos     }
    320      1.1  christos     BN_bn2bin(K, tmp);
    321  1.1.1.2  christos     /* Calls SSLfatal() as required */
    322  1.1.1.2  christos     ret = ssl_generate_master_secret(s, tmp, tmp_len, 1);
    323      1.1  christos  err:
    324      1.1  christos     BN_clear_free(K);
    325      1.1  christos     BN_clear_free(x);
    326  1.1.1.2  christos     if (passwd != NULL)
    327  1.1.1.2  christos         OPENSSL_clear_free(passwd, strlen(passwd));
    328      1.1  christos     BN_clear_free(u);
    329      1.1  christos     return ret;
    330      1.1  christos }
    331      1.1  christos 
    332  1.1.1.2  christos int srp_verify_server_param(SSL *s)
    333      1.1  christos {
    334      1.1  christos     SRP_CTX *srp = &s->srp_ctx;
    335      1.1  christos     /*
    336      1.1  christos      * Sanity check parameters: we can quickly check B % N == 0 by checking B
    337      1.1  christos      * != 0 since B < N
    338      1.1  christos      */
    339      1.1  christos     if (BN_ucmp(srp->g, srp->N) >= 0 || BN_ucmp(srp->B, srp->N) >= 0
    340      1.1  christos         || BN_is_zero(srp->B)) {
    341  1.1.1.2  christos         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SRP_VERIFY_SERVER_PARAM,
    342  1.1.1.2  christos                  SSL_R_BAD_DATA);
    343      1.1  christos         return 0;
    344      1.1  christos     }
    345      1.1  christos 
    346      1.1  christos     if (BN_num_bits(srp->N) < srp->strength) {
    347  1.1.1.2  christos         SSLfatal(s, SSL_AD_INSUFFICIENT_SECURITY, SSL_F_SRP_VERIFY_SERVER_PARAM,
    348  1.1.1.2  christos                  SSL_R_INSUFFICIENT_SECURITY);
    349      1.1  christos         return 0;
    350      1.1  christos     }
    351      1.1  christos 
    352      1.1  christos     if (srp->SRP_verify_param_callback) {
    353      1.1  christos         if (srp->SRP_verify_param_callback(s, srp->SRP_cb_arg) <= 0) {
    354  1.1.1.2  christos             SSLfatal(s, SSL_AD_INSUFFICIENT_SECURITY,
    355  1.1.1.2  christos                      SSL_F_SRP_VERIFY_SERVER_PARAM,
    356  1.1.1.2  christos                      SSL_R_CALLBACK_FAILED);
    357      1.1  christos             return 0;
    358      1.1  christos         }
    359      1.1  christos     } else if (!SRP_check_known_gN_param(srp->g, srp->N)) {
    360  1.1.1.2  christos         SSLfatal(s, SSL_AD_INSUFFICIENT_SECURITY, SSL_F_SRP_VERIFY_SERVER_PARAM,
    361  1.1.1.2  christos                  SSL_R_INSUFFICIENT_SECURITY);
    362      1.1  christos         return 0;
    363      1.1  christos     }
    364      1.1  christos 
    365      1.1  christos     return 1;
    366      1.1  christos }
    367      1.1  christos 
    368      1.1  christos int SRP_Calc_A_param(SSL *s)
    369      1.1  christos {
    370      1.1  christos     unsigned char rnd[SSL_MAX_MASTER_KEY_LENGTH];
    371      1.1  christos 
    372  1.1.1.2  christos     if (RAND_priv_bytes(rnd, sizeof(rnd)) <= 0)
    373  1.1.1.2  christos         return 0;
    374      1.1  christos     s->srp_ctx.a = BN_bin2bn(rnd, sizeof(rnd), s->srp_ctx.a);
    375      1.1  christos     OPENSSL_cleanse(rnd, sizeof(rnd));
    376      1.1  christos 
    377  1.1.1.2  christos     if (!(s->srp_ctx.A = SRP_Calc_A(s->srp_ctx.a, s->srp_ctx.N, s->srp_ctx.g)))
    378  1.1.1.2  christos         return 0;
    379      1.1  christos 
    380      1.1  christos     return 1;
    381      1.1  christos }
    382      1.1  christos 
    383      1.1  christos BIGNUM *SSL_get_srp_g(SSL *s)
    384      1.1  christos {
    385      1.1  christos     if (s->srp_ctx.g != NULL)
    386      1.1  christos         return s->srp_ctx.g;
    387      1.1  christos     return s->ctx->srp_ctx.g;
    388      1.1  christos }
    389      1.1  christos 
    390      1.1  christos BIGNUM *SSL_get_srp_N(SSL *s)
    391      1.1  christos {
    392      1.1  christos     if (s->srp_ctx.N != NULL)
    393      1.1  christos         return s->srp_ctx.N;
    394      1.1  christos     return s->ctx->srp_ctx.N;
    395      1.1  christos }
    396      1.1  christos 
    397      1.1  christos char *SSL_get_srp_username(SSL *s)
    398      1.1  christos {
    399      1.1  christos     if (s->srp_ctx.login != NULL)
    400      1.1  christos         return s->srp_ctx.login;
    401      1.1  christos     return s->ctx->srp_ctx.login;
    402      1.1  christos }
    403      1.1  christos 
    404      1.1  christos char *SSL_get_srp_userinfo(SSL *s)
    405      1.1  christos {
    406      1.1  christos     if (s->srp_ctx.info != NULL)
    407      1.1  christos         return s->srp_ctx.info;
    408      1.1  christos     return s->ctx->srp_ctx.info;
    409      1.1  christos }
    410      1.1  christos 
    411      1.1  christos # define tls1_ctx_ctrl ssl3_ctx_ctrl
    412      1.1  christos # define tls1_ctx_callback_ctrl ssl3_ctx_callback_ctrl
    413      1.1  christos 
    414      1.1  christos int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name)
    415      1.1  christos {
    416      1.1  christos     return tls1_ctx_ctrl(ctx, SSL_CTRL_SET_TLS_EXT_SRP_USERNAME, 0, name);
    417      1.1  christos }
    418      1.1  christos 
    419      1.1  christos int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password)
    420      1.1  christos {
    421      1.1  christos     return tls1_ctx_ctrl(ctx, SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD, 0, password);
    422      1.1  christos }
    423      1.1  christos 
    424      1.1  christos int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength)
    425      1.1  christos {
    426      1.1  christos     return tls1_ctx_ctrl(ctx, SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH, strength,
    427      1.1  christos                          NULL);
    428      1.1  christos }
    429      1.1  christos 
    430      1.1  christos int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx,
    431      1.1  christos                                           int (*cb) (SSL *, void *))
    432      1.1  christos {
    433      1.1  christos     return tls1_ctx_callback_ctrl(ctx, SSL_CTRL_SET_SRP_VERIFY_PARAM_CB,
    434      1.1  christos                                   (void (*)(void))cb);
    435      1.1  christos }
    436      1.1  christos 
    437      1.1  christos int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg)
    438      1.1  christos {
    439      1.1  christos     return tls1_ctx_ctrl(ctx, SSL_CTRL_SET_SRP_ARG, 0, arg);
    440      1.1  christos }
    441      1.1  christos 
    442      1.1  christos int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx,
    443      1.1  christos                                       int (*cb) (SSL *, int *, void *))
    444      1.1  christos {
    445      1.1  christos     return tls1_ctx_callback_ctrl(ctx, SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB,
    446      1.1  christos                                   (void (*)(void))cb);
    447      1.1  christos }
    448      1.1  christos 
    449      1.1  christos int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx,
    450      1.1  christos                                         char *(*cb) (SSL *, void *))
    451      1.1  christos {
    452      1.1  christos     return tls1_ctx_callback_ctrl(ctx, SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB,
    453      1.1  christos                                   (void (*)(void))cb);
    454      1.1  christos }
    455      1.1  christos 
    456      1.1  christos #endif
    457