bn_mpi.c revision 656d9c7f52f88b3a3daccafa7655dec086c4756e
145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project/* crypto/bn/bn_mpi.c */ 245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 345aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * All rights reserved. 445aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 545aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * This package is an SSL implementation written 645aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * by Eric Young (eay@cryptsoft.com). 745aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 845aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 945aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * This library is free for commercial and non-commercial use as long as 1045aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * the following conditions are aheared to. The following conditions 1145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 1245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1345aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * included with this distribution is covered by the same copyright terms 1445aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 1545aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 1645aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 1745aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * the code are not to be removed. 1845aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 195542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet * as the author of the parts of the library used. 20cfa3a826f5924552889c750e6abb28d73b6d0597Romain Guy * This can be in the form of a textual message at program startup or 2145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * in documentation (online or textual) provided with the package. 2245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 2345aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 2445aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * modification, are permitted provided that the following conditions 2545aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * are met: 2645aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 1. Redistributions of source code must retain the copyright 2745aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 2845aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 2945aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 3045aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * documentation and/or other materials provided with the distribution. 3145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 3. All advertising materials mentioning features or use of this software 3245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * must display the following acknowledgement: 335542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet * "This product includes cryptographic software written by 34cfa3a826f5924552889c750e6abb28d73b6d0597Romain Guy * Eric Young (eay@cryptsoft.com)" 35cfa3a826f5924552889c750e6abb28d73b6d0597Romain Guy * The word 'cryptographic' can be left out if the rouines from the library 36cfa3a826f5924552889c750e6abb28d73b6d0597Romain Guy * being used are not cryptographic related :-). 37cfa3a826f5924552889c750e6abb28d73b6d0597Romain Guy * 4. If you include any Windows specific code (or a derivative thereof) from 3845aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 3945aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 4045aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 4145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4345aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4445aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4545aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4645aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4745aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4845aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4945aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5045aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * SUCH DAMAGE. 5245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * 5345aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * The licence and distribution terms for any publically available version or 5445aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 5545aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * copied and put under another distribution licence 5645aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project * [including the GNU Public Licence.] 5745aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project */ 5845aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project 5945aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project#include <stdio.h> 6045aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project#include "cryptlib.h" 6145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project#include "bn_lcl.h" 6245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project 6345aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Projectint BN_bn2mpi(const BIGNUM *a, unsigned char *d) 6445aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project { 6545aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project int bits; 6645aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project int num=0; 6745aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project int ext=0; 6845aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project long l; 6945aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project 7045aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project bits=BN_num_bits(a); 7145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project num=(bits+7)/8; 7245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project if (bits > 0) 7345aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project { 7445aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project ext=((bits & 0x07) == 0); 7545aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project } 7645aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project if (d == NULL) 7745aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project return(num+4+ext); 7845aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project 7945aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project l=num+ext; 8045aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project d[0]=(unsigned char)(l>>24)&0xff; 8145aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project d[1]=(unsigned char)(l>>16)&0xff; 8245aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project d[2]=(unsigned char)(l>> 8)&0xff; 83 d[3]=(unsigned char)(l )&0xff; 84 if (ext) d[4]=0; 85 num=BN_bn2bin(a,&(d[4+ext])); 86 if (a->neg) 87 d[4]|=0x80; 88 return(num+4+ext); 89 } 90 91BIGNUM *BN_mpi2bn(const unsigned char *d, int n, BIGNUM *a) 92 { 93 long len; 94 int neg=0; 95 96 if (n < 4) 97 { 98 BNerr(BN_F_BN_MPI2BN,BN_R_INVALID_LENGTH); 99 return(NULL); 100 } 101 len=((long)d[0]<<24)|((long)d[1]<<16)|((int)d[2]<<8)|(int)d[3]; 102 if ((len+4) != n) 103 { 104 BNerr(BN_F_BN_MPI2BN,BN_R_ENCODING_ERROR); 105 return(NULL); 106 } 107 108 if (a == NULL) a=BN_new(); 109 if (a == NULL) return(NULL); 110 111 if (len == 0) 112 { 113 a->neg=0; 114 a->top=0; 115 return(a); 116 } 117 d+=4; 118 if ((*d) & 0x80) 119 neg=1; 120 if (BN_bin2bn(d,(int)len,a) == NULL) 121 return(NULL); 122 a->neg=neg; 123 if (neg) 124 { 125 BN_clear_bit(a,BN_num_bits(a)-1); 126 } 127 bn_check_top(a); 128 return(a); 129 } 130 131