Support for Signal calls.

Merge in RedPhone

// FREEBIE
This commit is contained in:
Moxie Marlinspike
2015-09-09 13:54:29 -07:00
parent 3d4ae60d81
commit d83a3d71bc
2585 changed files with 803492 additions and 45 deletions

View File

@@ -0,0 +1,172 @@
/* crypto/srp/srp.h */
/* Written by Christophe Renou (christophe.renou@edelweb.fr) with
* the precious help of Peter Sylvester (peter.sylvester@edelweb.fr)
* for the EdelKey project and contributed to the OpenSSL project 2004.
*/
/* ====================================================================
* Copyright (c) 2004 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#ifndef __SRP_H__
#define __SRP_H__
#ifndef OPENSSL_NO_SRP
#include <stdio.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <openssl/safestack.h>
#include <openssl/bn.h>
#include <openssl/crypto.h>
typedef struct SRP_gN_cache_st
{
char *b64_bn;
BIGNUM *bn;
} SRP_gN_cache;
DECLARE_STACK_OF(SRP_gN_cache)
typedef struct SRP_user_pwd_st
{
char *id;
BIGNUM *s;
BIGNUM *v;
const BIGNUM *g;
const BIGNUM *N;
char *info;
} SRP_user_pwd;
DECLARE_STACK_OF(SRP_user_pwd)
typedef struct SRP_VBASE_st
{
STACK_OF(SRP_user_pwd) *users_pwd;
STACK_OF(SRP_gN_cache) *gN_cache;
/* to simulate a user */
char *seed_key;
BIGNUM *default_g;
BIGNUM *default_N;
} SRP_VBASE;
/*Structure interne pour retenir les couples N et g*/
typedef struct SRP_gN_st
{
char *id;
BIGNUM *g;
BIGNUM *N;
} SRP_gN;
DECLARE_STACK_OF(SRP_gN)
SRP_VBASE *SRP_VBASE_new(char *seed_key);
int SRP_VBASE_free(SRP_VBASE *vb);
int SRP_VBASE_init(SRP_VBASE *vb, char * verifier_file);
SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username);
char *SRP_create_verifier(const char *user, const char *pass, char **salt,
char **verifier, const char *N, const char *g);
int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, BIGNUM **verifier, BIGNUM *N, BIGNUM *g);
#define SRP_NO_ERROR 0
#define SRP_ERR_VBASE_INCOMPLETE_FILE 1
#define SRP_ERR_VBASE_BN_LIB 2
#define SRP_ERR_OPEN_FILE 3
#define SRP_ERR_MEMORY 4
#define DB_srptype 0
#define DB_srpverifier 1
#define DB_srpsalt 2
#define DB_srpid 3
#define DB_srpgN 4
#define DB_srpinfo 5
#undef DB_NUMBER
#define DB_NUMBER 6
#define DB_SRP_INDEX 'I'
#define DB_SRP_VALID 'V'
#define DB_SRP_REVOKED 'R'
#define DB_SRP_MODIF 'v'
/* see srp.c */
char * SRP_check_known_gN_param(BIGNUM* g, BIGNUM* N);
SRP_gN *SRP_get_default_gN(const char * id) ;
/* server side .... */
BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, BIGNUM *N);
BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v);
int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N);
BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N) ;
/* client side .... */
BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass);
BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g);
BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, BIGNUM *a, BIGNUM *u);
int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N);
#define SRP_MINIMAL_N 1024
#ifdef __cplusplus
}
#endif
#endif
#endif

View File

