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 } 96392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom size = i; 97392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom i = size - 1; 98392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom j = size; 99392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while(1) 100392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 101392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] = a[i]; 102392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(--i < 0) break; 103392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] |= (a[i] & 3) << 6; 104392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom --j; 105392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] = (unsigned char) ((a[i] & 0x3c) >> 2); 106392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(--i < 0) break; 107392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] |= (a[i] & 0xf) << 4; 108392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom --j; 109392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] = (unsigned char) ((a[i] & 0x30) >> 4); 110392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(--i < 0) break; 111392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[j] |= (a[i] << 2); 112392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 113392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom a[--j] = 0; 114392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(--i < 0) break; 115392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 116392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while(a[j] == 0 && j <= size) ++j; 117392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom i = 0; 118392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (j <= size) a[i++] = a[j++]; 119392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return i; 120392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 121392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 122392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 123392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* 124392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * Convert a raw byte string into a null-terminated base64 ASCII string. 125392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom */ 126392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic char *t_tob64(char *dst, const unsigned char *src, int size) 127392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 128392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int c, pos = size % 3; 129392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char b0 = 0, b1 = 0, b2 = 0, notleading = 0; 130392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *olddst = dst; 131392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 132392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom switch(pos) 133392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 134392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case 1: 135392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b2 = src[0]; 136392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 137392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case 2: 138392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b1 = src[0]; 139392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b2 = src[1]; 140392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 141392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 142392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 143392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while(1) 144392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 145392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom c = (b0 & 0xfc) >> 2; 146392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(notleading || c != 0) 147392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 148392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = b64table[c]; 149392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom notleading = 1; 150392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 151392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom c = ((b0 & 3) << 4) | ((b1 & 0xf0) >> 4); 152392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(notleading || c != 0) 153392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 154392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = b64table[c]; 155392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom notleading = 1; 156392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 157392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom c = ((b1 & 0xf) << 2) | ((b2 & 0xc0) >> 6); 158392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(notleading || c != 0) 159392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 160392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = b64table[c]; 161392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom notleading = 1; 162392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 163392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom c = b2 & 0x3f; 164392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(notleading || c != 0) 165392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 166392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = b64table[c]; 167392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom notleading = 1; 168392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 169392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(pos >= size) break; 170392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b0 = src[pos++]; 173392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b1 = src[pos++]; 174392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom b2 = src[pos++]; 175392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 176392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 177392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 178392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *dst++ = '\0'; 179392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return olddst; 180392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 181392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 182392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic void SRP_user_pwd_free(SRP_user_pwd *user_pwd) 183392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 184392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (user_pwd == NULL) 185392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return; 186392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_free(user_pwd->s); 187392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_clear_free(user_pwd->v); 188392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(user_pwd->id); 189392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(user_pwd->info); 190392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(user_pwd); 191392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 192392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 193392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic SRP_user_pwd *SRP_user_pwd_new() 194392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 195392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd *ret = OPENSSL_malloc(sizeof(SRP_user_pwd)); 196392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (ret == NULL) 197392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 198392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->N = NULL; 199392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->g = NULL; 200392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->s = NULL; 201392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->v = NULL; 202392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->id = NULL ; 203392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->info = NULL; 204392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return ret; 205392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 206392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 207392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic void SRP_user_pwd_set_gN(SRP_user_pwd *vinfo, const BIGNUM *g, 208392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const BIGNUM *N) 209392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 210392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vinfo->N = N; 211392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vinfo->g = g; 212392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 213392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 214392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic int SRP_user_pwd_set_ids(SRP_user_pwd *vinfo, const char *id, 215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const char *info) 216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (id != NULL && NULL == (vinfo->id = BUF_strdup(id))) 218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return (info == NULL || NULL != (vinfo->info = BUF_strdup(info))) ; 220392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 221392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 222392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic int SRP_user_pwd_set_sv(SRP_user_pwd *vinfo, const char *s, 223392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const char *v) 224392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 225392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp[MAX_LEN]; 226392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int len; 227392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 228392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (strlen(s) > MAX_LEN || strlen(v) > MAX_LEN) 229392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 230392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom len = t_fromb64(tmp, v); 231392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (NULL == (vinfo->v = BN_bin2bn(tmp, len, NULL)) ) 232392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 233392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom len = t_fromb64(tmp, s); 234392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return ((vinfo->s = BN_bin2bn(tmp, len, NULL)) != NULL) ; 235392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 236392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 237392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic int SRP_user_pwd_set_sv_BN(SRP_user_pwd *vinfo, BIGNUM *s, BIGNUM *v) 238392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 239392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vinfo->v = v; 240392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vinfo->s = s; 241392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return (vinfo->s != NULL && vinfo->v != NULL) ; 242392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 243392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 244392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSRP_VBASE *SRP_VBASE_new(char *seed_key) 245392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 246392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_VBASE *vb = (SRP_VBASE *) OPENSSL_malloc(sizeof(SRP_VBASE)); 247392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 248392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (vb == NULL) 249392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 250392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(vb->users_pwd = sk_SRP_user_pwd_new_null()) || 251392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom !(vb->gN_cache = sk_SRP_gN_cache_new_null())) 252392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 253392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vb); 254392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 255392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 256392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->default_g = NULL; 257392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->default_N = NULL; 258392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->seed_key = NULL; 259392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((seed_key != NULL) && 260392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (vb->seed_key = BUF_strdup(seed_key)) == NULL) 261392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 262392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_user_pwd_free(vb->users_pwd); 263392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_gN_cache_free(vb->gN_cache); 264392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vb); 265392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 266392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 267392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return vb; 268392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 269392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 270392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 271392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromint SRP_VBASE_free(SRP_VBASE *vb) 272392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 273392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_user_pwd_pop_free(vb->users_pwd,SRP_user_pwd_free); 274392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_gN_cache_free(vb->gN_cache); 275392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vb->seed_key); 276392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vb); 277392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 278392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 279392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 280392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 281392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic SRP_gN_cache *SRP_gN_new_init(const char *ch) 282392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 283392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp[MAX_LEN]; 284392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int len; 285392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 286392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN_cache *newgN = (SRP_gN_cache *)OPENSSL_malloc(sizeof(SRP_gN_cache)); 287392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (newgN == NULL) 288392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 289392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((newgN->b64_bn = BUF_strdup(ch)) == NULL) 291392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 293392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom len = t_fromb64(tmp, ch); 294392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((newgN->bn = BN_bin2bn(tmp, len, NULL))) 295392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return newgN; 296392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 297392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(newgN->b64_bn); 298392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromerr: 299392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(newgN); 300392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 301392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 302392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 303392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 304392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic void SRP_gN_free(SRP_gN_cache *gN_cache) 305392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 306392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN_cache == NULL) 307392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return; 308392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(gN_cache->b64_bn); 309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_free(gN_cache->bn); 310392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(gN_cache); 311392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 312392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic SRP_gN *SRP_get_gN_by_id(const char *id, STACK_OF(SRP_gN) *gN_tab) 314392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 315392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i; 316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 317392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN *gN; 318392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN_tab != NULL) 319392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for(i = 0; i < sk_SRP_gN_num(gN_tab); i++) 320392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 321392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom gN = sk_SRP_gN_value(gN_tab, i); 322392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN && (id == NULL || strcmp(gN->id,id)==0)) 323392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return gN; 324392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 325392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 326392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return SRP_get_default_gN(id); 327392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 328392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 329392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic BIGNUM *SRP_gN_place_bn(STACK_OF(SRP_gN_cache) *gN_cache, char *ch) 330392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i; 332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN_cache == NULL) 333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* search if we have already one... */ 336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for(i = 0; i < sk_SRP_gN_cache_num(gN_cache); i++) 337392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 338392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN_cache *cache = sk_SRP_gN_cache_value(gN_cache, i); 339392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (strcmp(cache->b64_bn,ch)==0) 340392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return cache->bn; 341392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 342392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { /* it is the first time that we find it */ 343392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN_cache *newgN = SRP_gN_new_init(ch); 344392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (newgN) 345392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 346392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (sk_SRP_gN_cache_insert(gN_cache,newgN,0)>0) 347392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return newgN->bn; 348392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN_free(newgN); 349392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 350392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 351392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 352392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 353392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 354392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* this function parses verifier file. Format is: 355392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * string(index):base64(N):base64(g):0 356392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * string(username):base64(v):base64(salt):int(index) 357392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom */ 358392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 359392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 360392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromint SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file) 361392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 362392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int error_code ; 363392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom STACK_OF(SRP_gN) *SRP_gN_tab = sk_SRP_gN_new_null(); 364392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *last_index = NULL; 365392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i; 366392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char **pp; 367392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 368392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN *gN = NULL; 369392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd *user_pwd = NULL ; 370392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 371392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom TXT_DB *tmpdb = NULL; 372392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BIO *in = BIO_new(BIO_s_file()); 373392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 374392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_OPEN_FILE; 375392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 376392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (in == NULL || BIO_read_filename(in,verifier_file) <= 0) 377392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 378392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 379392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_VBASE_INCOMPLETE_FILE; 380392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 381392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((tmpdb =TXT_DB_read(in,DB_NUMBER)) == NULL) 382392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 383392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 384392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_MEMORY; 385392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 386392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 387392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (vb->seed_key) 388392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 389392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom last_index = SRP_get_default_gN(NULL)->id; 390392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 391392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (i = 0; i < sk_OPENSSL_PSTRING_num(tmpdb->data); i++) 392392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 393392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom pp = (char **)sk_OPENSSL_PSTRING_value(tmpdb->data,i); 394392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (pp[DB_srptype][0] == DB_SRP_INDEX) 395392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 396392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /*we add this couple in the internal Stack */ 397392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 398392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((gN = (SRP_gN *)OPENSSL_malloc(sizeof(SRP_gN))) == NULL) 399392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 400392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 401392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(gN->id = BUF_strdup(pp[DB_srpid])) 402392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom || !(gN->N = SRP_gN_place_bn(vb->gN_cache,pp[DB_srpverifier])) 403392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom || !(gN->g = SRP_gN_place_bn(vb->gN_cache,pp[DB_srpsalt])) 404392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom || sk_SRP_gN_insert(SRP_gN_tab,gN,0) == 0) 405392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 406392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 407392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom gN = NULL; 408392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 409392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (vb->seed_key != NULL) 410392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 411392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom last_index = pp[DB_srpid]; 412392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 413392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 414392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (pp[DB_srptype][0] == DB_SRP_VALID) 415392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 416392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* it is a user .... */ 417392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN *lgN; 418392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((lgN = SRP_get_gN_by_id(pp[DB_srpgN],SRP_gN_tab))!=NULL) 419392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 420392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_MEMORY; 421392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((user_pwd = SRP_user_pwd_new()) == NULL) 422392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 423392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 424392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd_set_gN(user_pwd,lgN->g,lgN->N); 425392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!SRP_user_pwd_set_ids(user_pwd, pp[DB_srpid],pp[DB_srpinfo])) 426392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 427392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 428392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_VBASE_BN_LIB; 429392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!SRP_user_pwd_set_sv(user_pwd, pp[DB_srpsalt],pp[DB_srpverifier])) 430392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 431392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 432392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (sk_SRP_user_pwd_insert(vb->users_pwd, user_pwd, 0) == 0) 433392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 434392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom user_pwd = NULL; /* abandon responsability */ 435392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 436392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 437392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 438392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 439392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (last_index != NULL) 440392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 441392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* this means that we want to simulate a default user */ 442392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 443392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (((gN = SRP_get_gN_by_id(last_index,SRP_gN_tab))==NULL)) 444392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 445392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_ERR_VBASE_BN_LIB; 446392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 447392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 448392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->default_g = gN->g ; 449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom vb->default_N = gN->N ; 450392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom gN = NULL ; 451392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 452392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom error_code = SRP_NO_ERROR; 453392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 454392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom err: 455392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* there may be still some leaks to fix, if this fails, the application terminates most likely */ 456392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 457392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN != NULL) 458392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 459392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(gN->id); 460392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(gN); 461392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 462392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 463392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd_free(user_pwd); 464392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 465392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (tmpdb) TXT_DB_free(tmpdb); 466392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (in) BIO_free_all(in); 467392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 468392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sk_SRP_gN_free(SRP_gN_tab); 469392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 470392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return error_code; 471392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 472392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 473392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 474392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 475392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username) 476392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 477392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int i; 478392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd *user; 479392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char digv[SHA_DIGEST_LENGTH]; 480392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char digs[SHA_DIGEST_LENGTH]; 481392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_MD_CTX ctxt; 482392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 483392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (vb == NULL) 484392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 485392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for(i = 0; i < sk_SRP_user_pwd_num(vb->users_pwd); i++) 486392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 487392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom user = sk_SRP_user_pwd_value(vb->users_pwd, i); 488392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (strcmp(user->id,username)==0) 489392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return user; 490392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 491392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((vb->seed_key == NULL) || 492392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (vb->default_g == NULL) || 493392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (vb->default_N == NULL)) 494392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 495392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 496392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* if the user is unknown we set parameters as well if we have a seed_key */ 497392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 498392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((user = SRP_user_pwd_new()) == NULL) 499392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 500392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 501392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_user_pwd_set_gN(user,vb->default_g,vb->default_N); 502392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 503392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!SRP_user_pwd_set_ids(user,username,NULL)) 504392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 505392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 506392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom RAND_pseudo_bytes(digv, SHA_DIGEST_LENGTH); 507392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_MD_CTX_init(&ctxt); 508392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_DigestInit_ex(&ctxt, EVP_sha1(), NULL); 509392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_DigestUpdate(&ctxt, vb->seed_key, strlen(vb->seed_key)); 510392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_DigestUpdate(&ctxt, username, strlen(username)); 511392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_DigestFinal_ex(&ctxt, digs, NULL); 512392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_MD_CTX_cleanup(&ctxt); 513392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (SRP_user_pwd_set_sv_BN(user, BN_bin2bn(digs,SHA_DIGEST_LENGTH,NULL), BN_bin2bn(digv,SHA_DIGEST_LENGTH, NULL))) 514392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return user; 515392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 516392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromerr: SRP_user_pwd_free(user); 517392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NULL; 518392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 519392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 520392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 521392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* 522392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom create a verifier (*salt,*verifier,g and N are in base64) 523392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom*/ 524392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromchar *SRP_create_verifier(const char *user, const char *pass, char **salt, 525392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char **verifier, const char *N, const char *g) 526392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 527392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int len; 528392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char * result=NULL; 529392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *vf; 530392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BIGNUM *N_bn = NULL, *g_bn = NULL, *s = NULL, *v = NULL; 531392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp[MAX_LEN]; 532392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp2[MAX_LEN]; 533392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char * defgNid = NULL; 534392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 535392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((user == NULL)|| 536392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (pass == NULL)|| 537392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (salt == NULL)|| 538392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (verifier == NULL)) 539392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 540392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 541392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (N) 542392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 543392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(len = t_fromb64(tmp, N))) goto err; 544392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom N_bn = BN_bin2bn(tmp, len, NULL); 545392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(len = t_fromb64(tmp, g))) goto err; 546392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom g_bn = BN_bin2bn(tmp, len, NULL); 547392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom defgNid = "*"; 548392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 549392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 550392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 551392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SRP_gN * gN = SRP_get_gN_by_id(g, NULL) ; 552392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (gN == NULL) 553392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom N_bn = gN->N; 555392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom g_bn = gN->g; 556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom defgNid = gN->id; 557392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 558392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 559392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (*salt == NULL) 560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 561392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN); 562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 563392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom s = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL); 564392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 565392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 566392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 567392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!(len = t_fromb64(tmp2, *salt))) 568392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 569392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom s = BN_bin2bn(tmp2, len, NULL); 570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 572392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 573392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(!SRP_create_verifier_BN(user, pass, &s, &v, N_bn, g_bn)) goto err; 574392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 575392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_bn2bin(v,tmp); 576392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (((vf = OPENSSL_malloc(BN_num_bytes(v)*2)) == NULL)) 577392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 578392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom t_tob64(vf, tmp, BN_num_bytes(v)); 579392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 580392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *verifier = vf; 581392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (*salt == NULL) 582392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 583392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *tmp_salt; 584392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((tmp_salt = (char *)OPENSSL_malloc(SRP_RANDOM_SALT_LEN * 2)) == NULL) 585392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 586392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(vf); 587392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 588392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 589392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom t_tob64(tmp_salt, tmp2, SRP_RANDOM_SALT_LEN); 590392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *salt = tmp_salt; 591392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 592392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 593392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom result=defgNid; 594392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 595392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromerr: 596392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(N) 597392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 598392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_free(N_bn); 599392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_free(g_bn); 600392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 601392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return result; 602392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 603392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 604392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/* 605392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom create a verifier (*salt,*verifier,g and N are BIGNUMs) 606392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom*/ 607392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromint SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, BIGNUM **verifier, BIGNUM *N, BIGNUM *g) 608392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 609392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int result=0; 610392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BIGNUM *x = NULL; 611392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_CTX *bn_ctx = BN_CTX_new(); 612392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char tmp2[MAX_LEN]; 613392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 614392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((user == NULL)|| 615392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (pass == NULL)|| 616392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (salt == NULL)|| 617392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (verifier == NULL)|| 618392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (N == NULL)|| 619392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (g == NULL)|| 620392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (bn_ctx == NULL)) 621392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 622392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 623392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srp_bn_print(N); 624392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srp_bn_print(g); 625392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 626392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (*salt == NULL) 627392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 628392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN); 629392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 630392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *salt = BN_bin2bn(tmp2,SRP_RANDOM_SALT_LEN,NULL); 631392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 632392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 633392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom x = SRP_Calc_x(*salt,user,pass); 634392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 635392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom *verifier = BN_new(); 636392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if(*verifier == NULL) goto err; 637392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 638392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!BN_mod_exp(*verifier,g,x,N,bn_ctx)) 639392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 640392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_clear_free(*verifier); 641392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 642392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 643392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 644392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srp_bn_print(*verifier); 645392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 646392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom result=1; 647392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 648392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromerr: 649392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 650392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_clear_free(x); 651392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BN_CTX_free(bn_ctx); 652392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return result; 653392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 654392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 655392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 656392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 657392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 658