1238384Sjkim/* crypto/srp/srp.h */ 2280297Sjkim/* 3280297Sjkim * Written by Christophe Renou (christophe.renou@edelweb.fr) with the 4280297Sjkim * precious help of Peter Sylvester (peter.sylvester@edelweb.fr) for the 5280297Sjkim * EdelKey project and contributed to the OpenSSL project 2004. 6238384Sjkim */ 7238384Sjkim/* ==================================================================== 8238384Sjkim * Copyright (c) 2004 The OpenSSL Project. All rights reserved. 9238384Sjkim * 10238384Sjkim * Redistribution and use in source and binary forms, with or without 11238384Sjkim * modification, are permitted provided that the following conditions 12238384Sjkim * are met: 13238384Sjkim * 14238384Sjkim * 1. Redistributions of source code must retain the above copyright 15280297Sjkim * notice, this list of conditions and the following disclaimer. 16238384Sjkim * 17238384Sjkim * 2. Redistributions in binary form must reproduce the above copyright 18238384Sjkim * notice, this list of conditions and the following disclaimer in 19238384Sjkim * the documentation and/or other materials provided with the 20238384Sjkim * distribution. 21238384Sjkim * 22238384Sjkim * 3. All advertising materials mentioning features or use of this 23238384Sjkim * software must display the following acknowledgment: 24238384Sjkim * "This product includes software developed by the OpenSSL Project 25238384Sjkim * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 26238384Sjkim * 27238384Sjkim * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 28238384Sjkim * endorse or promote products derived from this software without 29238384Sjkim * prior written permission. For written permission, please contact 30238384Sjkim * licensing@OpenSSL.org. 31238384Sjkim * 32238384Sjkim * 5. Products derived from this software may not be called "OpenSSL" 33238384Sjkim * nor may "OpenSSL" appear in their names without prior written 34238384Sjkim * permission of the OpenSSL Project. 35238384Sjkim * 36238384Sjkim * 6. Redistributions of any form whatsoever must retain the following 37238384Sjkim * acknowledgment: 38238384Sjkim * "This product includes software developed by the OpenSSL Project 39238384Sjkim * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 40238384Sjkim * 41238384Sjkim * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 42238384Sjkim * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43238384Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 44238384Sjkim * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 45238384Sjkim * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 46238384Sjkim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 47238384Sjkim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 48238384Sjkim * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 49238384Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 50238384Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 51238384Sjkim * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 52238384Sjkim * OF THE POSSIBILITY OF SUCH DAMAGE. 53238384Sjkim * ==================================================================== 54238384Sjkim * 55238384Sjkim * This product includes cryptographic software written by Eric Young 56238384Sjkim * (eay@cryptsoft.com). This product includes software written by Tim 57238384Sjkim * Hudson (tjh@cryptsoft.com). 58238384Sjkim * 59238384Sjkim */ 60238384Sjkim#ifndef __SRP_H__ 61280297Sjkim# define __SRP_H__ 62238384Sjkim 63280297Sjkim# ifndef OPENSSL_NO_SRP 64238384Sjkim 65280297Sjkim# include <stdio.h> 66280297Sjkim# include <string.h> 67238384Sjkim 68238384Sjkim#ifdef __cplusplus 69238384Sjkimextern "C" { 70238384Sjkim#endif 71238384Sjkim 72280297Sjkim# include <openssl/safestack.h> 73280297Sjkim# include <openssl/bn.h> 74280297Sjkim# include <openssl/crypto.h> 75238384Sjkim 76280297Sjkimtypedef struct SRP_gN_cache_st { 77280297Sjkim char *b64_bn; 78280297Sjkim BIGNUM *bn; 79280297Sjkim} SRP_gN_cache; 80238384Sjkim 81238384Sjkim 82238384SjkimDECLARE_STACK_OF(SRP_gN_cache) 83238384Sjkim 84280297Sjkimtypedef struct SRP_user_pwd_st { 85296279Sjkim /* Owned by us. */ 86280297Sjkim char *id; 87280297Sjkim BIGNUM *s; 88280297Sjkim BIGNUM *v; 89296279Sjkim /* Not owned by us. */ 90280297Sjkim const BIGNUM *g; 91280297Sjkim const BIGNUM *N; 92296279Sjkim /* Owned by us. */ 93280297Sjkim char *info; 94280297Sjkim} SRP_user_pwd; 95238384Sjkim 96238384SjkimDECLARE_STACK_OF(SRP_user_pwd) 97238384Sjkim 98296279Sjkimvoid SRP_user_pwd_free(SRP_user_pwd *user_pwd); 99296279Sjkim 100280297Sjkimtypedef struct SRP_VBASE_st { 101280297Sjkim STACK_OF(SRP_user_pwd) *users_pwd; 102280297Sjkim STACK_OF(SRP_gN_cache) *gN_cache; 103238384Sjkim/* to simulate a user */ 104280297Sjkim char *seed_key; 105280297Sjkim BIGNUM *default_g; 106280297Sjkim BIGNUM *default_N; 107280297Sjkim} SRP_VBASE; 108238384Sjkim 109280297Sjkim/* 110280297Sjkim * Structure interne pour retenir les couples N et g 111280297Sjkim */ 112280297Sjkimtypedef struct SRP_gN_st { 113280297Sjkim char *id; 114280297Sjkim BIGNUM *g; 115280297Sjkim BIGNUM *N; 116280297Sjkim} SRP_gN; 117238384Sjkim 118238384SjkimDECLARE_STACK_OF(SRP_gN) 119238384Sjkim 120238384SjkimSRP_VBASE *SRP_VBASE_new(char *seed_key); 121238384Sjkimint SRP_VBASE_free(SRP_VBASE *vb); 122280297Sjkimint SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); 123296279Sjkim 124296279Sjkim/* This method ignores the configured seed and fails for an unknown user. */ 125238384SjkimSRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); 126296279Sjkim/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ 127296279SjkimSRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); 128296279Sjkim 129238384Sjkimchar *SRP_create_verifier(const char *user, const char *pass, char **salt, 130280297Sjkim char **verifier, const char *N, const char *g); 131280297Sjkimint SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, 132280297Sjkim BIGNUM **verifier, BIGNUM *N, BIGNUM *g); 133238384Sjkim 134280297Sjkim# define SRP_NO_ERROR 0 135280297Sjkim# define SRP_ERR_VBASE_INCOMPLETE_FILE 1 136280297Sjkim# define SRP_ERR_VBASE_BN_LIB 2 137280297Sjkim# define SRP_ERR_OPEN_FILE 3 138280297Sjkim# define SRP_ERR_MEMORY 4 139238384Sjkim 140280297Sjkim# define DB_srptype 0 141280297Sjkim# define DB_srpverifier 1 142280297Sjkim# define DB_srpsalt 2 143280297Sjkim# define DB_srpid 3 144280297Sjkim# define DB_srpgN 4 145280297Sjkim# define DB_srpinfo 5 146280297Sjkim# undef DB_NUMBER 147280297Sjkim# define DB_NUMBER 6 148238384Sjkim 149280297Sjkim# define DB_SRP_INDEX 'I' 150280297Sjkim# define DB_SRP_VALID 'V' 151280297Sjkim# define DB_SRP_REVOKED 'R' 152280297Sjkim# define DB_SRP_MODIF 'v' 153238384Sjkim 154238384Sjkim/* see srp.c */ 155280297Sjkimchar *SRP_check_known_gN_param(BIGNUM *g, BIGNUM *N); 156280297SjkimSRP_gN *SRP_get_default_gN(const char *id); 157238384Sjkim 158238384Sjkim/* server side .... */ 159280297SjkimBIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, 160280297Sjkim BIGNUM *N); 161238384SjkimBIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v); 162238384Sjkimint SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N); 163280297SjkimBIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N); 164238384Sjkim 165238384Sjkim/* client side .... */ 166238384SjkimBIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass); 167238384SjkimBIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g); 168280297SjkimBIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, 169280297Sjkim BIGNUM *a, BIGNUM *u); 170238384Sjkimint SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N); 171238384Sjkim 172280297Sjkim# define SRP_MINIMAL_N 1024 173238384Sjkim 174238384Sjkim#ifdef __cplusplus 175238384Sjkim} 176238384Sjkim#endif 177238384Sjkim 178280297Sjkim# endif 179238384Sjkim#endif 180