Home | History | Annotate | Line # | Download | only in openssl
      1 /*
      2  * Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved.
      3  * Copyright (c) 2004, EdelKey Project. All Rights Reserved.
      4  *
      5  * Licensed under the OpenSSL license (the "License").  You may not use
      6  * this file except in compliance with the License.  You can obtain a copy
      7  * in the file LICENSE in the source distribution or at
      8  * https://www.openssl.org/source/license.html
      9  *
     10  * Originally written by Christophe Renou and Peter Sylvester,
     11  * for the EdelKey project.
     12  */
     13 
     14 #ifndef HEADER_SRP_H
     15 # define HEADER_SRP_H
     16 
     17 #include <openssl/opensslconf.h>
     18 
     19 #ifndef OPENSSL_NO_SRP
     20 # include <stdio.h>
     21 # include <string.h>
     22 # include <openssl/safestack.h>
     23 # include <openssl/bn.h>
     24 # include <openssl/crypto.h>
     25 
     26 # ifdef  __cplusplus
     27 extern "C" {
     28 # endif
     29 
     30 typedef struct SRP_gN_cache_st {
     31     char *b64_bn;
     32     BIGNUM *bn;
     33 } SRP_gN_cache;
     34 
     35 
     36 DEFINE_STACK_OF(SRP_gN_cache)
     37 
     38 typedef struct SRP_user_pwd_st {
     39     /* Owned by us. */
     40     char *id;
     41     BIGNUM *s;
     42     BIGNUM *v;
     43     /* Not owned by us. */
     44     const BIGNUM *g;
     45     const BIGNUM *N;
     46     /* Owned by us. */
     47     char *info;
     48 } SRP_user_pwd;
     49 
     50 void SRP_user_pwd_free(SRP_user_pwd *user_pwd);
     51 
     52 DEFINE_STACK_OF(SRP_user_pwd)
     53 
     54 typedef struct SRP_VBASE_st {
     55     STACK_OF(SRP_user_pwd) *users_pwd;
     56     STACK_OF(SRP_gN_cache) *gN_cache;
     57 /* to simulate a user */
     58     char *seed_key;
     59     const BIGNUM *default_g;
     60     const BIGNUM *default_N;
     61 } SRP_VBASE;
     62 
     63 /*
     64  * Internal structure storing N and g pair
     65  */
     66 typedef struct SRP_gN_st {
     67     char *id;
     68     const BIGNUM *g;
     69     const BIGNUM *N;
     70 } SRP_gN;
     71 
     72 DEFINE_STACK_OF(SRP_gN)
     73 
     74 SRP_VBASE *SRP_VBASE_new(char *seed_key);
     75 void SRP_VBASE_free(SRP_VBASE *vb);
     76 int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file);
     77 
     78 /* This method ignores the configured seed and fails for an unknown user. */
     79 DEPRECATEDIN_1_1_0(SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username))
     80 /* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/
     81 SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username);
     82 
     83 char *SRP_create_verifier(const char *user, const char *pass, char **salt,
     84                           char **verifier, const char *N, const char *g);
     85 int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt,
     86                            BIGNUM **verifier, const BIGNUM *N,
     87                            const BIGNUM *g);
     88 
     89 # define SRP_NO_ERROR 0
     90 # define SRP_ERR_VBASE_INCOMPLETE_FILE 1
     91 # define SRP_ERR_VBASE_BN_LIB 2
     92 # define SRP_ERR_OPEN_FILE 3
     93 # define SRP_ERR_MEMORY 4
     94 
     95 # define DB_srptype      0
     96 # define DB_srpverifier  1
     97 # define DB_srpsalt      2
     98 # define DB_srpid        3
     99 # define DB_srpgN        4
    100 # define DB_srpinfo      5
    101 # undef  DB_NUMBER
    102 # define DB_NUMBER       6
    103 
    104 # define DB_SRP_INDEX    'I'
    105 # define DB_SRP_VALID    'V'
    106 # define DB_SRP_REVOKED  'R'
    107 # define DB_SRP_MODIF    'v'
    108 
    109 /* see srp.c */
    110 char *SRP_check_known_gN_param(const BIGNUM *g, const BIGNUM *N);
    111 SRP_gN *SRP_get_default_gN(const char *id);
    112 
    113 /* server side .... */
    114 BIGNUM *SRP_Calc_server_key(const BIGNUM *A, const BIGNUM *v, const BIGNUM *u,
    115                             const BIGNUM *b, const BIGNUM *N);
    116 BIGNUM *SRP_Calc_B(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g,
    117                    const BIGNUM *v);
    118 int SRP_Verify_A_mod_N(const BIGNUM *A, const BIGNUM *N);
    119 BIGNUM *SRP_Calc_u(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N);
    120 
    121 /* client side .... */
    122 BIGNUM *SRP_Calc_x(const BIGNUM *s, const char *user, const char *pass);
    123 BIGNUM *SRP_Calc_A(const BIGNUM *a, const BIGNUM *N, const BIGNUM *g);
    124 BIGNUM *SRP_Calc_client_key(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g,
    125                             const BIGNUM *x, const BIGNUM *a, const BIGNUM *u);
    126 int SRP_Verify_B_mod_N(const BIGNUM *B, const BIGNUM *N);
    127 
    128 # define SRP_MINIMAL_N 1024
    129 
    130 # ifdef  __cplusplus
    131 }
    132 # endif
    133 # endif
    134 
    135 #endif
    136