@@ -0,0 +1,517 @@
/* start of generated data */
static BN_ULONG bn_group_1024_value[] = {
bn_pack4(0x9FC6,0x1D2F,0xC0EB,0x06E3),
bn_pack4(0xFD51,0x38FE,0x8376,0x435B),
bn_pack4(0x2FD4,0xCBF4,0x976E,0xAA9A),
bn_pack4(0x68ED,0xBC3C,0x0572,0x6CC0),
bn_pack4(0xC529,0xF566,0x660E,0x57EC),
bn_pack4(0x8255,0x9B29,0x7BCF,0x1885),
bn_pack4(0xCE8E,0xF4AD,0x69B1,0x5D49),
bn_pack4(0x5DC7,0xD7B4,0x6154,0xD6B6),
bn_pack4(0x8E49,0x5C1D,0x6089,0xDAD1),
bn_pack4(0xE0D5,0xD8E2,0x50B9,0x8BE4),
bn_pack4(0x383B,0x4813,0xD692,0xC6E0),
bn_pack4(0xD674,0xDF74,0x96EA,0x81D3),
bn_pack4(0x9EA2,0x314C,0x9C25,0x6576),
bn_pack4(0x6072,0x6187,0x75FF,0x3C0B),
bn_pack4(0x9C33,0xF80A,0xFA8F,0xC5E8),
bn_pack4(0xEEAF,0x0AB9,0xADB3,0x8DD6)
};
static BIGNUM bn_group_1024 = {
bn_group_1024_value,
(sizeof bn_group_1024_value)/sizeof(BN_ULONG),
(sizeof bn_group_1024_value)/sizeof(BN_ULONG),
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_group_1536_value[] = {
bn_pack4(0xCF76,0xE3FE,0xD135,0xF9BB),
bn_pack4(0x1518,0x0F93,0x499A,0x234D),
bn_pack4(0x8CE7,0xA28C,0x2442,0xC6F3),
bn_pack4(0x5A02,0x1FFF,0x5E91,0x479E),
bn_pack4(0x7F8A,0x2FE9,0xB8B5,0x292E),
bn_pack4(0x837C,0x264A,0xE3A9,0xBEB8),
bn_pack4(0xE442,0x734A,0xF7CC,0xB7AE),
bn_pack4(0x6577,0x2E43,0x7D6C,0x7F8C),
bn_pack4(0xDB2F,0xD53D,0x24B7,0xC486),
bn_pack4(0x6EDF,0x0195,0x3934,0x9627),
bn_pack4(0x158B,0xFD3E,0x2B9C,0x8CF5),
bn_pack4(0x764E,0x3F4B,0x53DD,0x9DA1),
bn_pack4(0x4754,0x8381,0xDBC5,0xB1FC),
bn_pack4(0x9B60,0x9E0B,0xE3BA,0xB63D),
bn_pack4(0x8134,0xB1C8,0xB979,0x8914),
bn_pack4(0xDF02,0x8A7C,0xEC67,0xF0D0),
bn_pack4(0x80B6,0x55BB,0x9A22,0xE8DC),
bn_pack4(0x1558,0x903B,0xA0D0,0xF843),
bn_pack4(0x51C6,0xA94B,0xE460,0x7A29),
bn_pack4(0x5F4F,0x5F55,0x6E27,0xCBDE),
bn_pack4(0xBEEE,0xA961,0x4B19,0xCC4D),
bn_pack4(0xDBA5,0x1DF4,0x99AC,0x4C80),
bn_pack4(0xB1F1,0x2A86,0x17A4,0x7BBB),
bn_pack4(0x9DEF,0x3CAF,0xB939,0x277A)
};
static BIGNUM bn_group_1536 = {
bn_group_1536_value,
(sizeof bn_group_1536_value)/sizeof(BN_ULONG),
(sizeof bn_group_1536_value)/sizeof(BN_ULONG),
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_group_2048_value[] = {
bn_pack4(0x0FA7,0x111F,0x9E4A,0xFF73),
bn_pack4(0x9B65,0xE372,0xFCD6,0x8EF2),
bn_pack4(0x35DE,0x236D,0x525F,0x5475),
bn_pack4(0x94B5,0xC803,0xD89F,0x7AE4),
bn_pack4(0x71AE,0x35F8,0xE9DB,0xFBB6),
bn_pack4(0x2A56,0x98F3,0xA8D0,0xC382),
bn_pack4(0x9CCC,0x041C,0x7BC3,0x08D8),
bn_pack4(0xAF87,0x4E73,0x03CE,0x5329),
bn_pack4(0x6160,0x2790,0x04E5,0x7AE6),
bn_pack4(0x032C,0xFBDB,0xF52F,0xB378),
bn_pack4(0x5EA7,0x7A27,0x75D2,0xECFA),
bn_pack4(0x5445,0x23B5,0x24B0,0xD57D),
bn_pack4(0x5B9D,0x32E6,0x88F8,0x7748),
bn_pack4(0xF1D2,0xB907,0x8717,0x461A),
bn_pack4(0x76BD,0x207A,0x436C,0x6481),
bn_pack4(0xCA97,0xB43A,0x23FB,0x8016),
bn_pack4(0x1D28,0x1E44,0x6B14,0x773B),
bn_pack4(0x7359,0xD041,0xD5C3,0x3EA7),
bn_pack4(0xA80D,0x740A,0xDBF4,0xFF74),
bn_pack4(0x55F9,0x7993,0xEC97,0x5EEA),
bn_pack4(0x2918,0xA996,0x2F0B,0x93B8),
bn_pack4(0x661A,0x05FB,0xD5FA,0xAAE8),
bn_pack4(0xCF60,0x9517,0x9A16,0x3AB3),
bn_pack4(0xE808,0x3969,0xEDB7,0x67B0),
bn_pack4(0xCD7F,0x48A9,0xDA04,0xFD50),
bn_pack4(0xD523,0x12AB,0x4B03,0x310D),
bn_pack4(0x8193,0xE075,0x7767,0xA13D),
bn_pack4(0xA373,0x29CB,0xB4A0,0x99ED),
bn_pack4(0xFC31,0x9294,0x3DB5,0x6050),
bn_pack4(0xAF72,0xB665,0x1987,0xEE07),
bn_pack4(0xF166,0xDE5E,0x1389,0x582F),
bn_pack4(0xAC6B,0xDB41,0x324A,0x9A9B)
};
static BIGNUM bn_group_2048 = {
bn_group_2048_value,
(sizeof bn_group_2048_value)/sizeof(BN_ULONG),
(sizeof bn_group_2048_value)/sizeof(BN_ULONG),
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_group_3072_value[] = {
bn_pack4(0xFFFF,0xFFFF,0xFFFF,0xFFFF),
bn_pack4(0x4B82,0xD120,0xA93A,0xD2CA),
bn_pack4(0x43DB,0x5BFC,0xE0FD,0x108E),
bn_pack4(0x08E2,0x4FA0,0x74E5,0xAB31),
bn_pack4(0x7709,0x88C0,0xBAD9,0x46E2),
bn_pack4(0xBBE1,0x1757,0x7A61,0x5D6C),
bn_pack4(0x521F,0x2B18,0x177B,0x200C),
bn_pack4(0xD876,0x0273,0x3EC8,0x6A64),
bn_pack4(0xF12F,0xFA06,0xD98A,0x0864),
bn_pack4(0xCEE3,0xD226,0x1AD2,0xEE6B),
bn_pack4(0x1E8C,0x94E0,0x4A25,0x619D),
bn_pack4(0xABF5,0xAE8C,0xDB09,0x33D7),
bn_pack4(0xB397,0x0F85,0xA6E1,0xE4C7),
bn_pack4(0x8AEA,0x7157,0x5D06,0x0C7D),
bn_pack4(0xECFB,0x8504,0x58DB,0xEF0A),
bn_pack4(0xA855,0x21AB,0xDF1C,0xBA64),
bn_pack4(0xAD33,0x170D,0x0450,0x7A33),
bn_pack4(0x1572,0x8E5A,0x8AAA,0xC42D),
bn_pack4(0x15D2,0x2618,0x98FA,0x0510),
bn_pack4(0x3995,0x497C,0xEA95,0x6AE5),
bn_pack4(0xDE2B,0xCBF6,0x9558,0x1718),
bn_pack4(0xB5C5,0x5DF0,0x6F4C,0x52C9),
bn_pack4(0x9B27,0x83A2,0xEC07,0xA28F),
bn_pack4(0xE39E,0x772C,0x180E,0x8603),
bn_pack4(0x3290,0x5E46,0x2E36,0xCE3B),
bn_pack4(0xF174,0x6C08,0xCA18,0x217C),
bn_pack4(0x670C,0x354E,0x4ABC,0x9804),
bn_pack4(0x9ED5,0x2907,0x7096,0x966D),
bn_pack4(0x1C62,0xF356,0x2085,0x52BB),
bn_pack4(0x8365,0x5D23,0xDCA3,0xAD96),
bn_pack4(0x6916,0x3FA8,0xFD24,0xCF5F),
bn_pack4(0x98DA,0x4836,0x1C55,0xD39A),
bn_pack4(0xC200,0x7CB8,0xA163,0xBF05),
bn_pack4(0x4928,0x6651,0xECE4,0x5B3D),
bn_pack4(0xAE9F,0x2411,0x7C4B,0x1FE6),
bn_pack4(0xEE38,0x6BFB,0x5A89,0x9FA5),
bn_pack4(0x0BFF,0x5CB6,0xF406,0xB7ED),
bn_pack4(0xF44C,0x42E9,0xA637,0xED6B),
bn_pack4(0xE485,0xB576,0x625E,0x7EC6),
bn_pack4(0x4FE1,0x356D,0x6D51,0xC245),
bn_pack4(0x302B,0x0A6D,0xF25F,0x1437),
bn_pack4(0xEF95,0x19B3,0xCD3A,0x431B),
bn_pack4(0x514A,0x0879,0x8E34,0x04DD),
bn_pack4(0x020B,0xBEA6,0x3B13,0x9B22),
bn_pack4(0x2902,0x4E08,0x8A67,0xCC74),
bn_pack4(0xC4C6,0x628B,0x80DC,0x1CD1),
bn_pack4(0xC90F,0xDAA2,0x2168,0xC234),
bn_pack4(0xFFFF,0xFFFF,0xFFFF,0xFFFF)
};
static BIGNUM bn_group_3072 = {
bn_group_3072_value,
(sizeof bn_group_3072_value)/sizeof(BN_ULONG),
(sizeof bn_group_3072_value)/sizeof(BN_ULONG),
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_group_4096_value[] = {
bn_pack4(0xFFFF,0xFFFF,0xFFFF,0xFFFF),
bn_pack4(0x4DF4,0x35C9,0x3406,0x3199),
bn_pack4(0x86FF,0xB7DC,0x90A6,0xC08F),
bn_pack4(0x93B4,0xEA98,0x8D8F,0xDDC1),
bn_pack4(0xD006,0x9127,0xD5B0,0x5AA9),
bn_pack4(0xB81B,0xDD76,0x2170,0x481C),
bn_pack4(0x1F61,0x2970,0xCEE2,0xD7AF),
bn_pack4(0x233B,0xA186,0x515B,0xE7ED),
bn_pack4(0x99B2,0x964F,0xA090,0xC3A2),
bn_pack4(0x287C,0x5947,0x4E6B,0xC05D),
bn_pack4(0x2E8E,0xFC14,0x1FBE,0xCAA6),
bn_pack4(0xDBBB,0xC2DB,0x04DE,0x8EF9),
bn_pack4(0x2583,0xE9CA,0x2AD4,0x4CE8),
bn_pack4(0x1A94,0x6834,0xB615,0x0BDA),
bn_pack4(0x99C3,0x2718,0x6AF4,0xE23C),
bn_pack4(0x8871,0x9A10,0xBDBA,0x5B26),
bn_pack4(0x1A72,0x3C12,0xA787,0xE6D7),
bn_pack4(0x4B82,0xD120,0xA921,0x0801),
bn_pack4(0x43DB,0x5BFC,0xE0FD,0x108E),
bn_pack4(0x08E2,0x4FA0,0x74E5,0xAB31),
bn_pack4(0x7709,0x88C0,0xBAD9,0x46E2),
bn_pack4(0xBBE1,0x1757,0x7A61,0x5D6C),
bn_pack4(0x521F,0x2B18,0x177B,0x200C),
bn_pack4(0xD876,0x0273,0x3EC8,0x6A64),
bn_pack4(0xF12F,0xFA06,0xD98A,0x0864),
bn_pack4(0xCEE3,0xD226,0x1AD2,0xEE6B),
bn_pack4(0x1E8C,0x94E0,0x4A25,0x619D),
bn_pack4(0xABF5,0xAE8C,0xDB09,0x33D7),
bn_pack4(0xB397,0x0F85,0xA6E1,0xE4C7),
bn_pack4(0x8AEA,0x7157,0x5D06,0x0C7D),
bn_pack4(0xECFB,0x8504,0x58DB,0xEF0A),
bn_pack4(0xA855,0x21AB,0xDF1C,0xBA64),
bn_pack4(0xAD33,0x170D,0x0450,0x7A33),
bn_pack4(0x1572,0x8E5A,0x8AAA,0xC42D),
bn_pack4(0x15D2,0x2618,0x98FA,0x0510),
bn_pack4(0x3995,0x497C,0xEA95,0x6AE5),
bn_pack4(0xDE2B,0xCBF6,0x9558,0x1718),
bn_pack4(0xB5C5,0x5DF0,0x6F4C,0x52C9),
bn_pack4(0x9B27,0x83A2,0xEC07,0xA28F),
bn_pack4(0xE39E,0x772C,0x180E,0x8603),
bn_pack4(0x3290,0x5E46,0x2E36,0xCE3B),
bn_pack4(0xF174,0x6C08,0xCA18,0x217C),
bn_pack4(0x670C,0x354E,0x4ABC,0x9804),
bn_pack4(0x9ED5,0x2907,0x7096,0x966D),
bn_pack4(0x1C62,0xF356,0x2085,0x52BB),
bn_pack4(0x8365,0x5D23,0xDCA3,0xAD96),
bn_pack4(0x6916,0x3FA8,0xFD24,0xCF5F),
bn_pack4(0x98DA,0x4836,0x1C55,0xD39A),
bn_pack4(0xC200,0x7CB8,0xA163,0xBF05),
bn_pack4(0x4928,0x6651,0xECE4,0x5B3D),
bn_pack4(0xAE9F,0x2411,0x7C4B,0x1FE6),
bn_pack4(0xEE38,0x6BFB,0x5A89,0x9FA5),
bn_pack4(0x0BFF,0x5CB6,0xF406,0xB7ED),
bn_pack4(0xF44C,0x42E9,0xA637,0xED6B),
bn_pack4(0xE485,0xB576,0x625E,0x7EC6),
bn_pack4(0x4FE1,0x356D,0x6D51,0xC245),
bn_pack4(0x302B,0x0A6D,0xF25F,0x1437),
bn_pack4(0xEF95,0x19B3,0xCD3A,0x431B),
bn_pack4(0x514A,0x0879,0x8E34,0x04DD),
bn_pack4(0x020B,0xBEA6,0x3B13,0x9B22),
bn_pack4(0x2902,0x4E08,0x8A67,0xCC74),
bn_pack4(0xC4C6,0x628B,0x80DC,0x1CD1),
bn_pack4(0xC90F,0xDAA2,0x2168,0xC234),
bn_pack4(0xFFFF,0xFFFF,0xFFFF,0xFFFF)
};
static BIGNUM bn_group_4096 = {
bn_group_4096_value,
(sizeof bn_group_4096_value)/sizeof(BN_ULONG),
(sizeof bn_group_4096_value)/sizeof(BN_ULONG),
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_group_6144_value[] = {
bn_pack4(0xFFFF,0xFFFF,0xFFFF,0xFFFF),
bn_pack4(0xE694,0xF91E,0x6DCC,0x4024),
bn_pack4(0x12BF,0x2D5B,0x0B74,0x74D6),
bn_pack4(0x043E,0x8F66,0x3F48,0x60EE),
bn_pack4(0x387F,0xE8D7,0x6E3C,0x0468),
bn_pack4(0xDA56,0xC9EC,0x2EF2,0x9632),
bn_pack4(0xEB19,0xCCB1,0xA313,0xD55C),
bn_pack4(0xF550,0xAA3D,0x8A1F,0xBFF0),
bn_pack4(0x06A1,0xD58B,0xB7C5,0xDA76),
bn_pack4(0xA797,0x15EE,0xF29B,0xE328),
bn_pack4(0x14CC,0x5ED2,0x0F80,0x37E0),
bn_pack4(0xCC8F,0x6D7E,0xBF48,0xE1D8),
bn_pack4(0x4BD4,0x07B2,0x2B41,0x54AA),
bn_pack4(0x0F1D,0x45B7,0xFF58,0x5AC5),
bn_pack4(0x23A9,0x7A7E,0x36CC,0x88BE),
bn_pack4(0x59E7,0xC97F,0xBEC7,0xE8F3),
bn_pack4(0xB5A8,0x4031,0x900B,0x1C9E),
bn_pack4(0xD55E,0x702F,0x4698,0x0C82),
bn_pack4(0xF482,0xD7CE,0x6E74,0xFEF6),
bn_pack4(0xF032,0xEA15,0xD172,0x1D03),
bn_pack4(0x5983,0xCA01,0xC64B,0x92EC),
bn_pack4(0x6FB8,0xF401,0x378C,0xD2BF),
bn_pack4(0x3320,0x5151,0x2BD7,0xAF42),
bn_pack4(0xDB7F,0x1447,0xE6CC,0x254B),
bn_pack4(0x44CE,0x6CBA,0xCED4,0xBB1B),
bn_pack4(0xDA3E,0xDBEB,0xCF9B,0x14ED),
bn_pack4(0x1797,0x27B0,0x865A,0x8918),
bn_pack4(0xB06A,0x53ED,0x9027,0xD831),
bn_pack4(0xE5DB,0x382F,0x4130,0x01AE),
bn_pack4(0xF8FF,0x9406,0xAD9E,0x530E),
bn_pack4(0xC975,0x1E76,0x3DBA,0x37BD),
bn_pack4(0xC1D4,0xDCB2,0x6026,0x46DE),
bn_pack4(0x36C3,0xFAB4,0xD27C,0x7026),
bn_pack4(0x4DF4,0x35C9,0x3402,0x8492),
bn_pack4(0x86FF,0xB7DC,0x90A6,0xC08F),
bn_pack4(0x93B4,0xEA98,0x8D8F,0xDDC1),
bn_pack4(0xD006,0x9127,0xD5B0,0x5AA9),
bn_pack4(0xB81B,0xDD76,0x2170,0x481C),
bn_pack4(0x1F61,0x2970,0xCEE2,0xD7AF),
bn_pack4(0x233B,0xA186,0x515B,0xE7ED),
bn_pack4(0x99B2,0x964F,0xA090,0xC3A2),
bn_pack4(0x287C,0x5947,0x4E6B,0xC05D),
bn_pack4(0x2E8E,0xFC14,0x1FBE,0xCAA6),
bn_pack4(0xDBBB,0xC2DB,0x04DE,0x8EF9),
bn_pack4(0x2583,0xE9CA,0x2AD4,0x4CE8),
bn_pack4(0x1A94,0x6834,0xB615,0x0BDA),
bn_pack4(0x99C3,0x2718,0x6AF4,0xE23C),
bn_pack4(0x8871,0x9A10,0xBDBA,0x5B26),
bn_pack4(0x1A72,0x3C12,0xA787,0xE6D7),
bn_pack4(0x4B82,0xD120,0xA921,0x0801),
bn_pack4(0x43DB,0x5BFC,0xE0FD,0x108E),
bn_pack4(0x08E2,0x4FA0,0x74E5,0xAB31),
bn_pack4(0x7709,0x88C0,0xBAD9,0x46E2),
bn_pack4(0xBBE1,0x1757,0x7A61,0x5D6C),
bn_pack4(0x521F,0x2B18,0x177B,0x200C),
bn_pack4(0xD876,0x0273,0x3EC8,0x6A64),
bn_pack4(0xF12F,0xFA06,0xD98A,0x0864),
bn_pack4(0xCEE3,0xD226,0x1AD2,0xEE6B),
bn_pack4(0x1E8C,0x94E0,0x4A25,0x619D),
bn_pack4(0xABF5,0xAE8C,0xDB09,0x33D7),
bn_pack4(0xB397,0x0F85,0xA6E1,0xE4C7),
bn_pack4(0x8AEA,0x7157,0x5D06,0x0C7D),
bn_pack4(0xECFB,0x8504,0x58DB,0xEF0A),
bn_pack4(0xA855,0x21AB,0xDF1C,0xBA64),
bn_pack4(0xAD33,0x170D,0x0450,0x7A33),
bn_pack4(0x1572,0x8E5A,0x8AAA,0xC42D),
bn_pack4(0x15D2,0x2618,0x98FA,0x0510),
bn_pack4(0x3995,0x497C,0xEA95,0x6AE5),
bn_pack4(0xDE2B,0xCBF6,0x9558,0x1718),
bn_pack4(0xB5C5,0x5DF0,0x6F4C,0x52C9),
bn_pack4(0x9B27,0x83A2,0xEC07,0xA28F),
bn_pack4(0xE39E,0x772C,0x180E,0x8603),
bn_pack4(0x3290,0x5E46,0x2E36,0xCE3B),
bn_pack4(0xF174,0x6C08,0xCA18,0x217C),
bn_pack4(0x670C,0x354E,0x4ABC,0x9804),
bn_pack4(0x9ED5,0x2907,0x7096,0x966D),
bn_pack4(0x1C62,0xF356,0x2085,0x52BB),
bn_pack4(0x8365,0x5D23,0xDCA3,0xAD96),
bn_pack4(0x6916,0x3FA8,0xFD24,0xCF5F),
bn_pack4(0x98DA,0x4836,0x1C55,0xD39A),
bn_pack4(0xC200,0x7CB8,0xA163,0xBF05),
bn_pack4(0x4928,0x6651,0xECE4,0x5B3D),
bn_pack4(0xAE9F,0x2411,0x7C4B,0x1FE6),
bn_pack4(0xEE38,0x6BFB,0x5A89,0x9FA5),
bn_pack4(0x0BFF,0x5CB6,0xF406,0xB7ED),
bn_pack4(0xF44C,0x42E9,0xA637,0xED6B),
bn_pack4(0xE485,0xB576,0x625E,0x7EC6),
bn_pack4(0x4FE1,0x356D,0x6D51,0xC245),
bn_pack4(0x302B,0x0A6D,0xF25F,0x1437),
bn_pack4(0xEF95,0x19B3,0xCD3A,0x431B),
bn_pack4(0x514A,0x0879,0x8E34,0x04DD),
bn_pack4(0x020B,0xBEA6,0x3B13,0x9B22),
bn_pack4(0x2902,0x4E08,0x8A67,0xCC74),
bn_pack4(0xC4C6,0x628B,0x80DC,0x1CD1),
bn_pack4(0xC90F,0xDAA2,0x2168,0xC234),
bn_pack4(0xFFFF,0xFFFF,0xFFFF,0xFFFF)
};
static BIGNUM bn_group_6144 = {
bn_group_6144_value,
(sizeof bn_group_6144_value)/sizeof(BN_ULONG),
(sizeof bn_group_6144_value)/sizeof(BN_ULONG),
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_group_8192_value[] = {
bn_pack4(0xFFFF,0xFFFF,0xFFFF,0xFFFF),
bn_pack4(0x60C9,0x80DD,0x98ED,0xD3DF),
bn_pack4(0xC81F,0x56E8,0x80B9,0x6E71),
bn_pack4(0x9E30,0x50E2,0x7656,0x94DF),
bn_pack4(0x9558,0xE447,0x5677,0xE9AA),
bn_pack4(0xC919,0x0DA6,0xFC02,0x6E47),
bn_pack4(0x889A,0x002E,0xD5EE,0x382B),
bn_pack4(0x4009,0x438B,0x481C,0x6CD7),
bn_pack4(0x3590,0x46F4,0xEB87,0x9F92),
bn_pack4(0xFAF3,0x6BC3,0x1ECF,0xA268),
bn_pack4(0xB1D5,0x10BD,0x7EE7,0x4D73),
bn_pack4(0xF9AB,0x4819,0x5DED,0x7EA1),
bn_pack4(0x64F3,0x1CC5,0x0846,0x851D),
bn_pack4(0x4597,0xE899,0xA025,0x5DC1),
bn_pack4(0xDF31,0x0EE0,0x74AB,0x6A36),
bn_pack4(0x6D2A,0x13F8,0x3F44,0xF82D),
bn_pack4(0x062B,0x3CF5,0xB3A2,0x78A6),
bn_pack4(0x7968,0x3303,0xED5B,0xDD3A),
bn_pack4(0xFA9D,0x4B7F,0xA2C0,0x87E8),
bn_pack4(0x4BCB,0xC886,0x2F83,0x85DD),
bn_pack4(0x3473,0xFC64,0x6CEA,0x306B),
bn_pack4(0x13EB,0x57A8,0x1A23,0xF0C7),
bn_pack4(0x2222,0x2E04,0xA403,0x7C07),
bn_pack4(0xE3FD,0xB8BE,0xFC84,0x8AD9),
bn_pack4(0x238F,0x16CB,0xE39D,0x652D),
bn_pack4(0x3423,0xB474,0x2BF1,0xC978),
bn_pack4(0x3AAB,0x639C,0x5AE4,0xF568),
bn_pack4(0x2576,0xF693,0x6BA4,0x2466),
bn_pack4(0x741F,0xA7BF,0x8AFC,0x47ED),
bn_pack4(0x3BC8,0x32B6,0x8D9D,0xD300),
bn_pack4(0xD8BE,0xC4D0,0x73B9,0x31BA),
bn_pack4(0x3877,0x7CB6,0xA932,0xDF8C),
bn_pack4(0x74A3,0x926F,0x12FE,0xE5E4),
bn_pack4(0xE694,0xF91E,0x6DBE,0x1159),
bn_pack4(0x12BF,0x2D5B,0x0B74,0x74D6),
bn_pack4(0x043E,0x8F66,0x3F48,0x60EE),
bn_pack4(0x387F,0xE8D7,0x6E3C,0x0468),
bn_pack4(0xDA56,0xC9EC,0x2EF2,0x9632),
bn_pack4(0xEB19,0xCCB1,0xA313,0xD55C),
bn_pack4(0xF550,0xAA3D,0x8A1F,0xBFF0),
bn_pack4(0x06A1,0xD58B,0xB7C5,0xDA76),
bn_pack4(0xA797,0x15EE,0xF29B,0xE328),
bn_pack4(0x14CC,0x5ED2,0x0F80,0x37E0),
bn_pack4(0xCC8F,0x6D7E,0xBF48,0xE1D8),
bn_pack4(0x4BD4,0x07B2,0x2B41,0x54AA),
bn_pack4(0x0F1D,0x45B7,0xFF58,0x5AC5),
bn_pack4(0x23A9,0x7A7E,0x36CC,0x88BE),
bn_pack4(0x59E7,0xC97F,0xBEC7,0xE8F3),
bn_pack4(0xB5A8,0x4031,0x900B,0x1C9E),
bn_pack4(0xD55E,0x702F,0x4698,0x0C82),
bn_pack4(0xF482,0xD7CE,0x6E74,0xFEF6),
bn_pack4(0xF032,0xEA15,0xD172,0x1D03),
bn_pack4(0x5983,0xCA01,0xC64B,0x92EC),
bn_pack4(0x6FB8,0xF401,0x378C,0xD2BF),
bn_pack4(0x3320,0x5151,0x2BD7,0xAF42),
bn_pack4(0xDB7F,0x1447,0xE6CC,0x254B),
bn_pack4(0x44CE,0x6CBA,0xCED4,0xBB1B),
bn_pack4(0xDA3E,0xDBEB,0xCF9B,0x14ED),
bn_pack4(0x1797,0x27B0,0x865A,0x8918),
bn_pack4(0xB06A,0x53ED,0x9027,0xD831),
bn_pack4(0xE5DB,0x382F,0x4130,0x01AE),
bn_pack4(0xF8FF,0x9406,0xAD9E,0x530E),
bn_pack4(0xC975,0x1E76,0x3DBA,0x37BD),
bn_pack4(0xC1D4,0xDCB2,0x6026,0x46DE),
bn_pack4(0x36C3,0xFAB4,0xD27C,0x7026),
bn_pack4(0x4DF4,0x35C9,0x3402,0x8492),
bn_pack4(0x86FF,0xB7DC,0x90A6,0xC08F),
bn_pack4(0x93B4,0xEA98,0x8D8F,0xDDC1),
bn_pack4(0xD006,0x9127,0xD5B0,0x5AA9),
bn_pack4(0xB81B,0xDD76,0x2170,0x481C),
bn_pack4(0x1F61,0x2970,0xCEE2,0xD7AF),
bn_pack4(0x233B,0xA186,0x515B,0xE7ED),
bn_pack4(0x99B2,0x964F,0xA090,0xC3A2),
bn_pack4(0x287C,0x5947,0x4E6B,0xC05D),
bn_pack4(0x2E8E,0xFC14,0x1FBE,0xCAA6),
bn_pack4(0xDBBB,0xC2DB,0x04DE,0x8EF9),
bn_pack4(0x2583,0xE9CA,0x2AD4,0x4CE8),
bn_pack4(0x1A94,0x6834,0xB615,0x0BDA),
bn_pack4(0x99C3,0x2718,0x6AF4,0xE23C),
bn_pack4(0x8871,0x9A10,0xBDBA,0x5B26),
bn_pack4(0x1A72,0x3C12,0xA787,0xE6D7),
bn_pack4(0x4B82,0xD120,0xA921,0x0801),
bn_pack4(0x43DB,0x5BFC,0xE0FD,0x108E),
bn_pack4(0x08E2,0x4FA0,0x74E5,0xAB31),
bn_pack4(0x7709,0x88C0,0xBAD9,0x46E2),
bn_pack4(0xBBE1,0x1757,0x7A61,0x5D6C),
bn_pack4(0x521F,0x2B18,0x177B,0x200C),
bn_pack4(0xD876,0x0273,0x3EC8,0x6A64),
bn_pack4(0xF12F,0xFA06,0xD98A,0x0864),
bn_pack4(0xCEE3,0xD226,0x1AD2,0xEE6B),
bn_pack4(0x1E8C,0x94E0,0x4A25,0x619D),
bn_pack4(0xABF5,0xAE8C,0xDB09,0x33D7),
bn_pack4(0xB397,0x0F85,0xA6E1,0xE4C7),
bn_pack4(0x8AEA,0x7157,0x5D06,0x0C7D),
bn_pack4(0xECFB,0x8504,0x58DB,0xEF0A),
bn_pack4(0xA855,0x21AB,0xDF1C,0xBA64),
bn_pack4(0xAD33,0x170D,0x0450,0x7A33),
bn_pack4(0x1572,0x8E5A,0x8AAA,0xC42D),
bn_pack4(0x15D2,0x2618,0x98FA,0x0510),
bn_pack4(0x3995,0x497C,0xEA95,0x6AE5),
bn_pack4(0xDE2B,0xCBF6,0x9558,0x1718),
bn_pack4(0xB5C5,0x5DF0,0x6F4C,0x52C9),
bn_pack4(0x9B27,0x83A2,0xEC07,0xA28F),
bn_pack4(0xE39E,0x772C,0x180E,0x8603),
bn_pack4(0x3290,0x5E46,0x2E36,0xCE3B),
bn_pack4(0xF174,0x6C08,0xCA18,0x217C),
bn_pack4(0x670C,0x354E,0x4ABC,0x9804),
bn_pack4(0x9ED5,0x2907,0x7096,0x966D),
bn_pack4(0x1C62,0xF356,0x2085,0x52BB),
bn_pack4(0x8365,0x5D23,0xDCA3,0xAD96),
bn_pack4(0x6916,0x3FA8,0xFD24,0xCF5F),
bn_pack4(0x98DA,0x4836,0x1C55,0xD39A),
bn_pack4(0xC200,0x7CB8,0xA163,0xBF05),
bn_pack4(0x4928,0x6651,0xECE4,0x5B3D),
bn_pack4(0xAE9F,0x2411,0x7C4B,0x1FE6),
bn_pack4(0xEE38,0x6BFB,0x5A89,0x9FA5),
bn_pack4(0x0BFF,0x5CB6,0xF406,0xB7ED),
bn_pack4(0xF44C,0x42E9,0xA637,0xED6B),
bn_pack4(0xE485,0xB576,0x625E,0x7EC6),
bn_pack4(0x4FE1,0x356D,0x6D51,0xC245),
bn_pack4(0x302B,0x0A6D,0xF25F,0x1437),
bn_pack4(0xEF95,0x19B3,0xCD3A,0x431B),
bn_pack4(0x514A,0x0879,0x8E34,0x04DD),
bn_pack4(0x020B,0xBEA6,0x3B13,0x9B22),
bn_pack4(0x2902,0x4E08,0x8A67,0xCC74),
bn_pack4(0xC4C6,0x628B,0x80DC,0x1CD1),
bn_pack4(0xC90F,0xDAA2,0x2168,0xC234),
bn_pack4(0xFFFF,0xFFFF,0xFFFF,0xFFFF)
};
static BIGNUM bn_group_8192 = {
bn_group_8192_value,
(sizeof bn_group_8192_value)/sizeof(BN_ULONG),
(sizeof bn_group_8192_value)/sizeof(BN_ULONG),
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_generator_19_value[] = {19} ;
static BIGNUM bn_generator_19 = {
bn_generator_19_value,
1,
1,
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_generator_5_value[] = {5} ;
static BIGNUM bn_generator_5 = {
bn_generator_5_value,
1,
1,
0,
BN_FLG_STATIC_DATA
};
static BN_ULONG bn_generator_2_value[] = {2} ;
static BIGNUM bn_generator_2 = {
bn_generator_2_value,
1,
1,
0,
BN_FLG_STATIC_DATA
};
static SRP_gN knowngN[] = {
{"8192",&bn_generator_19 , &bn_group_8192},
{"6144",&bn_generator_5 , &bn_group_6144},
{"4096",&bn_generator_5 , &bn_group_4096},
{"3072",&bn_generator_5 , &bn_group_3072},
{"2048",&bn_generator_2 , &bn_group_2048},
{"1536",&bn_generator_2 , &bn_group_1536},
{"1024",&bn_generator_2 , &bn_group_1024},
};
#define KNOWN_GN_NUMBER sizeof(knowngN) / sizeof(SRP_gN)
/* end of generated data */

View File

@@ -0,0 +1,83 @@
/* crypto/srp/srp_lcl.h */
/* Written by Peter Sylvester (peter.sylvester@edelweb.fr)
* for the EdelKey project and contributed to the OpenSSL project 2004.
*/
/* ====================================================================
* Copyright (c) 2004 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#ifndef HEADER_SRP_LCL_H
#define HEADER_SRP_LCL_H
#include <openssl/srp.h>
#include <openssl/sha.h>
#if 0
#define srp_bn_print(a) {fprintf(stderr, #a "="); BN_print_fp(stderr,a); \
fprintf(stderr,"\n");}
#else
#define srp_bn_print(a)
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,361 @@
/* crypto/srp/srp_lib.c */
/* Written by Christophe Renou (christophe.renou@edelweb.fr) with
* the precious help of Peter Sylvester (peter.sylvester@edelweb.fr)
* for the EdelKey project and contributed to the OpenSSL project 2004.
*/
/* ====================================================================
* Copyright (c) 2004 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#ifndef OPENSSL_NO_SRP
#include "cryptlib.h"
#include "srp_lcl.h"
#include <openssl/srp.h>
#include <openssl/evp.h>
#if (BN_BYTES == 8)
# if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)
# define bn_pack4(a1,a2,a3,a4) ((a1##UI64<<48)|(a2##UI64<<32)|(a3##UI64<<16)|a4##UI64)
# elif defined(__arch64__)
# define bn_pack4(a1,a2,a3,a4) ((a1##UL<<48)|(a2##UL<<32)|(a3##UL<<16)|a4##UL)
# else
# define bn_pack4(a1,a2,a3,a4) ((a1##ULL<<48)|(a2##ULL<<32)|(a3##ULL<<16)|a4##ULL)
# endif
#elif (BN_BYTES == 4)
# define bn_pack4(a1,a2,a3,a4) ((a3##UL<<16)|a4##UL), ((a1##UL<<16)|a2##UL)
#else
# error "unsupported BN_BYTES"
#endif
#include "srp_grps.h"
static BIGNUM *srp_Calc_k(BIGNUM *N, BIGNUM *g)
{
/* k = SHA1(N | PAD(g)) -- tls-srp draft 8 */
unsigned char digest[SHA_DIGEST_LENGTH];
unsigned char *tmp;
EVP_MD_CTX ctxt;
int longg ;
int longN = BN_num_bytes(N);
if ((tmp = OPENSSL_malloc(longN)) == NULL)
return NULL;
BN_bn2bin(N,tmp) ;
EVP_MD_CTX_init(&ctxt);
EVP_DigestInit_ex(&ctxt, EVP_sha1(), NULL);
EVP_DigestUpdate(&ctxt, tmp, longN);
memset(tmp, 0, longN);
longg = BN_bn2bin(g,tmp) ;
/* use the zeros behind to pad on left */
EVP_DigestUpdate(&ctxt, tmp + longg, longN-longg);
EVP_DigestUpdate(&ctxt, tmp, longg);
OPENSSL_free(tmp);
EVP_DigestFinal_ex(&ctxt, digest, NULL);
EVP_MD_CTX_cleanup(&ctxt);
return BN_bin2bn(digest, sizeof(digest), NULL);
}
BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N)
{
/* k = SHA1(PAD(A) || PAD(B) ) -- tls-srp draft 8 */
BIGNUM *u;
unsigned char cu[SHA_DIGEST_LENGTH];
unsigned char *cAB;
EVP_MD_CTX ctxt;
int longN;
if ((A == NULL) ||(B == NULL) || (N == NULL))
return NULL;
longN= BN_num_bytes(N);
if ((cAB = OPENSSL_malloc(2*longN)) == NULL)
return NULL;
memset(cAB, 0, longN);
EVP_MD_CTX_init(&ctxt);
EVP_DigestInit_ex(&ctxt, EVP_sha1(), NULL);
EVP_DigestUpdate(&ctxt, cAB + BN_bn2bin(A,cAB+longN), longN);
EVP_DigestUpdate(&ctxt, cAB + BN_bn2bin(B,cAB+longN), longN);
OPENSSL_free(cAB);
EVP_DigestFinal_ex(&ctxt, cu, NULL);
EVP_MD_CTX_cleanup(&ctxt);
if (!(u = BN_bin2bn(cu, sizeof(cu), NULL)))
return NULL;
if (!BN_is_zero(u))
return u;
BN_free(u);
return NULL;
}
BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, BIGNUM *N)
{
BIGNUM *tmp = NULL, *S = NULL;
BN_CTX *bn_ctx;
if (u == NULL || A == NULL || v == NULL || b == NULL || N == NULL)
return NULL;
if ((bn_ctx = BN_CTX_new()) == NULL ||
(tmp = BN_new()) == NULL ||
(S = BN_new()) == NULL )
goto err;
/* S = (A*v**u) ** b */
if (!BN_mod_exp(tmp,v,u,N,bn_ctx))
goto err;
if (!BN_mod_mul(tmp,A,tmp,N,bn_ctx))
goto err;
if (!BN_mod_exp(S,tmp,b,N,bn_ctx))
goto err;
err:
BN_CTX_free(bn_ctx);
BN_clear_free(tmp);
return S;
}
BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v)
{
BIGNUM *kv = NULL, *gb = NULL;
BIGNUM *B = NULL, *k = NULL;
BN_CTX *bn_ctx;
if (b == NULL || N == NULL || g == NULL || v == NULL ||
(bn_ctx = BN_CTX_new()) == NULL)
return NULL;
if ( (kv = BN_new()) == NULL ||
(gb = BN_new()) == NULL ||
(B = BN_new())== NULL)
goto err;
/* B = g**b + k*v */
if (!BN_mod_exp(gb,g,b,N,bn_ctx) ||
!(k = srp_Calc_k(N,g)) ||
!BN_mod_mul(kv,v,k,N,bn_ctx) ||
!BN_mod_add(B,gb,kv,N,bn_ctx))
{
BN_free(B);
B = NULL;
}
err:
BN_CTX_free(bn_ctx);
BN_clear_free(kv);
BN_clear_free(gb);
BN_free(k);
return B;
}
BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass)
{
unsigned char dig[SHA_DIGEST_LENGTH];
EVP_MD_CTX ctxt;
unsigned char *cs;
if ((s == NULL) ||
(user == NULL) ||
(pass == NULL))
return NULL;
if ((cs = OPENSSL_malloc(BN_num_bytes(s))) == NULL)
return NULL;
EVP_MD_CTX_init(&ctxt);
EVP_DigestInit_ex(&ctxt, EVP_sha1(), NULL);
EVP_DigestUpdate(&ctxt, user, strlen(user));
EVP_DigestUpdate(&ctxt, ":", 1);
EVP_DigestUpdate(&ctxt, pass, strlen(pass));
EVP_DigestFinal_ex(&ctxt, dig, NULL);
EVP_DigestInit_ex(&ctxt, EVP_sha1(), NULL);
BN_bn2bin(s,cs);
EVP_DigestUpdate(&ctxt, cs, BN_num_bytes(s));
OPENSSL_free(cs);
EVP_DigestUpdate(&ctxt, dig, sizeof(dig));
EVP_DigestFinal_ex(&ctxt, dig, NULL);
EVP_MD_CTX_cleanup(&ctxt);
return BN_bin2bn(dig, sizeof(dig), NULL);
}
BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g)
{
BN_CTX *bn_ctx;
BIGNUM * A = NULL;
if (a == NULL || N == NULL || g == NULL ||
(bn_ctx = BN_CTX_new()) == NULL)
return NULL;
if ((A = BN_new()) != NULL &&
!BN_mod_exp(A,g,a,N,bn_ctx))
{
BN_free(A);
A = NULL;
}
BN_CTX_free(bn_ctx);
return A;
}
BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, BIGNUM *a, BIGNUM *u)
{
BIGNUM *tmp = NULL, *tmp2 = NULL, *tmp3 = NULL , *k = NULL, *K = NULL;
BN_CTX *bn_ctx;
if (u == NULL || B == NULL || N == NULL || g == NULL || x == NULL || a == NULL ||
(bn_ctx = BN_CTX_new()) == NULL)
return NULL;
if ((tmp = BN_new()) == NULL ||
(tmp2 = BN_new())== NULL ||
(tmp3 = BN_new())== NULL ||
(K = BN_new()) == NULL)
goto err;
if (!BN_mod_exp(tmp,g,x,N,bn_ctx))
goto err;
if (!(k = srp_Calc_k(N,g)))
goto err;
if (!BN_mod_mul(tmp2,tmp,k,N,bn_ctx))
goto err;
if (!BN_mod_sub(tmp,B,tmp2,N,bn_ctx))
goto err;
if (!BN_mod_mul(tmp3,u,x,N,bn_ctx))
goto err;
if (!BN_mod_add(tmp2,a,tmp3,N,bn_ctx))
goto err;
if (!BN_mod_exp(K,tmp,tmp2,N,bn_ctx))
goto err;
err :
BN_CTX_free(bn_ctx);
BN_clear_free(tmp);
BN_clear_free(tmp2);
BN_clear_free(tmp3);
BN_free(k);
return K;
}
int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N)
{
BIGNUM *r;
BN_CTX *bn_ctx;
int ret = 0;
if (B == NULL || N == NULL ||
(bn_ctx = BN_CTX_new()) == NULL)
return 0;
if ((r = BN_new()) == NULL)
goto err;
/* Checks if B % N == 0 */
if (!BN_nnmod(r,B,N,bn_ctx))
goto err;
ret = !BN_is_zero(r);
err:
BN_CTX_free(bn_ctx);
BN_free(r);
return ret;
}
int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N)
{
/* Checks if A % N == 0 */
return SRP_Verify_B_mod_N(A,N) ;
}
/* Check if G and N are kwown parameters.
The values have been generated from the ietf-tls-srp draft version 8
*/
char *SRP_check_known_gN_param(BIGNUM *g, BIGNUM *N)
{
size_t i;
if ((g == NULL) || (N == NULL))
return 0;
srp_bn_print(g);
srp_bn_print(N);
for(i = 0; i < KNOWN_GN_NUMBER; i++)
{
if (BN_cmp(knowngN[i].g, g) == 0 && BN_cmp(knowngN[i].N, N) == 0)
return knowngN[i].id;
}
return NULL;
}
SRP_gN *SRP_get_default_gN(const char *id)
{
size_t i;
if (id == NULL)
return knowngN;
for(i = 0; i < KNOWN_GN_NUMBER; i++)
{
if (strcmp(knowngN[i].id, id)==0)
return knowngN + i;
}
return NULL;
}
#endif

