1392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* crypto/srp/srp_vfy.c */ 2392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* Written by Christophe Renou (christophe.renou@edelweb.fr) with 3392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * the precious help of Peter Sylvester (peter.sylvester@edelweb.fr) 4392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * for the EdelKey project and contributed to the OpenSSL project 2004. 5392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom */ 6392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* ==================================================================== 7392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * Copyright (c) 2004 The OpenSSL Project. All rights reserved. 8392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 9392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * Redistribution and use in source and binary forms, with or without 10392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * modification, are permitted provided that the following conditions 11392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * are met: 12392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 13392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 1. Redistributions of source code must retain the above copyright 14392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * notice, this list of conditions and the following disclaimer. 15392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 16392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 2. Redistributions in binary form must reproduce the above copyright 17392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * notice, this list of conditions and the following disclaimer in 18392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * the documentation and/or other materials provided with the 19392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * distribution. 20392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 21392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 3. All advertising materials mentioning features or use of this 22392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * software must display the following acknowledgment: 23392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * "This product includes software developed by the OpenSSL Project 24392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 26392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * endorse or promote products derived from this software without 28392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * prior written permission. For written permission, please contact 29392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * licensing@OpenSSL.org. 30392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 31392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 5. Products derived from this software may not be called "OpenSSL" 32392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * nor may "OpenSSL" appear in their names without prior written 33392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * permission of the OpenSSL Project. 34392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 35392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 6. Redistributions of any form whatsoever must retain the following 36392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * acknowledgment: 37392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * "This product includes software developed by the OpenSSL Project 38392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 40392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * OF THE POSSIBILITY OF SUCH DAMAGE. 52392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * ==================================================================== 53392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 54392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * This product includes cryptographic software written by Eric Young 55392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * (eay@cryptsoft.com). This product includes software written by Tim 56392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * Hudson (tjh@cryptsoft.com). 57392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * 58392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom */ 59392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_NO_SRP 60392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include "cryptlib.h" 61392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include "srp_lcl.h" 62392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/srp.h> 63392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/evp.h> 64392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/buffer.h> 65392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/rand.h> 66392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/txt_db.h> 67392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#define SRP_RANDOM_SALT_LEN 20 69392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#define MAX_LEN 2500 70392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 71392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic char b64table[] = 72392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./"; 73392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 74392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* the following two conversion routines have been inspired by code from Stanford */ 75392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 76392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* 77392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * Convert a base64 string into raw byte array representation. 78392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom */ 79392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic int t_fromb64(unsigned char *a, const char *src) 80392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 81392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *loc; 82392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i, j; 83392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int size; 84392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 85392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while(*src && (*src == ' ' || *src == '\t' || *src == '\n')) 86392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ++src; 87392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom size = strlen(src); 88392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom i = 0; 89392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while(i < size) 90392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 91392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom loc = strchr(b64table, src[i]); 92392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(loc == (char *) 0) break; 93392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else a[i] = loc - b64table; 94392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ++i; 95392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 9677c6be7176c48d2ce4d5979a84876d34204eedafKenny Root /* if nothing valid to process we have a zero length response */ 9777c6be7176c48d2ce4d5979a84876d34204eedafKenny Root if (i == 0) 9877c6be7176c48d2ce4d5979a84876d34204eedafKenny Root return 0; 99392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom size = i; 100392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom i = size - 1; 101392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom j = size; 102392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while(1) 103392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 104392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] = a[i]; 105392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(--i < 0) break; 106392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] |= (a[i] & 3) << 6; 107392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom --j; 108392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] = (unsigned char) ((a[i] & 0x3c) >> 2); 109392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(--i < 0) break; 110392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] |= (a[i] & 0xf) << 4; 111392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom --j; 112392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] = (unsigned char) ((a[i] & 0x30) >> 4); 113392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(--i < 0) break; 114392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] |= (a[i] << 2); 115392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 116392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[--j] = 0; 117392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(--i < 0) break; 118392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 119392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while(a[j] == 0 && j <= size) ++j; 120392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom i = 0; 121392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (j <= size) a[i++] = a[j++]; 122392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return i; 123392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 124392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 125392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 126392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* 127392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * Convert a raw byte string into a null-terminated base64 ASCII string. 128392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom */ 129392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic char *t_tob64(char *dst, const unsigned char *src, int size) 130392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 131392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int c, pos = size % 3; 132392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char b0 = 0, b1 = 0, b2 = 0, notleading = 0; 133392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *olddst = dst; 134392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 135392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom switch(pos) 136392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 137392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case 1: 138392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b2 = src[0]; 139392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 140392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case 2: 141392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b1 = src[0]; 142392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b2 = src[1]; 143392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 144392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 145392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 146392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while(1) 147392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 148392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom c = (b0 & 0xfc) >> 2; 149392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(notleading || c != 0) 150392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 151392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = b64table[c]; 152392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom notleading = 1; 153392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 154392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom c = ((b0 & 3) << 4) | ((b1 & 0xf0) >> 4); 155392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(notleading || c != 0) 156392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 157392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = b64table[c]; 158392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom notleading = 1; 159392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 160392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom c = ((b1 & 0xf) << 2) | ((b2 & 0xc0) >> 6); 161392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(notleading || c != 0) 162392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 163392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = b64table[c]; 164392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom notleading = 1; 165392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 166392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom c = b2 & 0x3f; 167392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(notleading || c != 0) 168392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 169392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = b64table[c]; 170392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom notleading = 1; 171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(pos >= size) break; 173392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 174392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 175392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b0 = src[pos++]; 176392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b1 = src[pos++]; 177392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b2 = src[pos++]; 178392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 179392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 180392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 181392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = '\0'; 182392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return olddst; 183392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 184392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 185392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic void SRP_user_pwd_free(SRP_user_pwd *user_pwd) 186392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 187392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (user_pwd == NULL) 188392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return; 189392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_free(user_pwd->s); 190392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_clear_free(user_pwd->v); 191392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(user_pwd->id); 192392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(user_pwd->info); 193392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(user_pwd); 194392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 195392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 196392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic SRP_user_pwd *SRP_user_pwd_new() 197392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 198392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd *ret = OPENSSL_malloc(sizeof(SRP_user_pwd)); 199392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (ret == NULL) 200392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 201392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->N = NULL; 202392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->g = NULL; 203392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->s = NULL; 204392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->v = NULL; 205392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->id = NULL ; 206392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->info = NULL; 207392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return ret; 208392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 209392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 210392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic void SRP_user_pwd_set_gN(SRP_user_pwd *vinfo, const BIGNUM *g, 211392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const BIGNUM *N) 212392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 213392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vinfo->N = N; 214392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vinfo->g = g; 215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic int SRP_user_pwd_set_ids(SRP_user_pwd *vinfo, const char *id, 218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const char *info) 219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 220392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (id != NULL && NULL == (vinfo->id = BUF_strdup(id))) 221392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 222392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return (info == NULL || NULL != (vinfo->info = BUF_strdup(info))) ; 223392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 224392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 225392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic int SRP_user_pwd_set_sv(SRP_user_pwd *vinfo, const char *s, 226392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const char *v) 227392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 228392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp[MAX_LEN]; 229392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int len; 230392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 231392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (strlen(s) > MAX_LEN || strlen(v) > MAX_LEN) 232392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 233392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom len = t_fromb64(tmp, v); 234392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (NULL == (vinfo->v = BN_bin2bn(tmp, len, NULL)) ) 235392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 236392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom len = t_fromb64(tmp, s); 237392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return ((vinfo->s = BN_bin2bn(tmp, len, NULL)) != NULL) ; 238392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 239392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 240392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic int SRP_user_pwd_set_sv_BN(SRP_user_pwd *vinfo, BIGNUM *s, BIGNUM *v) 241392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 242392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vinfo->v = v; 243392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vinfo->s = s; 244392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return (vinfo->s != NULL && vinfo->v != NULL) ; 245392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 246392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 247392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSRP_VBASE *SRP_VBASE_new(char *seed_key) 248392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 249392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_VBASE *vb = (SRP_VBASE *) OPENSSL_malloc(sizeof(SRP_VBASE)); 250392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 251392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (vb == NULL) 252392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 253392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(vb->users_pwd = sk_SRP_user_pwd_new_null()) || 254392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom !(vb->gN_cache = sk_SRP_gN_cache_new_null())) 255392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 256392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vb); 257392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 258392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 259392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->default_g = NULL; 260392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->default_N = NULL; 261392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->seed_key = NULL; 262392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((seed_key != NULL) && 263392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (vb->seed_key = BUF_strdup(seed_key)) == NULL) 264392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 265392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_user_pwd_free(vb->users_pwd); 266392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_gN_cache_free(vb->gN_cache); 267392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vb); 268392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 269392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 270392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return vb; 271392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 272392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 273392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 274392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromint SRP_VBASE_free(SRP_VBASE *vb) 275392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 276392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_user_pwd_pop_free(vb->users_pwd,SRP_user_pwd_free); 277392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_gN_cache_free(vb->gN_cache); 278392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vb->seed_key); 279392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vb); 280392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 281392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 282392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 283392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 284392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic SRP_gN_cache *SRP_gN_new_init(const char *ch) 285392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 286392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp[MAX_LEN]; 287392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int len; 288392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 289392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN_cache *newgN = (SRP_gN_cache *)OPENSSL_malloc(sizeof(SRP_gN_cache)); 290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (newgN == NULL) 291392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 293392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((newgN->b64_bn = BUF_strdup(ch)) == NULL) 294392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 295392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 296392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom len = t_fromb64(tmp, ch); 297392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((newgN->bn = BN_bin2bn(tmp, len, NULL))) 298392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return newgN; 299392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 300392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(newgN->b64_bn); 301392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromerr: 302392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(newgN); 303392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 304392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 305392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 306392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 307392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic void SRP_gN_free(SRP_gN_cache *gN_cache) 308392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN_cache == NULL) 310392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return; 311392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(gN_cache->b64_bn); 312392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_free(gN_cache->bn); 313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(gN_cache); 314392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 315392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic SRP_gN *SRP_get_gN_by_id(const char *id, STACK_OF(SRP_gN) *gN_tab) 317392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 318392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i; 319392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 320392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN *gN; 321392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN_tab != NULL) 322392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for(i = 0; i < sk_SRP_gN_num(gN_tab); i++) 323392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 324392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom gN = sk_SRP_gN_value(gN_tab, i); 325392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN && (id == NULL || strcmp(gN->id,id)==0)) 326392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return gN; 327392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 328392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 329392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return SRP_get_default_gN(id); 330392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic BIGNUM *SRP_gN_place_bn(STACK_OF(SRP_gN_cache) *gN_cache, char *ch) 333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i; 335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN_cache == NULL) 336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 337392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 338392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* search if we have already one... */ 339392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for(i = 0; i < sk_SRP_gN_cache_num(gN_cache); i++) 340392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 341392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN_cache *cache = sk_SRP_gN_cache_value(gN_cache, i); 342392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (strcmp(cache->b64_bn,ch)==0) 343392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return cache->bn; 344392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 345392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { /* it is the first time that we find it */ 346392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN_cache *newgN = SRP_gN_new_init(ch); 347392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (newgN) 348392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 349392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (sk_SRP_gN_cache_insert(gN_cache,newgN,0)>0) 350392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return newgN->bn; 351392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN_free(newgN); 352392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 353392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 354392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 355392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 356392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 357392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* this function parses verifier file. Format is: 358392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * string(index):base64(N):base64(g):0 359392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * string(username):base64(v):base64(salt):int(index) 360392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom */ 361392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 362392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 363392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromint SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file) 364392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 365392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int error_code ; 366392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom STACK_OF(SRP_gN) *SRP_gN_tab = sk_SRP_gN_new_null(); 367392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *last_index = NULL; 368392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i; 369392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char **pp; 370392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 371392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN *gN = NULL; 372392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd *user_pwd = NULL ; 373392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 374392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom TXT_DB *tmpdb = NULL; 375392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BIO *in = BIO_new(BIO_s_file()); 376392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 377392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_OPEN_FILE; 378392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 379392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (in == NULL || BIO_read_filename(in,verifier_file) <= 0) 380392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 381392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 382392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_VBASE_INCOMPLETE_FILE; 383392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 384392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((tmpdb =TXT_DB_read(in,DB_NUMBER)) == NULL) 385392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 386392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 387392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_MEMORY; 388392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 389392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 390392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (vb->seed_key) 391392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 392392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom last_index = SRP_get_default_gN(NULL)->id; 393392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 394392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (i = 0; i < sk_OPENSSL_PSTRING_num(tmpdb->data); i++) 395392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 39604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom pp = sk_OPENSSL_PSTRING_value(tmpdb->data,i); 397392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (pp[DB_srptype][0] == DB_SRP_INDEX) 398392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 399392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /*we add this couple in the internal Stack */ 400392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 401392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((gN = (SRP_gN *)OPENSSL_malloc(sizeof(SRP_gN))) == NULL) 402392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 403392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 404392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(gN->id = BUF_strdup(pp[DB_srpid])) 405392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom || !(gN->N = SRP_gN_place_bn(vb->gN_cache,pp[DB_srpverifier])) 406392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom || !(gN->g = SRP_gN_place_bn(vb->gN_cache,pp[DB_srpsalt])) 407392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom || sk_SRP_gN_insert(SRP_gN_tab,gN,0) == 0) 408392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 409392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 410392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom gN = NULL; 411392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 412392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (vb->seed_key != NULL) 413392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 414392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom last_index = pp[DB_srpid]; 415392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 416392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 417392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (pp[DB_srptype][0] == DB_SRP_VALID) 418392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 419392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* it is a user .... */ 420392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN *lgN; 421392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((lgN = SRP_get_gN_by_id(pp[DB_srpgN],SRP_gN_tab))!=NULL) 422392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 423392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_MEMORY; 424392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((user_pwd = SRP_user_pwd_new()) == NULL) 425392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 426392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 427392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd_set_gN(user_pwd,lgN->g,lgN->N); 428392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!SRP_user_pwd_set_ids(user_pwd, pp[DB_srpid],pp[DB_srpinfo])) 429392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 430392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 431392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_VBASE_BN_LIB; 432392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!SRP_user_pwd_set_sv(user_pwd, pp[DB_srpsalt],pp[DB_srpverifier])) 433392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 434392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 435392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (sk_SRP_user_pwd_insert(vb->users_pwd, user_pwd, 0) == 0) 436392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 437392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom user_pwd = NULL; /* abandon responsability */ 438392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 439392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 440392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 441392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 442392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (last_index != NULL) 443392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 444392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* this means that we want to simulate a default user */ 445392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 446392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (((gN = SRP_get_gN_by_id(last_index,SRP_gN_tab))==NULL)) 447392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 448392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_VBASE_BN_LIB; 449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 450392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 451392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->default_g = gN->g ; 452392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->default_N = gN->N ; 453392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom gN = NULL ; 454392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 455392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_NO_ERROR; 456392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 457392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom err: 458392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* there may be still some leaks to fix, if this fails, the application terminates most likely */ 459392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 460392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN != NULL) 461392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 462392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(gN->id); 463392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(gN); 464392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 465392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 466392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd_free(user_pwd); 467392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 468392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (tmpdb) TXT_DB_free(tmpdb); 469392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (in) BIO_free_all(in); 470392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 471392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_gN_free(SRP_gN_tab); 472392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 473392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return error_code; 474392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 475392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 476392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 477392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 478392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username) 479392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 480392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i; 481392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd *user; 482392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char digv[SHA_DIGEST_LENGTH]; 483392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char digs[SHA_DIGEST_LENGTH]; 484392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_MD_CTX ctxt; 485392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 486392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (vb == NULL) 487392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 488392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for(i = 0; i < sk_SRP_user_pwd_num(vb->users_pwd); i++) 489392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 490392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom user = sk_SRP_user_pwd_value(vb->users_pwd, i); 491392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (strcmp(user->id,username)==0) 492392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return user; 493392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 494392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((vb->seed_key == NULL) || 495392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (vb->default_g == NULL) || 496392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (vb->default_N == NULL)) 497392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 498392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 499392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* if the user is unknown we set parameters as well if we have a seed_key */ 500392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 501392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((user = SRP_user_pwd_new()) == NULL) 502392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 503392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 504392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd_set_gN(user,vb->default_g,vb->default_N); 505392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 506392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!SRP_user_pwd_set_ids(user,username,NULL)) 507392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 508392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 509392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom RAND_pseudo_bytes(digv, SHA_DIGEST_LENGTH); 510392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_MD_CTX_init(&ctxt); 511392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_DigestInit_ex(&ctxt, EVP_sha1(), NULL); 512392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_DigestUpdate(&ctxt, vb->seed_key, strlen(vb->seed_key)); 513392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_DigestUpdate(&ctxt, username, strlen(username)); 514392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_DigestFinal_ex(&ctxt, digs, NULL); 515392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_MD_CTX_cleanup(&ctxt); 516392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (SRP_user_pwd_set_sv_BN(user, BN_bin2bn(digs,SHA_DIGEST_LENGTH,NULL), BN_bin2bn(digv,SHA_DIGEST_LENGTH, NULL))) 517392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return user; 518392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 519392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromerr: SRP_user_pwd_free(user); 520392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 521392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 522392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 523392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 524392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* 525392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom create a verifier (*salt,*verifier,g and N are in base64) 526392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom*/ 527392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromchar *SRP_create_verifier(const char *user, const char *pass, char **salt, 528392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char **verifier, const char *N, const char *g) 529392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 530392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int len; 531392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char * result=NULL; 532392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *vf; 533392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BIGNUM *N_bn = NULL, *g_bn = NULL, *s = NULL, *v = NULL; 534392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp[MAX_LEN]; 535392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp2[MAX_LEN]; 536392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char * defgNid = NULL; 537392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 538392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((user == NULL)|| 539392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (pass == NULL)|| 540392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (salt == NULL)|| 541392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (verifier == NULL)) 542392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 543392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 544392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (N) 545392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 546392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(len = t_fromb64(tmp, N))) goto err; 547392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom N_bn = BN_bin2bn(tmp, len, NULL); 548392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(len = t_fromb64(tmp, g))) goto err; 549392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom g_bn = BN_bin2bn(tmp, len, NULL); 550392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom defgNid = "*"; 551392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 552392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 553392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN * gN = SRP_get_gN_by_id(g, NULL) ; 555392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN == NULL) 556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 557392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom N_bn = gN->N; 558392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom g_bn = gN->g; 559392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom defgNid = gN->id; 560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 561392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (*salt == NULL) 563392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 564392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN); 565392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 566392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom s = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL); 567392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 568392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 569392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(len = t_fromb64(tmp2, *salt))) 571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 572392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom s = BN_bin2bn(tmp2, len, NULL); 573392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 574392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 575392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 576392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(!SRP_create_verifier_BN(user, pass, &s, &v, N_bn, g_bn)) goto err; 577392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 578392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_bn2bin(v,tmp); 579392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (((vf = OPENSSL_malloc(BN_num_bytes(v)*2)) == NULL)) 580392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 581392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom t_tob64(vf, tmp, BN_num_bytes(v)); 582392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 583392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *verifier = vf; 584392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (*salt == NULL) 585392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 586392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *tmp_salt; 58704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom 58804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom if ((tmp_salt = OPENSSL_malloc(SRP_RANDOM_SALT_LEN * 2)) == NULL) 589392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 590392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vf); 591392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 592392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 593392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom t_tob64(tmp_salt, tmp2, SRP_RANDOM_SALT_LEN); 594392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *salt = tmp_salt; 595392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 596392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 597392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom result=defgNid; 598392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 599392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromerr: 600392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(N) 601392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 602392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_free(N_bn); 603392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_free(g_bn); 604392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 605392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return result; 606392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 607392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 608392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* 609392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom create a verifier (*salt,*verifier,g and N are BIGNUMs) 610392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom*/ 611392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromint SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, BIGNUM **verifier, BIGNUM *N, BIGNUM *g) 612392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 613392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int result=0; 614392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BIGNUM *x = NULL; 615392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_CTX *bn_ctx = BN_CTX_new(); 616392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp2[MAX_LEN]; 617392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 618392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((user == NULL)|| 619392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (pass == NULL)|| 620392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (salt == NULL)|| 621392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (verifier == NULL)|| 622392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (N == NULL)|| 623392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (g == NULL)|| 624392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (bn_ctx == NULL)) 625392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 626392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 627392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srp_bn_print(N); 628392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srp_bn_print(g); 629392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 630392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (*salt == NULL) 631392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 632392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN); 633392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 634392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *salt = BN_bin2bn(tmp2,SRP_RANDOM_SALT_LEN,NULL); 635392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 636392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 637392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom x = SRP_Calc_x(*salt,user,pass); 638392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 639392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *verifier = BN_new(); 640392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(*verifier == NULL) goto err; 641392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 642392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!BN_mod_exp(*verifier,g,x,N,bn_ctx)) 643392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 644392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_clear_free(*verifier); 645392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 646392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 647392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 648392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srp_bn_print(*verifier); 649392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 650392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom result=1; 651392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 652392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromerr: 653392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 654392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_clear_free(x); 655392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_CTX_free(bn_ctx); 656392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return result; 657392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 658392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 659392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 660392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 661392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 662