This commit was generated by cvs2svn to compensate for changes in r56083,
which included commits to RCS files with non-trunk default branches.
This commit is contained in:
commit
3cd1ecedd0
172
crypto/openssl/crypto/rsa/Makefile.ssl
Normal file
172
crypto/openssl/crypto/rsa/Makefile.ssl
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
#
|
||||||
|
# SSLeay/crypto/rsa/Makefile
|
||||||
|
#
|
||||||
|
|
||||||
|
DIR= rsa
|
||||||
|
TOP= ../..
|
||||||
|
CC= cc
|
||||||
|
INCLUDES= -I.. -I../../include
|
||||||
|
CFLAG=-g
|
||||||
|
INSTALL_PREFIX=
|
||||||
|
OPENSSLDIR= /usr/local/ssl
|
||||||
|
INSTALLTOP=/usr/local/ssl
|
||||||
|
MAKE= make -f Makefile.ssl
|
||||||
|
MAKEDEPEND= $(TOP)/util/domd $(TOP)
|
||||||
|
MAKEFILE= Makefile.ssl
|
||||||
|
AR= ar r
|
||||||
|
|
||||||
|
CFLAGS= $(INCLUDES) $(CFLAG)
|
||||||
|
|
||||||
|
GENERAL=Makefile
|
||||||
|
TEST=rsa_oaep_test.c
|
||||||
|
APPS=
|
||||||
|
|
||||||
|
LIB=$(TOP)/libcrypto.a
|
||||||
|
LIBSRC= rsa_eay.c rsa_gen.c rsa_lib.c rsa_sign.c rsa_saos.c rsa_err.c \
|
||||||
|
rsa_pk1.c rsa_ssl.c rsa_none.c rsa_oaep.c rsa_chk.c
|
||||||
|
LIBOBJ= rsa_eay.o rsa_gen.o rsa_lib.o rsa_sign.o rsa_saos.o rsa_err.o \
|
||||||
|
rsa_pk1.o rsa_ssl.o rsa_none.o rsa_oaep.o rsa_chk.o
|
||||||
|
|
||||||
|
SRC= $(LIBSRC)
|
||||||
|
|
||||||
|
EXHEADER= rsa.h
|
||||||
|
HEADER= $(EXHEADER)
|
||||||
|
|
||||||
|
ALL= $(GENERAL) $(SRC) $(HEADER)
|
||||||
|
|
||||||
|
top:
|
||||||
|
(cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
|
||||||
|
|
||||||
|
all: lib
|
||||||
|
|
||||||
|
lib: $(LIBOBJ)
|
||||||
|
$(AR) $(LIB) $(LIBOBJ)
|
||||||
|
$(RANLIB) $(LIB)
|
||||||
|
@touch lib
|
||||||
|
|
||||||
|
files:
|
||||||
|
$(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
|
||||||
|
|
||||||
|
links:
|
||||||
|
@$(TOP)/util/point.sh Makefile.ssl Makefile
|
||||||
|
@$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
|
||||||
|
@$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
|
||||||
|
@$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
|
||||||
|
|
||||||
|
install:
|
||||||
|
@for i in $(EXHEADER) ; \
|
||||||
|
do \
|
||||||
|
(cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
|
||||||
|
chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
|
||||||
|
done;
|
||||||
|
|
||||||
|
tags:
|
||||||
|
ctags $(SRC)
|
||||||
|
|
||||||
|
tests:
|
||||||
|
|
||||||
|
lint:
|
||||||
|
lint -DLINT $(INCLUDES) $(SRC)>fluff
|
||||||
|
|
||||||
|
depend:
|
||||||
|
$(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
|
||||||
|
|
||||||
|
dclean:
|
||||||
|
$(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
|
||||||
|
mv -f Makefile.new $(MAKEFILE)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
|
||||||
|
|
||||||
|
# DO NOT DELETE THIS LINE -- make depend depends on it.
|
||||||
|
|
||||||
|
rsa_chk.o: ../../include/openssl/bn.h ../../include/openssl/crypto.h
|
||||||
|
rsa_chk.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_chk.o: ../../include/openssl/opensslv.h ../../include/openssl/rsa.h
|
||||||
|
rsa_chk.o: ../../include/openssl/stack.h
|
||||||
|
rsa_eay.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||||
|
rsa_eay.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||||
|
rsa_eay.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_eay.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_eay.o: ../../include/openssl/opensslv.h ../../include/openssl/rand.h
|
||||||
|
rsa_eay.o: ../../include/openssl/rsa.h ../../include/openssl/stack.h
|
||||||
|
rsa_eay.o: ../cryptlib.h
|
||||||
|
rsa_err.o: ../../include/openssl/bn.h ../../include/openssl/crypto.h
|
||||||
|
rsa_err.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_err.o: ../../include/openssl/opensslv.h ../../include/openssl/rsa.h
|
||||||
|
rsa_err.o: ../../include/openssl/stack.h
|
||||||
|
rsa_gen.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||||
|
rsa_gen.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||||
|
rsa_gen.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_gen.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_gen.o: ../../include/openssl/opensslv.h ../../include/openssl/rsa.h
|
||||||
|
rsa_gen.o: ../../include/openssl/stack.h ../cryptlib.h
|
||||||
|
rsa_lib.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||||
|
rsa_lib.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||||
|
rsa_lib.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_lib.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
|
||||||
|
rsa_lib.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
|
||||||
|
rsa_lib.o: ../../include/openssl/rsa.h ../../include/openssl/stack.h
|
||||||
|
rsa_lib.o: ../cryptlib.h
|
||||||
|
rsa_none.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||||
|
rsa_none.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||||
|
rsa_none.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_none.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_none.o: ../../include/openssl/opensslv.h ../../include/openssl/rand.h
|
||||||
|
rsa_none.o: ../../include/openssl/rsa.h ../../include/openssl/stack.h
|
||||||
|
rsa_none.o: ../cryptlib.h
|
||||||
|
rsa_oaep.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||||
|
rsa_oaep.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||||
|
rsa_oaep.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_oaep.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_oaep.o: ../../include/openssl/opensslv.h ../../include/openssl/rand.h
|
||||||
|
rsa_oaep.o: ../../include/openssl/rsa.h ../../include/openssl/sha.h
|
||||||
|
rsa_oaep.o: ../../include/openssl/stack.h ../cryptlib.h
|
||||||
|
rsa_pk1.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||||
|
rsa_pk1.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||||
|
rsa_pk1.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_pk1.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_pk1.o: ../../include/openssl/opensslv.h ../../include/openssl/rand.h
|
||||||
|
rsa_pk1.o: ../../include/openssl/rsa.h ../../include/openssl/stack.h
|
||||||
|
rsa_pk1.o: ../cryptlib.h
|
||||||
|
rsa_saos.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||||
|
rsa_saos.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h
|
||||||
|
rsa_saos.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h
|
||||||
|
rsa_saos.o: ../../include/openssl/crypto.h ../../include/openssl/des.h
|
||||||
|
rsa_saos.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h
|
||||||
|
rsa_saos.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_saos.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||||
|
rsa_saos.o: ../../include/openssl/idea.h ../../include/openssl/md2.h
|
||||||
|
rsa_saos.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h
|
||||||
|
rsa_saos.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_saos.o: ../../include/openssl/opensslv.h ../../include/openssl/pkcs7.h
|
||||||
|
rsa_saos.o: ../../include/openssl/rc2.h ../../include/openssl/rc4.h
|
||||||
|
rsa_saos.o: ../../include/openssl/rc5.h ../../include/openssl/ripemd.h
|
||||||
|
rsa_saos.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h
|
||||||
|
rsa_saos.o: ../../include/openssl/sha.h ../../include/openssl/stack.h
|
||||||
|
rsa_saos.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||||
|
rsa_saos.o: ../cryptlib.h
|
||||||
|
rsa_sign.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||||
|
rsa_sign.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h
|
||||||
|
rsa_sign.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h
|
||||||
|
rsa_sign.o: ../../include/openssl/crypto.h ../../include/openssl/des.h
|
||||||
|
rsa_sign.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h
|
||||||
|
rsa_sign.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_sign.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||||
|
rsa_sign.o: ../../include/openssl/idea.h ../../include/openssl/md2.h
|
||||||
|
rsa_sign.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h
|
||||||
|
rsa_sign.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_sign.o: ../../include/openssl/opensslv.h ../../include/openssl/pkcs7.h
|
||||||
|
rsa_sign.o: ../../include/openssl/rc2.h ../../include/openssl/rc4.h
|
||||||
|
rsa_sign.o: ../../include/openssl/rc5.h ../../include/openssl/ripemd.h
|
||||||
|
rsa_sign.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h
|
||||||
|
rsa_sign.o: ../../include/openssl/sha.h ../../include/openssl/stack.h
|
||||||
|
rsa_sign.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||||
|
rsa_sign.o: ../cryptlib.h
|
||||||
|
rsa_ssl.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||||
|
rsa_ssl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||||
|
rsa_ssl.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||||
|
rsa_ssl.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||||
|
rsa_ssl.o: ../../include/openssl/opensslv.h ../../include/openssl/rand.h
|
||||||
|
rsa_ssl.o: ../../include/openssl/rsa.h ../../include/openssl/stack.h
|
||||||
|
rsa_ssl.o: ../cryptlib.h
|
317
crypto/openssl/crypto/rsa/rsa.h
Normal file
317
crypto/openssl/crypto/rsa/rsa.h
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
/* crypto/rsa/rsa.h */
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HEADER_RSA_H
|
||||||
|
#define HEADER_RSA_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/crypto.h>
|
||||||
|
|
||||||
|
#ifdef NO_RSA
|
||||||
|
#error RSA is disabled.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct rsa_st RSA;
|
||||||
|
|
||||||
|
typedef struct rsa_meth_st
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
int (*rsa_pub_enc)(int flen,unsigned char *from,unsigned char *to,
|
||||||
|
RSA *rsa,int padding);
|
||||||
|
int (*rsa_pub_dec)(int flen,unsigned char *from,unsigned char *to,
|
||||||
|
RSA *rsa,int padding);
|
||||||
|
int (*rsa_priv_enc)(int flen,unsigned char *from,unsigned char *to,
|
||||||
|
RSA *rsa,int padding);
|
||||||
|
int (*rsa_priv_dec)(int flen,unsigned char *from,unsigned char *to,
|
||||||
|
RSA *rsa,int padding);
|
||||||
|
int (*rsa_mod_exp)(BIGNUM *r0,BIGNUM *I,RSA *rsa); /* Can be null */
|
||||||
|
int (*bn_mod_exp)(BIGNUM *r, BIGNUM *a, const BIGNUM *p,
|
||||||
|
const BIGNUM *m, BN_CTX *ctx,
|
||||||
|
BN_MONT_CTX *m_ctx); /* Can be null */
|
||||||
|
int (*init)(RSA *rsa); /* called at new */
|
||||||
|
int (*finish)(RSA *rsa); /* called at free */
|
||||||
|
int flags; /* RSA_METHOD_FLAG_* things */
|
||||||
|
char *app_data; /* may be needed! */
|
||||||
|
} RSA_METHOD;
|
||||||
|
|
||||||
|
struct rsa_st
|
||||||
|
{
|
||||||
|
/* The first parameter is used to pickup errors where
|
||||||
|
* this is passed instead of aEVP_PKEY, it is set to 0 */
|
||||||
|
int pad;
|
||||||
|
int version;
|
||||||
|
RSA_METHOD *meth;
|
||||||
|
BIGNUM *n;
|
||||||
|
BIGNUM *e;
|
||||||
|
BIGNUM *d;
|
||||||
|
BIGNUM *p;
|
||||||
|
BIGNUM *q;
|
||||||
|
BIGNUM *dmp1;
|
||||||
|
BIGNUM *dmq1;
|
||||||
|
BIGNUM *iqmp;
|
||||||
|
/* be careful using this if the RSA structure is shared */
|
||||||
|
CRYPTO_EX_DATA ex_data;
|
||||||
|
int references;
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
/* Used to cache montgomery values */
|
||||||
|
BN_MONT_CTX *_method_mod_n;
|
||||||
|
BN_MONT_CTX *_method_mod_p;
|
||||||
|
BN_MONT_CTX *_method_mod_q;
|
||||||
|
|
||||||
|
/* all BIGNUM values are actually in the following data, if it is not
|
||||||
|
* NULL */
|
||||||
|
char *bignum_data;
|
||||||
|
BN_BLINDING *blinding;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define RSA_3 0x3L
|
||||||
|
#define RSA_F4 0x10001L
|
||||||
|
|
||||||
|
#define RSA_METHOD_FLAG_NO_CHECK 0x01 /* don't check pub/private match */
|
||||||
|
|
||||||
|
#define RSA_FLAG_CACHE_PUBLIC 0x02
|
||||||
|
#define RSA_FLAG_CACHE_PRIVATE 0x04
|
||||||
|
#define RSA_FLAG_BLINDING 0x08
|
||||||
|
#define RSA_FLAG_THREAD_SAFE 0x10
|
||||||
|
/* This flag means the private key operations will be handled by rsa_mod_exp
|
||||||
|
* and that they do not depend on the private key components being present:
|
||||||
|
* for example a key stored in external hardware. Without this flag bn_mod_exp
|
||||||
|
* gets called when private key components are absent.
|
||||||
|
*/
|
||||||
|
#define RSA_FLAG_EXT_PKEY 0x20
|
||||||
|
|
||||||
|
#define RSA_PKCS1_PADDING 1
|
||||||
|
#define RSA_SSLV23_PADDING 2
|
||||||
|
#define RSA_NO_PADDING 3
|
||||||
|
#define RSA_PKCS1_OAEP_PADDING 4
|
||||||
|
|
||||||
|
#define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,(char *)arg)
|
||||||
|
#define RSA_get_app_data(s) RSA_get_ex_data(s,0)
|
||||||
|
|
||||||
|
RSA * RSA_new(void);
|
||||||
|
RSA * RSA_new_method(RSA_METHOD *method);
|
||||||
|
int RSA_size(RSA *);
|
||||||
|
RSA * RSA_generate_key(int bits, unsigned long e,void
|
||||||
|
(*callback)(int,int,void *),void *cb_arg);
|
||||||
|
int RSA_check_key(RSA *);
|
||||||
|
/* next 4 return -1 on error */
|
||||||
|
int RSA_public_encrypt(int flen, unsigned char *from,
|
||||||
|
unsigned char *to, RSA *rsa,int padding);
|
||||||
|
int RSA_private_encrypt(int flen, unsigned char *from,
|
||||||
|
unsigned char *to, RSA *rsa,int padding);
|
||||||
|
int RSA_public_decrypt(int flen, unsigned char *from,
|
||||||
|
unsigned char *to, RSA *rsa,int padding);
|
||||||
|
int RSA_private_decrypt(int flen, unsigned char *from,
|
||||||
|
unsigned char *to, RSA *rsa,int padding);
|
||||||
|
void RSA_free (RSA *r);
|
||||||
|
|
||||||
|
int RSA_flags(RSA *r);
|
||||||
|
|
||||||
|
void RSA_set_default_method(RSA_METHOD *meth);
|
||||||
|
RSA_METHOD *RSA_get_default_method(void);
|
||||||
|
RSA_METHOD *RSA_get_method(RSA *rsa);
|
||||||
|
RSA_METHOD *RSA_set_method(RSA *rsa, RSA_METHOD *meth);
|
||||||
|
|
||||||
|
/* This function needs the memory locking malloc callbacks to be installed */
|
||||||
|
int RSA_memory_lock(RSA *r);
|
||||||
|
|
||||||
|
/* If you have RSAref compiled in. */
|
||||||
|
RSA_METHOD *RSA_PKCS1_RSAref(void);
|
||||||
|
|
||||||
|
/* these are the actual SSLeay RSA functions */
|
||||||
|
RSA_METHOD *RSA_PKCS1_SSLeay(void);
|
||||||
|
|
||||||
|
void ERR_load_RSA_strings(void );
|
||||||
|
|
||||||
|
RSA * d2i_RSAPublicKey(RSA **a, unsigned char **pp, long length);
|
||||||
|
int i2d_RSAPublicKey(RSA *a, unsigned char **pp);
|
||||||
|
RSA * d2i_RSAPrivateKey(RSA **a, unsigned char **pp, long length);
|
||||||
|
int i2d_RSAPrivateKey(RSA *a, unsigned char **pp);
|
||||||
|
#ifndef NO_FP_API
|
||||||
|
int RSA_print_fp(FILE *fp, RSA *r,int offset);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HEADER_BIO_H
|
||||||
|
int RSA_print(BIO *bp, RSA *r,int offset);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int i2d_Netscape_RSA(RSA *a, unsigned char **pp, int (*cb)());
|
||||||
|
RSA *d2i_Netscape_RSA(RSA **a, unsigned char **pp, long length, int (*cb)());
|
||||||
|
/* Naughty internal function required elsewhere, to handle a MS structure
|
||||||
|
* that is the same as the netscape one :-) */
|
||||||
|
RSA *d2i_Netscape_RSA_2(RSA **a, unsigned char **pp, long length, int (*cb)());
|
||||||
|
|
||||||
|
/* The following 2 functions sign and verify a X509_SIG ASN1 object
|
||||||
|
* inside PKCS#1 padded RSA encryption */
|
||||||
|
int RSA_sign(int type, unsigned char *m, unsigned int m_len,
|
||||||
|
unsigned char *sigret, unsigned int *siglen, RSA *rsa);
|
||||||
|
int RSA_verify(int type, unsigned char *m, unsigned int m_len,
|
||||||
|
unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
|
||||||
|
|
||||||
|
/* The following 2 function sign and verify a ASN1_OCTET_STRING
|
||||||
|
* object inside PKCS#1 padded RSA encryption */
|
||||||
|
int RSA_sign_ASN1_OCTET_STRING(int type, unsigned char *m, unsigned int m_len,
|
||||||
|
unsigned char *sigret, unsigned int *siglen, RSA *rsa);
|
||||||
|
int RSA_verify_ASN1_OCTET_STRING(int type, unsigned char *m, unsigned int m_len,
|
||||||
|
unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
|
||||||
|
|
||||||
|
int RSA_blinding_on(RSA *rsa, BN_CTX *ctx);
|
||||||
|
void RSA_blinding_off(RSA *rsa);
|
||||||
|
|
||||||
|
int RSA_padding_add_PKCS1_type_1(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl);
|
||||||
|
int RSA_padding_check_PKCS1_type_1(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl,int rsa_len);
|
||||||
|
int RSA_padding_add_PKCS1_type_2(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl);
|
||||||
|
int RSA_padding_check_PKCS1_type_2(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl,int rsa_len);
|
||||||
|
int RSA_padding_add_PKCS1_OAEP(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl,unsigned char *p,
|
||||||
|
int pl);
|
||||||
|
int RSA_padding_check_PKCS1_OAEP(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl,int rsa_len,
|
||||||
|
unsigned char *p,int pl);
|
||||||
|
int RSA_padding_add_SSLv23(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl);
|
||||||
|
int RSA_padding_check_SSLv23(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl,int rsa_len);
|
||||||
|
int RSA_padding_add_none(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl);
|
||||||
|
int RSA_padding_check_none(unsigned char *to,int tlen,
|
||||||
|
unsigned char *f,int fl,int rsa_len);
|
||||||
|
|
||||||
|
int RSA_get_ex_new_index(long argl, char *argp, int (*new_func)(),
|
||||||
|
int (*dup_func)(), void (*free_func)());
|
||||||
|
int RSA_set_ex_data(RSA *r,int idx,char *arg);
|
||||||
|
char *RSA_get_ex_data(RSA *r, int idx);
|
||||||
|
|
||||||
|
/* BEGIN ERROR CODES */
|
||||||
|
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||||
|
* made after this point may be overwritten when the script is next run.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Error codes for the RSA functions. */
|
||||||
|
|
||||||
|
/* Function codes. */
|
||||||
|
#define RSA_F_MEMORY_LOCK 100
|
||||||
|
#define RSA_F_RSA_CHECK_KEY 123
|
||||||
|
#define RSA_F_RSA_EAY_PRIVATE_DECRYPT 101
|
||||||
|
#define RSA_F_RSA_EAY_PRIVATE_ENCRYPT 102
|
||||||
|
#define RSA_F_RSA_EAY_PUBLIC_DECRYPT 103
|
||||||
|
#define RSA_F_RSA_EAY_PUBLIC_ENCRYPT 104
|
||||||
|
#define RSA_F_RSA_GENERATE_KEY 105
|
||||||
|
#define RSA_F_RSA_NEW_METHOD 106
|
||||||
|
#define RSA_F_RSA_PADDING_ADD_NONE 107
|
||||||
|
#define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121
|
||||||
|
#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 108
|
||||||
|
#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 109
|
||||||
|
#define RSA_F_RSA_PADDING_ADD_SSLV23 110
|
||||||
|
#define RSA_F_RSA_PADDING_CHECK_NONE 111
|
||||||
|
#define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122
|
||||||
|
#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 112
|
||||||
|
#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 113
|
||||||
|
#define RSA_F_RSA_PADDING_CHECK_SSLV23 114
|
||||||
|
#define RSA_F_RSA_PRINT 115
|
||||||
|
#define RSA_F_RSA_PRINT_FP 116
|
||||||
|
#define RSA_F_RSA_SIGN 117
|
||||||
|
#define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118
|
||||||
|
#define RSA_F_RSA_VERIFY 119
|
||||||
|
#define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING 120
|
||||||
|
|
||||||
|
/* Reason codes. */
|
||||||
|
#define RSA_R_ALGORITHM_MISMATCH 100
|
||||||
|
#define RSA_R_BAD_E_VALUE 101
|
||||||
|
#define RSA_R_BAD_FIXED_HEADER_DECRYPT 102
|
||||||
|
#define RSA_R_BAD_PAD_BYTE_COUNT 103
|
||||||
|
#define RSA_R_BAD_SIGNATURE 104
|
||||||
|
#define RSA_R_BLOCK_TYPE_IS_NOT_01 106
|
||||||
|
#define RSA_R_BLOCK_TYPE_IS_NOT_02 107
|
||||||
|
#define RSA_R_DATA_GREATER_THAN_MOD_LEN 108
|
||||||
|
#define RSA_R_DATA_TOO_LARGE 109
|
||||||
|
#define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110
|
||||||
|
#define RSA_R_DATA_TOO_SMALL 111
|
||||||
|
#define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122
|
||||||
|
#define RSA_R_D_E_NOT_CONGRUENT_TO_1 123
|
||||||
|
#define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112
|
||||||
|
#define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124
|
||||||
|
#define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125
|
||||||
|
#define RSA_R_IQMP_NOT_INVERSE_OF_Q 126
|
||||||
|
#define RSA_R_KEY_SIZE_TOO_SMALL 120
|
||||||
|
#define RSA_R_NULL_BEFORE_BLOCK_MISSING 113
|
||||||
|
#define RSA_R_N_DOES_NOT_EQUAL_P_Q 127
|
||||||
|
#define RSA_R_OAEP_DECODING_ERROR 121
|
||||||
|
#define RSA_R_PADDING_CHECK_FAILED 114
|
||||||
|
#define RSA_R_P_NOT_PRIME 128
|
||||||
|
#define RSA_R_Q_NOT_PRIME 129
|
||||||
|
#define RSA_R_SSLV3_ROLLBACK_ATTACK 115
|
||||||
|
#define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116
|
||||||
|
#define RSA_R_UNKNOWN_ALGORITHM_TYPE 117
|
||||||
|
#define RSA_R_UNKNOWN_PADDING_TYPE 118
|
||||||
|
#define RSA_R_WRONG_SIGNATURE_LENGTH 119
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
184
crypto/openssl/crypto/rsa/rsa_chk.c
Normal file
184
crypto/openssl/crypto/rsa/rsa_chk.c
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
/* crypto/rsa/rsa_chk.c -*- Mode: C; c-file-style: "eay" -*- */
|
||||||
|
/* ====================================================================
|
||||||
|
* Copyright (c) 1999 The OpenSSL Project. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* 3. All advertising materials mentioning features or use of this
|
||||||
|
* software must display the following acknowledgment:
|
||||||
|
* "This product includes software developed by the OpenSSL Project
|
||||||
|
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||||
|
*
|
||||||
|
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||||
|
* endorse or promote products derived from this software without
|
||||||
|
* prior written permission. For written permission, please contact
|
||||||
|
* openssl-core@OpenSSL.org.
|
||||||
|
*
|
||||||
|
* 5. Products derived from this software may not be called "OpenSSL"
|
||||||
|
* nor may "OpenSSL" appear in their names without prior written
|
||||||
|
* permission of the OpenSSL Project.
|
||||||
|
*
|
||||||
|
* 6. Redistributions of any form whatsoever must retain the following
|
||||||
|
* acknowledgment:
|
||||||
|
* "This product includes software developed by the OpenSSL Project
|
||||||
|
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||||
|
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||||
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
|
||||||
|
|
||||||
|
int RSA_check_key(RSA *key)
|
||||||
|
{
|
||||||
|
BIGNUM *i, *j, *k, *l, *m;
|
||||||
|
BN_CTX *ctx;
|
||||||
|
int r;
|
||||||
|
int ret=1;
|
||||||
|
|
||||||
|
i = BN_new();
|
||||||
|
j = BN_new();
|
||||||
|
k = BN_new();
|
||||||
|
l = BN_new();
|
||||||
|
m = BN_new();
|
||||||
|
ctx = BN_CTX_new();
|
||||||
|
if (i == NULL || j == NULL || k == NULL || l == NULL ||
|
||||||
|
m == NULL || ctx == NULL)
|
||||||
|
{
|
||||||
|
ret = -1;
|
||||||
|
RSAerr(RSA_F_RSA_CHECK_KEY, ERR_R_MALLOC_FAILURE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* p prime? */
|
||||||
|
r = BN_is_prime(key->p, BN_prime_checks, NULL, NULL, NULL);
|
||||||
|
if (r != 1)
|
||||||
|
{
|
||||||
|
ret = r;
|
||||||
|
if (r != 0)
|
||||||
|
goto err;
|
||||||
|
RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_P_NOT_PRIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* q prime? */
|
||||||
|
r = BN_is_prime(key->q, BN_prime_checks, NULL, NULL, NULL);
|
||||||
|
if (r != 1)
|
||||||
|
{
|
||||||
|
ret = r;
|
||||||
|
if (r != 0)
|
||||||
|
goto err;
|
||||||
|
RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_Q_NOT_PRIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* n = p*q? */
|
||||||
|
r = BN_mul(i, key->p, key->q, ctx);
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
|
||||||
|
if (BN_cmp(i, key->n) != 0)
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_N_DOES_NOT_EQUAL_P_Q);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* d*e = 1 mod lcm(p-1,q-1)? */
|
||||||
|
|
||||||
|
r = BN_sub(i, key->p, BN_value_one());
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
r = BN_sub(j, key->q, BN_value_one());
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
|
||||||
|
/* now compute k = lcm(i,j) */
|
||||||
|
r = BN_mul(l, i, j, ctx);
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
r = BN_gcd(m, i, j, ctx);
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
r = BN_div(k, NULL, l, m, ctx); /* remainder is 0 */
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
|
||||||
|
r = BN_mod_mul(i, key->d, key->e, k, ctx);
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
|
||||||
|
if (!BN_is_one(i))
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_D_E_NOT_CONGRUENT_TO_1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key->dmp1 != NULL && key->dmq1 != NULL && key->iqmp != NULL)
|
||||||
|
{
|
||||||
|
/* dmp1 = d mod (p-1)? */
|
||||||
|
r = BN_sub(i, key->p, BN_value_one());
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
|
||||||
|
r = BN_mod(j, key->d, i, ctx);
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
|
||||||
|
if (BN_cmp(j, key->dmp1) != 0)
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
RSAerr(RSA_F_RSA_CHECK_KEY,
|
||||||
|
RSA_R_DMP1_NOT_CONGRUENT_TO_D);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dmq1 = d mod (q-1)? */
|
||||||
|
r = BN_sub(i, key->q, BN_value_one());
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
|
||||||
|
r = BN_mod(j, key->d, i, ctx);
|
||||||
|
if (!r) { ret = -1; goto err; }
|
||||||
|
|
||||||
|
if (BN_cmp(j, key->dmq1) != 0)
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
RSAerr(RSA_F_RSA_CHECK_KEY,
|
||||||
|
RSA_R_DMQ1_NOT_CONGRUENT_TO_D);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iqmp = q^-1 mod p? */
|
||||||
|
if(!BN_mod_inverse(i, key->q, key->p, ctx))
|
||||||
|
{
|
||||||
|
ret = -1;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BN_cmp(i, key->iqmp) != 0)
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
RSAerr(RSA_F_RSA_CHECK_KEY,
|
||||||
|
RSA_R_IQMP_NOT_INVERSE_OF_Q);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err:
|
||||||
|
if (i != NULL) BN_free(i);
|
||||||
|
if (j != NULL) BN_free(j);
|
||||||
|
if (k != NULL) BN_free(k);
|
||||||
|
if (l != NULL) BN_free(l);
|
||||||
|
if (m != NULL) BN_free(m);
|
||||||
|
if (ctx != NULL) BN_CTX_free(ctx);
|
||||||
|
return (ret);
|
||||||
|
}
|
144
crypto/openssl/crypto/rsa/rsa_err.c
Normal file
144
crypto/openssl/crypto/rsa/rsa_err.c
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
/* crypto/rsa/rsa_err.c */
|
||||||
|
/* ====================================================================
|
||||||
|
* Copyright (c) 1999 The OpenSSL Project. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* 3. All advertising materials mentioning features or use of this
|
||||||
|
* software must display the following acknowledgment:
|
||||||
|
* "This product includes software developed by the OpenSSL Project
|
||||||
|
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||||
|
*
|
||||||
|
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||||
|
* endorse or promote products derived from this software without
|
||||||
|
* prior written permission. For written permission, please contact
|
||||||
|
* openssl-core@OpenSSL.org.
|
||||||
|
*
|
||||||
|
* 5. Products derived from this software may not be called "OpenSSL"
|
||||||
|
* nor may "OpenSSL" appear in their names without prior written
|
||||||
|
* permission of the OpenSSL Project.
|
||||||
|
*
|
||||||
|
* 6. Redistributions of any form whatsoever must retain the following
|
||||||
|
* acknowledgment:
|
||||||
|
* "This product includes software developed by the OpenSSL Project
|
||||||
|
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||||
|
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||||
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
* ====================================================================
|
||||||
|
*
|
||||||
|
* This product includes cryptographic software written by Eric Young
|
||||||
|
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||||
|
* Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* NOTE: this file was auto generated by the mkerr.pl script: any changes
|
||||||
|
* made to it will be overwritten when the script next updates this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
|
||||||
|
/* BEGIN ERROR CODES */
|
||||||
|
#ifndef NO_ERR
|
||||||
|
static ERR_STRING_DATA RSA_str_functs[]=
|
||||||
|
{
|
||||||
|
{ERR_PACK(0,RSA_F_MEMORY_LOCK,0), "MEMORY_LOCK"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_CHECK_KEY,0), "RSA_check_key"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_EAY_PRIVATE_DECRYPT,0), "RSA_EAY_PRIVATE_DECRYPT"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_EAY_PRIVATE_ENCRYPT,0), "RSA_EAY_PRIVATE_ENCRYPT"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_EAY_PUBLIC_DECRYPT,0), "RSA_EAY_PUBLIC_DECRYPT"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_EAY_PUBLIC_ENCRYPT,0), "RSA_EAY_PUBLIC_ENCRYPT"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_GENERATE_KEY,0), "RSA_generate_key"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_NEW_METHOD,0), "RSA_new_method"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_ADD_NONE,0), "RSA_padding_add_none"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_ADD_PKCS1_OAEP,0), "RSA_padding_add_PKCS1_OAEP"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1,0), "RSA_padding_add_PKCS1_type_1"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2,0), "RSA_padding_add_PKCS1_type_2"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_ADD_SSLV23,0), "RSA_padding_add_SSLv23"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_CHECK_NONE,0), "RSA_padding_check_none"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP,0), "RSA_padding_check_PKCS1_OAEP"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1,0), "RSA_padding_check_PKCS1_type_1"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2,0), "RSA_padding_check_PKCS1_type_2"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PADDING_CHECK_SSLV23,0), "RSA_padding_check_SSLv23"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PRINT,0), "RSA_print"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_PRINT_FP,0), "RSA_print_fp"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_SIGN,0), "RSA_sign"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_SIGN_ASN1_OCTET_STRING,0), "RSA_sign_ASN1_OCTET_STRING"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_VERIFY,0), "RSA_verify"},
|
||||||
|
{ERR_PACK(0,RSA_F_RSA_VERIFY_ASN1_OCTET_STRING,0), "RSA_verify_ASN1_OCTET_STRING"},
|
||||||
|
{0,NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static ERR_STRING_DATA RSA_str_reasons[]=
|
||||||
|
{
|
||||||
|
{RSA_R_ALGORITHM_MISMATCH ,"algorithm mismatch"},
|
||||||
|
{RSA_R_BAD_E_VALUE ,"bad e value"},
|
||||||
|
{RSA_R_BAD_FIXED_HEADER_DECRYPT ,"bad fixed header decrypt"},
|
||||||
|
{RSA_R_BAD_PAD_BYTE_COUNT ,"bad pad byte count"},
|
||||||
|
{RSA_R_BAD_SIGNATURE ,"bad signature"},
|
||||||
|
{RSA_R_BLOCK_TYPE_IS_NOT_01 ,"block type is not 01"},
|
||||||
|
{RSA_R_BLOCK_TYPE_IS_NOT_02 ,"block type is not 02"},
|
||||||
|
{RSA_R_DATA_GREATER_THAN_MOD_LEN ,"data greater than mod len"},
|
||||||
|
{RSA_R_DATA_TOO_LARGE ,"data too large"},
|
||||||
|
{RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE ,"data too large for key size"},
|
||||||
|
{RSA_R_DATA_TOO_SMALL ,"data too small"},
|
||||||
|
{RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE ,"data too small for key size"},
|
||||||
|
{RSA_R_D_E_NOT_CONGRUENT_TO_1 ,"d e not congruent to 1"},
|
||||||
|
{RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY ,"digest too big for rsa key"},
|
||||||
|
{RSA_R_DMP1_NOT_CONGRUENT_TO_D ,"dmp1 not congruent to d"},
|
||||||
|
{RSA_R_DMQ1_NOT_CONGRUENT_TO_D ,"dmq1 not congruent to d"},
|
||||||
|
{RSA_R_IQMP_NOT_INVERSE_OF_Q ,"iqmp not inverse of q"},
|
||||||
|
{RSA_R_KEY_SIZE_TOO_SMALL ,"key size too small"},
|
||||||
|
{RSA_R_NULL_BEFORE_BLOCK_MISSING ,"null before block missing"},
|
||||||
|
{RSA_R_N_DOES_NOT_EQUAL_P_Q ,"n does not equal p q"},
|
||||||
|
{RSA_R_OAEP_DECODING_ERROR ,"oaep decoding error"},
|
||||||
|
{RSA_R_PADDING_CHECK_FAILED ,"padding check failed"},
|
||||||
|
{RSA_R_P_NOT_PRIME ,"p not prime"},
|
||||||
|
{RSA_R_Q_NOT_PRIME ,"q not prime"},
|
||||||
|
{RSA_R_SSLV3_ROLLBACK_ATTACK ,"sslv3 rollback attack"},
|
||||||
|
{RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD,"the asn1 object identifier is not known for this md"},
|
||||||
|
{RSA_R_UNKNOWN_ALGORITHM_TYPE ,"unknown algorithm type"},
|
||||||
|
{RSA_R_UNKNOWN_PADDING_TYPE ,"unknown padding type"},
|
||||||
|
{RSA_R_WRONG_SIGNATURE_LENGTH ,"wrong signature length"},
|
||||||
|
{0,NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ERR_load_RSA_strings(void)
|
||||||
|
{
|
||||||
|
static int init=1;
|
||||||
|
|
||||||
|
if (init)
|
||||||
|
{
|
||||||
|
init=0;
|
||||||
|
#ifndef NO_ERR
|
||||||
|
ERR_load_strings(ERR_LIB_RSA,RSA_str_functs);
|
||||||
|
ERR_load_strings(ERR_LIB_RSA,RSA_str_reasons);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
195
crypto/openssl/crypto/rsa/rsa_gen.c
Normal file
195
crypto/openssl/crypto/rsa/rsa_gen.c
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
/* crypto/rsa/rsa_gen.c */
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "cryptlib.h"
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
|
||||||
|
RSA *RSA_generate_key(int bits, unsigned long e_value,
|
||||||
|
void (*callback)(int,int,void *), void *cb_arg)
|
||||||
|
{
|
||||||
|
RSA *rsa=NULL;
|
||||||
|
BIGNUM *r0=NULL,*r1=NULL,*r2=NULL,*r3=NULL,*tmp;
|
||||||
|
int bitsp,bitsq,ok= -1,n=0,i;
|
||||||
|
BN_CTX *ctx=NULL,*ctx2=NULL;
|
||||||
|
|
||||||
|
ctx=BN_CTX_new();
|
||||||
|
if (ctx == NULL) goto err;
|
||||||
|
ctx2=BN_CTX_new();
|
||||||
|
if (ctx2 == NULL) goto err;
|
||||||
|
r0= &(ctx->bn[0]);
|
||||||
|
r1= &(ctx->bn[1]);
|
||||||
|
r2= &(ctx->bn[2]);
|
||||||
|
r3= &(ctx->bn[3]);
|
||||||
|
ctx->tos+=4;
|
||||||
|
|
||||||
|
bitsp=(bits+1)/2;
|
||||||
|
bitsq=bits-bitsp;
|
||||||
|
rsa=RSA_new();
|
||||||
|
if (rsa == NULL) goto err;
|
||||||
|
|
||||||
|
/* set e */
|
||||||
|
rsa->e=BN_new();
|
||||||
|
if (rsa->e == NULL) goto err;
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
/* The problem is when building with 8, 16, or 32 BN_ULONG,
|
||||||
|
* unsigned long can be larger */
|
||||||
|
for (i=0; i<sizeof(unsigned long)*8; i++)
|
||||||
|
{
|
||||||
|
if (e_value & (1<<i))
|
||||||
|
BN_set_bit(rsa->e,i);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (!BN_set_word(rsa->e,e_value)) goto err;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* generate p and q */
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
rsa->p=BN_generate_prime(NULL,bitsp,0,NULL,NULL,callback,cb_arg);
|
||||||
|
if (rsa->p == NULL) goto err;
|
||||||
|
if (!BN_sub(r2,rsa->p,BN_value_one())) goto err;
|
||||||
|
if (!BN_gcd(r1,r2,rsa->e,ctx)) goto err;
|
||||||
|
if (BN_is_one(r1)) break;
|
||||||
|
if (callback != NULL) callback(2,n++,cb_arg);
|
||||||
|
BN_free(rsa->p);
|
||||||
|
}
|
||||||
|
if (callback != NULL) callback(3,0,cb_arg);
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
rsa->q=BN_generate_prime(NULL,bitsq,0,NULL,NULL,callback,cb_arg);
|
||||||
|
if (rsa->q == NULL) goto err;
|
||||||
|
if (!BN_sub(r2,rsa->q,BN_value_one())) goto err;
|
||||||
|
if (!BN_gcd(r1,r2,rsa->e,ctx)) goto err;
|
||||||
|
if (BN_is_one(r1) && (BN_cmp(rsa->p,rsa->q) != 0))
|
||||||
|
break;
|
||||||
|
if (callback != NULL) callback(2,n++,cb_arg);
|
||||||
|
BN_free(rsa->q);
|
||||||
|
}
|
||||||
|
if (callback != NULL) callback(3,1,cb_arg);
|
||||||
|
if (BN_cmp(rsa->p,rsa->q) < 0)
|
||||||
|
{
|
||||||
|
tmp=rsa->p;
|
||||||
|
rsa->p=rsa->q;
|
||||||
|
rsa->q=tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate n */
|
||||||
|
rsa->n=BN_new();
|
||||||
|
if (rsa->n == NULL) goto err;
|
||||||
|
if (!BN_mul(rsa->n,rsa->p,rsa->q,ctx)) goto err;
|
||||||
|
|
||||||
|
/* calculate d */
|
||||||
|
if (!BN_sub(r1,rsa->p,BN_value_one())) goto err; /* p-1 */
|
||||||
|
if (!BN_sub(r2,rsa->q,BN_value_one())) goto err; /* q-1 */
|
||||||
|
if (!BN_mul(r0,r1,r2,ctx)) goto err; /* (p-1)(q-1) */
|
||||||
|
|
||||||
|
/* should not be needed, since gcd(p-1,e) == 1 and gcd(q-1,e) == 1 */
|
||||||
|
/* for (;;)
|
||||||
|
{
|
||||||
|
if (!BN_gcd(r3,r0,rsa->e,ctx)) goto err;
|
||||||
|
if (BN_is_one(r3)) break;
|
||||||
|
|
||||||
|
if (1)
|
||||||
|
{
|
||||||
|
if (!BN_add_word(rsa->e,2L)) goto err;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
RSAerr(RSA_F_RSA_GENERATE_KEY,RSA_R_BAD_E_VALUE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
rsa->d=BN_mod_inverse(NULL,rsa->e,r0,ctx2); /* d */
|
||||||
|
if (rsa->d == NULL) goto err;
|
||||||
|
|
||||||
|
/* calculate d mod (p-1) */
|
||||||
|
rsa->dmp1=BN_new();
|
||||||
|
if (rsa->dmp1 == NULL) goto err;
|
||||||
|
if (!BN_mod(rsa->dmp1,rsa->d,r1,ctx)) goto err;
|
||||||
|
|
||||||
|
/* calculate d mod (q-1) */
|
||||||
|
rsa->dmq1=BN_new();
|
||||||
|
if (rsa->dmq1 == NULL) goto err;
|
||||||
|
if (!BN_mod(rsa->dmq1,rsa->d,r2,ctx)) goto err;
|
||||||
|
|
||||||
|
/* calculate inverse of q mod p */
|
||||||
|
rsa->iqmp=BN_mod_inverse(NULL,rsa->q,rsa->p,ctx2);
|
||||||
|
if (rsa->iqmp == NULL) goto err;
|
||||||
|
|
||||||
|
ok=1;
|
||||||
|
err:
|
||||||
|
if (ok == -1)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_GENERATE_KEY,ERR_LIB_BN);
|
||||||
|
ok=0;
|
||||||
|
}
|
||||||
|
BN_CTX_free(ctx);
|
||||||
|
BN_CTX_free(ctx2);
|
||||||
|
|
||||||
|
if (!ok)
|
||||||
|
{
|
||||||
|
if (rsa != NULL) RSA_free(rsa);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return(rsa);
|
||||||
|
}
|
||||||
|
|
329
crypto/openssl/crypto/rsa/rsa_lib.c
Normal file
329
crypto/openssl/crypto/rsa/rsa_lib.c
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
/* crypto/rsa/rsa_lib.c */
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <openssl/crypto.h>
|
||||||
|
#include "cryptlib.h"
|
||||||
|
#include <openssl/lhash.h>
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
|
||||||
|
const char *RSA_version="RSA" OPENSSL_VERSION_PTEXT;
|
||||||
|
|
||||||
|
static RSA_METHOD *default_RSA_meth=NULL;
|
||||||
|
static int rsa_meth_num=0;
|
||||||
|
static STACK *rsa_meth=NULL;
|
||||||
|
|
||||||
|
RSA *RSA_new(void)
|
||||||
|
{
|
||||||
|
return(RSA_new_method(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
void RSA_set_default_method(RSA_METHOD *meth)
|
||||||
|
{
|
||||||
|
default_RSA_meth=meth;
|
||||||
|
}
|
||||||
|
|
||||||
|
RSA_METHOD *RSA_get_default_method(void)
|
||||||
|
{
|
||||||
|
return default_RSA_meth;
|
||||||
|
}
|
||||||
|
|
||||||
|
RSA_METHOD *RSA_get_method(RSA *rsa)
|
||||||
|
{
|
||||||
|
return rsa->meth;
|
||||||
|
}
|
||||||
|
|
||||||
|
RSA_METHOD *RSA_set_method(RSA *rsa, RSA_METHOD *meth)
|
||||||
|
{
|
||||||
|
RSA_METHOD *mtmp;
|
||||||
|
mtmp = rsa->meth;
|
||||||
|
if (mtmp->finish) mtmp->finish(rsa);
|
||||||
|
rsa->meth = meth;
|
||||||
|
if (meth->init) meth->init(rsa);
|
||||||
|
return mtmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
RSA *RSA_new_method(RSA_METHOD *meth)
|
||||||
|
{
|
||||||
|
RSA *ret;
|
||||||
|
|
||||||
|
if (default_RSA_meth == NULL)
|
||||||
|
{
|
||||||
|
#ifdef RSAref
|
||||||
|
default_RSA_meth=RSA_PKCS1_RSAref();
|
||||||
|
#else
|
||||||
|
default_RSA_meth=RSA_PKCS1_SSLeay();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
ret=(RSA *)Malloc(sizeof(RSA));
|
||||||
|
if (ret == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_NEW_METHOD,ERR_R_MALLOC_FAILURE);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meth == NULL)
|
||||||
|
ret->meth=default_RSA_meth;
|
||||||
|
else
|
||||||
|
ret->meth=meth;
|
||||||
|
|
||||||
|
ret->pad=0;
|
||||||
|
ret->version=0;
|
||||||
|
ret->n=NULL;
|
||||||
|
ret->e=NULL;
|
||||||
|
ret->d=NULL;
|
||||||
|
ret->p=NULL;
|
||||||
|
ret->q=NULL;
|
||||||
|
ret->dmp1=NULL;
|
||||||
|
ret->dmq1=NULL;
|
||||||
|
ret->iqmp=NULL;
|
||||||
|
ret->references=1;
|
||||||
|
ret->_method_mod_n=NULL;
|
||||||
|
ret->_method_mod_p=NULL;
|
||||||
|
ret->_method_mod_q=NULL;
|
||||||
|
ret->blinding=NULL;
|
||||||
|
ret->bignum_data=NULL;
|
||||||
|
ret->flags=ret->meth->flags;
|
||||||
|
if ((ret->meth->init != NULL) && !ret->meth->init(ret))
|
||||||
|
{
|
||||||
|
Free(ret);
|
||||||
|
ret=NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
CRYPTO_new_ex_data(rsa_meth,(char *)ret,&ret->ex_data);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RSA_free(RSA *r)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (r == NULL) return;
|
||||||
|
|
||||||
|
i=CRYPTO_add(&r->references,-1,CRYPTO_LOCK_RSA);
|
||||||
|
#ifdef REF_PRINT
|
||||||
|
REF_PRINT("RSA",r);
|
||||||
|
#endif
|
||||||
|
if (i > 0) return;
|
||||||
|
#ifdef REF_CHECK
|
||||||
|
if (i < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"RSA_free, bad reference count\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CRYPTO_free_ex_data(rsa_meth,(char *)r,&r->ex_data);
|
||||||
|
|
||||||
|
if (r->meth->finish != NULL)
|
||||||
|
r->meth->finish(r);
|
||||||
|
|
||||||
|
if (r->n != NULL) BN_clear_free(r->n);
|
||||||
|
if (r->e != NULL) BN_clear_free(r->e);
|
||||||
|
if (r->d != NULL) BN_clear_free(r->d);
|
||||||
|
if (r->p != NULL) BN_clear_free(r->p);
|
||||||
|
if (r->q != NULL) BN_clear_free(r->q);
|
||||||
|
if (r->dmp1 != NULL) BN_clear_free(r->dmp1);
|
||||||
|
if (r->dmq1 != NULL) BN_clear_free(r->dmq1);
|
||||||
|
if (r->iqmp != NULL) BN_clear_free(r->iqmp);
|
||||||
|
if (r->blinding != NULL) BN_BLINDING_free(r->blinding);
|
||||||
|
if (r->bignum_data != NULL) Free_locked(r->bignum_data);
|
||||||
|
Free(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_get_ex_new_index(long argl, char *argp, int (*new_func)(),
|
||||||
|
int (*dup_func)(), void (*free_func)())
|
||||||
|
{
|
||||||
|
rsa_meth_num++;
|
||||||
|
return(CRYPTO_get_ex_new_index(rsa_meth_num-1,
|
||||||
|
&rsa_meth,argl,argp,new_func,dup_func,free_func));
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_set_ex_data(RSA *r, int idx, char *arg)
|
||||||
|
{
|
||||||
|
return(CRYPTO_set_ex_data(&r->ex_data,idx,arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *RSA_get_ex_data(RSA *r, int idx)
|
||||||
|
{
|
||||||
|
return(CRYPTO_get_ex_data(&r->ex_data,idx));
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_size(RSA *r)
|
||||||
|
{
|
||||||
|
return(BN_num_bytes(r->n));
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_public_encrypt(int flen, unsigned char *from, unsigned char *to,
|
||||||
|
RSA *rsa, int padding)
|
||||||
|
{
|
||||||
|
return(rsa->meth->rsa_pub_enc(flen, from, to, rsa, padding));
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_private_encrypt(int flen, unsigned char *from, unsigned char *to,
|
||||||
|
RSA *rsa, int padding)
|
||||||
|
{
|
||||||
|
return(rsa->meth->rsa_priv_enc(flen, from, to, rsa, padding));
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_private_decrypt(int flen, unsigned char *from, unsigned char *to,
|
||||||
|
RSA *rsa, int padding)
|
||||||
|
{
|
||||||
|
return(rsa->meth->rsa_priv_dec(flen, from, to, rsa, padding));
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_public_decrypt(int flen, unsigned char *from, unsigned char *to,
|
||||||
|
RSA *rsa, int padding)
|
||||||
|
{
|
||||||
|
return(rsa->meth->rsa_pub_dec(flen, from, to, rsa, padding));
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_flags(RSA *r)
|
||||||
|
{
|
||||||
|
return((r == NULL)?0:r->meth->flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RSA_blinding_off(RSA *rsa)
|
||||||
|
{
|
||||||
|
if (rsa->blinding != NULL)
|
||||||
|
{
|
||||||
|
BN_BLINDING_free(rsa->blinding);
|
||||||
|
rsa->blinding=NULL;
|
||||||
|
}
|
||||||
|
rsa->flags&= ~RSA_FLAG_BLINDING;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_blinding_on(RSA *rsa, BN_CTX *p_ctx)
|
||||||
|
{
|
||||||
|
BIGNUM *A,*Ai;
|
||||||
|
BN_CTX *ctx;
|
||||||
|
int ret=0;
|
||||||
|
|
||||||
|
if (p_ctx == NULL)
|
||||||
|
{
|
||||||
|
if ((ctx=BN_CTX_new()) == NULL) goto err;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ctx=p_ctx;
|
||||||
|
|
||||||
|
if (rsa->blinding != NULL)
|
||||||
|
BN_BLINDING_free(rsa->blinding);
|
||||||
|
|
||||||
|
A= &(ctx->bn[0]);
|
||||||
|
ctx->tos++;
|
||||||
|
if (!BN_rand(A,BN_num_bits(rsa->n)-1,1,0)) goto err;
|
||||||
|
if ((Ai=BN_mod_inverse(NULL,A,rsa->n,ctx)) == NULL) goto err;
|
||||||
|
|
||||||
|
if (!rsa->meth->bn_mod_exp(A,A,rsa->e,rsa->n,ctx,rsa->_method_mod_n))
|
||||||
|
goto err;
|
||||||
|
rsa->blinding=BN_BLINDING_new(A,Ai,rsa->n);
|
||||||
|
ctx->tos--;
|
||||||
|
rsa->flags|=RSA_FLAG_BLINDING;
|
||||||
|
BN_free(Ai);
|
||||||
|
ret=1;
|
||||||
|
err:
|
||||||
|
if (ctx != p_ctx) BN_CTX_free(ctx);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_memory_lock(RSA *r)
|
||||||
|
{
|
||||||
|
int i,j,k,off;
|
||||||
|
char *p;
|
||||||
|
BIGNUM *bn,**t[6],*b;
|
||||||
|
BN_ULONG *ul;
|
||||||
|
|
||||||
|
if (r->d == NULL) return(1);
|
||||||
|
t[0]= &r->d;
|
||||||
|
t[1]= &r->p;
|
||||||
|
t[2]= &r->q;
|
||||||
|
t[3]= &r->dmp1;
|
||||||
|
t[4]= &r->dmq1;
|
||||||
|
t[5]= &r->iqmp;
|
||||||
|
k=sizeof(BIGNUM)*6;
|
||||||
|
off=k/sizeof(BN_ULONG)+1;
|
||||||
|
j=1;
|
||||||
|
for (i=0; i<6; i++)
|
||||||
|
j+= (*t[i])->top;
|
||||||
|
if ((p=Malloc_locked((off+j)*sizeof(BN_ULONG))) == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_MEMORY_LOCK,ERR_R_MALLOC_FAILURE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
bn=(BIGNUM *)p;
|
||||||
|
ul=(BN_ULONG *)&(p[off]);
|
||||||
|
for (i=0; i<6; i++)
|
||||||
|
{
|
||||||
|
b= *(t[i]);
|
||||||
|
*(t[i])= &(bn[i]);
|
||||||
|
memcpy((char *)&(bn[i]),(char *)b,sizeof(BIGNUM));
|
||||||
|
bn[i].flags=BN_FLG_STATIC_DATA;
|
||||||
|
bn[i].d=ul;
|
||||||
|
memcpy((char *)ul,b->d,sizeof(BN_ULONG)*b->top);
|
||||||
|
ul+=b->top;
|
||||||
|
BN_clear_free(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* I should fix this so it can still be done */
|
||||||
|
r->flags&= ~(RSA_FLAG_CACHE_PRIVATE|RSA_FLAG_CACHE_PUBLIC);
|
||||||
|
|
||||||
|
r->bignum_data=p;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
98
crypto/openssl/crypto/rsa/rsa_none.c
Normal file
98
crypto/openssl/crypto/rsa/rsa_none.c
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/* crypto/rsa/rsa_none.c */
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "cryptlib.h"
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
#include <openssl/rand.h>
|
||||||
|
|
||||||
|
int RSA_padding_add_none(unsigned char *to, int tlen, unsigned char *from,
|
||||||
|
int flen)
|
||||||
|
{
|
||||||
|
if (flen > tlen)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_NONE,RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flen < tlen)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_NONE,RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(to,from,(unsigned int)flen);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_padding_check_none(unsigned char *to, int tlen, unsigned char *from,
|
||||||
|
int flen, int num)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (flen > tlen)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_NONE,RSA_R_DATA_TOO_LARGE);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(to,0,tlen-flen);
|
||||||
|
memcpy(to+tlen-flen,from,flen);
|
||||||
|
return(tlen);
|
||||||
|
}
|
||||||
|
|
162
crypto/openssl/crypto/rsa/rsa_oaep.c
Normal file
162
crypto/openssl/crypto/rsa/rsa_oaep.c
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/* crypto/rsa/rsa_oaep.c */
|
||||||
|
/* Written by Ulf Moeller. This software is distributed on an "AS IS"
|
||||||
|
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. */
|
||||||
|
|
||||||
|
/* EME_OAEP as defined in RFC 2437 (PKCS #1 v2.0) */
|
||||||
|
|
||||||
|
#if !defined(NO_SHA) && !defined(NO_SHA1)
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "cryptlib.h"
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
#include <openssl/sha.h>
|
||||||
|
#include <openssl/rand.h>
|
||||||
|
|
||||||
|
int MGF1(unsigned char *mask, long len, unsigned char *seed, long seedlen);
|
||||||
|
|
||||||
|
int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen,
|
||||||
|
unsigned char *from, int flen, unsigned char *param, int plen)
|
||||||
|
{
|
||||||
|
int i, emlen = tlen - 1;
|
||||||
|
unsigned char *db, *seed;
|
||||||
|
unsigned char *dbmask, seedmask[SHA_DIGEST_LENGTH];
|
||||||
|
|
||||||
|
if (flen > emlen - 2 * SHA_DIGEST_LENGTH - 1)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP,
|
||||||
|
RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emlen < 2 * SHA_DIGEST_LENGTH + 1)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP, RSA_R_KEY_SIZE_TOO_SMALL);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
dbmask = Malloc(emlen - SHA_DIGEST_LENGTH);
|
||||||
|
if (dbmask == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP, ERR_R_MALLOC_FAILURE);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
to[0] = 0;
|
||||||
|
seed = to + 1;
|
||||||
|
db = to + SHA_DIGEST_LENGTH + 1;
|
||||||
|
|
||||||
|
SHA1(param, plen, db);
|
||||||
|
memset(db + SHA_DIGEST_LENGTH, 0,
|
||||||
|
emlen - flen - 2 * SHA_DIGEST_LENGTH - 1);
|
||||||
|
db[emlen - flen - SHA_DIGEST_LENGTH - 1] = 0x01;
|
||||||
|
memcpy(db + emlen - flen - SHA_DIGEST_LENGTH, from, (unsigned int) flen);
|
||||||
|
RAND_bytes(seed, SHA_DIGEST_LENGTH);
|
||||||
|
#ifdef PKCS_TESTVECT
|
||||||
|
memcpy(seed,
|
||||||
|
"\xaa\xfd\x12\xf6\x59\xca\xe6\x34\x89\xb4\x79\xe5\x07\x6d\xde\xc2\xf0\x6c\xb5\x8f",
|
||||||
|
20);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MGF1(dbmask, emlen - SHA_DIGEST_LENGTH, seed, SHA_DIGEST_LENGTH);
|
||||||
|
for (i = 0; i < emlen - SHA_DIGEST_LENGTH; i++)
|
||||||
|
db[i] ^= dbmask[i];
|
||||||
|
|
||||||
|
MGF1(seedmask, SHA_DIGEST_LENGTH, db, emlen - SHA_DIGEST_LENGTH);
|
||||||
|
for (i = 0; i < SHA_DIGEST_LENGTH; i++)
|
||||||
|
seed[i] ^= seedmask[i];
|
||||||
|
|
||||||
|
Free(dbmask);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
|
||||||
|
unsigned char *from, int flen, int num, unsigned char *param,
|
||||||
|
int plen)
|
||||||
|
{
|
||||||
|
int i, dblen, mlen = -1;
|
||||||
|
unsigned char *maskeddb;
|
||||||
|
int lzero;
|
||||||
|
unsigned char *db, seed[SHA_DIGEST_LENGTH], phash[SHA_DIGEST_LENGTH];
|
||||||
|
|
||||||
|
if (--num < 2 * SHA_DIGEST_LENGTH + 1)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_OAEP_DECODING_ERROR);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
dblen = num - SHA_DIGEST_LENGTH;
|
||||||
|
db = Malloc(dblen);
|
||||||
|
if (db == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP, ERR_R_MALLOC_FAILURE);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
lzero = num - flen;
|
||||||
|
maskeddb = from - lzero + SHA_DIGEST_LENGTH;
|
||||||
|
|
||||||
|
MGF1(seed, SHA_DIGEST_LENGTH, maskeddb, dblen);
|
||||||
|
for (i = lzero; i < SHA_DIGEST_LENGTH; i++)
|
||||||
|
seed[i] ^= from[i - lzero];
|
||||||
|
|
||||||
|
MGF1(db, dblen, seed, SHA_DIGEST_LENGTH);
|
||||||
|
for (i = 0; i < dblen; i++)
|
||||||
|
db[i] ^= maskeddb[i];
|
||||||
|
|
||||||
|
SHA1(param, plen, phash);
|
||||||
|
|
||||||
|
if (memcmp(db, phash, SHA_DIGEST_LENGTH) != 0)
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_OAEP_DECODING_ERROR);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = SHA_DIGEST_LENGTH; i < dblen; i++)
|
||||||
|
if (db[i] != 0x00)
|
||||||
|
break;
|
||||||
|
if (db[i] != 0x01 || i++ >= dblen)
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP,
|
||||||
|
RSA_R_OAEP_DECODING_ERROR);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mlen = dblen - i;
|
||||||
|
if (tlen < mlen)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP, RSA_R_DATA_TOO_LARGE);
|
||||||
|
mlen = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
memcpy(to, db + i, mlen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Free(db);
|
||||||
|
return (mlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
int MGF1(unsigned char *mask, long len, unsigned char *seed, long seedlen)
|
||||||
|
{
|
||||||
|
long i, outlen = 0;
|
||||||
|
unsigned char cnt[4];
|
||||||
|
SHA_CTX c;
|
||||||
|
unsigned char md[SHA_DIGEST_LENGTH];
|
||||||
|
|
||||||
|
for (i = 0; outlen < len; i++)
|
||||||
|
{
|
||||||
|
cnt[0] = (i >> 24) & 255, cnt[1] = (i >> 16) & 255,
|
||||||
|
cnt[2] = (i >> 8) & 255, cnt[3] = i & 255;
|
||||||
|
SHA1_Init(&c);
|
||||||
|
SHA1_Update(&c, seed, seedlen);
|
||||||
|
SHA1_Update(&c, cnt, 4);
|
||||||
|
if (outlen + SHA_DIGEST_LENGTH <= len)
|
||||||
|
{
|
||||||
|
SHA1_Final(mask + outlen, &c);
|
||||||
|
outlen += SHA_DIGEST_LENGTH;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHA1_Final(md, &c);
|
||||||
|
memcpy(mask + outlen, md, len - outlen);
|
||||||
|
outlen = len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
309
crypto/openssl/crypto/rsa/rsa_oaep_test.c
Normal file
309
crypto/openssl/crypto/rsa/rsa_oaep_test.c
Normal file
@ -0,0 +1,309 @@
|
|||||||
|
/* test vectors from p1ovect1.txt */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "openssl/e_os.h"
|
||||||
|
|
||||||
|
#include <openssl/crypto.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
|
#ifdef NO_RSA
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
printf("No RSA support\n");
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
|
||||||
|
#define SetKey \
|
||||||
|
key->n = BN_bin2bn(n, sizeof(n)-1, key->n); \
|
||||||
|
key->e = BN_bin2bn(e, sizeof(e)-1, key->e); \
|
||||||
|
key->d = BN_bin2bn(d, sizeof(d)-1, key->d); \
|
||||||
|
key->p = BN_bin2bn(p, sizeof(p)-1, key->p); \
|
||||||
|
key->q = BN_bin2bn(q, sizeof(q)-1, key->q); \
|
||||||
|
key->dmp1 = BN_bin2bn(dmp1, sizeof(dmp1)-1, key->dmp1); \
|
||||||
|
key->dmq1 = BN_bin2bn(dmq1, sizeof(dmq1)-1, key->dmq1); \
|
||||||
|
key->iqmp = BN_bin2bn(iqmp, sizeof(iqmp)-1, key->iqmp); \
|
||||||
|
memcpy(c, ctext_ex, sizeof(ctext_ex) - 1); \
|
||||||
|
return (sizeof(ctext_ex) - 1);
|
||||||
|
|
||||||
|
static int key1(RSA *key, unsigned char *c)
|
||||||
|
{
|
||||||
|
static unsigned char n[] =
|
||||||
|
"\x00\xAA\x36\xAB\xCE\x88\xAC\xFD\xFF\x55\x52\x3C\x7F\xC4\x52\x3F"
|
||||||
|
"\x90\xEF\xA0\x0D\xF3\x77\x4A\x25\x9F\x2E\x62\xB4\xC5\xD9\x9C\xB5"
|
||||||
|
"\xAD\xB3\x00\xA0\x28\x5E\x53\x01\x93\x0E\x0C\x70\xFB\x68\x76\x93"
|
||||||
|
"\x9C\xE6\x16\xCE\x62\x4A\x11\xE0\x08\x6D\x34\x1E\xBC\xAC\xA0\xA1"
|
||||||
|
"\xF5";
|
||||||
|
|
||||||
|
static unsigned char e[] = "\x11";
|
||||||
|
|
||||||
|
static unsigned char d[] =
|
||||||
|
"\x0A\x03\x37\x48\x62\x64\x87\x69\x5F\x5F\x30\xBC\x38\xB9\x8B\x44"
|
||||||
|
"\xC2\xCD\x2D\xFF\x43\x40\x98\xCD\x20\xD8\xA1\x38\xD0\x90\xBF\x64"
|
||||||
|
"\x79\x7C\x3F\xA7\xA2\xCD\xCB\x3C\xD1\xE0\xBD\xBA\x26\x54\xB4\xF9"
|
||||||
|
"\xDF\x8E\x8A\xE5\x9D\x73\x3D\x9F\x33\xB3\x01\x62\x4A\xFD\x1D\x51";
|
||||||
|
|
||||||
|
static unsigned char p[] =
|
||||||
|
"\x00\xD8\x40\xB4\x16\x66\xB4\x2E\x92\xEA\x0D\xA3\xB4\x32\x04\xB5"
|
||||||
|
"\xCF\xCE\x33\x52\x52\x4D\x04\x16\xA5\xA4\x41\xE7\x00\xAF\x46\x12"
|
||||||
|
"\x0D";
|
||||||
|
|
||||||
|
static unsigned char q[] =
|
||||||
|
"\x00\xC9\x7F\xB1\xF0\x27\xF4\x53\xF6\x34\x12\x33\xEA\xAA\xD1\xD9"
|
||||||
|
"\x35\x3F\x6C\x42\xD0\x88\x66\xB1\xD0\x5A\x0F\x20\x35\x02\x8B\x9D"
|
||||||
|
"\x89";
|
||||||
|
|
||||||
|
static unsigned char dmp1[] =
|
||||||
|
"\x59\x0B\x95\x72\xA2\xC2\xA9\xC4\x06\x05\x9D\xC2\xAB\x2F\x1D\xAF"
|
||||||
|
"\xEB\x7E\x8B\x4F\x10\xA7\x54\x9E\x8E\xED\xF5\xB4\xFC\xE0\x9E\x05";
|
||||||
|
|
||||||
|
static unsigned char dmq1[] =
|
||||||
|
"\x00\x8E\x3C\x05\x21\xFE\x15\xE0\xEA\x06\xA3\x6F\xF0\xF1\x0C\x99"
|
||||||
|
"\x52\xC3\x5B\x7A\x75\x14\xFD\x32\x38\xB8\x0A\xAD\x52\x98\x62\x8D"
|
||||||
|
"\x51";
|
||||||
|
|
||||||
|
static unsigned char iqmp[] =
|
||||||
|
"\x36\x3F\xF7\x18\x9D\xA8\xE9\x0B\x1D\x34\x1F\x71\xD0\x9B\x76\xA8"
|
||||||
|
"\xA9\x43\xE1\x1D\x10\xB2\x4D\x24\x9F\x2D\xEA\xFE\xF8\x0C\x18\x26";
|
||||||
|
|
||||||
|
static unsigned char ctext_ex[] =
|
||||||
|
"\x1b\x8f\x05\xf9\xca\x1a\x79\x52\x6e\x53\xf3\xcc\x51\x4f\xdb\x89"
|
||||||
|
"\x2b\xfb\x91\x93\x23\x1e\x78\xb9\x92\xe6\x8d\x50\xa4\x80\xcb\x52"
|
||||||
|
"\x33\x89\x5c\x74\x95\x8d\x5d\x02\xab\x8c\x0f\xd0\x40\xeb\x58\x44"
|
||||||
|
"\xb0\x05\xc3\x9e\xd8\x27\x4a\x9d\xbf\xa8\x06\x71\x40\x94\x39\xd2";
|
||||||
|
|
||||||
|
SetKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int key2(RSA *key, unsigned char *c)
|
||||||
|
{
|
||||||
|
static unsigned char n[] =
|
||||||
|
"\x00\xA3\x07\x9A\x90\xDF\x0D\xFD\x72\xAC\x09\x0C\xCC\x2A\x78\xB8"
|
||||||
|
"\x74\x13\x13\x3E\x40\x75\x9C\x98\xFA\xF8\x20\x4F\x35\x8A\x0B\x26"
|
||||||
|
"\x3C\x67\x70\xE7\x83\xA9\x3B\x69\x71\xB7\x37\x79\xD2\x71\x7B\xE8"
|
||||||
|
"\x34\x77\xCF";
|
||||||
|
|
||||||
|
static unsigned char e[] = "\x3";
|
||||||
|
|
||||||
|
static unsigned char d[] =
|
||||||
|
"\x6C\xAF\xBC\x60\x94\xB3\xFE\x4C\x72\xB0\xB3\x32\xC6\xFB\x25\xA2"
|
||||||
|
"\xB7\x62\x29\x80\x4E\x68\x65\xFC\xA4\x5A\x74\xDF\x0F\x8F\xB8\x41"
|
||||||
|
"\x3B\x52\xC0\xD0\xE5\x3D\x9B\x59\x0F\xF1\x9B\xE7\x9F\x49\xDD\x21"
|
||||||
|
"\xE5\xEB";
|
||||||
|
|
||||||
|
static unsigned char p[] =
|
||||||
|
"\x00\xCF\x20\x35\x02\x8B\x9D\x86\x98\x40\xB4\x16\x66\xB4\x2E\x92"
|
||||||
|
"\xEA\x0D\xA3\xB4\x32\x04\xB5\xCF\xCE\x91";
|
||||||
|
|
||||||
|
static unsigned char q[] =
|
||||||
|
"\x00\xC9\x7F\xB1\xF0\x27\xF4\x53\xF6\x34\x12\x33\xEA\xAA\xD1\xD9"
|
||||||
|
"\x35\x3F\x6C\x42\xD0\x88\x66\xB1\xD0\x5F";
|
||||||
|
|
||||||
|
static unsigned char dmp1[] =
|
||||||
|
"\x00\x8A\x15\x78\xAC\x5D\x13\xAF\x10\x2B\x22\xB9\x99\xCD\x74\x61"
|
||||||
|
"\xF1\x5E\x6D\x22\xCC\x03\x23\xDF\xDF\x0B";
|
||||||
|
|
||||||
|
static unsigned char dmq1[] =
|
||||||
|
"\x00\x86\x55\x21\x4A\xC5\x4D\x8D\x4E\xCD\x61\x77\xF1\xC7\x36\x90"
|
||||||
|
"\xCE\x2A\x48\x2C\x8B\x05\x99\xCB\xE0\x3F";
|
||||||
|
|
||||||
|
static unsigned char iqmp[] =
|
||||||
|
"\x00\x83\xEF\xEF\xB8\xA9\xA4\x0D\x1D\xB6\xED\x98\xAD\x84\xED\x13"
|
||||||
|
"\x35\xDC\xC1\x08\xF3\x22\xD0\x57\xCF\x8D";
|
||||||
|
|
||||||
|
static unsigned char ctext_ex[] =
|
||||||
|
"\x14\xbd\xdd\x28\xc9\x83\x35\x19\x23\x80\xe8\xe5\x49\xb1\x58\x2a"
|
||||||
|
"\x8b\x40\xb4\x48\x6d\x03\xa6\xa5\x31\x1f\x1f\xd5\xf0\xa1\x80\xe4"
|
||||||
|
"\x17\x53\x03\x29\xa9\x34\x90\x74\xb1\x52\x13\x54\x29\x08\x24\x52"
|
||||||
|
"\x62\x51";
|
||||||
|
|
||||||
|
SetKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int key3(RSA *key, unsigned char *c)
|
||||||
|
{
|
||||||
|
static unsigned char n[] =
|
||||||
|
"\x00\xBB\xF8\x2F\x09\x06\x82\xCE\x9C\x23\x38\xAC\x2B\x9D\xA8\x71"
|
||||||
|
"\xF7\x36\x8D\x07\xEE\xD4\x10\x43\xA4\x40\xD6\xB6\xF0\x74\x54\xF5"
|
||||||
|
"\x1F\xB8\xDF\xBA\xAF\x03\x5C\x02\xAB\x61\xEA\x48\xCE\xEB\x6F\xCD"
|
||||||
|
"\x48\x76\xED\x52\x0D\x60\xE1\xEC\x46\x19\x71\x9D\x8A\x5B\x8B\x80"
|
||||||
|
"\x7F\xAF\xB8\xE0\xA3\xDF\xC7\x37\x72\x3E\xE6\xB4\xB7\xD9\x3A\x25"
|
||||||
|
"\x84\xEE\x6A\x64\x9D\x06\x09\x53\x74\x88\x34\xB2\x45\x45\x98\x39"
|
||||||
|
"\x4E\xE0\xAA\xB1\x2D\x7B\x61\xA5\x1F\x52\x7A\x9A\x41\xF6\xC1\x68"
|
||||||
|
"\x7F\xE2\x53\x72\x98\xCA\x2A\x8F\x59\x46\xF8\xE5\xFD\x09\x1D\xBD"
|
||||||
|
"\xCB";
|
||||||
|
|
||||||
|
static unsigned char e[] = "\x11";
|
||||||
|
|
||||||
|
static unsigned char d[] =
|
||||||
|
"\x00\xA5\xDA\xFC\x53\x41\xFA\xF2\x89\xC4\xB9\x88\xDB\x30\xC1\xCD"
|
||||||
|
"\xF8\x3F\x31\x25\x1E\x06\x68\xB4\x27\x84\x81\x38\x01\x57\x96\x41"
|
||||||
|
"\xB2\x94\x10\xB3\xC7\x99\x8D\x6B\xC4\x65\x74\x5E\x5C\x39\x26\x69"
|
||||||
|
"\xD6\x87\x0D\xA2\xC0\x82\xA9\x39\xE3\x7F\xDC\xB8\x2E\xC9\x3E\xDA"
|
||||||
|
"\xC9\x7F\xF3\xAD\x59\x50\xAC\xCF\xBC\x11\x1C\x76\xF1\xA9\x52\x94"
|
||||||
|
"\x44\xE5\x6A\xAF\x68\xC5\x6C\x09\x2C\xD3\x8D\xC3\xBE\xF5\xD2\x0A"
|
||||||
|
"\x93\x99\x26\xED\x4F\x74\xA1\x3E\xDD\xFB\xE1\xA1\xCE\xCC\x48\x94"
|
||||||
|
"\xAF\x94\x28\xC2\xB7\xB8\x88\x3F\xE4\x46\x3A\x4B\xC8\x5B\x1C\xB3"
|
||||||
|
"\xC1";
|
||||||
|
|
||||||
|
static unsigned char p[] =
|
||||||
|
"\x00\xEE\xCF\xAE\x81\xB1\xB9\xB3\xC9\x08\x81\x0B\x10\xA1\xB5\x60"
|
||||||
|
"\x01\x99\xEB\x9F\x44\xAE\xF4\xFD\xA4\x93\xB8\x1A\x9E\x3D\x84\xF6"
|
||||||
|
"\x32\x12\x4E\xF0\x23\x6E\x5D\x1E\x3B\x7E\x28\xFA\xE7\xAA\x04\x0A"
|
||||||
|
"\x2D\x5B\x25\x21\x76\x45\x9D\x1F\x39\x75\x41\xBA\x2A\x58\xFB\x65"
|
||||||
|
"\x99";
|
||||||
|
|
||||||
|
static unsigned char q[] =
|
||||||
|
"\x00\xC9\x7F\xB1\xF0\x27\xF4\x53\xF6\x34\x12\x33\xEA\xAA\xD1\xD9"
|
||||||
|
"\x35\x3F\x6C\x42\xD0\x88\x66\xB1\xD0\x5A\x0F\x20\x35\x02\x8B\x9D"
|
||||||
|
"\x86\x98\x40\xB4\x16\x66\xB4\x2E\x92\xEA\x0D\xA3\xB4\x32\x04\xB5"
|
||||||
|
"\xCF\xCE\x33\x52\x52\x4D\x04\x16\xA5\xA4\x41\xE7\x00\xAF\x46\x15"
|
||||||
|
"\x03";
|
||||||
|
|
||||||
|
static unsigned char dmp1[] =
|
||||||
|
"\x54\x49\x4C\xA6\x3E\xBA\x03\x37\xE4\xE2\x40\x23\xFC\xD6\x9A\x5A"
|
||||||
|
"\xEB\x07\xDD\xDC\x01\x83\xA4\xD0\xAC\x9B\x54\xB0\x51\xF2\xB1\x3E"
|
||||||
|
"\xD9\x49\x09\x75\xEA\xB7\x74\x14\xFF\x59\xC1\xF7\x69\x2E\x9A\x2E"
|
||||||
|
"\x20\x2B\x38\xFC\x91\x0A\x47\x41\x74\xAD\xC9\x3C\x1F\x67\xC9\x81";
|
||||||
|
|
||||||
|
static unsigned char dmq1[] =
|
||||||
|
"\x47\x1E\x02\x90\xFF\x0A\xF0\x75\x03\x51\xB7\xF8\x78\x86\x4C\xA9"
|
||||||
|
"\x61\xAD\xBD\x3A\x8A\x7E\x99\x1C\x5C\x05\x56\xA9\x4C\x31\x46\xA7"
|
||||||
|
"\xF9\x80\x3F\x8F\x6F\x8A\xE3\x42\xE9\x31\xFD\x8A\xE4\x7A\x22\x0D"
|
||||||
|
"\x1B\x99\xA4\x95\x84\x98\x07\xFE\x39\xF9\x24\x5A\x98\x36\xDA\x3D";
|
||||||
|
|
||||||
|
static unsigned char iqmp[] =
|
||||||
|
"\x00\xB0\x6C\x4F\xDA\xBB\x63\x01\x19\x8D\x26\x5B\xDB\xAE\x94\x23"
|
||||||
|
"\xB3\x80\xF2\x71\xF7\x34\x53\x88\x50\x93\x07\x7F\xCD\x39\xE2\x11"
|
||||||
|
"\x9F\xC9\x86\x32\x15\x4F\x58\x83\xB1\x67\xA9\x67\xBF\x40\x2B\x4E"
|
||||||
|
"\x9E\x2E\x0F\x96\x56\xE6\x98\xEA\x36\x66\xED\xFB\x25\x79\x80\x39"
|
||||||
|
"\xF7";
|
||||||
|
|
||||||
|
static unsigned char ctext_ex[] =
|
||||||
|
"\xb8\x24\x6b\x56\xa6\xed\x58\x81\xae\xb5\x85\xd9\xa2\x5b\x2a\xd7"
|
||||||
|
"\x90\xc4\x17\xe0\x80\x68\x1b\xf1\xac\x2b\xc3\xde\xb6\x9d\x8b\xce"
|
||||||
|
"\xf0\xc4\x36\x6f\xec\x40\x0a\xf0\x52\xa7\x2e\x9b\x0e\xff\xb5\xb3"
|
||||||
|
"\xf2\xf1\x92\xdb\xea\xca\x03\xc1\x27\x40\x05\x71\x13\xbf\x1f\x06"
|
||||||
|
"\x69\xac\x22\xe9\xf3\xa7\x85\x2e\x3c\x15\xd9\x13\xca\xb0\xb8\x86"
|
||||||
|
"\x3a\x95\xc9\x92\x94\xce\x86\x74\x21\x49\x54\x61\x03\x46\xf4\xd4"
|
||||||
|
"\x74\xb2\x6f\x7c\x48\xb4\x2e\xe6\x8e\x1f\x57\x2a\x1f\xc4\x02\x6a"
|
||||||
|
"\xc4\x56\xb4\xf5\x9f\x7b\x62\x1e\xa1\xb9\xd8\x8f\x64\x20\x2f\xb1";
|
||||||
|
|
||||||
|
SetKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pad_unknown(void)
|
||||||
|
{
|
||||||
|
unsigned long l;
|
||||||
|
while ((l = ERR_get_error()) != 0)
|
||||||
|
if (ERR_GET_REASON(l) == RSA_R_UNKNOWN_PADDING_TYPE)
|
||||||
|
return(1);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int err=0;
|
||||||
|
int v;
|
||||||
|
RSA *key;
|
||||||
|
unsigned char ptext[256];
|
||||||
|
unsigned char ctext[256];
|
||||||
|
static unsigned char ptext_ex[] = "\x54\x85\x9b\x34\x2c\x49\xea\x2a";
|
||||||
|
unsigned char ctext_ex[256];
|
||||||
|
int plen;
|
||||||
|
int clen = 0;
|
||||||
|
int num;
|
||||||
|
|
||||||
|
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
|
||||||
|
|
||||||
|
plen = sizeof(ptext_ex) - 1;
|
||||||
|
|
||||||
|
for (v = 0; v < 3; v++)
|
||||||
|
{
|
||||||
|
key = RSA_new();
|
||||||
|
switch (v) {
|
||||||
|
case 0:
|
||||||
|
clen = key1(key, ctext_ex);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
clen = key2(key, ctext_ex);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
clen = key3(key, ctext_ex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
num = RSA_public_encrypt(plen, ptext_ex, ctext, key,
|
||||||
|
RSA_PKCS1_PADDING);
|
||||||
|
if (num != clen)
|
||||||
|
{
|
||||||
|
printf("PKCS#1 v1.5 encryption failed!\n");
|
||||||
|
err=1;
|
||||||
|
goto oaep;
|
||||||
|
}
|
||||||
|
|
||||||
|
num = RSA_private_decrypt(num, ctext, ptext, key,
|
||||||
|
RSA_PKCS1_PADDING);
|
||||||
|
if (num != plen || memcmp(ptext, ptext_ex, num) != 0)
|
||||||
|
{
|
||||||
|
printf("PKCS#1 v1.5 decryption failed!\n");
|
||||||
|
err=1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("PKCS #1 v1.5 encryption/decryption ok\n");
|
||||||
|
|
||||||
|
oaep:
|
||||||
|
ERR_clear_error();
|
||||||
|
num = RSA_public_encrypt(plen, ptext_ex, ctext, key,
|
||||||
|
RSA_PKCS1_OAEP_PADDING);
|
||||||
|
if (num == -1 && pad_unknown())
|
||||||
|
{
|
||||||
|
printf("No OAEP support\n");
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
if (num != clen)
|
||||||
|
{
|
||||||
|
printf("OAEP encryption failed!\n");
|
||||||
|
err=1;
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
|
num = RSA_private_decrypt(num, ctext, ptext, key,
|
||||||
|
RSA_PKCS1_OAEP_PADDING);
|
||||||
|
if (num != plen || memcmp(ptext, ptext_ex, num) != 0)
|
||||||
|
{
|
||||||
|
printf("OAEP decryption (encrypted data) failed!\n");
|
||||||
|
err=1;
|
||||||
|
}
|
||||||
|
else if (memcmp(ctext, ctext_ex, num) == 0)
|
||||||
|
{
|
||||||
|
printf("OAEP test vector %d passed!\n", v);
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Different ciphertexts (rsa_oaep.c without -DPKCS_TESTVECT).
|
||||||
|
Try decrypting ctext_ex */
|
||||||
|
|
||||||
|
num = RSA_private_decrypt(clen, ctext_ex, ptext, key,
|
||||||
|
RSA_PKCS1_OAEP_PADDING);
|
||||||
|
|
||||||
|
if (num != plen || memcmp(ptext, ptext_ex, num) != 0)
|
||||||
|
{
|
||||||
|
printf("OAEP decryption (test vector data) failed!\n");
|
||||||
|
err=1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("OAEP encryption/decryption ok\n");
|
||||||
|
next:
|
||||||
|
RSA_free(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
ERR_remove_state(0);
|
||||||
|
|
||||||
|
CRYPTO_mem_leaks_fp(stdout);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
#endif
|
212
crypto/openssl/crypto/rsa/rsa_pk1.c
Normal file
212
crypto/openssl/crypto/rsa/rsa_pk1.c
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
/* crypto/rsa/rsa_pk1.c */
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "cryptlib.h"
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
#include <openssl/rand.h>
|
||||||
|
|
||||||
|
int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen,
|
||||||
|
unsigned char *from, int flen)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
unsigned char *p;
|
||||||
|
|
||||||
|
if (flen > (tlen-11))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1,RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
p=(unsigned char *)to;
|
||||||
|
|
||||||
|
*(p++)=0;
|
||||||
|
*(p++)=1; /* Private Key BT (Block Type) */
|
||||||
|
|
||||||
|
/* padd out with 0xff data */
|
||||||
|
j=tlen-3-flen;
|
||||||
|
memset(p,0xff,j);
|
||||||
|
p+=j;
|
||||||
|
*(p++)='\0';
|
||||||
|
memcpy(p,from,(unsigned int)flen);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen,
|
||||||
|
unsigned char *from, int flen, int num)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
unsigned char *p;
|
||||||
|
|
||||||
|
p=from;
|
||||||
|
if ((num != (flen+1)) || (*(p++) != 01))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1,RSA_R_BLOCK_TYPE_IS_NOT_01);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* scan over padding data */
|
||||||
|
j=flen-1; /* one for type. */
|
||||||
|
for (i=0; i<j; i++)
|
||||||
|
{
|
||||||
|
if (*p != 0xff) /* should decrypt to 0xff */
|
||||||
|
{
|
||||||
|
if (*p == 0)
|
||||||
|
{ p++; break; }
|
||||||
|
else {
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1,RSA_R_BAD_FIXED_HEADER_DECRYPT);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == j)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1,RSA_R_NULL_BEFORE_BLOCK_MISSING);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < 8)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1,RSA_R_BAD_PAD_BYTE_COUNT);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
i++; /* Skip over the '\0' */
|
||||||
|
j-=i;
|
||||||
|
memcpy(to,p,(unsigned int)j);
|
||||||
|
|
||||||
|
return(j);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen,
|
||||||
|
unsigned char *from, int flen)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
unsigned char *p;
|
||||||
|
|
||||||
|
if (flen > (tlen-11))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2,RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
p=(unsigned char *)to;
|
||||||
|
|
||||||
|
*(p++)=0;
|
||||||
|
*(p++)=2; /* Public Key BT (Block Type) */
|
||||||
|
|
||||||
|
/* pad out with non-zero random data */
|
||||||
|
j=tlen-3-flen;
|
||||||
|
|
||||||
|
RAND_bytes(p,j);
|
||||||
|
for (i=0; i<j; i++)
|
||||||
|
{
|
||||||
|
if (*p == '\0')
|
||||||
|
do {
|
||||||
|
RAND_bytes(p,1);
|
||||||
|
} while (*p == '\0');
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*(p++)='\0';
|
||||||
|
|
||||||
|
memcpy(p,from,(unsigned int)flen);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen,
|
||||||
|
unsigned char *from, int flen, int num)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
unsigned char *p;
|
||||||
|
|
||||||
|
p=from;
|
||||||
|
if ((num != (flen+1)) || (*(p++) != 02))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2,RSA_R_BLOCK_TYPE_IS_NOT_02);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
#ifdef PKCS1_CHECK
|
||||||
|
return(num-11);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* scan over padding data */
|
||||||
|
j=flen-1; /* one for type. */
|
||||||
|
for (i=0; i<j; i++)
|
||||||
|
if (*(p++) == 0) break;
|
||||||
|
|
||||||
|
if (i == j)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2,RSA_R_NULL_BEFORE_BLOCK_MISSING);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < 8)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2,RSA_R_BAD_PAD_BYTE_COUNT);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
i++; /* Skip over the '\0' */
|
||||||
|
j-=i;
|
||||||
|
memcpy(to,p,(unsigned int)j);
|
||||||
|
|
||||||
|
return(j);
|
||||||
|
}
|
||||||
|
|
144
crypto/openssl/crypto/rsa/rsa_saos.c
Normal file
144
crypto/openssl/crypto/rsa/rsa_saos.c
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
/* crypto/rsa/rsa_saos.c */
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "cryptlib.h"
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
#include <openssl/objects.h>
|
||||||
|
#include <openssl/x509.h>
|
||||||
|
|
||||||
|
int RSA_sign_ASN1_OCTET_STRING(int type, unsigned char *m, unsigned int m_len,
|
||||||
|
unsigned char *sigret, unsigned int *siglen, RSA *rsa)
|
||||||
|
{
|
||||||
|
ASN1_OCTET_STRING sig;
|
||||||
|
int i,j,ret=1;
|
||||||
|
unsigned char *p,*s;
|
||||||
|
|
||||||
|
sig.type=V_ASN1_OCTET_STRING;
|
||||||
|
sig.length=m_len;
|
||||||
|
sig.data=m;
|
||||||
|
|
||||||
|
i=i2d_ASN1_OCTET_STRING(&sig,NULL);
|
||||||
|
j=RSA_size(rsa);
|
||||||
|
if ((i-RSA_PKCS1_PADDING) > j)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_SIGN_ASN1_OCTET_STRING,RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
s=(unsigned char *)Malloc((unsigned int)j+1);
|
||||||
|
if (s == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_SIGN_ASN1_OCTET_STRING,ERR_R_MALLOC_FAILURE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
p=s;
|
||||||
|
i2d_ASN1_OCTET_STRING(&sig,&p);
|
||||||
|
i=RSA_private_encrypt(i,s,sigret,rsa,RSA_PKCS1_PADDING);
|
||||||
|
if (i <= 0)
|
||||||
|
ret=0;
|
||||||
|
else
|
||||||
|
*siglen=i;
|
||||||
|
|
||||||
|
memset(s,0,(unsigned int)j+1);
|
||||||
|
Free(s);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_verify_ASN1_OCTET_STRING(int dtype, unsigned char *m,
|
||||||
|
unsigned int m_len, unsigned char *sigbuf, unsigned int siglen,
|
||||||
|
RSA *rsa)
|
||||||
|
{
|
||||||
|
int i,ret=0;
|
||||||
|
unsigned char *p,*s;
|
||||||
|
ASN1_OCTET_STRING *sig=NULL;
|
||||||
|
|
||||||
|
if (siglen != (unsigned int)RSA_size(rsa))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_VERIFY_ASN1_OCTET_STRING,RSA_R_WRONG_SIGNATURE_LENGTH);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
s=(unsigned char *)Malloc((unsigned int)siglen);
|
||||||
|
if (s == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_VERIFY_ASN1_OCTET_STRING,ERR_R_MALLOC_FAILURE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
i=RSA_public_decrypt((int)siglen,sigbuf,s,rsa,RSA_PKCS1_PADDING);
|
||||||
|
|
||||||
|
if (i <= 0) goto err;
|
||||||
|
|
||||||
|
p=s;
|
||||||
|
sig=d2i_ASN1_OCTET_STRING(NULL,&p,(long)i);
|
||||||
|
if (sig == NULL) goto err;
|
||||||
|
|
||||||
|
if ( ((unsigned int)sig->length != m_len) ||
|
||||||
|
(memcmp(m,sig->data,m_len) != 0))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_VERIFY_ASN1_OCTET_STRING,RSA_R_BAD_SIGNATURE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret=1;
|
||||||
|
err:
|
||||||
|
if (sig != NULL) ASN1_OCTET_STRING_free(sig);
|
||||||
|
memset(s,0,(unsigned int)siglen);
|
||||||
|
Free(s);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
188
crypto/openssl/crypto/rsa/rsa_sign.c
Normal file
188
crypto/openssl/crypto/rsa/rsa_sign.c
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
/* crypto/rsa/rsa_sign.c */
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "cryptlib.h"
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
#include <openssl/objects.h>
|
||||||
|
#include <openssl/x509.h>
|
||||||
|
|
||||||
|
int RSA_sign(int type, unsigned char *m, unsigned int m_len,
|
||||||
|
unsigned char *sigret, unsigned int *siglen, RSA *rsa)
|
||||||
|
{
|
||||||
|
X509_SIG sig;
|
||||||
|
ASN1_TYPE parameter;
|
||||||
|
int i,j,ret=1;
|
||||||
|
unsigned char *p,*s;
|
||||||
|
X509_ALGOR algor;
|
||||||
|
ASN1_OCTET_STRING digest;
|
||||||
|
|
||||||
|
sig.algor= &algor;
|
||||||
|
sig.algor->algorithm=OBJ_nid2obj(type);
|
||||||
|
if (sig.algor->algorithm == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_SIGN,RSA_R_UNKNOWN_ALGORITHM_TYPE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
if (sig.algor->algorithm->length == 0)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_SIGN,RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
parameter.type=V_ASN1_NULL;
|
||||||
|
parameter.value.ptr=NULL;
|
||||||
|
sig.algor->parameter= ¶meter;
|
||||||
|
|
||||||
|
sig.digest= &digest;
|
||||||
|
sig.digest->data=m;
|
||||||
|
sig.digest->length=m_len;
|
||||||
|
|
||||||
|
i=i2d_X509_SIG(&sig,NULL);
|
||||||
|
j=RSA_size(rsa);
|
||||||
|
if ((i-RSA_PKCS1_PADDING) > j)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_SIGN,RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
s=(unsigned char *)Malloc((unsigned int)j+1);
|
||||||
|
if (s == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_SIGN,ERR_R_MALLOC_FAILURE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
p=s;
|
||||||
|
i2d_X509_SIG(&sig,&p);
|
||||||
|
i=RSA_private_encrypt(i,s,sigret,rsa,RSA_PKCS1_PADDING);
|
||||||
|
if (i <= 0)
|
||||||
|
ret=0;
|
||||||
|
else
|
||||||
|
*siglen=i;
|
||||||
|
|
||||||
|
memset(s,0,(unsigned int)j+1);
|
||||||
|
Free(s);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_verify(int dtype, unsigned char *m, unsigned int m_len,
|
||||||
|
unsigned char *sigbuf, unsigned int siglen, RSA *rsa)
|
||||||
|
{
|
||||||
|
int i,ret=0,sigtype;
|
||||||
|
unsigned char *p,*s;
|
||||||
|
X509_SIG *sig=NULL;
|
||||||
|
|
||||||
|
if (siglen != (unsigned int)RSA_size(rsa))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_VERIFY,RSA_R_WRONG_SIGNATURE_LENGTH);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
s=(unsigned char *)Malloc((unsigned int)siglen);
|
||||||
|
if (s == NULL)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_VERIFY,ERR_R_MALLOC_FAILURE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
i=RSA_public_decrypt((int)siglen,sigbuf,s,rsa,RSA_PKCS1_PADDING);
|
||||||
|
|
||||||
|
if (i <= 0) goto err;
|
||||||
|
|
||||||
|
p=s;
|
||||||
|
sig=d2i_X509_SIG(NULL,&p,(long)i);
|
||||||
|
|
||||||
|
if (sig == NULL) goto err;
|
||||||
|
sigtype=OBJ_obj2nid(sig->algor->algorithm);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef RSA_DEBUG
|
||||||
|
/* put a backward compatability flag in EAY */
|
||||||
|
fprintf(stderr,"in(%s) expect(%s)\n",OBJ_nid2ln(sigtype),
|
||||||
|
OBJ_nid2ln(dtype));
|
||||||
|
#endif
|
||||||
|
if (sigtype != dtype)
|
||||||
|
{
|
||||||
|
if (((dtype == NID_md5) &&
|
||||||
|
(sigtype == NID_md5WithRSAEncryption)) ||
|
||||||
|
((dtype == NID_md2) &&
|
||||||
|
(sigtype == NID_md2WithRSAEncryption)))
|
||||||
|
{
|
||||||
|
/* ok, we will let it through */
|
||||||
|
#if !defined(NO_STDIO) && !defined(WIN16)
|
||||||
|
fprintf(stderr,"signature has problems, re-make with post SSLeay045\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_VERIFY,RSA_R_ALGORITHM_MISMATCH);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( ((unsigned int)sig->digest->length != m_len) ||
|
||||||
|
(memcmp(m,sig->digest->data,m_len) != 0))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret=1;
|
||||||
|
err:
|
||||||
|
if (sig != NULL) X509_SIG_free(sig);
|
||||||
|
memset(s,0,(unsigned int)siglen);
|
||||||
|
Free(s);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
147
crypto/openssl/crypto/rsa/rsa_ssl.c
Normal file
147
crypto/openssl/crypto/rsa/rsa_ssl.c
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
/* crypto/rsa/rsa_ssl.c */
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "cryptlib.h"
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
#include <openssl/rand.h>
|
||||||
|
|
||||||
|
int RSA_padding_add_SSLv23(unsigned char *to, int tlen, unsigned char *from,
|
||||||
|
int flen)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
unsigned char *p;
|
||||||
|
|
||||||
|
if (flen > (tlen-11))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_ADD_SSLV23,RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
p=(unsigned char *)to;
|
||||||
|
|
||||||
|
*(p++)=0;
|
||||||
|
*(p++)=2; /* Public Key BT (Block Type) */
|
||||||
|
|
||||||
|
/* pad out with non-zero random data */
|
||||||
|
j=tlen-3-8-flen;
|
||||||
|
|
||||||
|
RAND_bytes(p,j);
|
||||||
|
for (i=0; i<j; i++)
|
||||||
|
{
|
||||||
|
if (*p == '\0')
|
||||||
|
do {
|
||||||
|
RAND_bytes(p,1);
|
||||||
|
} while (*p == '\0');
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(p,3,8);
|
||||||
|
p+=8;
|
||||||
|
*(p++)='\0';
|
||||||
|
|
||||||
|
memcpy(p,from,(unsigned int)flen);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int RSA_padding_check_SSLv23(unsigned char *to, int tlen, unsigned char *from,
|
||||||
|
int flen, int num)
|
||||||
|
{
|
||||||
|
int i,j,k;
|
||||||
|
unsigned char *p;
|
||||||
|
|
||||||
|
p=from;
|
||||||
|
if (flen < 10)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_DATA_TOO_SMALL);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
if ((num != (flen+1)) || (*(p++) != 02))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_BLOCK_TYPE_IS_NOT_02);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* scan over padding data */
|
||||||
|
j=flen-1; /* one for type */
|
||||||
|
for (i=0; i<j; i++)
|
||||||
|
if (*(p++) == 0) break;
|
||||||
|
|
||||||
|
if ((i == j) || (i < 8))
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_NULL_BEFORE_BLOCK_MISSING);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
for (k= -8; k<0; k++)
|
||||||
|
{
|
||||||
|
if (p[k] != 0x03) break;
|
||||||
|
}
|
||||||
|
if (k == 0)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_SSLV3_ROLLBACK_ATTACK);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
i++; /* Skip over the '\0' */
|
||||||
|
j-=i;
|
||||||
|
memcpy(to,p,(unsigned int)j);
|
||||||
|
|
||||||
|
return(j);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user