View File

@@ -0,0 +1,661 @@
/* crypto/srp/srp_vfy.c */
/* Written by Christophe Renou (christophe.renou@edelweb.fr) with
* the precious help of Peter Sylvester (peter.sylvester@edelweb.fr)
* for the EdelKey project and contributed to the OpenSSL project 2004.
*/
/* ====================================================================
* Copyright (c) 2004 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#ifndef OPENSSL_NO_SRP
#include "cryptlib.h"
#include "srp_lcl.h"
#include <openssl/srp.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <openssl/rand.h>
#include <openssl/txt_db.h>
#define SRP_RANDOM_SALT_LEN 20
#define MAX_LEN 2500
static char b64table[] =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./";
/* the following two conversion routines have been inspired by code from Stanford */
/*
* Convert a base64 string into raw byte array representation.
*/
static int t_fromb64(unsigned char *a, const char *src)
{
char *loc;
int i, j;
int size;
while(*src && (*src == ' ' || *src == '\t' || *src == '\n'))
++src;
size = strlen(src);
i = 0;
while(i < size)
{
loc = strchr(b64table, src[i]);
if(loc == (char *) 0) break;
else a[i] = loc - b64table;
++i;
}
/* if nothing valid to process we have a zero length response */
if (i == 0)
return 0;
size = i;
i = size - 1;
j = size;
while(1)
{
a[j] = a[i];
if(--i < 0) break;
a[j] |= (a[i] & 3) << 6;
--j;
a[j] = (unsigned char) ((a[i] & 0x3c) >> 2);
if(--i < 0) break;
a[j] |= (a[i] & 0xf) << 4;
--j;
a[j] = (unsigned char) ((a[i] & 0x30) >> 4);
if(--i < 0) break;
a[j] |= (a[i] << 2);
a[--j] = 0;
if(--i < 0) break;
}
while(a[j] == 0 && j <= size) ++j;
i = 0;
while (j <= size) a[i++] = a[j++];
return i;
}
/*
* Convert a raw byte string into a null-terminated base64 ASCII string.
*/
static char *t_tob64(char *dst, const unsigned char *src, int size)
{
int c, pos = size % 3;
unsigned char b0 = 0, b1 = 0, b2 = 0, notleading = 0;
char *olddst = dst;
switch(pos)
{
case 1:
b2 = src[0];
break;
case 2:
b1 = src[0];
b2 = src[1];
break;
}
while(1)
{
c = (b0 & 0xfc) >> 2;
if(notleading || c != 0)
{
*dst++ = b64table[c];
notleading = 1;
}
c = ((b0 & 3) << 4) | ((b1 & 0xf0) >> 4);
if(notleading || c != 0)
{
*dst++ = b64table[c];
notleading = 1;
}
c = ((b1 & 0xf) << 2) | ((b2 & 0xc0) >> 6);
if(notleading || c != 0)
{
*dst++ = b64table[c];
notleading = 1;
}
c = b2 & 0x3f;
if(notleading || c != 0)
{
*dst++ = b64table[c];
notleading = 1;
}
if(pos >= size) break;
else
{
b0 = src[pos++];
b1 = src[pos++];
b2 = src[pos++];
}
}
*dst++ = '\0';
return olddst;
}
static void SRP_user_pwd_free(SRP_user_pwd *user_pwd)
{
if (user_pwd == NULL)
return;
BN_free(user_pwd->s);
BN_clear_free(user_pwd->v);
OPENSSL_free(user_pwd->id);
OPENSSL_free(user_pwd->info);
OPENSSL_free(user_pwd);
}
static SRP_user_pwd *SRP_user_pwd_new()
{
SRP_user_pwd *ret = OPENSSL_malloc(sizeof(SRP_user_pwd));
if (ret == NULL)
return NULL;
ret->N = NULL;
ret->g = NULL;
ret->s = NULL;
ret->v = NULL;
ret->id = NULL ;
ret->info = NULL;
return ret;
}
static void SRP_user_pwd_set_gN(SRP_user_pwd *vinfo, const BIGNUM *g,
const BIGNUM *N)
{
vinfo->N = N;
vinfo->g = g;
}
static int SRP_user_pwd_set_ids(SRP_user_pwd *vinfo, const char *id,
const char *info)
{
if (id != NULL && NULL == (vinfo->id = BUF_strdup(id)))
return 0;
return (info == NULL || NULL != (vinfo->info = BUF_strdup(info))) ;
}
static int SRP_user_pwd_set_sv(SRP_user_pwd *vinfo, const char *s,
const char *v)
{
unsigned char tmp[MAX_LEN];
int len;
if (strlen(s) > MAX_LEN || strlen(v) > MAX_LEN)
return 0;
len = t_fromb64(tmp, v);
if (NULL == (vinfo->v = BN_bin2bn(tmp, len, NULL)) )
return 0;
len = t_fromb64(tmp, s);
return ((vinfo->s = BN_bin2bn(tmp, len, NULL)) != NULL) ;
}
static int SRP_user_pwd_set_sv_BN(SRP_user_pwd *vinfo, BIGNUM *s, BIGNUM *v)
{
vinfo->v = v;
vinfo->s = s;
return (vinfo->s != NULL && vinfo->v != NULL) ;
}
SRP_VBASE *SRP_VBASE_new(char *seed_key)
{
SRP_VBASE *vb = (SRP_VBASE *) OPENSSL_malloc(sizeof(SRP_VBASE));
if (vb == NULL)
return NULL;
if (!(vb->users_pwd = sk_SRP_user_pwd_new_null()) ||
!(vb->gN_cache = sk_SRP_gN_cache_new_null()))
{
OPENSSL_free(vb);
return NULL;
}
vb->default_g = NULL;
vb->default_N = NULL;
vb->seed_key = NULL;
if ((seed_key != NULL) &&
(vb->seed_key = BUF_strdup(seed_key)) == NULL)
{
sk_SRP_user_pwd_free(vb->users_pwd);
sk_SRP_gN_cache_free(vb->gN_cache);
OPENSSL_free(vb);
return NULL;
}
return vb;
}
int SRP_VBASE_free(SRP_VBASE *vb)
{
sk_SRP_user_pwd_pop_free(vb->users_pwd,SRP_user_pwd_free);
sk_SRP_gN_cache_free(vb->gN_cache);
OPENSSL_free(vb->seed_key);
OPENSSL_free(vb);
return 0;
}
static SRP_gN_cache *SRP_gN_new_init(const char *ch)
{
unsigned char tmp[MAX_LEN];
int len;
SRP_gN_cache *newgN = (SRP_gN_cache *)OPENSSL_malloc(sizeof(SRP_gN_cache));
if (newgN == NULL)
return NULL;
if ((newgN->b64_bn = BUF_strdup(ch)) == NULL)
goto err;
len = t_fromb64(tmp, ch);
if ((newgN->bn = BN_bin2bn(tmp, len, NULL)))
return newgN;
OPENSSL_free(newgN->b64_bn);
err:
OPENSSL_free(newgN);
return NULL;
}
static void SRP_gN_free(SRP_gN_cache *gN_cache)
{
if (gN_cache == NULL)
return;
OPENSSL_free(gN_cache->b64_bn);
BN_free(gN_cache->bn);
OPENSSL_free(gN_cache);
}
static SRP_gN *SRP_get_gN_by_id(const char *id, STACK_OF(SRP_gN) *gN_tab)
{
int i;
SRP_gN *gN;
if (gN_tab != NULL)
for(i = 0; i < sk_SRP_gN_num(gN_tab); i++)
{
gN = sk_SRP_gN_value(gN_tab, i);
if (gN && (id == NULL || strcmp(gN->id,id)==0))
return gN;
}
return SRP_get_default_gN(id);
}
static BIGNUM *SRP_gN_place_bn(STACK_OF(SRP_gN_cache) *gN_cache, char *ch)
{
int i;
if (gN_cache == NULL)
return NULL;
/* search if we have already one... */
for(i = 0; i < sk_SRP_gN_cache_num(gN_cache); i++)
{
SRP_gN_cache *cache = sk_SRP_gN_cache_value(gN_cache, i);
if (strcmp(cache->b64_bn,ch)==0)
return cache->bn;
}
{ /* it is the first time that we find it */
SRP_gN_cache *newgN = SRP_gN_new_init(ch);
if (newgN)
{
if (sk_SRP_gN_cache_insert(gN_cache,newgN,0)>0)
return newgN->bn;
SRP_gN_free(newgN);
}
}
return NULL;
}
/* this function parses verifier file. Format is:
* string(index):base64(N):base64(g):0
* string(username):base64(v):base64(salt):int(index)
*/
int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file)
{
int error_code ;
STACK_OF(SRP_gN) *SRP_gN_tab = sk_SRP_gN_new_null();
char *last_index = NULL;
int i;
char **pp;
SRP_gN *gN = NULL;
SRP_user_pwd *user_pwd = NULL ;
TXT_DB *tmpdb = NULL;
BIO *in = BIO_new(BIO_s_file());
error_code = SRP_ERR_OPEN_FILE;
if (in == NULL || BIO_read_filename(in,verifier_file) <= 0)
goto err;
error_code = SRP_ERR_VBASE_INCOMPLETE_FILE;
if ((tmpdb =TXT_DB_read(in,DB_NUMBER)) == NULL)
goto err;
error_code = SRP_ERR_MEMORY;
if (vb->seed_key)
{
last_index = SRP_get_default_gN(NULL)->id;
}
for (i = 0; i < sk_OPENSSL_PSTRING_num(tmpdb->data); i++)
{
pp = sk_OPENSSL_PSTRING_value(tmpdb->data,i);
if (pp[DB_srptype][0] == DB_SRP_INDEX)
{
/*we add this couple in the internal Stack */
if ((gN = (SRP_gN *)OPENSSL_malloc(sizeof(SRP_gN))) == NULL)
goto err;
if (!(gN->id = BUF_strdup(pp[DB_srpid]))
|| !(gN->N = SRP_gN_place_bn(vb->gN_cache,pp[DB_srpverifier]))
|| !(gN->g = SRP_gN_place_bn(vb->gN_cache,pp[DB_srpsalt]))
|| sk_SRP_gN_insert(SRP_gN_tab,gN,0) == 0)
goto err;
gN = NULL;
if (vb->seed_key != NULL)
{
last_index = pp[DB_srpid];
}
}
else if (pp[DB_srptype][0] == DB_SRP_VALID)
{
/* it is a user .... */
SRP_gN *lgN;
if ((lgN = SRP_get_gN_by_id(pp[DB_srpgN],SRP_gN_tab))!=NULL)
{
error_code = SRP_ERR_MEMORY;
if ((user_pwd = SRP_user_pwd_new()) == NULL)
goto err;
SRP_user_pwd_set_gN(user_pwd,lgN->g,lgN->N);
if (!SRP_user_pwd_set_ids(user_pwd, pp[DB_srpid],pp[DB_srpinfo]))
goto err;
error_code = SRP_ERR_VBASE_BN_LIB;
if (!SRP_user_pwd_set_sv(user_pwd, pp[DB_srpsalt],pp[DB_srpverifier]))
goto err;
if (sk_SRP_user_pwd_insert(vb->users_pwd, user_pwd, 0) == 0)
goto err;
user_pwd = NULL; /* abandon responsability */
}
}
}
if (last_index != NULL)
{
/* this means that we want to simulate a default user */
if (((gN = SRP_get_gN_by_id(last_index,SRP_gN_tab))==NULL))
{
error_code = SRP_ERR_VBASE_BN_LIB;
goto err;
}
vb->default_g = gN->g ;
vb->default_N = gN->N ;
gN = NULL ;
}
error_code = SRP_NO_ERROR;
err:
/* there may be still some leaks to fix, if this fails, the application terminates most likely */
if (gN != NULL)
{
OPENSSL_free(gN->id);
OPENSSL_free(gN);
}
SRP_user_pwd_free(user_pwd);
if (tmpdb) TXT_DB_free(tmpdb);
if (in) BIO_free_all(in);
sk_SRP_gN_free(SRP_gN_tab);
return error_code;
}
SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username)
{
int i;
SRP_user_pwd *user;
unsigned char digv[SHA_DIGEST_LENGTH];
unsigned char digs[SHA_DIGEST_LENGTH];
EVP_MD_CTX ctxt;
if (vb == NULL)
return NULL;
for(i = 0; i < sk_SRP_user_pwd_num(vb->users_pwd); i++)
{
user = sk_SRP_user_pwd_value(vb->users_pwd, i);
if (strcmp(user->id,username)==0)
return user;
}
if ((vb->seed_key == NULL) ||
(vb->default_g == NULL) ||
(vb->default_N == NULL))
return NULL;
/* if the user is unknown we set parameters as well if we have a seed_key */
if ((user = SRP_user_pwd_new()) == NULL)
return NULL;
SRP_user_pwd_set_gN(user,vb->default_g,vb->default_N);
if (!SRP_user_pwd_set_ids(user,username,NULL))
goto err;
RAND_pseudo_bytes(digv, SHA_DIGEST_LENGTH);
EVP_MD_CTX_init(&ctxt);
EVP_DigestInit_ex(&ctxt, EVP_sha1(), NULL);
EVP_DigestUpdate(&ctxt, vb->seed_key, strlen(vb->seed_key));
EVP_DigestUpdate(&ctxt, username, strlen(username));
EVP_DigestFinal_ex(&ctxt, digs, NULL);
EVP_MD_CTX_cleanup(&ctxt);
if (SRP_user_pwd_set_sv_BN(user, BN_bin2bn(digs,SHA_DIGEST_LENGTH,NULL), BN_bin2bn(digv,SHA_DIGEST_LENGTH, NULL)))
return user;
err: SRP_user_pwd_free(user);
return NULL;
}
/*
create a verifier (*salt,*verifier,g and N are in base64)
*/
char *SRP_create_verifier(const char *user, const char *pass, char **salt,
char **verifier, const char *N, const char *g)
{
int len;
char * result=NULL;
char *vf;
BIGNUM *N_bn = NULL, *g_bn = NULL, *s = NULL, *v = NULL;
unsigned char tmp[MAX_LEN];
unsigned char tmp2[MAX_LEN];
char * defgNid = NULL;
if ((user == NULL)||
(pass == NULL)||
(salt == NULL)||
(verifier == NULL))
goto err;
if (N)
{
if (!(len = t_fromb64(tmp, N))) goto err;
N_bn = BN_bin2bn(tmp, len, NULL);
if (!(len = t_fromb64(tmp, g))) goto err;
g_bn = BN_bin2bn(tmp, len, NULL);
defgNid = "*";
}
else
{
SRP_gN * gN = SRP_get_gN_by_id(g, NULL) ;
if (gN == NULL)
goto err;
N_bn = gN->N;
g_bn = gN->g;
defgNid = gN->id;
}
if (*salt == NULL)
{
RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN);
s = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL);
}
else
{
if (!(len = t_fromb64(tmp2, *salt)))
goto err;
s = BN_bin2bn(tmp2, len, NULL);
}
if(!SRP_create_verifier_BN(user, pass, &s, &v, N_bn, g_bn)) goto err;
BN_bn2bin(v,tmp);
if (((vf = OPENSSL_malloc(BN_num_bytes(v)*2)) == NULL))
goto err;
t_tob64(vf, tmp, BN_num_bytes(v));
*verifier = vf;
if (*salt == NULL)
{
char *tmp_salt;
if ((tmp_salt = OPENSSL_malloc(SRP_RANDOM_SALT_LEN * 2)) == NULL)
{
OPENSSL_free(vf);
goto err;
}
t_tob64(tmp_salt, tmp2, SRP_RANDOM_SALT_LEN);
*salt = tmp_salt;
}
result=defgNid;
err:
if(N)
{
BN_free(N_bn);
BN_free(g_bn);
}
return result;
}
/*
create a verifier (*salt,*verifier,g and N are BIGNUMs)
*/
int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, BIGNUM **verifier, BIGNUM *N, BIGNUM *g)
{
int result=0;
BIGNUM *x = NULL;
BN_CTX *bn_ctx = BN_CTX_new();
unsigned char tmp2[MAX_LEN];
if ((user == NULL)||
(pass == NULL)||
(salt == NULL)||
(verifier == NULL)||
(N == NULL)||
(g == NULL)||
(bn_ctx == NULL))
goto err;
srp_bn_print(N);
srp_bn_print(g);
if (*salt == NULL)
{
RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN);
*salt = BN_bin2bn(tmp2,SRP_RANDOM_SALT_LEN,NULL);
}
x = SRP_Calc_x(*salt,user,pass);
*verifier = BN_new();
if(*verifier == NULL) goto err;
if (!BN_mod_exp(*verifier,g,x,N,bn_ctx))
{
BN_clear_free(*verifier);
goto err;
}
srp_bn_print(*verifier);
result=1;
err:
BN_clear_free(x);
BN_CTX_free(bn_ctx);
return result;
}
#endif