1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* crypto/bn/bn_print.c */ 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved. 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com). 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL. 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to. The following conditions 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA, 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed. 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used. 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package. 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met: 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer. 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer in the 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * documentation and/or other materials provided with the distribution. 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * must display the following acknowledgement: 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes cryptographic software written by 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Eric Young (eay@cryptsoft.com)" 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The word 'cryptographic' can be left out if the rouines from the library 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * being used are not cryptographic related :-). 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the apps directory (application code) you must include an acknowledgement: 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE. 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed. i.e. this code cannot simply be 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.] 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h> 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <ctype.h> 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "cryptlib.h" 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/buffer.h> 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "bn_lcl.h" 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic const char Hex[]="0123456789ABCDEF"; 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Must 'OPENSSL_free' the returned data */ 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgchar *BN_bn2hex(const BIGNUM *a) 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i,j,v,z=0; 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *buf; 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *p; 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buf=(char *)OPENSSL_malloc(a->top*BN_BYTES*2+2); 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (buf == NULL) 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BNerr(BN_F_BN_BN2HEX,ERR_R_MALLOC_FAILURE); 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p=buf; 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (a->neg) *(p++)='-'; 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BN_is_zero(a)) *(p++)='0'; 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (i=a->top-1; i >=0; i--) 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (j=BN_BITS2-8; j >= 0; j-=8) 86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* strip leading zeros */ 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org v=((int)(a->d[i]>>(long)j))&0xff; 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (z || (v != 0)) 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *(p++)=Hex[v>>4]; 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *(p++)=Hex[v&0x0f]; 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org z=1; 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *p='\0'; 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(buf); 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Must 'OPENSSL_free' the returned data */ 103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgchar *BN_bn2dec(const BIGNUM *a) 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i=0,num, ok = 0; 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *buf=NULL; 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *p; 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIGNUM *t=NULL; 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_ULONG *bn_data=NULL,*lp; 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* get an upper bound for the length of the decimal integer 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * num <= (BN_num_bits(a) + 1) * log(2) 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * <= 3 * BN_num_bits(a) * 0.1001 + log(2) + 1 (rounding error) 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * <= BN_num_bits(a)/10 + BN_num_bits/1000 + 1 + 1 115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=BN_num_bits(a)*3; 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org num=(i/10+i/1000+1)+1; 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bn_data=(BN_ULONG *)OPENSSL_malloc((num/BN_DEC_NUM+1)*sizeof(BN_ULONG)); 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buf=(char *)OPENSSL_malloc(num+3); 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((buf == NULL) || (bn_data == NULL)) 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BNerr(BN_F_BN_BN2DEC,ERR_R_MALLOC_FAILURE); 123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((t=BN_dup(a)) == NULL) goto err; 126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define BUF_REMAIN (num+3 - (size_t)(p - buf)) 128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p=buf; 129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org lp=bn_data; 130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BN_is_zero(t)) 131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *(p++)='0'; 133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *(p++)='\0'; 134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BN_is_negative(t)) 138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *p++ = '-'; 139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=0; 141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org while (!BN_is_zero(t)) 142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *lp=BN_div_word(t,BN_DEC_CONV); 144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org lp++; 145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org lp--; 147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* We now have a series of blocks, BN_DEC_NUM chars 148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in length, where the last one needs truncation. 149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The blocks need to be reversed in order. */ 150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_snprintf(p,BUF_REMAIN,BN_DEC_FMT1,*lp); 151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org while (*p) p++; 152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org while (lp != bn_data) 153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org lp--; 155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_snprintf(p,BUF_REMAIN,BN_DEC_FMT2,*lp); 156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org while (*p) p++; 157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = 1; 160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (bn_data != NULL) OPENSSL_free(bn_data); 162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (t != NULL) BN_free(t); 163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ok && buf) 164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org OPENSSL_free(buf); 166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org buf = NULL; 167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(buf); 170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint BN_hex2bn(BIGNUM **bn, const char *a) 173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIGNUM *ret=NULL; 175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_ULONG l=0; 176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int neg=0,h,m,i,j,k,c; 177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int num; 178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((a == NULL) || (*a == '\0')) return(0); 180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*a == '-') { neg=1; a++; } 182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (i=0; isxdigit((unsigned char) a[i]); i++) 184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ; 185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org num=i+neg; 187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (bn == NULL) return(num); 188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* a is the start of the hex digits, and it is 'i' long */ 190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*bn == NULL) 191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret=BN_new()) == NULL) return(0); 193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret= *bn; 197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_zero(ret); 198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* i is the number of hex digests; */ 201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (bn_expand(ret,i*4) == NULL) goto err; 202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org j=i; /* least significant 'hex' */ 204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org m=0; 205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org h=0; 206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org while (j > 0) 207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org m=((BN_BYTES*2) <= j)?(BN_BYTES*2):j; 209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=0; 210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (;;) 211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c=a[j-m]; 213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((c >= '0') && (c <= '9')) k=c-'0'; 214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if ((c >= 'a') && (c <= 'f')) k=c-'a'+10; 215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if ((c >= 'A') && (c <= 'F')) k=c-'A'+10; 216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else k=0; /* paranoia */ 217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=(l<<4)|k; 218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (--m <= 0) 220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->d[h++]=l; 222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org j-=(BN_BYTES*2); 226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->top=h; 228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bn_correct_top(ret); 229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->neg=neg; 230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *bn=ret; 232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bn_check_top(ret); 233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(num); 234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*bn == NULL) BN_free(ret); 236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint BN_dec2bn(BIGNUM **bn, const char *a) 240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIGNUM *ret=NULL; 242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_ULONG l=0; 243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int neg=0,i,j; 244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int num; 245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((a == NULL) || (*a == '\0')) return(0); 247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*a == '-') { neg=1; a++; } 248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (i=0; isdigit((unsigned char) a[i]); i++) 250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ; 251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org num=i+neg; 253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (bn == NULL) return(num); 254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* a is the start of the digits, and it is 'i' long. 256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * We chop it into BN_DEC_NUM digits at a time */ 257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*bn == NULL) 258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret=BN_new()) == NULL) return(0); 260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret= *bn; 264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_zero(ret); 265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* i is the number of digests, a bit of an over expand; */ 268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (bn_expand(ret,i*4) == NULL) goto err; 269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org j=BN_DEC_NUM-(i%BN_DEC_NUM); 271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (j == BN_DEC_NUM) j=0; 272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=0; 273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org while (*a) 274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l*=10; 276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l+= *a-'0'; 277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org a++; 278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (++j == BN_DEC_NUM) 279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_mul_word(ret,BN_DEC_CONV); 281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_add_word(ret,l); 282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=0; 283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org j=0; 284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret->neg=neg; 287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bn_correct_top(ret); 289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *bn=ret; 290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org bn_check_top(ret); 291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(num); 292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*bn == NULL) BN_free(ret); 294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 297480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgint BN_asc2bn(BIGNUM **bn, const char *a) 298480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 299480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org const char *p = a; 300480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (*p == '-') 301480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org p++; 302480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 303480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (p[0] == '0' && (p[1] == 'X' || p[1] == 'x')) 304480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 305480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (!BN_hex2bn(bn, p + 2)) 306480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 0; 307480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 308480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else 309480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 310480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (!BN_dec2bn(bn, p)) 311480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 0; 312480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 313480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (*a == '-') 314480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org (*bn)->neg = 1; 315480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 1; 316480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 317480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_BIO 319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_FP_API 320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint BN_print_fp(FILE *fp, const BIGNUM *a) 321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO *b; 323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret; 324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((b=BIO_new(BIO_s_file())) == NULL) 326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_set_fp(b,fp,BIO_NOCLOSE); 328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=BN_print(b,a); 329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_free(b); 330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint BN_print(BIO *bp, const BIGNUM *a) 335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i,j,v,z=0; 337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret=0; 338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((a->neg) && (BIO_write(bp,"-",1) != 1)) goto end; 340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BN_is_zero(a) && (BIO_write(bp,"0",1) != 1)) goto end; 341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (i=a->top-1; i >=0; i--) 342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (j=BN_BITS2-4; j >= 0; j-=4) 344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* strip leading zeros */ 346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org v=((int)(a->d[i]>>(long)j))&0x0f; 347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (z || (v != 0)) 348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BIO_write(bp,&(Hex[v]),1) != 1) 350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org z=1; 352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=1; 356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgend: 357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 3602c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org 3612c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.orgchar *BN_options(void) 3622c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org { 3632c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org static int init=0; 3642c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org static char data[16]; 3652c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org 3662c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org if (!init) 3672c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org { 3682c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org init++; 3692c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#ifdef BN_LLONG 3702c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org BIO_snprintf(data,sizeof data,"bn(%d,%d)", 3712c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org (int)sizeof(BN_ULLONG)*8,(int)sizeof(BN_ULONG)*8); 3722c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#else 3732c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org BIO_snprintf(data,sizeof data,"bn(%d,%d)", 3742c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org (int)sizeof(BN_ULONG)*8,(int)sizeof(BN_ULONG)*8); 3752c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#endif 3762c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org } 3772c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org return(data); 3782c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org } 379