1238384Sjkim/* crypto/srp/srp.h */ 2280304Sjkim/* 3280304Sjkim * Written by Christophe Renou (christophe.renou@edelweb.fr) with the 4280304Sjkim * precious help of Peter Sylvester (peter.sylvester@edelweb.fr) for the 5280304Sjkim * 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 15280304Sjkim * 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__ 61280304Sjkim# define __SRP_H__ 62238384Sjkim 63280304Sjkim# ifndef OPENSSL_NO_SRP 64238384Sjkim 65280304Sjkim# include <stdio.h> 66280304Sjkim# include <string.h> 67238384Sjkim 68238384Sjkim#ifdef __cplusplus 69238384Sjkimextern "C" { 70238384Sjkim#endif 71238384Sjkim 72280304Sjkim# include <openssl/safestack.h> 73280304Sjkim# include <openssl/bn.h> 74280304Sjkim# include <openssl/crypto.h> 75238384Sjkim 76280304Sjkimtypedef struct SRP_gN_cache_st { 77280304Sjkim char *b64_bn; 78280304Sjkim BIGNUM *bn; 79280304Sjkim} SRP_gN_cache; 80238384Sjkim 81238384Sjkim 82238384SjkimDECLARE_STACK_OF(SRP_gN_cache) 83238384Sjkim 84280304Sjkimtypedef struct SRP_user_pwd_st { 85296317Sdelphij /* Owned by us. */ 86280304Sjkim char *id; 87280304Sjkim BIGNUM *s; 88280304Sjkim BIGNUM *v; 89296317Sdelphij /* Not owned by us. */ 90280304Sjkim const BIGNUM *g; 91280304Sjkim const BIGNUM *N; 92296317Sdelphij /* Owned by us. */ 93280304Sjkim char *info; 94280304Sjkim} SRP_user_pwd; 95238384Sjkim 96238384SjkimDECLARE_STACK_OF(SRP_user_pwd) 97238384Sjkim 98296317Sdelphijvoid SRP_user_pwd_free(SRP_user_pwd *user_pwd); 99296317Sdelphij 100280304Sjkimtypedef struct SRP_VBASE_st { 101280304Sjkim STACK_OF(SRP_user_pwd) *users_pwd; 102280304Sjkim STACK_OF(SRP_gN_cache) *gN_cache; 103238384Sjkim/* to simulate a user */ 104280304Sjkim char *seed_key; 105280304Sjkim BIGNUM *default_g; 106280304Sjkim BIGNUM *default_N; 107280304Sjkim} SRP_VBASE; 108238384Sjkim 109280304Sjkim/* 110280304Sjkim * Structure interne pour retenir les couples N et g 111280304Sjkim */ 112280304Sjkimtypedef struct SRP_gN_st { 113280304Sjkim char *id; 114280304Sjkim BIGNUM *g; 115280304Sjkim BIGNUM *N; 116280304Sjkim} SRP_gN; 117238384Sjkim 118238384SjkimDECLARE_STACK_OF(SRP_gN) 119238384Sjkim 120238384SjkimSRP_VBASE *SRP_VBASE_new(char *seed_key); 121238384Sjkimint SRP_VBASE_free(SRP_VBASE *vb); 122280304Sjkimint SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); 123296317Sdelphij 124296317Sdelphij/* 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); 126296317Sdelphij/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ 127296317SdelphijSRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); 128296317Sdelphij 129238384Sjkimchar *SRP_create_verifier(const char *user, const char *pass, char **salt, 130280304Sjkim char **verifier, const char *N, const char *g); 131280304Sjkimint SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, 132280304Sjkim BIGNUM **verifier, BIGNUM *N, BIGNUM *g); 133238384Sjkim 134280304Sjkim# define SRP_NO_ERROR 0 135280304Sjkim# define SRP_ERR_VBASE_INCOMPLETE_FILE 1 136280304Sjkim# define SRP_ERR_VBASE_BN_LIB 2 137280304Sjkim# define SRP_ERR_OPEN_FILE 3 138280304Sjkim# define SRP_ERR_MEMORY 4 139238384Sjkim 140280304Sjkim# define DB_srptype 0 141280304Sjkim# define DB_srpverifier 1 142280304Sjkim# define DB_srpsalt 2 143280304Sjkim# define DB_srpid 3 144280304Sjkim# define DB_srpgN 4 145280304Sjkim# define DB_srpinfo 5 146280304Sjkim# undef DB_NUMBER 147280304Sjkim# define DB_NUMBER 6 148238384Sjkim 149280304Sjkim# define DB_SRP_INDEX 'I' 150280304Sjkim# define DB_SRP_VALID 'V' 151280304Sjkim# define DB_SRP_REVOKED 'R' 152280304Sjkim# define DB_SRP_MODIF 'v' 153238384Sjkim 154238384Sjkim/* see srp.c */ 155280304Sjkimchar *SRP_check_known_gN_param(BIGNUM *g, BIGNUM *N); 156280304SjkimSRP_gN *SRP_get_default_gN(const char *id); 157238384Sjkim 158238384Sjkim/* server side .... */ 159280304SjkimBIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, 160280304Sjkim BIGNUM *N); 161238384SjkimBIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v); 162238384Sjkimint SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N); 163280304SjkimBIGNUM *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); 168280304SjkimBIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, 169280304Sjkim BIGNUM *a, BIGNUM *u); 170238384Sjkimint SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N); 171238384Sjkim 172280304Sjkim# define SRP_MINIMAL_N 1024 173238384Sjkim 174238384Sjkim#ifdef __cplusplus 175238384Sjkim} 176238384Sjkim#endif 177238384Sjkim 178280304Sjkim# endif 179238384Sjkim#endif 180