1238384Sjkim/* crypto/srp/srp.h */ 2238384Sjkim/* Written by Christophe Renou (christophe.renou@edelweb.fr) with 3238384Sjkim * the precious help of Peter Sylvester (peter.sylvester@edelweb.fr) 4238384Sjkim * for the EdelKey project and contributed to the OpenSSL project 2004. 5238384Sjkim */ 6238384Sjkim/* ==================================================================== 7238384Sjkim * Copyright (c) 2004 The OpenSSL Project. All rights reserved. 8238384Sjkim * 9238384Sjkim * Redistribution and use in source and binary forms, with or without 10238384Sjkim * modification, are permitted provided that the following conditions 11238384Sjkim * are met: 12238384Sjkim * 13238384Sjkim * 1. Redistributions of source code must retain the above copyright 14238384Sjkim * notice, this list of conditions and the following disclaimer. 15238384Sjkim * 16238384Sjkim * 2. Redistributions in binary form must reproduce the above copyright 17238384Sjkim * notice, this list of conditions and the following disclaimer in 18238384Sjkim * the documentation and/or other materials provided with the 19238384Sjkim * distribution. 20238384Sjkim * 21238384Sjkim * 3. All advertising materials mentioning features or use of this 22238384Sjkim * software must display the following acknowledgment: 23238384Sjkim * "This product includes software developed by the OpenSSL Project 24238384Sjkim * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25238384Sjkim * 26238384Sjkim * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27238384Sjkim * endorse or promote products derived from this software without 28238384Sjkim * prior written permission. For written permission, please contact 29238384Sjkim * licensing@OpenSSL.org. 30238384Sjkim * 31238384Sjkim * 5. Products derived from this software may not be called "OpenSSL" 32238384Sjkim * nor may "OpenSSL" appear in their names without prior written 33238384Sjkim * permission of the OpenSSL Project. 34238384Sjkim * 35238384Sjkim * 6. Redistributions of any form whatsoever must retain the following 36238384Sjkim * acknowledgment: 37238384Sjkim * "This product includes software developed by the OpenSSL Project 38238384Sjkim * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39238384Sjkim * 40238384Sjkim * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41238384Sjkim * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42238384Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43238384Sjkim * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44238384Sjkim * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45238384Sjkim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46238384Sjkim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47238384Sjkim * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48238384Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49238384Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50238384Sjkim * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51238384Sjkim * OF THE POSSIBILITY OF SUCH DAMAGE. 52238384Sjkim * ==================================================================== 53238384Sjkim * 54238384Sjkim * This product includes cryptographic software written by Eric Young 55238384Sjkim * (eay@cryptsoft.com). This product includes software written by Tim 56238384Sjkim * Hudson (tjh@cryptsoft.com). 57238384Sjkim * 58238384Sjkim */ 59238384Sjkim#ifndef __SRP_H__ 60238384Sjkim#define __SRP_H__ 61238384Sjkim 62238384Sjkim#ifndef OPENSSL_NO_SRP 63238384Sjkim 64238384Sjkim#include <stdio.h> 65238384Sjkim#include <string.h> 66238384Sjkim 67238384Sjkim#ifdef __cplusplus 68238384Sjkimextern "C" { 69238384Sjkim#endif 70238384Sjkim 71238384Sjkim#include <openssl/safestack.h> 72238384Sjkim#include <openssl/bn.h> 73238384Sjkim#include <openssl/crypto.h> 74238384Sjkim 75238384Sjkimtypedef struct SRP_gN_cache_st 76238384Sjkim { 77238384Sjkim char *b64_bn; 78238384Sjkim BIGNUM *bn; 79238384Sjkim } SRP_gN_cache; 80238384Sjkim 81238384Sjkim 82238384SjkimDECLARE_STACK_OF(SRP_gN_cache) 83238384Sjkim 84238384Sjkimtypedef struct SRP_user_pwd_st 85238384Sjkim { 86238384Sjkim char *id; 87238384Sjkim BIGNUM *s; 88238384Sjkim BIGNUM *v; 89238384Sjkim const BIGNUM *g; 90238384Sjkim const BIGNUM *N; 91238384Sjkim char *info; 92238384Sjkim } SRP_user_pwd; 93238384Sjkim 94238384SjkimDECLARE_STACK_OF(SRP_user_pwd) 95238384Sjkim 96238384Sjkimtypedef struct SRP_VBASE_st 97238384Sjkim { 98238384Sjkim STACK_OF(SRP_user_pwd) *users_pwd; 99238384Sjkim STACK_OF(SRP_gN_cache) *gN_cache; 100238384Sjkim/* to simulate a user */ 101238384Sjkim char *seed_key; 102238384Sjkim BIGNUM *default_g; 103238384Sjkim BIGNUM *default_N; 104238384Sjkim } SRP_VBASE; 105238384Sjkim 106238384Sjkim 107238384Sjkim/*Structure interne pour retenir les couples N et g*/ 108238384Sjkimtypedef struct SRP_gN_st 109238384Sjkim { 110238384Sjkim char *id; 111238384Sjkim BIGNUM *g; 112238384Sjkim BIGNUM *N; 113238384Sjkim } SRP_gN; 114238384Sjkim 115238384SjkimDECLARE_STACK_OF(SRP_gN) 116238384Sjkim 117238384SjkimSRP_VBASE *SRP_VBASE_new(char *seed_key); 118238384Sjkimint SRP_VBASE_free(SRP_VBASE *vb); 119238384Sjkimint SRP_VBASE_init(SRP_VBASE *vb, char * verifier_file); 120238384SjkimSRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); 121238384Sjkimchar *SRP_create_verifier(const char *user, const char *pass, char **salt, 122238384Sjkim char **verifier, const char *N, const char *g); 123238384Sjkimint SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, BIGNUM **verifier, BIGNUM *N, BIGNUM *g); 124238384Sjkim 125238384Sjkim 126238384Sjkim#define SRP_NO_ERROR 0 127238384Sjkim#define SRP_ERR_VBASE_INCOMPLETE_FILE 1 128238384Sjkim#define SRP_ERR_VBASE_BN_LIB 2 129238384Sjkim#define SRP_ERR_OPEN_FILE 3 130238384Sjkim#define SRP_ERR_MEMORY 4 131238384Sjkim 132238384Sjkim#define DB_srptype 0 133238384Sjkim#define DB_srpverifier 1 134238384Sjkim#define DB_srpsalt 2 135238384Sjkim#define DB_srpid 3 136238384Sjkim#define DB_srpgN 4 137238384Sjkim#define DB_srpinfo 5 138238384Sjkim#undef DB_NUMBER 139238384Sjkim#define DB_NUMBER 6 140238384Sjkim 141238384Sjkim#define DB_SRP_INDEX 'I' 142238384Sjkim#define DB_SRP_VALID 'V' 143238384Sjkim#define DB_SRP_REVOKED 'R' 144238384Sjkim#define DB_SRP_MODIF 'v' 145238384Sjkim 146238384Sjkim 147238384Sjkim/* see srp.c */ 148238384Sjkimchar * SRP_check_known_gN_param(BIGNUM* g, BIGNUM* N); 149238384SjkimSRP_gN *SRP_get_default_gN(const char * id) ; 150238384Sjkim 151238384Sjkim/* server side .... */ 152238384SjkimBIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, BIGNUM *N); 153238384SjkimBIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v); 154238384Sjkimint SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N); 155238384SjkimBIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N) ; 156238384Sjkim 157238384Sjkim 158238384Sjkim 159238384Sjkim/* client side .... */ 160238384SjkimBIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass); 161238384SjkimBIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g); 162238384SjkimBIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, BIGNUM *a, BIGNUM *u); 163238384Sjkimint SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N); 164238384Sjkim 165238384Sjkim#define SRP_MINIMAL_N 1024 166238384Sjkim 167238384Sjkim#ifdef __cplusplus 168238384Sjkim} 169238384Sjkim#endif 170238384Sjkim 171238384Sjkim#endif 172238384Sjkim#endif 173