From 2cb43b7f80c9b4466eb261e8097b56434f85109a Mon Sep 17 00:00:00 2001 From: Zhi Guan Date: Mon, 6 Jun 2016 22:04:44 +0200 Subject: [PATCH] jni api --- MINFO | 8 +- Makefile | 681 ++++++ PROBLEMS | 2 + README.md | 58 +- apps/ciphers.c | 4 +- apps/cpk.c | 4 +- apps/cpkparam.c | 4 +- apps/enc.c | 2 +- crypto/asn1/a_sign.c | 4 + crypto/asn1/ameth_lib.c | 3 - crypto/cbcmac/cbcmac.c | 6 +- crypto/cpk/cpk.h | 3 +- crypto/cpk/cpk_err2.c | 126 -- crypto/ec/ec.h | 6 +- crypto/ec/ec_ameth.c | 2 +- crypto/ec/ec_asn1.c | 2 +- crypto/ec/ec_curve.c | 4 +- crypto/ec/ec_pmeth.c | 40 +- crypto/ecies/Makefile | 2 +- crypto/ecies/ecies.h | 2 +- crypto/ecies/ecies_lib.c | 52 +- crypto/engine/eng_all.c | 2 +- crypto/engine/engine.h | 2 +- crypto/err/Makefile | 43 +- crypto/err/err.c | 2 +- crypto/err/err.h | 18 +- crypto/err/err_all.c | 4 +- crypto/evp/c_allc.c | 2 +- crypto/evp/c_alld.c | 2 +- crypto/evp/digest.c | 4 - crypto/evp/e_sms4.c | 15 +- crypto/evp/e_zuc.c | 87 +- crypto/evp/evp.h | 4 +- crypto/evp/evp_enc.c | 17 +- crypto/evp/m_sigver.c | 3 - crypto/evp/m_sm3.c | 20 +- crypto/evp/pmeth_gn.c | 4 - crypto/evp/pmeth_lib.c | 2 +- crypto/ffx/Makefile | 16 + crypto/objects/obj_xref.h | 14 + crypto/objects/obj_xref.txt | 10 + crypto/otp/Makefile | 2 + crypto/paillier/Makefile | 15 + crypto/pem/pem.h | 4 - crypto/skf/Makefile | 4 +- crypto/skf/skf.h | 2 +- crypto/skf/skf_dev.c | 33 + crypto/skf/skf_dgst.c | 22 +- crypto/skf/skf_ec.c | 24 + crypto/skf/skf_enc.c | 138 +- crypto/skf/skf_err.c | 11 + crypto/skf/skf_errstr.c | 4 +- crypto/skf/skf_ex.h | 16 + crypto/skf/skf_handle.c | 121 +- crypto/skf/skf_lcl.h | 16 +- crypto/skf/skf_mac.c | 10 +- crypto/skf/skf_rsa.c | 103 +- crypto/skf/skftest.c | 383 ++++ crypto/sm2/Makefile | 4 +- crypto/sm2/sm2.h | 1 + crypto/sm2/sm2_err.c | 1 + crypto/sm2/sm2_kap.c | 99 +- crypto/sm2/sm2_lib.c | 14 +- crypto/sm3/Makefile | 9 +- crypto/sm3/README.md | 66 + crypto/sm3/hmac_sm3.c | 78 - crypto/sm3/hmac_sm3.h | 29 - crypto/sm3/hmac_sm3_test.c | 68 - crypto/sm3/sm3.c | 45 +- crypto/sm3/sm3.h | 22 +- crypto/sm3/sm3_hmac.c | 129 ++ crypto/sm3/sm3dgst.c | 46 - crypto/sm3/sm3test.c | 22 - crypto/sm3/sm3test2.c | 59 + crypto/sm9/Makefile | 11 + crypto/sm9/sm9_lib.c | 3 +- crypto/sms4/Makefile | 2 + crypto/sms4/README.md | 22 + crypto/sms4/sms4test.c | 6 +- crypto/x509/x509.h | 2 +- crypto/x509/x509type.c | 3 - crypto/zuc/zuc.c | 298 +-- crypto/zuc/zuc.h | 106 +- crypto/zuc/zuctest.c | 509 +++++ demos/ameth.c | 36 - demos/gmssl/Makefile | 14 + demos/gmssl/a.out | Bin 0 -> 1472832 bytes demos/gmssl/cert.pem | 13 - demos/gmssl/ciphers.c | 89 + demos/{ => gmssl}/ectool.c | 0 demos/gmssl/evpsm3.c | 109 + demos/gmssl/gmssl.sh | 7 +- demos/gmssl/{sm3hmac.c => hmacsm3.c} | 2 +- demos/gmssl/listciphers.c | 38 - demos/gmssl/memleak.c | 20 + demos/gmssl/selfsign.c | 128 +- demos/gmssl/sm2ciphertext.bin | 2 + demos/gmssl/sm2key.pem | 6 +- demos/gmssl/sm2sig.der | Bin 0 -> 71 bytes demos/gmssl/sm2testpem.c | 32 - demos/gmssl/sm3.c | 72 +- demos/mycipher/Makefile | 78 + demos/mycipher/README.md | 9 + .../evp/m_btc.c => demos/mycipher/mycipher.c | 61 +- demos/mycipher/mycipher.h | 85 + demos/mycipher/mycipher.o | Bin 0 -> 1020 bytes demos/mycipher/myciphertest.c | 77 + demos/mystream/Makefile | 78 + demos/mystream/README.md | 9 + demos/mystream/mystream.c | 64 + demos/mystream/mystream.h | 80 + demos/mystream/mystream.o | Bin 0 -> 744 bytes demos/mystream/mystreamtest.c | 62 + doc/crypto/sm2.pod | 200 ++ doc/gmssl/draft-shen-sm3-hash-01.txt | 728 ++++++ engines/Makefile | 19 +- engines/e_skf.c | 138 +- engines/e_skf_err.c | 1 + engines/e_skf_err.h | 1 + engines/skf/Makefile | 6 + engines/skf/README.md | 13 + engines/skf/skf_dummy.c | 345 ++- jni/GmSSL.c | 726 ++++++ jni/GmSSL.java | 88 + jni/Makefile | 24 + jni/README.md | 12 + jni/jni/jni.h | 1961 +++++++++++++++++ jni/jni/jni_md.h | 23 + ms/version32.rc | 47 + ssl/s3_lib.c | 2 +- ssl/ssl.h | 4 +- ssl/ssl_algs.c | 2 +- ssl/ssl_ciph.c | 36 +- ssl/ssl_lib.c | 2 +- ssl/ssl_locl.h | 22 +- ssl/ssl_sess.c | 2 +- ssl/ssl_stat.c | 6 +- ssl/ssl_txt.c | 2 +- test/p.zuc.cipher | Bin 1036 -> 1032 bytes test/p.zuc.clear | Bin 1016 -> 1016 bytes util/libeay.num | 14 + util/ssleay.num | 3 + 142 files changed, 7768 insertions(+), 1678 deletions(-) create mode 100644 Makefile delete mode 100644 crypto/cpk/cpk_err2.c create mode 100644 crypto/skf/skftest.c create mode 100644 crypto/sm3/README.md delete mode 100644 crypto/sm3/hmac_sm3.c delete mode 100644 crypto/sm3/hmac_sm3.h delete mode 100644 crypto/sm3/hmac_sm3_test.c create mode 100644 crypto/sm3/sm3_hmac.c delete mode 100644 crypto/sm3/sm3dgst.c create mode 100644 crypto/sms4/README.md delete mode 100644 demos/ameth.c create mode 100644 demos/gmssl/Makefile create mode 100755 demos/gmssl/a.out delete mode 100644 demos/gmssl/cert.pem create mode 100644 demos/gmssl/ciphers.c rename demos/{ => gmssl}/ectool.c (100%) create mode 100644 demos/gmssl/evpsm3.c rename demos/gmssl/{sm3hmac.c => hmacsm3.c} (99%) delete mode 100644 demos/gmssl/listciphers.c create mode 100644 demos/gmssl/memleak.c delete mode 100644 demos/gmssl/sm2testpem.c create mode 100644 demos/mycipher/Makefile create mode 100644 demos/mycipher/README.md rename crypto/evp/m_btc.c => demos/mycipher/mycipher.c (69%) create mode 100644 demos/mycipher/mycipher.h create mode 100644 demos/mycipher/mycipher.o create mode 100644 demos/mycipher/myciphertest.c create mode 100644 demos/mystream/Makefile create mode 100644 demos/mystream/README.md create mode 100644 demos/mystream/mystream.c create mode 100644 demos/mystream/mystream.h create mode 100644 demos/mystream/mystream.o create mode 100644 demos/mystream/mystreamtest.c create mode 100644 doc/crypto/sm2.pod create mode 100644 doc/gmssl/draft-shen-sm3-hash-01.txt create mode 100644 engines/skf/Makefile create mode 100644 engines/skf/README.md create mode 100644 jni/GmSSL.c create mode 100644 jni/GmSSL.java create mode 100644 jni/Makefile create mode 100644 jni/README.md create mode 100644 jni/jni/jni.h create mode 100644 jni/jni/jni_md.h create mode 100644 ms/version32.rc diff --git a/MINFO b/MINFO index 59c52c3f..19584f06 100644 --- a/MINFO +++ b/MINFO @@ -1313,7 +1313,7 @@ TOP=../.. RELATIVE_DIRECTORY= RELATIVE_DIRECTORY=crypto/sm3 AFLAGS=-I.. -I../.. -I../../include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -arch x86_64 -O3 -DL_ENDIAN -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -ALL=Makefile sm3.c byteorder.h sm3.h +ALL=Makefile sm3.c sm3_hmac.c byteorder.h sm3.h APPS= AR=ar r ASFLAGS=-I.. -I../.. -I../../include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -arch x86_64 -O3 -DL_ENDIAN -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM @@ -1327,11 +1327,11 @@ GENERAL=Makefile HEADER=byteorder.h sm3.h INCLUDES=-I.. -I../.. -I../../include LIB=../../libcrypto.a -LIBOBJ=sm3.o -LIBSRC=sm3.c +LIBOBJ=sm3.o sm3_hmac.o +LIBSRC=sm3.c sm3_hmac.c MAKEFILE=Makefile SM3_ASM_OBJ= -SRC=sm3.c +SRC=sm3.c sm3_hmac.c TEST=sm3test.c TOP=../.. RELATIVE_DIRECTORY= diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..9fef01f8 --- /dev/null +++ b/Makefile @@ -0,0 +1,681 @@ +### Generated automatically from Makefile.org by Configure. + +## +## Makefile for OpenSSL +## + +VERSION=1.0.2d-fips +MAJOR=1 +MINOR=0.2 +SHLIB_VERSION_NUMBER=1.0.0 +SHLIB_VERSION_HISTORY= +SHLIB_MAJOR=1 +SHLIB_MINOR=0.0 +SHLIB_EXT=.$(SHLIB_MAJOR).$(SHLIB_MINOR).dylib +PLATFORM=darwin64-x86_64-cc +OPTIONS=--prefix=/usr/local/ --openssldir=/usr/local/openssl no-ec_nistp_64_gcc_128 no-gmp no-jpake no-krb5 no-libunbound no-md2 no-rc5 no-rfc3779 no-sctp no-shared no-ssl-trace no-store no-unit-test no-zlib no-zlib-dynamic static-engine +CONFIGURE_ARGS=darwin64-x86_64-cc --prefix=/usr/local/ --openssldir=/usr/local/openssl +SHLIB_TARGET=darwin-shared + +# HERE indicates where this Makefile lives. This can be used to indicate +# where sub-Makefiles are expected to be. Currently has very limited usage, +# and should probably not be bothered with at all. +HERE=. + +# INSTALL_PREFIX is for package builders so that they can configure +# for, say, /usr/ and yet have everything installed to /tmp/somedir/usr/. +# Normally it is left empty. +INSTALL_PREFIX= +INSTALLTOP=/usr/local + +# Do not edit this manually. Use Configure --openssldir=DIR do change this! +OPENSSLDIR=/usr/local/openssl + +# NO_IDEA - Define to build without the IDEA algorithm +# NO_RC4 - Define to build without the RC4 algorithm +# NO_RC2 - Define to build without the RC2 algorithm +# THREADS - Define when building with threads, you will probably also need any +# system defines as well, i.e. _REENTERANT for Solaris 2.[34] +# TERMIO - Define the termio terminal subsystem, needed if sgtty is missing. +# TERMIOS - Define the termios terminal subsystem, Silicon Graphics. +# LONGCRYPT - Define to use HPUX 10.x's long password modification to crypt(3). +# DEVRANDOM - Give this the value of the 'random device' if your OS supports +# one. 32 bytes will be read from this when the random +# number generator is initalised. +# SSL_FORBID_ENULL - define if you want the server to be not able to use the +# NULL encryption ciphers. +# +# LOCK_DEBUG - turns on lots of lock debug output :-) +# REF_CHECK - turn on some xyz_free() assertions. +# REF_PRINT - prints some stuff on structure free. +# CRYPTO_MDEBUG - turns on my 'memory leak' detecting stuff +# MFUNC - Make all Malloc/Free/Realloc calls call +# CRYPTO_malloc/CRYPTO_free/CRYPTO_realloc which can be setup to +# call application defined callbacks via CRYPTO_set_mem_functions() +# MD5_ASM needs to be defined to use the x86 assembler for MD5 +# SHA1_ASM needs to be defined to use the x86 assembler for SHA1 +# RMD160_ASM needs to be defined to use the x86 assembler for RIPEMD160 +# Do not define B_ENDIAN or L_ENDIAN if 'unsigned long' == 8. It must +# equal 4. +# PKCS1_CHECK - pkcs1 tests. + +CC= cc +CFLAG= -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -arch x86_64 -O3 -DL_ENDIAN -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM +DEPFLAG= -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_LIBUNBOUND -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_SSL_TRACE -DOPENSSL_NO_STORE -DOPENSSL_NO_UNIT_TEST +PEX_LIBS= -Wl,-search_paths_first +EX_LIBS= +EXE_EXT= +ARFLAGS= +AR= ar $(ARFLAGS) r +RANLIB= /usr/bin/ranlib +NM= nm +PERL= /usr/bin/perl +TAR= tar +TARFLAGS= --no-recursion +MAKEDEPPROG=makedepend +LIBDIR=lib + +# We let the C compiler driver to take care of .s files. This is done in +# order to be excused from maintaining a separate set of architecture +# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC +# gcc, then the driver will automatically translate it to -xarch=v8plus +# and pass it down to assembler. +AS=$(CC) -c +ASFLAG=$(CFLAG) + +# For x86 assembler: Set PROCESSOR to 386 if you want to support +# the 80386. +PROCESSOR= + +# CPUID module collects small commonly used assembler snippets +CPUID_OBJ= x86_64cpuid.o +BN_ASM= x86_64-gcc.o x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o rsaz_exp.o rsaz-x86_64.o rsaz-avx2.o +EC_ASM= ecp_nistz256.o ecp_nistz256-x86_64.o +DES_ENC= des_enc.o fcrypt_b.o +AES_ENC= aes-x86_64.o vpaes-x86_64.o bsaes-x86_64.o aesni-x86_64.o aesni-sha1-x86_64.o aesni-sha256-x86_64.o aesni-mb-x86_64.o +BF_ENC= bf_enc.o +CAST_ENC= c_enc.o +RC4_ENC= rc4_enc.o rc4_skey.o +RC5_ENC= rc5_enc.o +MD5_ASM_OBJ= md5-x86_64.o +SHA1_ASM_OBJ= sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o +RMD160_ASM_OBJ= +WP_ASM_OBJ= wp-x86_64.o +CMLL_ENC= cmll-x86_64.o cmll_misc.o +MODES_ASM_OBJ= ghash-x86_64.o aesni-gcm-x86_64.o +ENGINES_ASM_OBJ= +PERLASM_SCHEME= macosx + +# KRB5 stuff +KRB5_INCLUDES= +LIBKRB5= + +# Zlib stuff +ZLIB_INCLUDE= +LIBZLIB= + +# TOP level FIPS install directory. +FIPSDIR=/usr/local/ssl/fips-2.0 + +# This is the location of fipscanister.o and friends. +# The FIPS module build will place it $(INSTALLTOP)/lib +# but since $(INSTALLTOP) can only take the default value +# when the module is built it will be in /usr/local/ssl/lib +# $(INSTALLTOP) for this build may be different so hard +# code the path. + +FIPSLIBDIR= + +# The location of the library which contains fipscanister.o +# normally it will be libcrypto unless fipsdso is set in which +# case it will be libfips. If not compiling in FIPS mode at all +# this is empty making it a useful test for a FIPS compile. + +FIPSCANLIB= + +# Shared library base address. Currently only used on Windows. +# + +BASEADDR=0xFB00000 + +DIRS= crypto ssl engines apps test tools +ENGDIRS= ccgost +SHLIBDIRS= crypto ssl + +# dirs in crypto to build +SDIRS= \ + objects \ + md4 md5 sha mdc2 hmac ripemd whrlpool \ + des aes rc2 rc4 idea bf cast camellia seed modes \ + bn ec rsa dsa ecdsa dh ecdh ecies dso engine \ + buffer bio stack lhash rand err \ + evp asn1 pem x509 x509v3 conf txt_db pkcs7 pkcs12 comp ocsp ui krb5 \ + cms pqueue ts srp cmac \ + sm2 sm3 sms4 sm9 ecies ffx cpk zuc cbcmac otp skf paillier kdf + +# keep in mind that the above list is adjusted by ./Configure +# according to no-xxx arguments... + +# tests to perform. "alltests" is a special word indicating that all tests +# should be performed. +TESTS = alltests + +MAKEFILE= Makefile + +MANDIR=$(OPENSSLDIR)/man +MAN1=1 +MAN3=3 +MANSUFFIX= +HTMLSUFFIX=html +HTMLDIR=$(OPENSSLDIR)/html +SHELL=/bin/sh + +TOP= . +ONEDIRS=out tmp +EDIRS= times doc bugs util include certs ms shlib mt demos perl sf dep VMS +WDIRS= windows +LIBS= libcrypto.a libssl.a +SHARED_CRYPTO=libcrypto$(SHLIB_EXT) +SHARED_SSL=libssl$(SHLIB_EXT) +SHARED_LIBS= +SHARED_LIBS_LINK_EXTS=.$(SHLIB_MAJOR).dylib .dylib +SHARED_LDFLAGS=-arch x86_64 -dynamiclib + +GENERAL= Makefile +BASENAME= gmssl +NAME= $(BASENAME)-$(VERSION) +TARFILE= $(NAME).tar +WTARFILE= $(NAME)-win.tar +EXHEADER= e_os2.h +HEADER= e_os.h + +all: Makefile build_all + +# as we stick to -e, CLEARENV ensures that local variables in lower +# Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn +# shell, which [annoyingly enough] terminates unset with error if VAR +# is not present:-( TOP= && unset TOP is tribute to HP-UX /bin/sh, +# which terminates unset with error if no variable was present:-( +CLEARENV= TOP= && unset TOP $${LIB+LIB} $${LIBS+LIBS} \ + $${INCLUDE+INCLUDE} $${INCLUDES+INCLUDES} \ + $${DIR+DIR} $${DIRS+DIRS} $${SRC+SRC} \ + $${LIBSRC+LIBSRC} $${LIBOBJ+LIBOBJ} $${ALL+ALL} \ + $${EXHEADER+EXHEADER} $${HEADER+HEADER} \ + $${GENERAL+GENERAL} $${CFLAGS+CFLAGS} \ + $${ASFLAGS+ASFLAGS} $${AFLAGS+AFLAGS} \ + $${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS} $${SCRIPTS+SCRIPTS} \ + $${SHAREDCMD+SHAREDCMD} $${SHAREDFLAGS+SHAREDFLAGS} \ + $${SHARED_LIB+SHARED_LIB} $${LIBEXTRAS+LIBEXTRAS} + +BUILDENV= PLATFORM='$(PLATFORM)' PROCESSOR='$(PROCESSOR)' \ + CC='$(CC)' CFLAG='$(CFLAG)' \ + AS='$(CC)' ASFLAG='$(CFLAG) -c' \ + AR='$(AR)' NM='$(NM)' RANLIB='$(RANLIB)' \ + CROSS_COMPILE='$(CROSS_COMPILE)' \ + PERL='$(PERL)' ENGDIRS='$(ENGDIRS)' \ + SDIRS='$(SDIRS)' LIBRPATH='$(INSTALLTOP)/$(LIBDIR)' \ + INSTALL_PREFIX='$(INSTALL_PREFIX)' \ + INSTALLTOP='$(INSTALLTOP)' OPENSSLDIR='$(OPENSSLDIR)' \ + LIBDIR='$(LIBDIR)' \ + MAKEDEPEND='$$$${TOP}/util/domd $$$${TOP} -MD $(MAKEDEPPROG)' \ + DEPFLAG='-DOPENSSL_NO_DEPRECATED $(DEPFLAG)' \ + MAKEDEPPROG='$(MAKEDEPPROG)' \ + SHARED_LDFLAGS='$(SHARED_LDFLAGS)' \ + KRB5_INCLUDES='$(KRB5_INCLUDES)' LIBKRB5='$(LIBKRB5)' \ + ZLIB_INCLUDE='$(ZLIB_INCLUDE)' LIBZLIB='$(LIBZLIB)' \ + EXE_EXT='$(EXE_EXT)' SHARED_LIBS='$(SHARED_LIBS)' \ + SHLIB_EXT='$(SHLIB_EXT)' SHLIB_TARGET='$(SHLIB_TARGET)' \ + PEX_LIBS='$(PEX_LIBS)' EX_LIBS='$(EX_LIBS)' \ + CPUID_OBJ='$(CPUID_OBJ)' BN_ASM='$(BN_ASM)' \ + EC_ASM='$(EC_ASM)' DES_ENC='$(DES_ENC)' \ + AES_ENC='$(AES_ENC)' CMLL_ENC='$(CMLL_ENC)' \ + BF_ENC='$(BF_ENC)' CAST_ENC='$(CAST_ENC)' \ + RC4_ENC='$(RC4_ENC)' RC5_ENC='$(RC5_ENC)' \ + SHA1_ASM_OBJ='$(SHA1_ASM_OBJ)' \ + MD5_ASM_OBJ='$(MD5_ASM_OBJ)' \ + RMD160_ASM_OBJ='$(RMD160_ASM_OBJ)' \ + WP_ASM_OBJ='$(WP_ASM_OBJ)' \ + MODES_ASM_OBJ='$(MODES_ASM_OBJ)' \ + ENGINES_ASM_OBJ='$(ENGINES_ASM_OBJ)' \ + PERLASM_SCHEME='$(PERLASM_SCHEME)' \ + FIPSLIBDIR='${FIPSLIBDIR}' \ + FIPSDIR='${FIPSDIR}' \ + FIPSCANLIB="$${FIPSCANLIB:-$(FIPSCANLIB)}" \ + THIS=$${THIS:-$@} MAKEFILE=Makefile MAKEOVERRIDES= +# MAKEOVERRIDES= effectively "equalizes" GNU-ish and SysV-ish make flavors, +# which in turn eliminates ambiguities in variable treatment with -e. + +# BUILD_CMD is a generic macro to build a given target in a given +# subdirectory. The target must be given through the shell variable +# `target' and the subdirectory to build in must be given through `dir'. +# This macro shouldn't be used directly, use RECURSIVE_BUILD_CMD or +# BUILD_ONE_CMD instead. +# +# BUILD_ONE_CMD is a macro to build a given target in a given +# subdirectory if that subdirectory is part of $(DIRS). It requires +# exactly the same shell variables as BUILD_CMD. +# +# RECURSIVE_BUILD_CMD is a macro to build a given target in all +# subdirectories defined in $(DIRS). It requires that the target +# is given through the shell variable `target'. +BUILD_CMD= if [ -d "$$dir" ]; then \ + ( cd $$dir && echo "making $$target in $$dir..." && \ + $(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. DIR=$$dir $$target \ + ) || exit 1; \ + fi +RECURSIVE_BUILD_CMD=for dir in $(DIRS); do $(BUILD_CMD); done +BUILD_ONE_CMD=\ + if expr " $(DIRS) " : ".* $$dir " >/dev/null 2>&1; then \ + $(BUILD_CMD); \ + fi + +reflect: + @[ -n "$(THIS)" ] && $(CLEARENV) && $(MAKE) $(THIS) -e $(BUILDENV) + +sub_all: build_all + +build_all: build_libs build_apps build_tests build_tools + +build_libs: build_libcrypto build_libssl openssl.pc + +build_libcrypto: build_crypto build_engines libcrypto.pc +build_libssl: build_ssl libssl.pc + +build_crypto: + @dir=crypto; target=all; $(BUILD_ONE_CMD) +build_ssl: build_crypto + @dir=ssl; target=all; $(BUILD_ONE_CMD) +build_engines: build_crypto + @dir=engines; target=all; $(BUILD_ONE_CMD) +build_apps: build_libs + @dir=apps; target=all; $(BUILD_ONE_CMD) +build_tests: build_libs + @dir=test; target=all; $(BUILD_ONE_CMD) +build_tools: build_libs + @dir=tools; target=all; $(BUILD_ONE_CMD) + +all_testapps: build_libs build_testapps +build_testapps: + @dir=crypto; target=testapps; $(BUILD_ONE_CMD) + +fips_premain_dso$(EXE_EXT): libcrypto.a + [ -z "$(FIPSCANLIB)" ] || $(CC) $(CFLAG) -Iinclude \ + -DFINGERPRINT_PREMAIN_DSO_LOAD -o $@ \ + $(FIPSLIBDIR)fips_premain.c $(FIPSLIBDIR)fipscanister.o \ + libcrypto.a $(EX_LIBS) + +libcrypto$(SHLIB_EXT): libcrypto.a fips_premain_dso$(EXE_EXT) + @if [ "$(SHLIB_TARGET)" != "" ]; then \ + if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \ + FIPSLD_LIBCRYPTO=libcrypto.a ; \ + FIPSLD_CC="$(CC)"; CC=$(FIPSDIR)/bin/fipsld; \ + export CC FIPSLD_CC FIPSLD_LIBCRYPTO; \ + fi; \ + $(MAKE) -e SHLIBDIRS=crypto CC="$${CC:-$(CC)}" build-shared && \ + (touch -c fips_premain_dso$(EXE_EXT) || :); \ + else \ + echo "There's no support for shared libraries on this platform" >&2; \ + exit 1; \ + fi + +libssl$(SHLIB_EXT): libcrypto$(SHLIB_EXT) libssl.a + @if [ "$(SHLIB_TARGET)" != "" ]; then \ + $(MAKE) SHLIBDIRS=ssl SHLIBDEPS='-lcrypto' build-shared; \ + else \ + echo "There's no support for shared libraries on this platform" >&2; \ + exit 1; \ + fi + +clean-shared: + @set -e; for i in $(SHLIBDIRS); do \ + if [ -n "$(SHARED_LIBS_LINK_EXTS)" ]; then \ + tmp="$(SHARED_LIBS_LINK_EXTS)"; \ + for j in $${tmp:-x}; do \ + ( set -x; rm -f lib$$i$$j ); \ + done; \ + fi; \ + ( set -x; rm -f lib$$i$(SHLIB_EXT) ); \ + if expr "$(PLATFORM)" : "Cygwin" >/dev/null; then \ + ( set -x; rm -f cyg$$i$(SHLIB_EXT) lib$$i$(SHLIB_EXT).a ); \ + fi; \ + done + +link-shared: + @ set -e; for i in $(SHLIBDIRS); do \ + $(MAKE) -f $(HERE)/Makefile.shared -e $(BUILDENV) \ + LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \ + LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \ + symlink.$(SHLIB_TARGET); \ + libs="$$libs -l$$i"; \ + done + +build-shared: do_$(SHLIB_TARGET) link-shared + +do_$(SHLIB_TARGET): + @ set -e; libs='-L. $(SHLIBDEPS)'; for i in $(SHLIBDIRS); do \ + if [ "$$i" = "ssl" -a -n "$(LIBKRB5)" ]; then \ + libs="$(LIBKRB5) $$libs"; \ + fi; \ + $(CLEARENV) && $(MAKE) -f Makefile.shared -e $(BUILDENV) \ + LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \ + LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \ + LIBDEPS="$$libs $(EX_LIBS)" \ + link_a.$(SHLIB_TARGET); \ + libs="-l$$i $$libs"; \ + done + +libcrypto.pc: Makefile + @ ( echo 'prefix=$(INSTALLTOP)'; \ + echo 'exec_prefix=$${prefix}'; \ + echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ + echo 'includedir=$${prefix}/include'; \ + echo ''; \ + echo 'Name: OpenSSL-libcrypto'; \ + echo 'Description: OpenSSL cryptography library'; \ + echo 'Version: '$(VERSION); \ + echo 'Requires: '; \ + echo 'Libs: -L$${libdir} -lcrypto'; \ + echo 'Libs.private: $(EX_LIBS)'; \ + echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc + +libssl.pc: Makefile + @ ( echo 'prefix=$(INSTALLTOP)'; \ + echo 'exec_prefix=$${prefix}'; \ + echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ + echo 'includedir=$${prefix}/include'; \ + echo ''; \ + echo 'Name: OpenSSL-libssl'; \ + echo 'Description: Secure Sockets Layer and cryptography libraries'; \ + echo 'Version: '$(VERSION); \ + echo 'Requires.private: libcrypto'; \ + echo 'Libs: -L$${libdir} -lssl'; \ + echo 'Libs.private: $(EX_LIBS)'; \ + echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc + +openssl.pc: Makefile + @ ( echo 'prefix=$(INSTALLTOP)'; \ + echo 'exec_prefix=$${prefix}'; \ + echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ + echo 'includedir=$${prefix}/include'; \ + echo ''; \ + echo 'Name: OpenSSL'; \ + echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \ + echo 'Version: '$(VERSION); \ + echo 'Requires: libssl libcrypto' ) > openssl.pc + +Makefile: Makefile.org Configure config + @echo "Makefile is older than Makefile.org, Configure or config." + @echo "Reconfigure the source tree (via './config' or 'perl Configure'), please." + @false + +libclean: + rm -f *.map *.so *.so.* *.dylib *.dll engines/*.so engines/*.dll engines/*.dylib *.a engines/*.a */lib */*/lib + +clean: libclean + rm -f shlib/*.o *.o core a.out fluff rehash.time testlog make.log cctest cctest.c + @set -e; target=clean; $(RECURSIVE_BUILD_CMD) + rm -f $(LIBS) + rm -f openssl.pc libssl.pc libcrypto.pc + rm -f speed.* .pure + rm -f $(TARFILE) + @set -e; for i in $(ONEDIRS) ;\ + do \ + rm -fr $$i/*; \ + done + +makefile.one: files + $(PERL) util/mk1mf.pl >makefile.one; \ + sh util/do_ms.sh + +files: + $(PERL) $(TOP)/util/files.pl Makefile > $(TOP)/MINFO + @set -e; target=files; $(RECURSIVE_BUILD_CMD) + +links: + @$(PERL) $(TOP)/util/mkdir-p.pl include/openssl + @$(PERL) $(TOP)/util/mklink.pl include/openssl $(EXHEADER) + @set -e; target=links; $(RECURSIVE_BUILD_CMD) + +gentests: + @(cd test && echo "generating dummy tests (if needed)..." && \ + $(CLEARENV) && $(MAKE) -e $(BUILDENV) TESTS='$(TESTS)' OPENSSL_DEBUG_MEMORY=on generate ); + +dclean: + rm -rf *.bak include/openssl certs/.0 + @set -e; target=dclean; $(RECURSIVE_BUILD_CMD) + +rehash: rehash.time +rehash.time: certs apps + @if [ -z "$(CROSS_COMPILE)" ]; then \ + (OPENSSL="`pwd`/util/opensslwrap.sh"; \ + [ -x "apps/openssl.exe" ] && OPENSSL="apps/openssl.exe" || :; \ + OPENSSL_DEBUG_MEMORY=on; \ + export OPENSSL OPENSSL_DEBUG_MEMORY; \ + $(PERL) tools/c_rehash certs/demo) && \ + touch rehash.time; \ + else :; fi + +test: tests + +tests: rehash + @(cd test && echo "testing..." && \ + $(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. TESTS='$(TESTS)' OPENSSL_DEBUG_MEMORY=on OPENSSL_CONF=../apps/openssl.cnf tests ); + OPENSSL_CONF=apps/openssl.cnf util/opensslwrap.sh version -a + +report: + @$(PERL) util/selftest.pl + +update: errors stacks util/libeay.num util/ssleay.num TABLE + @set -e; target=update; $(RECURSIVE_BUILD_CMD) + +depend: + @set -e; target=depend; $(RECURSIVE_BUILD_CMD) + +lint: + @set -e; target=lint; $(RECURSIVE_BUILD_CMD) + +tags: + rm -f TAGS + find . -name '[^.]*.[ch]' | xargs etags -a + +errors: + $(PERL) util/ck_errf.pl -strict */*.c */*/*.c + $(PERL) util/mkerr.pl -recurse -write + (cd engines; $(MAKE) PERL=$(PERL) errors) + +stacks: + $(PERL) util/mkstack.pl -write + +util/libeay.num:: + $(PERL) util/mkdef.pl crypto update + +util/ssleay.num:: + $(PERL) util/mkdef.pl ssl update + +TABLE: Configure + (echo 'Output of `Configure TABLE'"':"; \ + $(PERL) Configure TABLE) > TABLE + +# Build distribution tar-file. As the list of files returned by "find" is +# pretty long, on several platforms a "too many arguments" error or similar +# would occur. Therefore the list of files is temporarily stored into a file +# and read directly, requiring GNU-Tar. Call "make TAR=gtar dist" if the normal +# tar does not support the --files-from option. +tar: + find . -type d -print | xargs chmod 755 + find . -type f -print | xargs chmod a+r + find . -type f -perm -0100 -print | xargs chmod a+x + find * \! -path CVS/\* \! -path \*/CVS/\* \! -name CVS \! -name .cvsignore \! -name STATUS \! -name TABLE | sort > ../$(TARFILE).list; \ + $(TAR) $(TARFLAGS) --files-from ../$(TARFILE).list -cvf - | \ + tardy --user_number=0 --user_name=openssl \ + --group_number=0 --group_name=openssl \ + --prefix=openssl-$(VERSION) - |\ + gzip --best >../$(TARFILE).gz; \ + rm -f ../$(TARFILE).list; \ + ls -l ../$(TARFILE).gz + +tar-snap: + @$(TAR) $(TARFLAGS) -cvf - \ + `find * \! -path CVS/\* \! -path \*/CVS/\* \! -name CVS \! -name .cvsignore \! -name STATUS \! -name TABLE \! -name '*.o' \! -name '*.a' \! -name '*.so' \! -name '*.so.*' \! -name 'openssl' \! -name '*test' \! -name '.#*' \! -name '*~' | sort` |\ + tardy --user_number=0 --user_name=openssl \ + --group_number=0 --group_name=openssl \ + --prefix=openssl-$(VERSION) - > ../$(TARFILE);\ + ls -l ../$(TARFILE) + +dist: + $(PERL) Configure dist + @$(MAKE) dist_pem_h + @$(MAKE) SDIRS='$(SDIRS)' clean + @$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' tar + +dist_pem_h: + (cd crypto/pem; $(MAKE) -e $(BUILDENV) pem.h; $(MAKE) clean) + +install: all install_docs install_sw + +install_sw: + @$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ + $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \ + $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \ + $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig \ + $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl \ + $(INSTALL_PREFIX)$(OPENSSLDIR)/misc \ + $(INSTALL_PREFIX)$(OPENSSLDIR)/certs \ + $(INSTALL_PREFIX)$(OPENSSLDIR)/private + @set -e; headerlist="$(EXHEADER)"; for i in $$headerlist;\ + do \ + (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \ + chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \ + done; + @set -e; target=install; $(RECURSIVE_BUILD_CMD) + @set -e; liblist="$(LIBS)"; for i in $$liblist ;\ + do \ + if [ -f "$$i" ]; then \ + ( echo installing $$i; \ + cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ + $(RANLIB) $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ + chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ + mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i ); \ + fi; \ + done; + @set -e; if [ -n "$(SHARED_LIBS)" ]; then \ + tmp="$(SHARED_LIBS)"; \ + for i in $${tmp:-x}; \ + do \ + if [ -f "$$i" -o -f "$$i.a" ]; then \ + ( echo installing $$i; \ + if expr "$(PLATFORM)" : "Cygwin" >/dev/null; then \ + c=`echo $$i | sed 's/^lib\(.*\)\.dll\.a/cyg\1-$(SHLIB_VERSION_NUMBER).dll/'`; \ + cp $$c $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new; \ + chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new; \ + mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c; \ + cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ + chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ + mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i; \ + else \ + cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ + chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ + mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i; \ + fi ); \ + if expr $(PLATFORM) : 'mingw' > /dev/null; then \ + ( case $$i in \ + *crypto*) i=libeay32.dll;; \ + *ssl*) i=ssleay32.dll;; \ + esac; \ + echo installing $$i; \ + cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ + chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ + mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i ); \ + fi; \ + fi; \ + done; \ + ( here="`pwd`"; \ + cd $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR); \ + $(MAKE) -f $$here/Makefile HERE="$$here" link-shared ); \ + if [ "$(INSTALLTOP)" != "/usr" ]; then \ + echo 'OpenSSL shared libraries have been installed in:'; \ + echo ' $(INSTALLTOP)'; \ + echo ''; \ + sed -e '1,/^$$/d' doc/openssl-shared.txt; \ + fi; \ + fi + cp libcrypto.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig + chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc + cp libssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig + chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc + cp openssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig + chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc + +install_html_docs: + here="`pwd`"; \ + filecase=; \ + case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*|darwin*-*-cc) \ + filecase=-i; \ + esac; \ + for subdir in apps crypto ssl; do \ + mkdir -p $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir; \ + for i in doc/$$subdir/*.pod; do \ + fn=`basename $$i .pod`; \ + echo "installing html/$$fn.$(HTMLSUFFIX)"; \ + cat $$i \ + | sed -r 's/L<([^)]*)(\([0-9]\))?\|([^)]*)(\([0-9]\))?>/L<\1|\3>/g' \ + | pod2html --podroot=doc --htmlroot=.. --podpath=apps:crypto:ssl \ + | sed -r 's/ $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir/$$fn.$(HTMLSUFFIX); \ + $(PERL) util/extract-names.pl < $$i | \ + grep -v $$filecase "^$$fn\$$" | \ + (cd $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir; \ + while read n; do \ + PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$(HTMLSUFFIX) "$$n".$(HTMLSUFFIX); \ + done); \ + done; \ + done + +install_docs: + @$(PERL) $(TOP)/util/mkdir-p.pl \ + $(INSTALL_PREFIX)$(MANDIR)/man1 \ + $(INSTALL_PREFIX)$(MANDIR)/man3 \ + $(INSTALL_PREFIX)$(MANDIR)/man5 \ + $(INSTALL_PREFIX)$(MANDIR)/man7 + @pod2man="`cd ./util; ./pod2mantest $(PERL)`"; \ + here="`pwd`"; \ + filecase=; \ + case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*|darwin*-*-cc) \ + filecase=-i; \ + esac; \ + set -e; for i in doc/apps/*.pod; do \ + fn=`basename $$i .pod`; \ + sec=`$(PERL) util/extract-section.pl 1 < $$i`; \ + echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ + (cd `$(PERL) util/dirname.pl $$i`; \ + sh -c "$$pod2man \ + --section=$$sec --center=OpenSSL \ + --release=$(VERSION) `basename $$i`") \ + > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ + $(PERL) util/extract-names.pl < $$i | \ + (grep -v $$filecase "^$$fn\$$"; true) | \ + (grep -v "[ ]"; true) | \ + (cd $(INSTALL_PREFIX)$(MANDIR)/man$$sec/; \ + while read n; do \ + PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$${sec}$(MANSUFFIX) "$$n".$${sec}$(MANSUFFIX); \ + done); \ + done; \ + set -e; for i in doc/crypto/*.pod doc/ssl/*.pod; do \ + fn=`basename $$i .pod`; \ + sec=`$(PERL) util/extract-section.pl 3 < $$i`; \ + echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ + (cd `$(PERL) util/dirname.pl $$i`; \ + sh -c "$$pod2man \ + --section=$$sec --center=OpenSSL \ + --release=$(VERSION) `basename $$i`") \ + > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ + $(PERL) util/extract-names.pl < $$i | \ + (grep -v $$filecase "^$$fn\$$"; true) | \ + (grep -v "[ ]"; true) | \ + (cd $(INSTALL_PREFIX)$(MANDIR)/man$$sec/; \ + while read n; do \ + PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$${sec}$(MANSUFFIX) "$$n".$${sec}$(MANSUFFIX); \ + done); \ + done + +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/PROBLEMS b/PROBLEMS index 3eaab01f..ca02b10d 100644 --- a/PROBLEMS +++ b/PROBLEMS @@ -211,3 +211,5 @@ link failures. Apply 109147-09 or later or modify Makefile generated by ./Configure solaris64-sparcv9-cc and replace RANLIB assignment with RANLIB= /usr/ccs/bin/ar rs + +* gmssl warings: skf kdf diff --git a/README.md b/README.md index b6972e1f..a11e0638 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,43 @@ # GmSSL -GmSSL (http://gmssl.org) 是支持国密算法和标准的OpenSSL分支,增加了对国密SM2/SM3/SM4算法和ECIES、CPK、ZUC算法的支持,实现了这些算法与EVP API和命令行工具的集成。GmSSL由北京大学信息安全实验室(http://infosec.pku.edu.cn)开发和维护。 +GmSSL [(http://gmssl.org)](http://gmssl.org) 是支持国密算法和标准的OpenSSL分支,是一个提供了丰富密码学功能和安全功能的开源软件包。在保持OpenSSL原有功能并实现和OpenSSL API兼容的基础上,GmSSL新增多种密码算法、标准和协议,其中包括: -GmSSL的`libcrypto`密码库增加的密码算法包括: +* 椭圆曲线公钥加密国际标准ECIES +* 国密SM2椭圆曲线公钥密码标准,包含数字签名算法、公钥加密算法、密钥交换协议及推荐椭圆曲线参数 +* 国密SM3密码杂凑算法、HMAC-SM3消息认证码算法、PBKDF2口令加密算法 +* 国密SM4/SMS4分组密码、ECB/CBC/CFB/OFB/CTR/GCM/FFX加密模式和CBC-MAC/CMAC消息认证码算法 +* 组合公钥(CPK)身份密码,可同时支持椭圆曲线国际标准算法和国密标准算法 +* 国密动态口令密码规范 +* 祖冲之(ZUC)序列密码 -- SM2是国密椭圆曲线公钥密码标准,其中包含数字签名、公钥加密和密钥交换三个具体方案,以及一个256比特素域上的推荐椭圆曲线参数。GmSSL内置了SM2的推荐曲线参数,实现了SM2的签名算法和公钥加密算法。 -- SM3是国密密码杂凑算法标准,输出的杂凑值长度为256比特。 -- SM4是国密分组密码标准,又名SMS4,其分组长度和密钥长度均为128比特。GmSSL实现了SMS4密码及SMS4的ECB、CBC、CFB、OFB等工作模式。 -- X9.63 KDF是密钥派生函数国际标准之一,ECIES和SM2公钥加密方案依赖该算法,GmSSL实现了X9.63 KDF,并用于支持ECIES和SM2公钥加密。 -- ECIES (Elliptic Curve Integrated Encryption Scheme)是椭圆曲线公钥加密的国际标准,可用于加密数据。 -- CPK是由南相浩和陈钟设计的基于身份的密码。GmSSL实现了CPK的系统建立和密钥生成算法,生成的密钥可以用于DSA、ECDH、ECDSA、ECIES、SM2等公钥密码算法。 -- ZUC(祖冲之算法)是由我国设计的序列密码,以32位字为单位输出密钥流,其密钥长度和IV长度均为128比特。GmSSL的ZUC算法处于开发中。 +GmSSL还可以以安全中间件的方式访问PCI-E密码加速卡、USB Key等硬件密码设备,为上层应用提供密钥安全存储、密码计算硬件加速以及国密SM1分组密码、国密SSF33分组密码等硬件实现的保密算法。GmSSL通过ENGINE机制支持符合不同接口规范的密码设备: -GmSSL提供命令行工具`gmssl`,可用于生成SM2签名、SM3摘要、HMAC-SM3消息认证码,支持SM4和ZUC数据加解密。 +* 提供国密算法和国密SKF接口规范实现的硬件密码设备 +* 提供Windows Crypto API Provider的密码硬件设备 +* 提供PKCS #11 (Cryptoki)接口实现的密码硬件设备 -``` bash -$ echo -n abc | gmssl dgst -sm3 -66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0 +GmSSL主要包含通用密码库`libcrypto`、SSL/TLS协议库`libssl`和命令行工具`gmssl`。除`gmssl`的命令行接口之外,GmSSL还通过`libcrypto`密码库提供原生的EVP API抽象密码接口以及国密智能IC卡及智能密码钥匙密码应用接口SKF API,以及通过JNI (Java Native Interface)本地接口实现的Java语言绑定。 + +为了便于商业软件安全地采用GmSSL,GmSSL保持了和OpenSSL相似的BSD/Apache风格的许可证,因此闭源软件或者商业软件可以安全地在产品中采用GmSSL的代码。自发布以来GmSSL荣获开源中国[(http://oschina.net)](http://oschina.net)密码类推荐开源项目、2015年度“一铭杯”中国Linux软件大赛二等奖(该年度最高奖项)等奖励和荣誉。 + +GmSSL项目目前由北京大学信息安全实验室开发和维护,项目的长期目标是推动国产密码算法在国内互联网和开源领域的广泛应用,提高国内商用非涉密领域的自主密码应用水平。 + +## 编译和安装 + +OpenSSL通过其独有的编译脚本支持非常广泛的硬件和操作系统,GmSSL项目力求保持其跨平台特性。目前GmSSL可以在Linux平台和苹果OS X平台顺利编译安装,在Windows上暂时无法编译通过。我们预计可以在下一个版本发布时修正Windows平台的编译问题。 + +在Linux平台上通过如下指令实现编译和安装: + +``` +./config +make +make install ``` -显示SM2推荐椭圆曲线域参数 - -``` bash -$ gmssl ecparam -text -noout -name sm2p256v1 -param_enc explicit +在苹果OS X操作系统上通过如下指令实现编译和安装: +``` +./Configure darwin64-x86_64-cc --prefix=/usr/local --openssldir=/usr/local/openssl +make +sudo make install ``` -在代码目录`./certs/sm2/`目录中给出了SM2证书的例子,可以用`gmssl`工具进行解析 -``` -$ gmssl x509 -text -noout -in certs/sm2/sm2-x509.pem -$ gmssl pkcs7 -print_certs -in certs/sm2/sm2-pkcs7.pem -``` - -GmSSL新增的EVP对象包括`EVP_sm3()`、`EVP_sm4_ecb()`、`EVP_sm4_cbc()`、`EVP_sm4_ofb()`、`EVP_sm4_cfb()`和`EVP_zuc()`。 - diff --git a/apps/ciphers.c b/apps/ciphers.c index 3b9d978a..e042d5e9 100644 --- a/apps/ciphers.c +++ b/apps/ciphers.c @@ -76,7 +76,7 @@ static const char *ciphers_usage[] = { " -ssl2 - SSL2 mode\n", " -ssl3 - SSL3 mode\n", " -tls1 - TLS1 mode\n", -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL " -gmssl - GMSSL mode\n", #endif NULL @@ -141,7 +141,7 @@ int MAIN(int argc, char **argv) else if (strcmp(*argv, "-tls1") == 0) meth = TLSv1_client_method(); #endif -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL else if (strcmp(*argv, "-gmssl") == 0) meth = GMSSLv1_client_method(); #endif diff --git a/apps/cpk.c b/apps/cpk.c index 364f56a9..91c17224 100644 --- a/apps/cpk.c +++ b/apps/cpk.c @@ -105,7 +105,7 @@ */ #include -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL # include # include # include @@ -404,7 +404,7 @@ int MAIN(int argc, char **argv) apps_shutdown(); OPENSSL_EXIT(ret); } -#else /* !OPENSSL_NO_GMSSL */ +#else /* !NO_GMSSL */ # if PEDANTIC static void *dummy = &dummy; diff --git a/apps/cpkparam.c b/apps/cpkparam.c index 275394a0..3f8291f5 100644 --- a/apps/cpkparam.c +++ b/apps/cpkparam.c @@ -158,7 +158,7 @@ */ #include /* for OPENSSL_NO_DH */ -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL # include # include # include @@ -521,7 +521,7 @@ int MAIN(int argc, char **argv) } -#else /* !OPENSSL_NO_GMSSL */ +#else /* !NO_GMSSL */ # if PEDANTIC static void *dummy = &dummy; diff --git a/apps/enc.c b/apps/enc.c index b03e42cf..d1e3e8d1 100644 --- a/apps/enc.c +++ b/apps/enc.c @@ -344,7 +344,7 @@ int MAIN(int argc, char **argv) } if (dgst == NULL) { -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL dgst = EVP_sm3(); #else dgst = EVP_md5(); diff --git a/crypto/asn1/a_sign.c b/crypto/asn1/a_sign.c index 51c6a0c3..32aa3c76 100644 --- a/crypto/asn1/a_sign.c +++ b/crypto/asn1/a_sign.c @@ -135,6 +135,7 @@ int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_ALGOR *algor2, unsigned char *p, *buf_in = NULL, *buf_out = NULL; int i, inl = 0, outl = 0, outll = 0; X509_ALGOR *a; + printf("%s %d: %s executed\n", __FILE__, __LINE__, __FUNCTION__); EVP_MD_CTX_init(&ctx); for (i = 0; i < 2; i++) { @@ -222,8 +223,10 @@ int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, { EVP_MD_CTX ctx; EVP_MD_CTX_init(&ctx); + printf("%s %d: %s executed\n", __FILE__, __LINE__, __FUNCTION__); if (!EVP_DigestSignInit(&ctx, NULL, type, NULL, pkey)) { EVP_MD_CTX_cleanup(&ctx); + ERR_print_errors_fp(stderr); return 0; } return ASN1_item_sign_ctx(it, algor1, algor2, signature, asn, &ctx); @@ -239,6 +242,7 @@ int ASN1_item_sign_ctx(const ASN1_ITEM *it, size_t inl = 0, outl = 0, outll = 0; int signid, paramtype; int rv; + printf("%s %d: %s executed\n", __FILE__, __LINE__, __FUNCTION__); type = EVP_MD_CTX_md(ctx); pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx); diff --git a/crypto/asn1/ameth_lib.c b/crypto/asn1/ameth_lib.c index 669a949b..03fb491d 100644 --- a/crypto/asn1/ameth_lib.c +++ b/crypto/asn1/ameth_lib.c @@ -72,9 +72,6 @@ extern const EVP_PKEY_ASN1_METHOD dhx_asn1_meth; extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth; extern const EVP_PKEY_ASN1_METHOD hmac_asn1_meth; extern const EVP_PKEY_ASN1_METHOD cmac_asn1_meth; -#ifndef OPENSSL_NO_SM2 -extern const EVP_PKEY_ASN1_METHOD sm2_asn1_meth; -#endif /* Keep this sorted in type order !! */ static const EVP_PKEY_ASN1_METHOD *standard_methods[] = { diff --git a/crypto/cbcmac/cbcmac.c b/crypto/cbcmac/cbcmac.c index 2e769f4a..1b079f9d 100644 --- a/crypto/cbcmac/cbcmac.c +++ b/crypto/cbcmac/cbcmac.c @@ -55,7 +55,7 @@ int CBCMAC_Init(CBCMAC_CTX *ctx, const void *key, size_t keylen, const EVP_CIPHER *cipher, ENGINE *eng) { int i, block_size; - + if (!EVP_EncryptInit_ex(&ctx->cipher_ctx, cipher, eng, key, NULL)) { CBCMACerr(CBCMAC_F_CBCMAC_INIT, CBCMAC_R_CIPHER_CTX_INIT_FAILED); return 0; @@ -67,7 +67,7 @@ int CBCMAC_Init(CBCMAC_CTX *ctx, const void *key, size_t keylen, ctx->worklen = 0; block_size = EVP_CIPHER_CTX_block_size(&ctx->cipher_ctx); bzero(ctx->cbcstate, block_size); - return 0; + return 1; } int CBCMAC_Update(CBCMAC_CTX *ctx, const void *data, size_t datalen) @@ -119,7 +119,7 @@ int CBCMAC_Update(CBCMAC_CTX *ctx, const void *data, size_t datalen) } - return 0; + return 1; } int CBCMAC_Final(CBCMAC_CTX *ctx, unsigned char *out, size_t *outlen) diff --git a/crypto/cpk/cpk.h b/crypto/cpk/cpk.h index cee2d3d9..1669eea1 100644 --- a/crypto/cpk/cpk.h +++ b/crypto/cpk/cpk.h @@ -72,7 +72,7 @@ typedef struct cpk_master_secret_st { ASN1_OCTET_STRING *secret_factors; } CPK_MASTER_SECRET; - +DECLARE_ASN1_FUNCTIONS(CPK_MASTER_SECRET) typedef struct cpk_public_params_st { long version; @@ -82,6 +82,7 @@ typedef struct cpk_public_params_st { ASN1_OCTET_STRING *public_factors; } CPK_PUBLIC_PARAMS; +DECLARE_ASN1_FUNCTIONS(CPK_PUBLIC_PARAMS) X509_ALGOR *CPK_MAP_new_default(void); int CPK_MAP_is_valid(const X509_ALGOR *algor); diff --git a/crypto/cpk/cpk_err2.c b/crypto/cpk/cpk_err2.c deleted file mode 100644 index 5abc0244..00000000 --- a/crypto/cpk/cpk_err2.c +++ /dev/null @@ -1,126 +0,0 @@ -/* crypto/cpk/cpk_err.c */ -/* ==================================================================== - * Copyright (c) 2007 - 2015 The GmSSL 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 GmSSL Project. - * (http://gmssl.org/)" - * - * 4. The name "GmSSL Project" must not be used to endorse or promote - * products derived from this software without prior written - * permission. For written permission, please contact - * guanzhi1980@gmail.com. - * - * 5. Products derived from this software may not be called "GmSSL" - * nor may "GmSSL" appear in their names without prior written - * permission of the GmSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the GmSSL Project - * (http://gmssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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 -#include "cpk.h" - -/* BEGIN ERROR CODES */ -#ifndef OPENSSL_NO_ERR - -#define ERR_FUNC(func) ERR_PACK(ERR_LIB_CPK,func,0) -#define ERR_REASON(reason) ERR_PACK(ERR_LIB_CPK,0,reason) - -static ERR_STRING_DATA CPK_str_functs[] = -{ - {ERR_FUNC(CPK_F_CPK_MASTER_SECRET_CREATE), "CPK_MASTER_SECRET_create"}, - {ERR_FUNC(CPK_F_CPK_MASTER_SECRET_EXTRACT_PUBLIC_PARAMS), "CPK_MASTER_SECRET_extract_public_params"}, - {ERR_FUNC(CPK_F_CPK_MASTER_SECRET_EXTRACT_PRIVATE_KEY), "CPK_MASTER_SECRET_extract_private_key"}, - {ERR_FUNC(CPK_F_CPK_PUBLIC_PARAMS_EXTRACT_PUBLIC_KEY), "CPK_PUBLIC_PARAMS_extract_public_key"}, - {ERR_FUNC(CPK_F_CPK_PUBLIC_PARAMS_COMPUTE_SHARE_KEY), "CPK_PUBLIC_PARAMS_compute_share_key"}, - {ERR_FUNC(CPK_F_CPK_MASTER_SECRET_DIGEST), "CPK_F_CPK_MASTER_SECRET_digest"}, - {ERR_FUNC(CPK_F_CPK_PUBLIC_PARAMS_DIGEST), "CPK_F_CPK_PUBLIC_PARAMS_digest"}, - {ERR_FUNC(CPK_F_CPK_MASTER_SECRET_PRINT), "CPK_F_CPK_MASTER_SECRET_print"}, - {ERR_FUNC(CPK_F_CPK_PUBLIC_PARAMS_PRINT), "CPK_F_CPK_PUBLIC_PARAMS_print"}, - {ERR_FUNC(CPK_F_CPK_MASTER_SECRET_VALIDATE_PUBLIC_PARAMS), "CPK_F_CPK_MASTER_SECRET_validate_public_params"}, - {ERR_FUNC(CPK_F_CPK_PUBLIC_PARAMS_VALIDATE_PRIVATE_KEY), "CPK_F_CPK_PUBLIC_PARAMS_validate_private_key"}, - {ERR_FUNC(CPK_F_CPK_MAP_NEW_DEFAULT), "CPK_F_CPK_MAP_new_default"}, - {ERR_FUNC(CPK_F_CPK_MAP_NUM_FACTORS), "CPK_F_CPK_MAP_num_factors"}, - {ERR_FUNC(CPK_F_CPK_MAP_NUM_INDEXES), "CPK_F_CPK_MAP_num_indexes"}, - {ERR_FUNC(CPK_F_CPK_MAP_STR2INDEX), "CPK_F_CPK_MAP_STR2INDEX"}, - {ERR_FUNC(CPK_F_X509_ALGOR_GET1_EC_KEY), "X509_ALGOR_get1_ec_key"}, - {ERR_FUNC(CPK_F_X509_ALGOR_GET1_DSA), "X509_ALGOR_get1_dsa"}, - {0, NULL} -}; - -static ERR_STRING_DATA CPK_str_reasons[] = -{ - {ERR_REASON(CPK_R_BAD_ARGUMENT), "bad argument"}, - {ERR_REASON(CPK_R_UNKNOWN_DIGEST_TYPE), "unknown digest algorithm"}, - {ERR_REASON(CPK_R_UNKNOWN_CIPHER_TYPE), "unknown cipher algorithm"}, - {ERR_REASON(CPK_R_UNKNOWN_MAP_TYPE), "unknown cpk map algorithm"}, - {ERR_REASON(CPK_R_UNKNOWN_CURVE), "unknown elliptic curve"}, - {ERR_REASON(CPK_R_STACK_ERROR), "stack error"}, - {ERR_REASON(CPK_R_DERIVE_KEY_FAILED), "derive key failed"}, - {ERR_REASON(CPK_R_ECIES_ENCRYPT_FAILED), "ecies encryption failed"}, - {ERR_REASON(CPK_R_ECIES_DECRYPT_FAILED), "ecies decryption failed"}, - {ERR_REASON(CPK_R_DER_DECODE_FAILED), "DER decode failed"}, - {ERR_REASON(CPK_R_UNSUPPORTED_PKCS7_CONTENT_TYPE),"CPK_R_UNSUPPORTED_PKCS7_CONTENT_TYPE"}, - {ERR_REASON(CPK_R_SET_SIGNER), "CPK_R_SET_SIGNER"}, - {ERR_REASON(CPK_R_SET_RECIP_INFO), "CPK_R_SET_RECIP_INFO"}, - {ERR_REASON(CPK_R_UNABLE_TO_FIND_MESSAGE_DIGEST),"CPK_R_UNABLE_TO_FIND_MESSAGE_DIGEST"}, - {ERR_REASON(CPK_R_BAD_DATA), "bad data"}, - {ERR_REASON(CPK_R_MAP_FAILED), "CPK_R_MAP_FAILED"}, - {ERR_REASON(CPK_R_ADD_SIGNING_TIME), "CPK_R_ADD_SIGNING_TIME"}, - {ERR_REASON(CPK_R_VERIFY_FAILED), "CPK_R_VERIFY_FAILED"}, - {ERR_REASON(CPK_R_UNKNOWN_ECDH_TYPE), "CPK_R_UNKNOWN_ECDH_TYPE"}, - {ERR_REASON(CPK_R_DIGEST_FAILED), "CPK_R_DIGEST_FAILED"}, - {ERR_REASON(CPK_R_WITHOUT_DECRYPT_KEY), "CPK_R_WITHOUT_DECRYPT_KEY"}, - {ERR_REASON(CPK_R_UNKNOWN_PKCS7_TYPE), "CPK_R_UNKNOWN_PKCS7_TYPE"}, - {ERR_REASON(CPK_R_INVALID_ID_LENGTH), "invalid identity length"}, - {ERR_REASON(CPK_R_INVALID_PKEY_TYPE), "invalid public key type"}, - {ERR_REASON(CPK_R_INVALID_MAP_ALGOR), "invalid map algorithm"}, - {ERR_REASON(CPK_R_PKEY_TYPE_NOT_MATCH), "public key type not match"}, - {0, NULL} -}; - -#endif - -void ERR_load_CPK_strings(void) -{ -#ifndef OPENSSL_NO_ERR - - if (ERR_func_error_string(CPK_str_functs[0].error) == NULL) { - ERR_load_strings(0, CPK_str_functs); - ERR_load_strings(0, CPK_str_reasons); - } - -#endif -} diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h index 6e5c4b51..59bbe314 100644 --- a/crypto/ec/ec.h +++ b/crypto/ec/ec.h @@ -1004,7 +1004,7 @@ int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL) -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define EVP_PKEY_CTX_set_ec_sign_type(ctx, type) \ EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ EVP_PKEY_OP_SIGN|EVP_PKEY_OP_SIGNCTX| \ @@ -1036,7 +1036,7 @@ int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ EVP_PKEY_OP_DERIVE, \ EVP_PKEY_CTRL_EC_DH_TYPE, -2, NULL); -# endif /* OPENSSL_NO_GMSSL */ +# endif /* NO_GMSSL */ @@ -1101,7 +1101,7 @@ int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); # define EVP_PKEY_CTRL_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 9) # define EVP_PKEY_CTRL_GET_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 10) -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define EVP_PKEY_CTRL_EC_SIGN_TYPE (EVP_PKEY_ALG_CTRL + 11) # define EVP_PKEY_CTRL_GET_EC_SIGN_TYPE (EVP_PKEY_ALG_CTRL + 12) # define EVP_PKEY_CTRL_EC_ENC_TYPE (EVP_PKEY_ALG_CTRL + 13) diff --git a/crypto/ec/ec_ameth.c b/crypto/ec/ec_ameth.c index 3989e5c6..c1d9219b 100644 --- a/crypto/ec/ec_ameth.c +++ b/crypto/ec/ec_ameth.c @@ -613,7 +613,7 @@ const EVP_PKEY_ASN1_METHOD eckey_asn1_meth = { EVP_PKEY_EC, 0, "EC", -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL "GmSSL EC/SM2 algorithm", #else "OpenSSL EC algorithm", diff --git a/crypto/ec/ec_asn1.c b/crypto/ec/ec_asn1.c index 3b5ce06d..a28b5b48 100644 --- a/crypto/ec/ec_asn1.c +++ b/crypto/ec/ec_asn1.c @@ -61,7 +61,7 @@ #include #include #include -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL #include #endif diff --git a/crypto/ec/ec_curve.c b/crypto/ec/ec_curve.c index 620318b3..50d00c6d 100644 --- a/crypto/ec/ec_curve.c +++ b/crypto/ec/ec_curve.c @@ -2835,7 +2835,7 @@ static const struct { } }; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL static const struct { EC_CURVE_DATA h; unsigned char data[0 + 32 * 6]; @@ -3112,7 +3112,7 @@ static const ec_list_element curve_list[] = { "RFC 5639 curve over a 512 bit prime field"}, {NID_brainpoolP512t1, &_EC_brainpoolP512t1.h, 0, "RFC 5639 curve over a 512 bit prime field"}, -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL {NID_sm2p256v1, &_EC_SM2_PRIME_256V1.h, 0, "SM2 curve over a 256 bit prime field"}, {NID_wapip192v1, &_EC_WAPI_PRIME_192V1.h, 0, diff --git a/crypto/ec/ec_pmeth.c b/crypto/ec/ec_pmeth.c index 317e64c8..725a45ae 100644 --- a/crypto/ec/ec_pmeth.c +++ b/crypto/ec/ec_pmeth.c @@ -88,15 +88,21 @@ typedef struct { size_t kdf_ukmlen; /* KDF output length */ size_t kdf_outlen; +#ifndef NO_GMSSL /* SECG, SM2 or other standards */ int sign_type; int enc_type; int dh_type; - union { - void *ptr; - ECIES_PARAMS *ecies; - SM2_ENC_PARAMS *sm2; - } enc_param; + + unsigned char sm2_id_dgst[EVP_MAX_MD_SIZE]; + size_t sm2_id_dgstlen; + + union { + void *ptr; + ECIES_PARAMS *ecies; + SM2_ENC_PARAMS *sm2; + } enc_param; +#endif } EC_PKEY_CTX; static int pkey_ec_init(EVP_PKEY_CTX *ctx) @@ -115,11 +121,13 @@ static int pkey_ec_init(EVP_PKEY_CTX *ctx) dctx->kdf_outlen = 0; dctx->kdf_ukm = NULL; dctx->kdf_ukmlen = 0; +#ifndef NO_GMSSL dctx->sign_type = NID_sm_scheme; - dctx->enc_type = NID_sm_scheme; - dctx->dh_type = NID_sm_scheme; - dctx->enc_param.ptr = NULL; - + dctx->enc_type = NID_sm_scheme; + dctx->dh_type = NID_sm_scheme; + dctx->sm2_id_dgstlen = 0; + dctx->enc_param.ptr = NULL; +#endif ctx->data = dctx; return 1; @@ -157,6 +165,7 @@ static int pkey_ec_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) dctx->sign_type = sctx->sign_type; dctx->enc_type = sctx->enc_type; dctx->dh_type = sctx->dh_type; + // fixme return 1; } @@ -256,8 +265,7 @@ static int pkey_ec_signctx_init(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx) unsigned char zid[EVP_MAX_MD_SIZE]; unsigned int zidlen = sizeof(zid); - - + //FIXME: it is wrong to do it here! if (dctx->sign_type == NID_sm_scheme) { if (!SM2_compute_id_digest(md, zid, &zidlen, ec_key)) { ECerr(EC_F_PKEY_EC_SIGNCTX_INIT, ERR_R_SM2_LIB); @@ -272,7 +280,6 @@ static int pkey_ec_signctx_init(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx) } } - return 1; } @@ -595,13 +602,16 @@ static int pkey_ec_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) dctx->kdf_type = p1; return 1; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case EVP_PKEY_CTRL_EC_SIGN_TYPE: if (p1 == -2) return dctx->sign_type; if (p1 != NID_secg_scheme && p1 != NID_sm_scheme) return -2; dctx->sign_type = p1; + + //SM2_compute_id_digest(); + //set this data to pkey_ctx return 1; case EVP_PKEY_CTRL_GET_EC_SIGN_TYPE: @@ -670,7 +680,7 @@ static int pkey_ec_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) EVP_MD_type((const EVP_MD *)p2) != NID_ecdsa_with_SHA1 && EVP_MD_type((const EVP_MD *)p2) != NID_sha224 && EVP_MD_type((const EVP_MD *)p2) != NID_sha256 && -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL EVP_MD_type((const EVP_MD *)p2) != NID_sm3 && #endif EVP_MD_type((const EVP_MD *)p2) != NID_sha384 && @@ -722,7 +732,7 @@ static int pkey_ec_ctrl_str(EVP_PKEY_CTX *ctx, else return -2; return EVP_PKEY_CTX_set_ec_param_enc(ctx, param_enc); -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL } else if (!strcmp(type, "ec_sign_algor")) { int sign_type; if (!strcmp(value, "ecdsa")) diff --git a/crypto/ecies/Makefile b/crypto/ecies/Makefile index e5add24e..c81cd15b 100644 --- a/crypto/ecies/Makefile +++ b/crypto/ecies/Makefile @@ -122,4 +122,4 @@ ecies_lib.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h ecies_lib.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h ecies_lib.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h ecies_lib.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h -ecies_lib.o: ecies_lib.c +ecies_lib.o: ../o_str.h ecies_lib.c diff --git a/crypto/ecies/ecies.h b/crypto/ecies/ecies.h index bac41690..55bf6df4 100644 --- a/crypto/ecies/ecies.h +++ b/crypto/ecies/ecies.h @@ -118,7 +118,7 @@ int i2d_ECIESParameters(const ECIES_PARAMS *param, unsigned char **out); ECIES_PARAMS *d2i_ECIESParameters(ECIES_PARAMS **param, const unsigned char **in, long len); int ECIES_set_parameters(EC_KEY *ec_key, const ECIES_PARAMS *param); -ECIES_PARAMS *ECIES_get_parameters(const EC_KEY *ec_key); +ECIES_PARAMS *ECIES_get_parameters(EC_KEY *ec_key); ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, const unsigned char *in, size_t inlen, EC_KEY *ec_key); int ECIES_do_decrypt(const ECIES_CIPHERTEXT_VALUE *cv, diff --git a/crypto/ecies/ecies_lib.c b/crypto/ecies/ecies_lib.c index d7fdfd0f..029d9199 100644 --- a/crypto/ecies/ecies_lib.c +++ b/crypto/ecies/ecies_lib.c @@ -59,6 +59,7 @@ #include #include #include +#include "../o_str.h" static void *ecies_data_dup(void *data) { @@ -71,7 +72,7 @@ static void *ecies_data_dup(void *data) { return NULL; } - memcpy(ret, param, sizeof(*param)); + memcpy(ret, param, sizeof(*param)); return ret; } @@ -97,7 +98,8 @@ int ECIES_set_parameters(EC_KEY *ec_key, const ECIES_PARAMS *param) return 1; } -ECIES_PARAMS *ECIES_get_parameters(const EC_KEY *ec_key) +//FIXME: is is _get0_ ? +ECIES_PARAMS *ECIES_get_parameters(EC_KEY *ec_key) { ECIES_PARAMS *ret; if (!(ret = EC_KEY_get_key_method_data(ec_key, @@ -120,7 +122,7 @@ ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, EVP_CIPHER_CTX cipher_ctx; EVP_CIPHER_CTX_init(&cipher_ctx); - if (!(cv = ECIES_CIPHERTEXT_VALUE_new())) + if (!(cv = ECIES_CIPHERTEXT_VALUE_new())) { fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__); ECIESerr(ECIES_F_ECIES_DO_ENCRYPT, ERR_R_MALLOC_FAILURE); @@ -164,7 +166,7 @@ ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__); ECIESerr(ECIES_F_ECIES_DO_ENCRYPT, ERR_R_EC_LIB); goto err; - } + } /* * use ecdh to compute enckey and mackey @@ -205,7 +207,7 @@ ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, goto err; } - if (!ECDH_compute_key(share, sharelen, + if (!ECDH_compute_key(share, sharelen, EC_KEY_get0_public_key(pub_key), ephem_key, KDF_get_x9_63(param->kdf_md))) { @@ -222,15 +224,15 @@ ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, if (param->sym_cipher) len = (int)(inlen + EVP_MAX_BLOCK_LENGTH * 2); else len = inlen; - + if (!M_ASN1_OCTET_STRING_set(cv->ciphertext, NULL, len)) { ECIESerr(ECIES_F_ECIES_DO_ENCRYPT, ERR_R_MALLOC_FAILURE); fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__); goto err; } - - if (param->sym_cipher) + + if (param->sym_cipher) { unsigned char iv[EVP_MAX_IV_LENGTH]; memset(iv, 0, sizeof(iv)); @@ -243,7 +245,7 @@ ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, goto err; } p = cv->ciphertext->data; - if (!EVP_EncryptUpdate(&cipher_ctx, p, &len, in, (int)inlen)) + if (!EVP_EncryptUpdate(&cipher_ctx, p, &len, in, (int)inlen)) { fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__); ECIESerr(ECIES_F_ECIES_DO_ENCRYPT, @@ -259,7 +261,7 @@ ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, goto err; } p += len; - cv->ciphertext->length = (int)(p - cv->ciphertext->data); + cv->ciphertext->length = (int)(p - cv->ciphertext->data); } else { @@ -273,12 +275,12 @@ ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, * calculate mactag of ciphertext and encode */ cv->mactag->length = maclen; - + if (!M_ASN1_OCTET_STRING_set(cv->mactag, NULL, cv->mactag->length)) { fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__); ECIESerr(ECIES_F_ECIES_DO_ENCRYPT, ERR_R_MALLOC_FAILURE); - goto err; + goto err; } if (!HMAC(param->mac_md, mackey, mackeylen, cv->ciphertext->data, (size_t)cv->ciphertext->length, @@ -293,8 +295,8 @@ ECIES_CIPHERTEXT_VALUE *ECIES_do_encrypt(const ECIES_PARAMS *param, err: EVP_CIPHER_CTX_cleanup(&cipher_ctx); if (share) OPENSSL_free(share); - if (ephem_key) EC_KEY_free(ephem_key); - if (e && cv) + if (ephem_key) EC_KEY_free(ephem_key); + if (e && cv) { ECIES_CIPHERTEXT_VALUE_free(cv); cv = NULL; @@ -303,7 +305,7 @@ err: } int ECIES_do_decrypt(const ECIES_CIPHERTEXT_VALUE *cv, - const ECIES_PARAMS *param, unsigned char *out, size_t *outlen, + const ECIES_PARAMS *param, unsigned char *out, size_t *outlen, EC_KEY *pri_key) { int r = 0; @@ -351,10 +353,10 @@ int ECIES_do_decrypt(const ECIES_CIPHERTEXT_VALUE *cv, ECIESerr(ECIES_F_ECIES_DO_DECRYPT, ECIES_R_BAD_DATA); goto err; } - + /* * use ecdh to compute enckey and mackey - */ + */ if (param->sym_cipher) enckeylen = EVP_CIPHER_key_length(param->sym_cipher); else enckeylen = cv->ciphertext->length; @@ -366,17 +368,17 @@ int ECIES_do_decrypt(const ECIES_CIPHERTEXT_VALUE *cv, ECIESerr(ECIES_F_ECIES_DO_DECRYPT, ERR_R_MALLOC_FAILURE); goto err; } - + if (!ECDH_compute_key(share, enckeylen + mackeylen, ephem_point, pri_key, - KDF_get_x9_63(param->kdf_md))) + KDF_get_x9_63(param->kdf_md))) { ECIESerr(ECIES_F_ECIES_DO_DECRYPT, ECIES_R_ECDH_FAILED); goto err; - } + } enckey = share; mackey = share + enckeylen; - + /* * generate and verify mac */ @@ -387,7 +389,7 @@ int ECIES_do_decrypt(const ECIES_CIPHERTEXT_VALUE *cv, } if (!HMAC(param->mac_md, mackey, mackeylen, cv->ciphertext->data, (size_t)cv->ciphertext->length, - mac, (unsigned int *)&len)) + mac, (unsigned int *)&len)) { ECIESerr(ECIES_F_ECIES_DO_DECRYPT, ECIES_R_GEN_MAC_FAILED); goto err; @@ -431,14 +433,14 @@ int ECIES_do_decrypt(const ECIES_CIPHERTEXT_VALUE *cv, p += len; *outlen = (int)(p - out); } - else + else { int i; for (i = 0; i < cv->ciphertext->length; i++) out[i] = cv->ciphertext->data[i] ^ enckey[i]; *outlen = cv->ciphertext->length; } - + r = 1; err: if (share) OPENSSL_free(share); @@ -463,7 +465,7 @@ int ECIES_encrypt(const ECIES_PARAMS *param, fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__); return 0; } - + if ((len = i2d_ECIES_CIPHERTEXT_VALUE(cv, NULL)) <= 0) { fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__); ECIESerr(ECIES_F_ECIES_ENCRYPT, ECIES_R_ENCRYPT_FAILED); diff --git a/crypto/engine/eng_all.c b/crypto/engine/eng_all.c index 308a7140..14ddc824 100644 --- a/crypto/engine/eng_all.c +++ b/crypto/engine/eng_all.c @@ -113,7 +113,7 @@ void ENGINE_load_builtin_engines(void) # ifndef OPENSSL_NO_GOST ENGINE_load_gost(); # endif -# ifndef OPENSSL_NO_SKF +# ifndef NO_GMSSL //ENGINE_load_skf(); # endif # ifndef OPENSSL_NO_GMP diff --git a/crypto/engine/engine.h b/crypto/engine/engine.h index 1eb10ea3..dc9cb739 100644 --- a/crypto/engine/engine.h +++ b/crypto/engine/engine.h @@ -411,7 +411,7 @@ void ENGINE_load_gmp(void); # ifndef OPENSSL_NO_GOST void ENGINE_load_gost(void); # endif -# ifndef OPENSSL_NO_SKF +# ifndef NO_GMSSL void ENGINE_load_skf(void); # endif # endif diff --git a/crypto/err/Makefile b/crypto/err/Makefile index cbb06782..03aad7b5 100644 --- a/crypto/err/Makefile +++ b/crypto/err/Makefile @@ -83,31 +83,32 @@ err.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h err.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h err.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h err.o: ../cryptlib.h err.c -err_all.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h -err_all.o: ../../include/openssl/bn.h ../../include/openssl/buffer.h -err_all.o: ../../include/openssl/cbcmac.h ../../include/openssl/cms.h -err_all.o: ../../include/openssl/comp.h ../../include/openssl/conf.h -err_all.o: ../../include/openssl/cpk.h ../../include/openssl/crypto.h -err_all.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h -err_all.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h -err_all.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h -err_all.o: ../../include/openssl/ecdsa.h ../../include/openssl/ecies.h -err_all.o: ../../include/openssl/engine.h ../../include/openssl/err.h -err_all.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h +err_all.o: ../../include/openssl/aes.h ../../include/openssl/asn1.h +err_all.o: ../../include/openssl/bio.h ../../include/openssl/bn.h +err_all.o: ../../include/openssl/buffer.h ../../include/openssl/cbcmac.h +err_all.o: ../../include/openssl/cms.h ../../include/openssl/comp.h +err_all.o: ../../include/openssl/conf.h ../../include/openssl/cpk.h +err_all.o: ../../include/openssl/crypto.h ../../include/openssl/dh.h +err_all.o: ../../include/openssl/dsa.h ../../include/openssl/dso.h +err_all.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +err_all.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h +err_all.o: ../../include/openssl/ecies.h ../../include/openssl/engine.h +err_all.o: ../../include/openssl/err.h ../../include/openssl/evp.h +err_all.o: ../../include/openssl/ffx.h ../../include/openssl/kdf.h err_all.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h err_all.o: ../../include/openssl/objects.h ../../include/openssl/ocsp.h err_all.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h err_all.o: ../../include/openssl/ossl_typ.h ../../include/openssl/otp.h -err_all.o: ../../include/openssl/pem2.h ../../include/openssl/pkcs12.h -err_all.o: ../../include/openssl/pkcs7.h ../../include/openssl/rand.h -err_all.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h -err_all.o: ../../include/openssl/sha.h ../../include/openssl/skf.h -err_all.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h -err_all.o: ../../include/openssl/sm9.h ../../include/openssl/stack.h -err_all.o: ../../include/openssl/symhacks.h ../../include/openssl/ts.h -err_all.o: ../../include/openssl/ui.h ../../include/openssl/x509.h -err_all.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h -err_all.o: err_all.c +err_all.o: ../../include/openssl/paillier.h ../../include/openssl/pem2.h +err_all.o: ../../include/openssl/pkcs12.h ../../include/openssl/pkcs7.h +err_all.o: ../../include/openssl/rand.h ../../include/openssl/rsa.h +err_all.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h +err_all.o: ../../include/openssl/skf.h ../../include/openssl/sm2.h +err_all.o: ../../include/openssl/sm3.h ../../include/openssl/sm9.h +err_all.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h +err_all.o: ../../include/openssl/ts.h ../../include/openssl/ui.h +err_all.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h +err_all.o: ../../include/openssl/x509v3.h err_all.c err_prn.o: ../../e_os.h ../../include/openssl/bio.h err_prn.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h err_prn.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h diff --git a/crypto/err/err.c b/crypto/err/err.c index 9b966bf4..74dc7241 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -155,7 +155,7 @@ static ERR_STRING_DATA ERR_str_libraries[] = { {ERR_PACK(ERR_LIB_FIPS, 0, 0), "FIPS routines"}, {ERR_PACK(ERR_LIB_CMS, 0, 0), "CMS routines"}, {ERR_PACK(ERR_LIB_HMAC, 0, 0), "HMAC routines"}, -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL {ERR_PACK(ERR_LIB_ECIES, 0, 0), "ECIES routines"}, {ERR_PACK(ERR_LIB_CPK, 0, 0), "CPK routines"}, {ERR_PACK(ERR_LIB_SM2, 0, 0), "SM2 routines"}, diff --git a/crypto/err/err.h b/crypto/err/err.h index 9884a875..ea8f9931 100644 --- a/crypto/err/err.h +++ b/crypto/err/err.h @@ -198,7 +198,7 @@ typedef struct err_state_st { # define ERR_LIB_HMAC 48 # define ERR_LIB_JPAKE 49 -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define ERR_LIB_ECIES 50 # define ERR_LIB_CPK 51 # define ERR_LIB_SM2 52 @@ -246,16 +246,16 @@ typedef struct err_state_st { # define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),__FILE__,__LINE__) # define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__) -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define ECIESerr(f,r) ERR_PUT_error(ERR_LIB_ECIES,(f),(r),__FILE__,__LINE__) # define CPKerr(f,r) ERR_PUT_error(ERR_LIB_CPK,(f),(r),__FILE__,__LINE__) # define SM2err(f,r) ERR_PUT_error(ERR_LIB_SM2,(f),(r),__FILE__,__LINE__) # define SKFerr(f,r) ERR_PUT_error(ERR_LIB_SKF,(f),(r),__FILE__,__LINE__) -# define CBCMACerr(f,r) ERR_PUT_error(ERR_LIB_CBCMAC,(f),(r),__FILE__,__LINE__); -# define OTPerr(f,r) ERR_PUT_error(ERR_LIB_OTP,(f),(r),__FILE__,__LINE__); -# define SM9err(f,r) ERR_PUT_error(ERR_LIB_SM9,(f),(r),__FILE__,__LINE__); -# define PAILLIERerr(f,r) ERR_PUT_error(ERR_LIB_PAILLIER,(f),(r),__FILE__,__LINE__); -# define FFXerr(f,r) ERR_PUT_error(ERR_LIB_FFX,(f),(r),__FILE__,__LINE__); +# define CBCMACerr(f,r) ERR_PUT_error(ERR_LIB_CBCMAC,(f),(r),__FILE__,__LINE__) +# define OTPerr(f,r) ERR_PUT_error(ERR_LIB_OTP,(f),(r),__FILE__,__LINE__) +# define SM9err(f,r) ERR_PUT_error(ERR_LIB_SM9,(f),(r),__FILE__,__LINE__) +# define PAILLIERerr(f,r) ERR_PUT_error(ERR_LIB_PAILLIER,(f),(r),__FILE__,__LINE__) +# define FFXerr(f,r) ERR_PUT_error(ERR_LIB_FFX,(f),(r),__FILE__,__LINE__) # endif /* @@ -314,7 +314,7 @@ typedef struct err_state_st { # define ERR_R_STORE_LIB ERR_LIB_STORE/* 44 */ # define ERR_R_TS_LIB ERR_LIB_TS/* 45 */ -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define ERR_R_ECIES_LIB ERR_LIB_ECIES/* 50 */ # define ERR_R_CPK_LIB ERR_LIB_CPK/* 51 */ # define ERR_R_SM2_LIB ERR_LIB_SM2/* 52 */ @@ -326,6 +326,8 @@ typedef struct err_state_st { # define ERR_R_FFX_LIB ERR_LIB_FFX/* 58 */ # endif +//FIXME: it seems we used up error numbers + # define ERR_R_NESTED_ASN1_ERROR 58 # define ERR_R_BAD_ASN1_OBJECT_HEADER 59 # define ERR_R_BAD_GET_ASN1_OBJECT_CALL 60 diff --git a/crypto/err/err_all.c b/crypto/err/err_all.c index af76d44b..c72f18a2 100644 --- a/crypto/err/err_all.c +++ b/crypto/err/err_all.c @@ -108,7 +108,7 @@ # include #endif -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL # include # include # include @@ -176,7 +176,7 @@ void ERR_load_crypto_strings(void) # ifndef OPENSSL_NO_JPAKE ERR_load_JPAKE_strings(); # endif -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL ERR_load_ECIES_strings(); ERR_load_CPK_strings(); ERR_load_SM2_strings(); diff --git a/crypto/evp/c_allc.c b/crypto/evp/c_allc.c index 59545528..a8e45c28 100644 --- a/crypto/evp/c_allc.c +++ b/crypto/evp/c_allc.c @@ -163,7 +163,7 @@ void OpenSSL_add_all_ciphers(void) EVP_add_cipher_alias(SN_rc5_cbc, "RC5"); #endif -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL EVP_add_cipher(EVP_sms4_ecb()); EVP_add_cipher(EVP_sms4_cbc()); EVP_add_cipher(EVP_sms4_cfb()); diff --git a/crypto/evp/c_alld.c b/crypto/evp/c_alld.c index 0fa216f2..dd86fb2f 100644 --- a/crypto/evp/c_alld.c +++ b/crypto/evp/c_alld.c @@ -67,7 +67,7 @@ void OpenSSL_add_all_digests(void) #ifndef OPENSSL_NO_MD4 EVP_add_digest(EVP_md4()); #endif -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL EVP_add_digest(EVP_sm3()); #endif #ifndef OPENSSL_NO_MD5 diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c index dbd9c501..f2643f32 100644 --- a/crypto/evp/digest.c +++ b/crypto/evp/digest.c @@ -211,7 +211,6 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) type = ctx->digest; } #endif - //fprintf(stderr, "%s %d\n", __FILE__, __LINE__); if (ctx->digest != type) { if (ctx->digest && ctx->digest->ctx_size) OPENSSL_free(ctx->md_data); @@ -220,7 +219,6 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) ctx->update = type->update; ctx->md_data = OPENSSL_malloc(type->ctx_size); if (ctx->md_data == NULL) { - fprintf(stderr, "%s %d\n", __FILE__, __LINE__); EVPerr(EVP_F_EVP_DIGESTINIT_EX, ERR_R_MALLOC_FAILURE); return 0; } @@ -231,7 +229,6 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) #endif if (ctx->pctx) { int r; - //fprintf(stderr, "%s %d\n", __FILE__, __LINE__); r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG, EVP_PKEY_CTRL_DIGESTINIT, 0, ctx); if (r <= 0 && (r != -2)) @@ -248,7 +245,6 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) return 0; } #endif - //fprintf(stderr, "%s %d\n", __FILE__, __LINE__); return ctx->digest->init(ctx); } diff --git a/crypto/evp/e_sms4.c b/crypto/evp/e_sms4.c index 7a2a3e7f..640d3fc8 100644 --- a/crypto/evp/e_sms4.c +++ b/crypto/evp/e_sms4.c @@ -53,7 +53,8 @@ #include #include "cryptlib.h" -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL + #include #include #include @@ -61,8 +62,6 @@ #include "modes_lcl.h" #include -#define SMS4_IV_LENGTH SMS4_BLOCK_SIZE - typedef struct { sms4_key_t ks; } EVP_SMS4_KEY; @@ -95,7 +94,7 @@ static int sms4_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t len) { EVP_SMS4_KEY *sms4_key = (EVP_SMS4_KEY *)ctx->cipher_data; - + if (ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) { CRYPTO_cfb128_1_encrypt(in, out, len, &sms4_key->ks, ctx->iv, &ctx->num, ctx->encrypt, (block128_f)sms4_encrypt); @@ -144,7 +143,7 @@ static int sms4_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, CRYPTO_cfb128_8_encrypt(in, out, len, &sms4_key->ks, ctx->iv, &ctx->num, ctx->encrypt, (block128_f)sms4_encrypt); - + return 1; } @@ -236,7 +235,7 @@ static int sms4_gcm_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) case EVP_CTRL_COPY: default: return -1; - } + } } @@ -255,7 +254,7 @@ static int sms4_wrap_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc) { EVP_SMS4_WRAP_CTX *sms4_wrap = ctx->cipher_data; - + if (!iv && !key) return 1; @@ -337,7 +336,7 @@ static int sms4_wrap_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, NULL, /* get_asn1_parameters() */ NULL, /* ctrl() */ NULL /* app_data */ -}; +}; const EVP_CIPHER *EVP_sms4_wrap(void) { diff --git a/crypto/evp/e_zuc.c b/crypto/evp/e_zuc.c index fe380931..22050ed1 100644 --- a/crypto/evp/e_zuc.c +++ b/crypto/evp/e_zuc.c @@ -1,47 +1,88 @@ +/* crypto/evp/e_zuc.c */ +/* ==================================================================== + * Copyright (c) 2014 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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 #include "cryptlib.h" -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL #include -#include "evp_locl.h" -#include #include +#include +#include "evp_locl.h" static int zuc_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc) { - ZUC_set_key((ZUC_KEY *)&ctx->cipher_data, key, iv); + zuc_set_key((zuc_key_t *)&ctx->cipher_data, key, iv); return 1; } static int zuc_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inlen) { - ZUC_encrypt((ZUC_KEY *)&ctx->cipher_data, inlen, in, out); + zuc_encrypt((zuc_key_t *)&ctx->cipher_data, inlen, in, out); return 1; } - -/* - * FIXME: - * evp_enc.c assert block_size in {1, 8, 16}, 4 not ok! - */ static const EVP_CIPHER zuc_cipher = { - NID_zuc, /* nid */ - 4, /* block_size */ - 16, /* key_len */ - 16, /* iv_len */ - 0, /* flags */ - zuc_init, /* init() */ - zuc_do_cipher, /* do_cipher() */ - NULL, /* cleanup() */ - sizeof(ZUC_KEY), /* ctx_size */ - NULL, /* set_asn1_parameters() */ - NULL, /* get_asn1_parameters() */ - NULL, /* ctrl() */ - NULL /* app_data */ + NID_zuc, + 1, 16, 16, + EVP_CIPH_VARIABLE_LENGTH, + zuc_init, + zuc_do_cipher, + NULL, + sizeof(zuc_key_t), + NULL, NULL, NULL, NULL }; const EVP_CIPHER *EVP_zuc(void) diff --git a/crypto/evp/evp.h b/crypto/evp/evp.h index 95a5885a..3bba4274 100644 --- a/crypto/evp/evp.h +++ b/crypto/evp/evp.h @@ -741,7 +741,7 @@ const EVP_MD *EVP_ripemd160(void); # ifndef OPENSSL_NO_WHIRLPOOL const EVP_MD *EVP_whirlpool(void); # endif -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL const EVP_MD *EVP_sm3(void); # endif const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ @@ -830,7 +830,7 @@ const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void); # define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64 const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); # endif -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL const EVP_CIPHER *EVP_sms4_ecb(void); const EVP_CIPHER *EVP_sms4_cbc(void); const EVP_CIPHER *EVP_sms4_cfb1(void); diff --git a/crypto/evp/evp_enc.c b/crypto/evp/evp_enc.c index 9c22622f..e57a67ca 100644 --- a/crypto/evp/evp_enc.c +++ b/crypto/evp/evp_enc.c @@ -210,7 +210,7 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, #endif /* we assume block size is a power of 2 in *cryptUpdate */ OPENSSL_assert(ctx->cipher->block_size == 1 -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL || ctx->cipher->block_size == 4 #endif || ctx->cipher->block_size == 8 @@ -668,18 +668,3 @@ int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in) return 1; } -#ifndef OPENSSL_NO_GMSSL -int EVP_Encrypt_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outlen, - const unsigned char *in, int inlen) -{ - return 0; -} - -int EVP_Decrypt_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outlen, - const unsigned char *in, int inlen) -{ - - return 1; -} -#endif /* GMSSL */ - diff --git a/crypto/evp/m_sigver.c b/crypto/evp/m_sigver.c index 1ed77c35..0e8f4801 100644 --- a/crypto/evp/m_sigver.c +++ b/crypto/evp/m_sigver.c @@ -86,7 +86,6 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, return 0; } } - if (ver) { if (ctx->pctx->pmeth->verifyctx_init) { if (ctx->pctx->pmeth->verifyctx_init(ctx->pctx, ctx) <= 0) @@ -97,14 +96,12 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, } else { if (ctx->pctx->pmeth->signctx_init) { if (ctx->pctx->pmeth->signctx_init(ctx->pctx, ctx) <= 0) { -fprintf(stderr, "error %s %d\n", __FILE__, __LINE__); return 0; } ctx->pctx->operation = EVP_PKEY_OP_SIGNCTX; } else if (EVP_PKEY_sign_init(ctx->pctx) <= 0) return 0; } - if (EVP_PKEY_CTX_set_signature_md(ctx->pctx, type) <= 0) return 0; if (pctx) diff --git a/crypto/evp/m_sm3.c b/crypto/evp/m_sm3.c index b57612ba..98de163b 100644 --- a/crypto/evp/m_sm3.c +++ b/crypto/evp/m_sm3.c @@ -52,7 +52,7 @@ #include #include "cryptlib.h" -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL #include #include @@ -62,17 +62,29 @@ static int init(EVP_MD_CTX *ctx) { - return sm3_init(ctx->md_data); + if (!ctx || !ctx->md_data) { + return 0; + } + sm3_init(ctx->md_data); + return 1; } static int update(EVP_MD_CTX *ctx, const void *in, size_t inlen) { - return sm3_update(ctx->md_data, in, inlen); + if (!ctx || !ctx->md_data || !in) { + return 0; + } + sm3_update(ctx->md_data, in, inlen); + return 1; } static int final(EVP_MD_CTX *ctx, unsigned char *md) { - return sm3_final(ctx->md_data, md); + if (!ctx || !ctx->md_data || !md) { + return 0; + } + sm3_final(ctx->md_data, md); + return 1; } static const EVP_MD sm3_md = { diff --git a/crypto/evp/pmeth_gn.c b/crypto/evp/pmeth_gn.c index 629046ee..fbf1ffe6 100644 --- a/crypto/evp/pmeth_gn.c +++ b/crypto/evp/pmeth_gn.c @@ -200,21 +200,17 @@ EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e, mac_ctx = EVP_PKEY_CTX_new_id(type, e); if (!mac_ctx) { if (e) fprintf(stderr, "engine is not null\n"); - fprintf(stderr, "error %s %d\n", __FILE__, __LINE__); return NULL; } if (EVP_PKEY_keygen_init(mac_ctx) <= 0) { - fprintf(stderr, "error %s %d\n", __FILE__, __LINE__); goto merr; } if (EVP_PKEY_CTX_ctrl(mac_ctx, -1, EVP_PKEY_OP_KEYGEN, EVP_PKEY_CTRL_SET_MAC_KEY, keylen, (void *)key) <= 0) { - fprintf(stderr, "error %s %d\n", __FILE__, __LINE__); goto merr; } if (EVP_PKEY_keygen(mac_ctx, &mac_key) <= 0) { - fprintf(stderr, "error %s %d\n", __FILE__, __LINE__); goto merr; } merr: diff --git a/crypto/evp/pmeth_lib.c b/crypto/evp/pmeth_lib.c index bb7dfaef..bc6f9131 100644 --- a/crypto/evp/pmeth_lib.c +++ b/crypto/evp/pmeth_lib.c @@ -95,7 +95,7 @@ static const EVP_PKEY_METHOD *standard_methods[] = { #ifndef OPENSSL_NO_DH &dhx_pkey_meth, #endif -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL &cbcmac_pkey_meth, #endif }; diff --git a/crypto/ffx/Makefile b/crypto/ffx/Makefile index 8fe376ba..be3b7676 100644 --- a/crypto/ffx/Makefile +++ b/crypto/ffx/Makefile @@ -61,6 +61,8 @@ tests: lint: lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend + depend: @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) @@ -74,3 +76,17 @@ clean: # DO NOT DELETE THIS LINE -- make depend depends on it. +ffx.o: ../../include/openssl/aes.h ../../include/openssl/bio.h +ffx.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h +ffx.o: ../../include/openssl/err.h ../../include/openssl/ffx.h +ffx.o: ../../include/openssl/lhash.h ../../include/openssl/opensslconf.h +ffx.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h +ffx.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h +ffx.o: ../../include/openssl/symhacks.h ffx.c +ffx_err.o: ../../include/openssl/aes.h ../../include/openssl/bio.h +ffx_err.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h +ffx_err.o: ../../include/openssl/err.h ../../include/openssl/ffx.h +ffx_err.o: ../../include/openssl/lhash.h ../../include/openssl/opensslconf.h +ffx_err.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h +ffx_err.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h +ffx_err.o: ../../include/openssl/symhacks.h ffx_err.c diff --git a/crypto/objects/obj_xref.h b/crypto/objects/obj_xref.h index e453e99f..4080a0c6 100644 --- a/crypto/objects/obj_xref.h +++ b/crypto/objects/obj_xref.h @@ -56,6 +56,13 @@ static const nid_triple sigoid_srt[] = { NID_dh_cofactor_kdf}, {NID_dhSinglePass_cofactorDH_sha512kdf_scheme, NID_sha512, NID_dh_cofactor_kdf}, + {NID_sm2sign_with_sm3, NID_sm3, NID_X9_62_id_ecPublicKey}, + {NID_sm2sign_with_sha1, NID_sha1, NID_sm2sign}, + {NID_sm2sign_with_sha256, NID_sha256, NID_sm2sign}, + {NID_sm2sign_with_sha512, NID_sha512, NID_sm2sign}, + {NID_sm2sign_with_sha224, NID_sha224, NID_sm2sign}, + {NID_sm2sign_with_sha384, NID_sha384, NID_sm2sign}, + {NID_sm2sign_with_rmd160, NID_ripemd160, NID_sm2sign}, }; static const nid_triple *const sigoid_srt_xref[] = { @@ -71,29 +78,36 @@ static const nid_triple *const sigoid_srt_xref[] = { &sigoid_srt[12], &sigoid_srt[30], &sigoid_srt[35], + &sigoid_srt[41], &sigoid_srt[6], &sigoid_srt[10], + &sigoid_srt[46], &sigoid_srt[11], &sigoid_srt[13], &sigoid_srt[24], &sigoid_srt[20], &sigoid_srt[32], &sigoid_srt[37], + &sigoid_srt[42], &sigoid_srt[14], &sigoid_srt[21], &sigoid_srt[33], &sigoid_srt[38], + &sigoid_srt[45], &sigoid_srt[15], &sigoid_srt[22], &sigoid_srt[34], &sigoid_srt[39], + &sigoid_srt[43], &sigoid_srt[16], &sigoid_srt[23], &sigoid_srt[19], &sigoid_srt[31], &sigoid_srt[36], + &sigoid_srt[44], &sigoid_srt[25], &sigoid_srt[26], &sigoid_srt[27], &sigoid_srt[28], + &sigoid_srt[40], }; diff --git a/crypto/objects/obj_xref.txt b/crypto/objects/obj_xref.txt index 19c94226..b1498ce3 100644 --- a/crypto/objects/obj_xref.txt +++ b/crypto/objects/obj_xref.txt @@ -29,6 +29,7 @@ dsaWithSHA1 sha1 dsa dsaWithSHA1_2 sha1 dsa_2 +# GMSSL: here is the problem! ecdsa_with_SHA1 sha1 X9_62_id_ecPublicKey ecdsa_with_SHA224 sha224 X9_62_id_ecPublicKey ecdsa_with_SHA256 sha256 X9_62_id_ecPublicKey @@ -36,6 +37,7 @@ ecdsa_with_SHA384 sha384 X9_62_id_ecPublicKey ecdsa_with_SHA512 sha512 X9_62_id_ecPublicKey ecdsa_with_Recommended undef X9_62_id_ecPublicKey ecdsa_with_Specified undef X9_62_id_ecPublicKey +sm2sign_with_sm3 sm3 X9_62_id_ecPublicKey dsa_with_SHA224 sha224 dsa dsa_with_SHA256 sha256 dsa @@ -56,3 +58,11 @@ dhSinglePass_cofactorDH_sha224kdf_scheme sha224 dh_cofactor_kdf dhSinglePass_cofactorDH_sha256kdf_scheme sha256 dh_cofactor_kdf dhSinglePass_cofactorDH_sha384kdf_scheme sha384 dh_cofactor_kdf dhSinglePass_cofactorDH_sha512kdf_scheme sha512 dh_cofactor_kdf + +# GMSSL SM2 schemes +sm2sign_with_sha1 sha1 sm2sign +sm2sign_with_sha256 sha256 sm2sign +sm2sign_with_sha512 sha512 sm2sign +sm2sign_with_sha224 sha224 sm2sign +sm2sign_with_sha384 sha384 sm2sign +sm2sign_with_rmd160 ripemd160 sm2sign diff --git a/crypto/otp/Makefile b/crypto/otp/Makefile index a9228d19..e5a776d1 100644 --- a/crypto/otp/Makefile +++ b/crypto/otp/Makefile @@ -66,6 +66,8 @@ tests: lint: lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend + depend: @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/crypto/paillier/Makefile b/crypto/paillier/Makefile index 524f679c..3bed2de6 100644 --- a/crypto/paillier/Makefile +++ b/crypto/paillier/Makefile @@ -66,6 +66,8 @@ tests: lint: lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend + depend: @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) @@ -79,3 +81,16 @@ clean: # DO NOT DELETE THIS LINE -- make depend depends on it. +pai_err.o: ../../include/openssl/bio.h ../../include/openssl/bn.h +pai_err.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h +pai_err.o: ../../include/openssl/err.h ../../include/openssl/lhash.h +pai_err.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h +pai_err.o: ../../include/openssl/ossl_typ.h ../../include/openssl/paillier.h +pai_err.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h +pai_err.o: ../../include/openssl/symhacks.h pai_err.c +pai_lib.o: ../../include/openssl/bn.h ../../include/openssl/crypto.h +pai_lib.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h +pai_lib.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h +pai_lib.o: ../../include/openssl/paillier.h ../../include/openssl/safestack.h +pai_lib.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h +pai_lib.o: pai_lib.c diff --git a/crypto/pem/pem.h b/crypto/pem/pem.h index 6301930b..d3b23fc9 100644 --- a/crypto/pem/pem.h +++ b/crypto/pem/pem.h @@ -137,10 +137,6 @@ extern "C" { # define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" # define PEM_STRING_PARAMETERS "PARAMETERS" # define PEM_STRING_CMS "CMS" -# ifndef OPENSSL_NO_GMSSL -# define PEM_STRING_SM2PARAMETERS "SM2 PARAMETERS" -# define PEM_STRING_SM2PRIVATEKEY "SM2 PRIVATE KEY" -# endif /* * Note that this structure is initialised by PEM_SealInit and cleaned up diff --git a/crypto/skf/Makefile b/crypto/skf/Makefile index c450745e..3fbbc3d6 100644 --- a/crypto/skf/Makefile +++ b/crypto/skf/Makefile @@ -65,6 +65,8 @@ tests: lint: lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend + depend: @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) @@ -74,7 +76,7 @@ dclean: mv -f Makefile.new $(MAKEFILE) clean: - rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff + rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff a.out # DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/crypto/skf/skf.h b/crypto/skf/skf.h index 5e11b404..0925d89a 100644 --- a/crypto/skf/skf.h +++ b/crypto/skf/skf.h @@ -1,6 +1,6 @@ /* crypto/skf/skf.h */ /* ==================================================================== - * Copyright (c) 2014 - 2015 The GmSSL Project. All rights reserved. + * Copyright (c) 2014 - 2016 The GmSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/crypto/skf/skf_dev.c b/crypto/skf/skf_dev.c index 7b5b7fb2..2fd067df 100644 --- a/crypto/skf/skf_dev.c +++ b/crypto/skf/skf_dev.c @@ -58,6 +58,7 @@ #define DEV_NAME "pseudo_dev" #define DEV_NAME_LIST DEV_NAME"\0" +SKF_HANDLE skf_dev_handle; ULONG DEVAPI SKF_EnumDev(BOOL bPresent, LPSTR szNameList, @@ -79,11 +80,14 @@ ULONG DEVAPI SKF_EnumDev(BOOL bPresent, ULONG DEVAPI SKF_ConnectDev(LPSTR szName, DEVHANDLE *phDev) { + *phDev = &skf_dev_handle; return SAR_OK; } ULONG DEVAPI SKF_DisConnectDev(DEVHANDLE hDev) { + //FIXME: close all handles + hDev = NULL; return SAR_OK; } @@ -155,4 +159,33 @@ int SKF_print_dev_info(DEVINFO *devInfo) return 1; } +char *SKF_get_alg_name(ULONG ulAlgID) +{ + //FIXME: make these name compatible with OBJ short name + switch (ulAlgID) { + case SGD_SM1_ECB: return "SM1-ECB"; + case SGD_SM1_CBC: return "SM1-CBC"; + case SGD_SM1_CFB: return "SM1-CFB"; + case SGD_SM1_OFB: return "SM1-OFB"; + case SGD_SM1_MAC: return "SM1-MAC"; + case SGD_SM4_ECB: return "SM4-ECB"; + case SGD_SM4_CBC: return "SM4-CBC"; + case SGD_SM4_CFB: return "SM4-CFB"; + case SGD_SM4_OFB: return "SM4-OFB"; + case SGD_SM4_MAC: return "SM4-MAC"; + case SGD_SSF33_ECB: return "SSF33-ECB"; + case SGD_SSF33_CBC: return "SSF33-CBC"; + case SGD_SSF33_CFB: return "SSF33-CFB"; + case SGD_SSF33_OFB: return "SSF33-OFB"; + case SGD_SSF33_MAC: return "SSF33-MAC"; + case SGD_RSA: return "RSA"; + case SGD_SM2_1: return "SM2-1"; + case SGD_SM2_2: return "SM2-2"; + case SGD_SM2_3: return "SM2-3"; + case SGD_SM3: return "SM3"; + case SGD_SHA1: return "SHA-1"; + case SGD_SHA256: return "SHA256"; + } + return "(unknown)"; +} diff --git a/crypto/skf/skf_dgst.c b/crypto/skf/skf_dgst.c index f9dec0d7..c332e32f 100644 --- a/crypto/skf/skf_dgst.c +++ b/crypto/skf/skf_dgst.c @@ -67,7 +67,7 @@ ULONG DEVAPI SKF_DigestInit(DEVHANDLE hDev, const EVP_MD *md; EVP_MD_CTX *mdctx = NULL; EC_KEY *ec_key = NULL; - SKF_HANDLE *handle; + SKF_HANDLE *hHash; unsigned char dgst[EVP_MAX_MD_SIZE]; unsigned int dgstlen = 0; @@ -137,17 +137,20 @@ ULONG DEVAPI SKF_DigestInit(DEVHANDLE hDev, } } - if (!(handle = SKF_HANDLE_new(SKF_HASH_HANDLE))) { - SKFerr(SKF_F_SKF_DIGESTINIT, SKF_R_MALLOC_FAILED); - ret = SAR_MEMORYERR; + + if (!(hHash = OPENSSL_malloc(sizeof(*hHash)))) { + SKFerr(SKF_F_SKF_DIGESTINIT, ERR_R_MALLOC_FAILURE); goto end; } - handle->u.md_ctx = mdctx; + bzero(hHash, sizeof(*hHash)); + hHash->magic = SKF_HANDLE_MAGIC; + hHash->type = SKF_HASH_HANDLE; + hHash->u.md_ctx = mdctx; mdctx = NULL; + *phHash = hHash; ret = SAR_OK; - end: EVP_MD_CTX_destroy(mdctx); EC_KEY_free(ec_key); @@ -204,11 +207,8 @@ ULONG DEVAPI SKF_DigestFinal(HANDLE hHash, return SAR_FAIL; } - if (!SKF_HANDLE_free(hHash)) { - SKFerr(SKF_F_SKF_DIGESTFINAL, SKF_R_FREE_HANDLE_FAILED); - return SAR_FAIL; - } - + EVP_MD_CTX_destroy(mdctx); + ((SKF_HANDLE *)hHash)->u.md_ctx = NULL; return SAR_OK; } diff --git a/crypto/skf/skf_ec.c b/crypto/skf/skf_ec.c index 9c3f8c43..b864f628 100644 --- a/crypto/skf/skf_ec.c +++ b/crypto/skf/skf_ec.c @@ -56,6 +56,30 @@ #include #include "skf_lcl.h" +ULONG DEVAPI SKF_GenExtECCKeyPair(DEVHANDLE hDev, + ECCPRIVATEKEYBLOB *priKey, + ECCPUBLICKEYBLOB *pubKey) +{ + ULONG ret = SAR_FAIL; + EC_KEY *ec_key; + + if(!(ec_key = EC_KEY_new_by_curve_name(NID_sm2p256v1))) { + SKFerr(SKF_F_SKF_GENEXTECCKEYPAIR, ERR_R_EC_LIB); + return SAR_FAIL; + } + if (!EC_KEY_get_ECCPRIVATEKEYBLOB(ec_key, priKey)) { + SKFerr(SKF_F_SKF_GENEXTECCKEYPAIR, SKF_R_GET_PRIVATE_KEY_FAILED); + goto end; + } + if (!EC_KEY_get_ECCPUBLICKEYBLOB(ec_key, pubKey)) { + SKFerr(SKF_F_SKF_GENEXTECCKEYPAIR, SKF_R_GET_PUBLIC_KEY_FAILED); + goto end; + } + ret = SAR_OK; +end: + EC_KEY_free(ec_key); + return ret; +} ULONG DEVAPI SKF_ExtECCSign(DEVHANDLE hDev, ECCPRIVATEKEYBLOB *pECCPriKeyBlob, diff --git a/crypto/skf/skf_enc.c b/crypto/skf/skf_enc.c index 57ef9d0a..17ebcbed 100644 --- a/crypto/skf/skf_enc.c +++ b/crypto/skf/skf_enc.c @@ -59,6 +59,101 @@ #define PADDING_TYPE_NO_PADDING 0 #define PADDING_TYPE_PKCS5 1 +/* +229 typedef struct Struct_BLOCKCIPHERPARAM { +230 BYTE IV[MAX_IV_LEN]; +231 ULONG IVLen; +232 ULONG PaddingType; +233 ULONG FeedBitLen; +234 } BLOCKCIPHERPARAM, *PBLOCKCIPHERPARAM; +*/ + +int SKF_nid_to_encparams(int nid, ULONG *algID, BLOCKCIPHERPARAM *params) +{ + ULONG ulAlgID = 0; + + switch (nid) { + case NID_ssf33_ecb: + ulAlgID = SGD_SSF33_ECB; + break; + case NID_ssf33_cbc: + ulAlgID = SGD_SSF33_CBC; + break; + case NID_ssf33_cfb1: + case NID_ssf33_cfb8: + case NID_ssf33_cfb128: + ulAlgID = SGD_SSF33_CFB; + break; + case NID_ssf33_ofb128: + ulAlgID = SGD_SSF33_OFB; + break; + case NID_sm1_ecb: + ulAlgID = SGD_SM1_ECB; + break; + case NID_sm1_cbc: + ulAlgID = SGD_SM1_CBC; + break; + case NID_sm1_cfb1: + case NID_sm1_cfb8: + case NID_sm1_cfb128: + ulAlgID = SGD_SM1_CFB; + break; + case NID_sm1_ofb128: + ulAlgID = SGD_SM1_OFB; + break; + case NID_sms4_ecb: + ulAlgID = SGD_SM4_ECB; + break; + case NID_sms4_cbc: + ulAlgID = SGD_SM4_CBC; + break; + case NID_sms4_cfb1: + case NID_sms4_cfb8: + case NID_sms4_cfb128: + ulAlgID = SGD_SM4_CFB; + break; + case NID_sms4_ofb128: + ulAlgID = SGD_SM4_OFB; + break; + default: + return 0; + } + + *algID = ulAlgID; + + switch (nid) { + case NID_sm1_cfb1: + case NID_sms4_cfb1: + case NID_ssf33_cfb1: + params->FeedBitLen = 1; + break; + case NID_sm1_cfb8: + case NID_sms4_cfb8: + case NID_ssf33_cfb8: + params->FeedBitLen = 8; + break; + case NID_sm1_cfb128: + case NID_sms4_cfb128: + case NID_ssf33_cfb128: + params->FeedBitLen = 128; + break; + default: + params->FeedBitLen = 0; + } + + switch (nid) { + case NID_sm1_cbc: + case NID_sms4_cbc: + case NID_ssf33_cbc: + params->PaddingType = SKF_PKCS5_PADDING; + break; + default: + params->PaddingType = SKF_NO_PADDING; + } + + return 1; +} + ULONG DEVAPI SKF_EncryptInit(HANDLE hKey, BLOCKCIPHERPARAM encryptParam) @@ -70,25 +165,25 @@ ULONG DEVAPI SKF_EncryptInit(HANDLE hKey, unsigned char *key; unsigned char *iv; - //FIXME: CFB bits! + if (!(cipher = SKF_HANDLE_get_cipher(hKey, encparam))) { + SKFerr(SKF_F_SKF_ENCRYPTINIT, SKF_R_INVALID_KEY_HANDLE); + return SAR_INVALIDPARAMERR; + } if (!(key = SKF_HANDLE_get_key(hKey))) { SKFerr(SKF_F_SKF_ENCRYPTINIT, SKF_R_INVALID_KEY_HANDLE); - ret = SAR_INVALIDPARAMERR; - goto end; + return SAR_INVALIDPARAMERR; } if (encparam->IVLen != SMS4_IV_LENGTH) { SKFerr(SKF_F_SKF_ENCRYPTINIT, SKF_R_INVALID_IV_LENGTH); - ret = SAR_INVALIDPARAMERR; - goto end; + return SAR_INVALIDPARAMERR; } - iv = encparam->IV; if (!(ctx = EVP_CIPHER_CTX_new())) { SKFerr(SKF_F_SKF_ENCRYPTINIT, ERR_R_EVP_LIB); - goto end; + return SAR_INVALIDPARAMERR; } if (!EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv)) { @@ -96,10 +191,8 @@ ULONG DEVAPI SKF_EncryptInit(HANDLE hKey, goto end; } - if (!SKF_HANDLE_set1_cipher_ctx(hKey, ctx)) { - SKFerr(SKF_F_SKF_ENCRYPTINIT, SKF_R_SET_CIPHER_CTX_FAILED); - goto end; - } + ((SKF_HANDLE *)hKey)->type = SKF_CIPHER_HANDLE; + ((SKF_HANDLE *)hKey)->u.cipher_ctx = ctx; ctx = NULL; ret = SAR_OK; @@ -153,7 +246,9 @@ ULONG DEVAPI SKF_EncryptFinal(HANDLE hKey, } *pulEncryptedDataLen = outlen; - SKF_HANDLE_free_cipher_ctx(hKey); + EVP_CIPHER_CTX_free(ctx); + ((SKF_HANDLE *)hKey)->u.cipher_ctx = NULL; + ((SKF_HANDLE *)hKey)->type = SKF_KEY_HANDLE; return SAR_OK; } @@ -167,18 +262,19 @@ ULONG DEVAPI SKF_DecryptInit(HANDLE hKey, unsigned char *key; unsigned char *iv; + if (!(cipher = SKF_HANDLE_get_cipher(hKey, param))) { + SKFerr(SKF_F_SKF_DECRYPTINIT, SKF_R_INVALID_KEY_HANDLE); + return SAR_INVALIDPARAMERR; + } if (!(key = SKF_HANDLE_get_key(hKey))) { SKFerr(SKF_F_SKF_DECRYPTINIT, SKF_R_INVALID_KEY_HANDLE); - ret = SAR_INVALIDPARAMERR; - goto end; + return SAR_INVALIDPARAMERR; } - if (param->IVLen != SMS4_IV_LENGTH) { SKFerr(SKF_F_SKF_DECRYPTINIT, SKF_R_INVALID_IV_LENGTH); ret = SAR_INVALIDPARAMERR; goto end; } - iv = param->IV; if (!(ctx = EVP_CIPHER_CTX_new())) { @@ -191,10 +287,8 @@ ULONG DEVAPI SKF_DecryptInit(HANDLE hKey, goto end; } - if (!SKF_HANDLE_set1_cipher_ctx(hKey, ctx)) { - SKFerr(SKF_F_SKF_DECRYPTINIT, SKF_R_SET_CIPHER_CTX_FAILED); - goto end; - } + ((SKF_HANDLE *)hKey)->type = SKF_CIPHER_HANDLE; + ((SKF_HANDLE *)hKey)->u.cipher_ctx = ctx; ctx = NULL; ret = SAR_OK; @@ -248,7 +342,9 @@ ULONG DEVAPI SKF_DecryptFinal(HANDLE hKey, } *pulDecryptedDataLen = len; - SKF_HANDLE_free_cipher_ctx(hKey); + EVP_CIPHER_CTX_free(ctx); + ((SKF_HANDLE *)hKey)->u.cipher_ctx = NULL; + ((SKF_HANDLE *)hKey)->type = SKF_KEY_HANDLE; return SAR_OK; } diff --git a/crypto/skf/skf_err.c b/crypto/skf/skf_err.c index 3306f9e7..1649ae48 100644 --- a/crypto/skf/skf_err.c +++ b/crypto/skf/skf_err.c @@ -89,6 +89,7 @@ static ERR_STRING_DATA SKF_str_functs[] = { {ERR_FUNC(SKF_F_EC_KEY_SET_ECCPUBLICKEYBLOB), "EC_KEY_set_ECCPUBLICKEYBLOB"}, {ERR_FUNC(SKF_F_RSA_GET_RSAPRIVATEKEYBLOB), "RSA_get_RSAPRIVATEKEYBLOB"}, + {ERR_FUNC(SKF_F_RSA_GET_RSAPUBLICKEYBLOB), "RSA_get_RSAPUBLICKEYBLOB"}, {ERR_FUNC(SKF_F_RSA_NEW_FROM_RSAPRIVATEKEYBLOB), "RSA_new_from_RSAPRIVATEKEYBLOB"}, {ERR_FUNC(SKF_F_RSA_NEW_FROM_RSAPUBLICKEYBLOB), @@ -127,6 +128,7 @@ static ERR_STRING_DATA SKF_str_functs[] = { {ERR_FUNC(SKF_F_SKF_EXTECCVERIFY), "SKF_EXTECCVERIFY"}, {ERR_FUNC(SKF_F_SKF_EXTRSAPRIKEYOPERATION), "SKF_EXTRSAPRIKEYOPERATION"}, {ERR_FUNC(SKF_F_SKF_EXTRSAPUBKEYOPERATION), "SKF_EXTRSAPUBKEYOPERATION"}, + {ERR_FUNC(SKF_F_SKF_GENEXTECCKEYPAIR), "SKF_GENEXTECCKEYPAIR"}, {ERR_FUNC(SKF_F_SKF_GENEXTRSAKEY), "SKF_GENEXTRSAKEY"}, {ERR_FUNC(SKF_F_SKF_GENRANDOM), "SKF_GENRANDOM"}, {ERR_FUNC(SKF_F_SKF_GETDEVINFO), "SKF_GETDEVINFO"}, @@ -134,7 +136,9 @@ static ERR_STRING_DATA SKF_str_functs[] = { {ERR_FUNC(SKF_F_SKF_GETFILEINFO), "SKF_GETFILEINFO"}, {ERR_FUNC(SKF_F_SKF_GETPININFO), "SKF_GETPININFO"}, {ERR_FUNC(SKF_F_SKF_HANDLE_GET_CBCMAC_CTX), "SKF_HANDLE_GET_CBCMAC_CTX"}, + {ERR_FUNC(SKF_F_SKF_HANDLE_GET_CIPHER), "SKF_HANDLE_GET_CIPHER"}, {ERR_FUNC(SKF_F_SKF_HANDLE_GET_CIPHER_CTX), "SKF_HANDLE_GET_CIPHER_CTX"}, + {ERR_FUNC(SKF_F_SKF_HANDLE_GET_KEY), "SKF_HANDLE_GET_KEY"}, {ERR_FUNC(SKF_F_SKF_HANDLE_GET_MD_CTX), "SKF_HANDLE_GET_MD_CTX"}, {ERR_FUNC(SKF_F_SKF_LOCKDEV), "SKF_LOCKDEV"}, {ERR_FUNC(SKF_F_SKF_MAC), "SKF_MAC"}, @@ -171,11 +175,15 @@ static ERR_STRING_DATA SKF_str_reasons[] = { {ERR_REASON(SKF_R_DECRYPT_FAILED), "decrypt failed"}, {ERR_REASON(SKF_R_ENCODE_CIPHERTEXT_FAILED), "encode ciphertext failed"}, {ERR_REASON(SKF_R_ENCODE_FAILED), "encode failed"}, + {ERR_REASON(SKF_R_ENCODE_RSA_PUBLIC_KEY_FAILED), + "encode rsa public key failed"}, {ERR_REASON(SKF_R_ENCODE_SIGNATURE_FAILED), "encode signature failed"}, {ERR_REASON(SKF_R_ENCRYPT_FAILED), "encrypt failed"}, {ERR_REASON(SKF_R_FAIL), "fail"}, {ERR_REASON(SKF_R_FREE_HANDLE_FAILED), "free handle failed"}, {ERR_REASON(SKF_R_GEN_RSA_FAILED), "gen rsa failed"}, + {ERR_REASON(SKF_R_GET_PRIVATE_KEY_FAILED), "get private key failed"}, + {ERR_REASON(SKF_R_GET_PUBLIC_KEY_FAILED), "get public key failed"}, {ERR_REASON(SKF_R_INVALID_ALGID), "invalid algid"}, {ERR_REASON(SKF_R_INVALID_ALGOR), "invalid algor"}, {ERR_REASON(SKF_R_INVALID_APP_HANDLE), "invalid app handle"}, @@ -194,7 +202,9 @@ static ERR_STRING_DATA SKF_str_reasons[] = { {ERR_REASON(SKF_R_INVALID_EC_KEY), "invalid ec key"}, {ERR_REASON(SKF_R_INVALID_EC_PRIVATE_KEY), "invalid ec private key"}, {ERR_REASON(SKF_R_INVALID_EC_PUBLIC_KEY), "invalid ec public key"}, + {ERR_REASON(SKF_R_INVALID_FEED_BIT_LENGTH), "invalid feed bit length"}, {ERR_REASON(SKF_R_INVALID_HANDLE), "invalid handle"}, + {ERR_REASON(SKF_R_INVALID_HANDLE_ALGOR), "invalid handle algor"}, {ERR_REASON(SKF_R_INVALID_HANDLE_MAGIC), "invalid handle magic"}, {ERR_REASON(SKF_R_INVALID_HANDLE_TYPE), "invalid handle type"}, {ERR_REASON(SKF_R_INVALID_HASH_HANDLE), "invalid hash handle"}, @@ -208,6 +218,7 @@ static ERR_STRING_DATA SKF_str_reasons[] = { {ERR_REASON(SKF_R_INVALID_PRIVATE_KEY), "invalid private key"}, {ERR_REASON(SKF_R_INVALID_PUBLIC_KEY), "invalid public key"}, {ERR_REASON(SKF_R_INVALID_RANDOM_LENGTH), "invalid random length"}, + {ERR_REASON(SKF_R_INVALID_RSA_KEY_LENGTH), "invalid rsa key length"}, {ERR_REASON(SKF_R_INVALID_RSA_PRIVATE_KEY), "invalid rsa private key"}, {ERR_REASON(SKF_R_INVALID_RSA_PUBLIC_KEY), "invalid rsa public key"}, {ERR_REASON(SKF_R_INVALID_SIGNATURE), "invalid signature"}, diff --git a/crypto/skf/skf_errstr.c b/crypto/skf/skf_errstr.c index ce971be1..fe25bedc 100644 --- a/crypto/skf/skf_errstr.c +++ b/crypto/skf/skf_errstr.c @@ -115,10 +115,10 @@ char *SKF_get_errstr(ULONG ulError) int i; for (i = 0; i < sizeof(skf_errstr)/sizeof(skf_errstr[0]); i++) { if (ulError == skf_errstr[i].err_no) { - return (LPSTR)skf_errstr[i].err_str; + return skf_errstr[i].err_str; } } - return (LPSTR)"(undef)"; + return "(undef)"; } diff --git a/crypto/skf/skf_ex.h b/crypto/skf/skf_ex.h index 3e7a4693..f9ff759b 100644 --- a/crypto/skf/skf_ex.h +++ b/crypto/skf/skf_ex.h @@ -65,7 +65,9 @@ extern "C" { #endif int SKF_print_dev_info(DEVINFO *devInfo); +char *SKF_get_alg_name(ULONG ulAlgID); char *SKF_get_errstr(ULONG ulError); +int SKF_nid_to_encparams(int nid, ULONG *algID, BLOCKCIPHERPARAM *params); RSA *RSA_new_from_RSAPUBLICKEYBLOB(const RSAPUBLICKEYBLOB *blob); RSA *RSA_new_from_RSAPRIVATEKEYBLOB(const RSAPRIVATEKEYBLOB *blob); @@ -74,6 +76,10 @@ int RSA_get_RSAPUBLICKEYBLOB(RSA *rsa, RSAPUBLICKEYBLOB *blob); int RSA_set_RSAPRIVATEKEYBLOB(RSA *rsa, const RSAPRIVATEKEYBLOB *blob); int RSA_get_RSAPRIVATEKEYBLOB(RSA *rsa, RSAPRIVATEKEYBLOB *blob); +ULONG DEVAPI SKF_GenExtECCKeyPair(DEVHANDLE hDev, + ECCPRIVATEKEYBLOB *priKey, + ECCPUBLICKEYBLOB *pubKey); + EC_KEY *EC_KEY_new_from_ECCPUBLICKEYBLOB(const ECCPUBLICKEYBLOB *blob); EC_KEY *EC_KEY_new_from_ECCPRIVATEKEYBLOB(const ECCPRIVATEKEYBLOB *blob); int EC_KEY_set_ECCPUBLICKEYBLOB(EC_KEY *ec_key, const ECCPUBLICKEYBLOB *blob); @@ -110,6 +116,7 @@ void ERR_load_SKF_strings(void); # define SKF_F_EC_KEY_SET_ECCPRIVATEKEYBLOB 157 # define SKF_F_EC_KEY_SET_ECCPUBLICKEYBLOB 158 # define SKF_F_RSA_GET_RSAPRIVATEKEYBLOB 169 +# define SKF_F_RSA_GET_RSAPUBLICKEYBLOB 173 # define SKF_F_RSA_NEW_FROM_RSAPRIVATEKEYBLOB 163 # define SKF_F_RSA_NEW_FROM_RSAPUBLICKEYBLOB 164 # define SKF_F_RSA_SET_RSAPRIVATEKEYBLOB 170 @@ -146,6 +153,7 @@ void ERR_load_SKF_strings(void); # define SKF_F_SKF_EXTECCVERIFY 151 # define SKF_F_SKF_EXTRSAPRIKEYOPERATION 166 # define SKF_F_SKF_EXTRSAPUBKEYOPERATION 167 +# define SKF_F_SKF_GENEXTECCKEYPAIR 174 # define SKF_F_SKF_GENEXTRSAKEY 132 # define SKF_F_SKF_GENRANDOM 133 # define SKF_F_SKF_GETDEVINFO 116 @@ -153,7 +161,9 @@ void ERR_load_SKF_strings(void); # define SKF_F_SKF_GETFILEINFO 118 # define SKF_F_SKF_GETPININFO 119 # define SKF_F_SKF_HANDLE_GET_CBCMAC_CTX 140 +# define SKF_F_SKF_HANDLE_GET_CIPHER 171 # define SKF_F_SKF_HANDLE_GET_CIPHER_CTX 141 +# define SKF_F_SKF_HANDLE_GET_KEY 172 # define SKF_F_SKF_HANDLE_GET_MD_CTX 142 # define SKF_F_SKF_LOCKDEV 120 # define SKF_F_SKF_MAC 168 @@ -183,11 +193,14 @@ void ERR_load_SKF_strings(void); # define SKF_R_DECRYPT_FAILED 133 # define SKF_R_ENCODE_CIPHERTEXT_FAILED 134 # define SKF_R_ENCODE_FAILED 114 +# define SKF_R_ENCODE_RSA_PUBLIC_KEY_FAILED 162 # define SKF_R_ENCODE_SIGNATURE_FAILED 135 # define SKF_R_ENCRYPT_FAILED 136 # define SKF_R_FAIL 104 # define SKF_R_FREE_HANDLE_FAILED 128 # define SKF_R_GEN_RSA_FAILED 115 +# define SKF_R_GET_PRIVATE_KEY_FAILED 164 +# define SKF_R_GET_PUBLIC_KEY_FAILED 165 # define SKF_R_INVALID_ALGID 122 # define SKF_R_INVALID_ALGOR 156 # define SKF_R_INVALID_APP_HANDLE 105 @@ -206,7 +219,9 @@ void ERR_load_SKF_strings(void); # define SKF_R_INVALID_EC_KEY 151 # define SKF_R_INVALID_EC_PRIVATE_KEY 145 # define SKF_R_INVALID_EC_PUBLIC_KEY 146 +# define SKF_R_INVALID_FEED_BIT_LENGTH 160 # define SKF_R_INVALID_HANDLE 107 +# define SKF_R_INVALID_HANDLE_ALGOR 161 # define SKF_R_INVALID_HANDLE_MAGIC 125 # define SKF_R_INVALID_HANDLE_TYPE 126 # define SKF_R_INVALID_HASH_HANDLE 127 @@ -220,6 +235,7 @@ void ERR_load_SKF_strings(void); # define SKF_R_INVALID_PRIVATE_KEY 152 # define SKF_R_INVALID_PUBLIC_KEY 153 # define SKF_R_INVALID_RANDOM_LENGTH 119 +# define SKF_R_INVALID_RSA_KEY_LENGTH 163 # define SKF_R_INVALID_RSA_PRIVATE_KEY 158 # define SKF_R_INVALID_RSA_PUBLIC_KEY 159 # define SKF_R_INVALID_SIGNATURE 148 diff --git a/crypto/skf/skf_handle.c b/crypto/skf/skf_handle.c index 5d280564..c43be96c 100644 --- a/crypto/skf/skf_handle.c +++ b/crypto/skf/skf_handle.c @@ -54,21 +54,84 @@ #include #include "skf_lcl.h" - -EVP_MD_CTX *SKF_HANDLE_get_md_ctx(SKF_HANDLE *handle) +unsigned char *SKF_HANDLE_get_key(HANDLE hKey) { - EVP_MD_CTX *ret; + SKF_HANDLE *handle; - if (!handle) { - SKFerr(SKF_F_SKF_HANDLE_GET_MD_CTX, SKF_R_NULL_ARGUMENT); + if (!(handle = (SKF_HANDLE *)hKey)) { + SKFerr(SKF_F_SKF_HANDLE_GET_KEY, ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + if (handle->magic != SKF_HANDLE_MAGIC) { + SKFerr(SKF_F_SKF_HANDLE_GET_KEY, SKF_R_INVALID_HANDLE_MAGIC); + return NULL; + } + if (handle->type < SKF_KEY_HANDLE) { + SKFerr(SKF_F_SKF_HANDLE_GET_KEY, SKF_R_INVALID_HANDLE_TYPE); return NULL; } + switch (handle->algid) { + case SGD_SM4_ECB: + case SGD_SM4_CBC: + case SGD_SM4_CFB: + case SGD_SM4_OFB: + case SGD_SM4_MAC: + break; + default: + SKFerr(SKF_F_SKF_HANDLE_GET_KEY, SKF_R_INVALID_ALGOR); + return NULL; + } + + if (!handle->keylen) { + SKFerr(SKF_F_SKF_HANDLE_GET_KEY, SKF_R_INVALID_KEY_HANDLE); + return NULL; + } + return handle->key; +} + +const EVP_CIPHER *SKF_HANDLE_get_cipher(HANDLE hKey, BLOCKCIPHERPARAM *param) +{ + SKF_HANDLE *handle = (SKF_HANDLE *)hKey; + if (!SKF_HANDLE_get_key(hKey)) { + SKFerr(SKF_F_SKF_HANDLE_GET_CIPHER, SKF_R_INVALID_KEY_HANDLE); + return NULL; + } + + switch (handle->algid) { + case SGD_SM4_ECB: + return EVP_sms4_ecb(); + case SGD_SM4_CBC: + return EVP_sms4_cbc(); + case SGD_SM4_OFB: + return EVP_sms4_ofb(); + case SGD_SM4_CFB: + switch (param->FeedBitLen) { + case 1: return EVP_sms4_cfb1(); + case 8: return EVP_sms4_cfb8(); + case 128: return EVP_sms4_cfb128(); + } + SKFerr(SKF_F_SKF_HANDLE_GET_CIPHER, SKF_R_INVALID_FEED_BIT_LENGTH); + return NULL; + } + + SKFerr(SKF_F_SKF_HANDLE_GET_CIPHER, SKF_R_INVALID_HANDLE_ALGOR); + return NULL; +} + +EVP_MD_CTX *SKF_HANDLE_get_md_ctx(HANDLE hHash) +{ + EVP_MD_CTX *ret; + SKF_HANDLE *handle; + + if (!(handle = (SKF_HANDLE *)hHash)) { + SKFerr(SKF_F_SKF_HANDLE_GET_MD_CTX, ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } if (handle->magic != SKF_HANDLE_MAGIC) { SKFerr(SKF_F_SKF_HANDLE_GET_MD_CTX, SKF_R_INVALID_HANDLE_MAGIC); return NULL; } - if (handle->type != SKF_HASH_HANDLE) { SKFerr(SKF_F_SKF_HANDLE_GET_MD_CTX, SKF_R_INVALID_HANDLE_TYPE); return NULL; @@ -78,24 +141,22 @@ EVP_MD_CTX *SKF_HANDLE_get_md_ctx(SKF_HANDLE *handle) SKFerr(SKF_F_SKF_HANDLE_GET_MD_CTX, SKF_R_CTX_NOT_CREATED); return NULL; } - return ret; } -CBCMAC_CTX *SKF_HANDLE_get_cbcmac_ctx(SKF_HANDLE *handle) +CBCMAC_CTX *SKF_HANDLE_get_cbcmac_ctx(HANDLE hMac) { CBCMAC_CTX *ret; + SKF_HANDLE *handle; - if (!handle) { - SKFerr(SKF_F_SKF_HANDLE_GET_CBCMAC_CTX, SKF_R_NULL_ARGUMENT); + if (!(handle = (SKF_HANDLE *)hMac)) { + SKFerr(SKF_F_SKF_HANDLE_GET_CBCMAC_CTX, ERR_R_PASSED_NULL_PARAMETER); return NULL; } - if (handle->magic != SKF_HANDLE_MAGIC) { SKFerr(SKF_F_SKF_HANDLE_GET_CBCMAC_CTX, SKF_R_INVALID_HANDLE_MAGIC); return NULL; } - if (handle->type != SKF_MAC_HANDLE) { SKFerr(SKF_F_SKF_HANDLE_GET_CBCMAC_CTX, SKF_R_INVALID_HANDLE_TYPE); return NULL; @@ -105,24 +166,22 @@ CBCMAC_CTX *SKF_HANDLE_get_cbcmac_ctx(SKF_HANDLE *handle) SKFerr(SKF_F_SKF_HANDLE_GET_CBCMAC_CTX, SKF_R_CTX_NOT_CREATED); return NULL; } - return ret; } -EVP_CIPHER_CTX *SKF_HANDLE_get_cipher_ctx(SKF_HANDLE *handle) +EVP_CIPHER_CTX *SKF_HANDLE_get_cipher_ctx(HANDLE hKey) { EVP_CIPHER_CTX *ret; + SKF_HANDLE *handle; - if (!handle) { - SKFerr(SKF_F_SKF_HANDLE_GET_CIPHER_CTX, SKF_R_NULL_ARGUMENT); + if (!(handle = (SKF_HANDLE *)hKey)) { + SKFerr(SKF_F_SKF_HANDLE_GET_CIPHER_CTX, ERR_R_PASSED_NULL_PARAMETER); return NULL; } - if (handle->magic != SKF_HANDLE_MAGIC) { SKFerr(SKF_F_SKF_HANDLE_GET_CIPHER_CTX, SKF_R_INVALID_HANDLE_MAGIC); return NULL; } - if (handle->type != SKF_CIPHER_HANDLE) { SKFerr(SKF_F_SKF_HANDLE_GET_CIPHER_CTX, SKF_R_INVALID_HANDLE_TYPE); return NULL; @@ -132,44 +191,28 @@ EVP_CIPHER_CTX *SKF_HANDLE_get_cipher_ctx(SKF_HANDLE *handle) SKFerr(SKF_F_SKF_HANDLE_GET_CIPHER_CTX, SKF_R_CTX_NOT_CREATED); return NULL; } - return ret; } -int SKF_HANDLE_free_cipher_ctx(SKF_HANDLE *handle) +int SKF_HANDLE_free(HANDLE handle) { return 0; } -int SKF_HANDLE_free(SKF_HANDLE *handle) -{ - return 0; -} -unsigned char *SKF_HANDLE_get_key(SKF_HANDLE *handle) +HANDLE SKF_HANDLE_new(int type) { + return NULL; } -SKF_HANDLE *SKF_HANDLE_new(int type) -{ - return NULL; -} - -int SKF_HANDLE_set1_cipher_ctx(SKF_HANDLE *handle, EVP_CIPHER_CTX *ctx) -{ - return 0; -} - - - ULONG DEVAPI SKF_CloseHandle(HANDLE hHandle) { SKF_HANDLE *handle; + return SAR_OK; //FIXME: if (!(handle = (SKF_HANDLE *)hHandle)) { - SKFerr(SKF_F_SKF_CLOSEHANDLE, SKF_R_NULL_ARGUMENT); - return SAR_INVALIDPARAMERR; + return SAR_OK; } if (handle->magic != SKF_HANDLE_MAGIC) { diff --git a/crypto/skf/skf_lcl.h b/crypto/skf/skf_lcl.h index 6343b7cd..34fff5fb 100644 --- a/crypto/skf/skf_lcl.h +++ b/crypto/skf/skf_lcl.h @@ -83,15 +83,13 @@ struct SKF_HANDLE { typedef struct SKF_HANDLE SKF_HANDLE; -SKF_HANDLE *SKF_HANDLE_new(int type); -EVP_MD_CTX *SKF_HANDLE_get_md_ctx(SKF_HANDLE *hHash); -CBCMAC_CTX *SKF_HANDLE_get_cbcmac_ctx(SKF_HANDLE *hMac); -EVP_CIPHER_CTX *SKF_HANDLE_get_cipher_ctx(SKF_HANDLE *hKey); -unsigned char *SKF_HANDLE_get_key(SKF_HANDLE *hKey); -int SKF_HANDLE_set1_md_ctx(SKF_HANDLE *hHash, EVP_MD_CTX *ctx); -int SKF_HANDLE_set1_cbcmac_ctx(SKF_HANDLE *hMac, CBCMAC_CTX *ctx); -int SKF_HANDLE_set1_cipher_ctx(SKF_HANDLE *hKey, EVP_CIPHER_CTX *ctx); -int SKF_HANDLE_free(SKF_HANDLE *handle); +EVP_MD_CTX *SKF_HANDLE_get_md_ctx(HANDLE hHash); +CBCMAC_CTX *SKF_HANDLE_get_cbcmac_ctx(HANDLE hMac); +const EVP_CIPHER *SKF_HANDLE_get_cipher(HANDLE hKey, BLOCKCIPHERPARAM *param); +EVP_CIPHER_CTX *SKF_HANDLE_get_cipher_ctx(HANDLE hKey); +unsigned char *SKF_HANDLE_get_key(HANDLE hKey); + + #ifdef __cplusplus diff --git a/crypto/skf/skf_mac.c b/crypto/skf/skf_mac.c index 3b2cbf49..53670001 100644 --- a/crypto/skf/skf_mac.c +++ b/crypto/skf/skf_mac.c @@ -61,7 +61,6 @@ ULONG DEVAPI SKF_MacInit(HANDLE hKey, BLOCKCIPHERPARAM *pMacParam, HANDLE *phMac) { - int ok = 0; SKF_HANDLE *key; SKF_HANDLE *hMac = NULL; const EVP_CIPHER *cipher; @@ -71,14 +70,14 @@ ULONG DEVAPI SKF_MacInit(HANDLE hKey, return SAR_INVALIDPARAMERR; } - OPENSSL_assert(!pMacParam); + //TODO: check pMacParam if (key->magic != SKF_HANDLE_MAGIC) { SKFerr(SKF_F_SKF_MACINIT, SKF_R_INVALID_HANDLE_MAGIC); return SAR_INVALIDPARAMERR; } - if (key->type <= SKF_KEY_HANDLE) { + if (key->type < SKF_KEY_HANDLE) { SKFerr(SKF_F_SKF_MACINIT, SKF_R_INVALID_KEY_HANDLE); return SAR_INVALIDPARAMERR; } @@ -142,17 +141,20 @@ ULONG DEVAPI SKF_MacFinal(HANDLE hMac, ULONG *pulMacDataLen) { CBCMAC_CTX *ctx; + size_t size; if (!(ctx = SKF_HANDLE_get_cbcmac_ctx(hMac))) { SKFerr(SKF_F_SKF_MACFINAL, SKF_R_INVALID_MAC_HANDLE); return SAR_INVALIDPARAMERR; } - if (!CBCMAC_Final(ctx, pbMacData, pulMacDataLen)) { + size = *pulMacDataLen; + if (!CBCMAC_Final(ctx, pbMacData, &size)) { SKFerr(SKF_F_SKF_MACFINAL, ERR_R_CBCMAC_LIB); return SAR_FAIL; } + *pulMacDataLen = (ULONG)size; return SAR_OK; } diff --git a/crypto/skf/skf_rsa.c b/crypto/skf/skf_rsa.c index cd17220f..b6c048db 100644 --- a/crypto/skf/skf_rsa.c +++ b/crypto/skf/skf_rsa.c @@ -54,8 +54,7 @@ #include #include #include "skf_lcl.h" - -#if 0 +#if 1 ULONG DEVAPI SKF_GenExtRSAKey(DEVHANDLE hDev, ULONG ulBitsLen, RSAPRIVATEKEYBLOB *pBlob) @@ -226,104 +225,101 @@ ULONG DEVAPI SKF_RSAVerify(DEVHANDLE hDev, RSA *RSA_new_from_RSAPUBLICKEYBLOB(const RSAPUBLICKEYBLOB *blob) { RSA *ret; - if (!(ret = RSA_new())) { SKFerr(SKF_F_RSA_NEW_FROM_RSAPUBLICKEYBLOB, ERR_R_RSA_LIB); return NULL; } - if (!RSA_set_RSAPUBLICKEYBLOB(ret, blob)) { SKFerr(SKF_F_RSA_NEW_FROM_RSAPUBLICKEYBLOB, SKF_R_INVALID_RSA_PUBLIC_KEY); RSA_free(ret); return NULL; } - return ret; } RSA *RSA_new_from_RSAPRIVATEKEYBLOB(const RSAPRIVATEKEYBLOB *blob) { RSA *ret; - if (!(ret = RSA_new())) { SKFerr(SKF_F_RSA_NEW_FROM_RSAPRIVATEKEYBLOB, ERR_R_RSA_LIB); return NULL; } - if (!RSA_set_RSAPRIVATEKEYBLOB(ret, blob)) { SKFerr(SKF_F_RSA_NEW_FROM_RSAPRIVATEKEYBLOB, SKF_R_INVALID_RSA_PRIVATE_KEY); RSA_free(ret); return NULL; } - return ret; } int RSA_set_RSAPUBLICKEYBLOB(RSA *rsa, const RSAPUBLICKEYBLOB *blob) { - int ret = 0; - if (!rsa || !blob) { - SKFerr(SKF_F_RSA_SET_RSAPUBLICKEYBLOB, SKF_R_NULL_ARGUMENT); + SKFerr(SKF_F_RSA_SET_RSAPUBLICKEYBLOB, + ERR_R_PASSED_NULL_PARAMETER); return 0; } - - if (!(rsa->n = BN_bin2bn(blob->Modulus, blob->BitLen/8, rsa->n))) { - goto end; + if ((blob->BitLen < 1024) || (blob->BitLen > MAX_RSA_MODULUS_LEN*8) || + (blob->BitLen / 8 != 0)) { + SKFerr(SKF_F_RSA_SET_RSAPUBLICKEYBLOB, SKF_R_INVALID_RSA_KEY_LENGTH); + return 0; } - - if (!(rsa->e = BN_bin2bn(blob->PublicExponent, blob->BitLen/8, rsa->e))) { - goto end; + if (!(rsa->n = BN_bin2bn(blob->Modulus, blob->BitLen/8, rsa->n))) { + SKFerr(SKF_F_RSA_SET_RSAPUBLICKEYBLOB, SKF_R_INVALID_RSA_PUBLIC_KEY); + return 0; + } + if (!(rsa->e = BN_bin2bn(blob->PublicExponent, MAX_RSA_EXPONENT_LEN, rsa->e))) { + SKFerr(SKF_F_RSA_SET_RSAPUBLICKEYBLOB, SKF_R_INVALID_RSA_PUBLIC_KEY); + return 0; } if (!RSA_check_key(rsa)) { - goto end; + SKFerr(SKF_F_RSA_SET_RSAPUBLICKEYBLOB, SKF_R_INVALID_RSA_PUBLIC_KEY); + return 0; } - -end: - return ret; + return 1; } int RSA_get_RSAPUBLICKEYBLOB(RSA *rsa, RSAPUBLICKEYBLOB *blob) { - int ret = 0; int nbytes; - + if (!rsa || !blob) { + SKFerr(SKF_F_RSA_GET_RSAPUBLICKEYBLOB, + ERR_R_PASSED_NULL_PARAMETER); + return 0; + } if (!rsa->n || !rsa->e) { - goto end; + SKFerr(SKF_F_RSA_GET_RSAPUBLICKEYBLOB, + SKF_R_INVALID_RSA_PUBLIC_KEY); + return 0; } - nbytes = BN_num_bytes(rsa->n); - - if (!BN_bn2bin(rsa->n, blob->Modulus + bnlen - BN_num_bytes(rsa->n)) || - !BN_bn2bin(rsa->e, blob->PublicExponent + bnlen - BN_num_bytes(rsa->e))) { + if (!BN_bn2bin(rsa->n, blob->Modulus) || !BN_bn2bin(rsa->e, + blob->PublicExponent + MAX_RSA_EXPONENT_LEN - BN_num_bytes(rsa->e))) { + SKFerr(SKF_F_RSA_GET_RSAPUBLICKEYBLOB, + SKF_R_ENCODE_RSA_PUBLIC_KEY_FAILED); + return 0; } - - return ret; + return 1; } - int RSA_set_RSAPRIVATEKEYBLOB(RSA *rsa, const RSAPRIVATEKEYBLOB *blob) { - int ret = 0; int nbytes; - if (!rsa || !blob) { - SKFerr(SKF_F_RSA_SET_RSAPRIVATEKEYBLOB, SKF_R_NULL_ARGUMENT); - return SAR_INVALIDPARAMERR; + SKFerr(SKF_F_RSA_SET_RSAPRIVATEKEYBLOB, + ERR_R_PASSED_NULL_PARAMETER); + return 0; } - if (blob->AlgID != SGD_RSA) { - SKFerr(SKF_F_RSA_SET_RSAPRIVATEKEYBLOB, SKR_R_INVALID_ALGOR); - return SAR_INVALIDPARAMERR; + SKFerr(SKF_F_RSA_SET_RSAPRIVATEKEYBLOB, SKF_R_INVALID_ALGOR); + return 0; } - if ((blob->BitLen < 1024) || (blob->BitLen > MAX_RSA_MODULUS_LEN*8) || (blob->BitLen % 8 != 0) || (blob->BitLen % 16 != 0)) { - SKFerr(SKF_F_RSA_SET_RSAPRIVATEKEYBLOB, SKR_R_INVALID_KEY_LENGTH); - return SAR_INVALIDPARAMERR; + SKFerr(SKF_F_RSA_SET_RSAPRIVATEKEYBLOB, SKF_R_INVALID_KEY_LENGTH); + return 0; } nbytes = blob->BitLen/8; - if (!(rsa->n = BN_bin2bn(blob->Modulus, nbytes, rsa->n)) || !(rsa->e = BN_bin2bn(blob->PublicExponent, MAX_RSA_EXPONENT_LEN, rsa->e)) || !(rsa->d = BN_bin2bn(blob->PrivateExponent, nbytes, rsa->d)) || @@ -332,26 +328,24 @@ int RSA_set_RSAPRIVATEKEYBLOB(RSA *rsa, const RSAPRIVATEKEYBLOB *blob) !(rsa->dmp1 = BN_bin2bn(blob->Prime1Exponent, nbytes/2, rsa->dmp1)) || !(rsa->dmq1 = BN_bin2bn(blob->Prime2Exponent, nbytes/2, rsa->dmq1)) || !(rsa->iqmp = BN_bin2bn(blob->Coefficient, nbytes/2, rsa->iqmp))) { - - SKFerr(SKF_F_RSA_SET_RSAPRIVATEKEYBLOB, SKR_R_INVALID_RSA_PRIVATE_KEY); - return SAR_INVALIDPARAMERR; + SKFerr(SKF_F_RSA_SET_RSAPRIVATEKEYBLOB, SKF_R_INVALID_RSA_PRIVATE_KEY); + return 0; } - - return SAR_OK; + return 1; } int RSA_get_RSAPRIVATEKEYBLOB(RSA *rsa, RSAPRIVATEKEYBLOB *blob) { int nbytes; if (!rsa || !blob) { - SKFerr(SKF_F_RSA_GET_RSAPRIVATEKEYBLOB, SKF_R_NULL_ARGUMENT); - return SAR_INVALIDPARAMERR; + SKFerr(SKF_F_RSA_GET_RSAPRIVATEKEYBLOB, + ERR_R_PASSED_NULL_PARAMETER); + return 0; } - if (!rsa->n || !rsa->e || !rsa->d || !rsa->p || !rsa->q || - !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) + !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) { SKFerr(SKF_F_RSA_GET_RSAPRIVATEKEYBLOB, SKF_R_INVALID_RSA_PRIVATE_KEY); - return SAR_INVALIDPARAMERR; + return 0; } bzero(blob, sizeof(*blob)); @@ -367,11 +361,10 @@ int RSA_get_RSAPRIVATEKEYBLOB(RSA *rsa, RSAPRIVATEKEYBLOB *blob) !BN_bn2bin(rsa->dmp1, blob->Prime1Exponent + nbytes/2 - BN_num_bytes(rsa->dmp1)) || !BN_bn2bin(rsa->dmq1, blob->Prime2Exponent + nbytes/2 - BN_num_bytes(rsa->dmq1)) || !BN_bn2bin(rsa->iqmp, blob->Coefficient + nbytes/2 - BN_num_bytes(rsa->iqmp))) { - SKFerr(SKF_F_RSA_GET_RSAPRIVATEKEYBLOB, SKF_R_INVALID_RSA_PRIVATE_KEY); - return SAR_INVALIDPARAMERR; + return 0; } - return SAR_OK; + return 1; } #endif diff --git a/crypto/skf/skftest.c b/crypto/skf/skftest.c new file mode 100644 index 00000000..dfe14722 --- /dev/null +++ b/crypto/skf/skftest.c @@ -0,0 +1,383 @@ +/* crypto/skf/skftest.c */ +/* ==================================================================== + * Copyright (c) 2015-2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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 +#include +#include +#include +#include +#include + +#define PRINT_ERRSTR(rv) \ + fprintf(stderr, "error: %s %d: %s\n", __FILE__, __LINE__, SKF_get_errstr(rv)) + +DEVHANDLE open_dev(LPSTR devName, int verbose) +{ + DEVHANDLE hDev; + ULONG rv; + + if ((rv = SKF_ConnectDev(devName, &hDev)) != SAR_OK) { + PRINT_ERRSTR(rv); + return NULL; + } + + if (verbose > 1) { + DEVINFO devInfo; + if ((rv = SKF_GetDevInfo(hDev, &devInfo)) != SAR_OK) { + PRINT_ERRSTR(rv); + SKF_DisConnectDev(hDev); + return NULL; + } + SKF_print_dev_info(&devInfo); + } + + return hDev; +} + +int test_skf_mac(DEVHANDLE hDev, ULONG ulAlgID, int verbose) +{ + int ret = 0; + HANDLE hKey = NULL; + HANDLE hMac = NULL; + BLOCKCIPHERPARAM param; + BYTE key[EVP_MAX_KEY_LENGTH]; + BYTE data[128] = {0}; + BYTE mac[EVP_MAX_MD_SIZE]; + ULONG dataLen, macLen; + ULONG rv; + + if ((rv = SKF_SetSymmKey(hDev, key, ulAlgID, &hKey)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + bzero(¶m, sizeof(param)); + param.IVLen = 0; + param.PaddingType = SKF_NO_PADDING; + if ((rv = SKF_MacInit(hKey, ¶m, &hMac)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + dataLen = (ULONG)sizeof(data); + macLen = (ULONG)sizeof(mac); + if ((rv = SKF_Mac(hMac, data, dataLen, mac, &macLen)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + if (macLen != 16) { + printf("macLen = %d\n", (int)macLen); + fprintf(stderr, "error: %s %d: %s\n", __FILE__, __LINE__, "mac length != 16"); + goto end; + } + + ret = 1; +end: + if ((rv = SKF_CloseHandle(hMac)) != SAR_OK) { + PRINT_ERRSTR(rv); + ret = 0; + } + if ((rv = SKF_CloseHandle(hKey)) != SAR_OK) { + PRINT_ERRSTR(rv); + ret = 0; + } + + if (ret && verbose) { + printf("%s(%s) passed\n", __FUNCTION__, SKF_get_alg_name(ulAlgID)); + } + + return ret; +} + +int test_skf_dgst(DEVHANDLE hDev, ULONG ulAlgID, int verbose) +{ + int ret = 0; + HANDLE hHash = NULL; + BYTE data[200] = {0}; + BYTE dgst[EVP_MAX_MD_SIZE]; + ULONG dataLen, dgstLen; + ULONG rv; + + if ((rv = SKF_DigestInit(hDev, ulAlgID, NULL, NULL, 0, &hHash)) != SAR_OK) { + PRINT_ERRSTR(rv); + return 0; + } + dataLen = (ULONG)sizeof(data); + dgstLen = (ULONG)sizeof(dgst); + if ((rv = SKF_Digest(hHash, data, dataLen, dgst, &dgstLen)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + if (verbose > 1) { + ULONG i; + printf("%s (%u-Byte) = ", SKF_get_alg_name(ulAlgID), dgstLen); + for (i = 0; i < dgstLen; i++) { + printf("%02x", dgst[i]); + } + printf("\n"); + } + + ret = 1; +end: + if ((rv = SKF_CloseHandle(hHash)) != SAR_OK) { + PRINT_ERRSTR(rv); + ret = 0; + } + if (ret && verbose) { + printf("%s(%s) passed\n", __FUNCTION__, SKF_get_alg_name(ulAlgID)); + } + + return ret; +} + +int test_skf_enc(DEVHANDLE hDev, ULONG ulAlgID, BLOCKCIPHERPARAM param, int verbose) +{ + int ret = 0; + HANDLE hKey = NULL; + BYTE key[EVP_MAX_KEY_LENGTH]; + BYTE data[] = "message to be encrypted"; + BYTE cbuf[256]; + BYTE mbuf[256]; + ULONG mlen, clen; + ULONG rv; + + if ((rv = SKF_SetSymmKey(hDev, key, ulAlgID, &hKey)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + if ((rv = SKF_EncryptInit(hKey, param)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + mlen = (ULONG)sizeof(data); + clen = (ULONG)sizeof(cbuf); + if ((rv = SKF_Encrypt(hKey, data, mlen, cbuf, &clen)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + if ((rv = SKF_DecryptInit(hKey, param)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + mlen = (ULONG)sizeof(mbuf); + if ((rv = SKF_Decrypt(hKey, cbuf, clen, mbuf, &mlen)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + //FIXME: compare data with mbuf + + if (verbose > 1) { + //FIXME: print ciphertext + } + + ret = 1; +end: + if ((rv = SKF_CloseHandle(hKey)) != SAR_OK) { + PRINT_ERRSTR(rv); + ret = 0; + } + if (ret && verbose) { + //FIXME: print success info + } + + return ret; +} + +int test_skf_rsa(DEVHANDLE hDev, ULONG ulBitsLen, int verbose) +{ + int ret = 0; + RSAPRIVATEKEYBLOB rsa; + RSAPUBLICKEYBLOB rsaPubKey; + BYTE data[] = "message to be encrypted or signed"; + BYTE cbuf[512]; + BYTE mbuf[256]; + BYTE sig[512]; + ULONG len, clen, mlen, siglen; + ULONG rv; + + if ((rv = SKF_GenExtRSAKey(hDev, 2048, &rsa)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + memcpy(&rsaPubKey, &rsa, sizeof(rsaPubKey)); + + len = (ULONG)sizeof(data); + clen = (ULONG)sizeof(cbuf); + if ((rv = SKF_ExtRSAPubKeyOperation(hDev, &rsaPubKey, data, len, cbuf, &clen)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + mlen = (ULONG)sizeof(mbuf); + if ((rv = SKF_ExtRSAPriKeyOperation(hDev, &rsa, cbuf, clen, mbuf, &mlen)) != SAR_OK) { + PRINT_ERRSTR(rv); + goto end; + } + + ret = 1; +end: + return 0; +} + +int test_skf_ec(DEVHANDLE hDev, int verbose) +{ + ECCPRIVATEKEYBLOB priKey; + ECCPUBLICKEYBLOB pubKey; + ECCSIGNATUREBLOB sig; + BYTE cbuf[sizeof(ECCCIPHERBLOB) + 512]; + BYTE msg[] = "message to be signed and encrypted"; + BYTE mbuf[128]; + ULONG mlen, clen; + ULONG rv; + + bzero(&priKey, sizeof(priKey)); + bzero(&pubKey, sizeof(pubKey)); + if ((rv = SKF_GenExtECCKeyPair(hDev, &priKey, &pubKey)) != SAR_OK) { + PRINT_ERRSTR(rv); + return 0; + } + + mlen = (ULONG)sizeof(msg); + bzero(&sig, sizeof(sig)); + if ((rv = SKF_ExtECCSign(hDev, &priKey, msg, mlen, &sig)) != SAR_OK) { + PRINT_ERRSTR(rv); + return 0; + } + if ((rv = SKF_ExtECCVerify(hDev, &pubKey, msg, mlen, &sig)) != SAR_OK) { + PRINT_ERRSTR(rv); + return 0; + } + + mlen = (ULONG)sizeof(msg); + bzero(cbuf, sizeof(cbuf)); + if ((rv = SKF_ExtECCEncrypt(hDev, &pubKey, msg, mlen, (ECCCIPHERBLOB *)cbuf)) != SAR_OK) { + PRINT_ERRSTR(rv); + return 0; + } + mlen = (ULONG)sizeof(mbuf); + bzero(mbuf, sizeof(mbuf)); + if ((rv = SKF_ExtECCDecrypt(hDev, &priKey, (ECCCIPHERBLOB *)cbuf, mbuf, &mlen)) != SAR_OK) { + PRINT_ERRSTR(rv); + return 0; + } + + return 1; +} + +int main(int argc, char **argv) +{ + int verbose = 2; + DEVHANDLE hDev = NULL; + ULONG digestAlgors[] = { + SGD_SM3, + SGD_SHA1, + SGD_SHA256 + }; + ULONG cipherAlgors[] = { + SGD_SM4_ECB, + SGD_SM4_CBC, + SGD_SM4_CFB, + SGD_SM4_CFB, + SGD_SM4_CFB, + SGD_SM4_OFB + }; + BLOCKCIPHERPARAM cipherParams[] = { + {{0}, 0, SKF_NO_PADDING, 0}, + {{0}, 16, SKF_PKCS5_PADDING, 0}, + {{0}, 16, SKF_NO_PADDING, 1}, + {{0}, 16, SKF_NO_PADDING, 8}, + {{0}, 16, SKF_NO_PADDING, 128}, + {{0}, 16, SKF_NO_PADDING, 0}, + }; + ULONG rsaBits[] = { 1024, 2048 }; + int i; + + hDev = open_dev((LPSTR)"name", verbose); + /* + if (!test_skf_mac(hDev, SGD_SM4_MAC, verbose)) { + goto end; + } + */ + + for (i = 0; i < sizeof(digestAlgors)/sizeof(digestAlgors[0]); i++) { + if (!test_skf_dgst(hDev, digestAlgors[i], verbose)) { + goto end; + } + } + + for (i = 0; i < sizeof(cipherAlgors)/sizeof(cipherAlgors[0]); i++) { + if (!test_skf_enc(hDev, cipherAlgors[i], cipherParams[i], verbose)) { + goto end; + } + } + + for (i = 0; i < sizeof(rsaBits)/sizeof(rsaBits[0]); i++) { + if (!test_skf_rsa(hDev, test_skf_rsa(hDev, rsaBits[i], verbose))) { + goto end; + } + } + + if (!test_skf_ec(hDev, verbose)) { + goto end; + } + +end: + ERR_print_errors_fp(stderr); + SKF_DisConnectDev(hDev); + return -1; +} + diff --git a/crypto/sm2/Makefile b/crypto/sm2/Makefile index 062fac74..d79746c5 100644 --- a/crypto/sm2/Makefile +++ b/crypto/sm2/Makefile @@ -103,8 +103,8 @@ sm2_enc.o: ../../include/openssl/pkcs7.h ../../include/openssl/rand.h sm2_enc.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h sm2_enc.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h sm2_enc.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h -sm2_enc.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h sm2.h -sm2_enc.o: sm2_enc.c +sm2_enc.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h +sm2_enc.o: ../o_str.h sm2_enc.c sm2_err.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h sm2_err.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h sm2_err.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h diff --git a/crypto/sm2/sm2.h b/crypto/sm2/sm2.h index 8a6fdc39..cd391944 100644 --- a/crypto/sm2/sm2.h +++ b/crypto/sm2/sm2.h @@ -228,6 +228,7 @@ void ERR_load_SM2_strings(void); # define SM2_F_SM2_CIPHERTEXT_VALUE_PRINT 103 # define SM2_F_SM2_CIPHERTEXT_VALUE_SIZE 104 # define SM2_F_SM2_COMPUTE_ID_DIGEST 105 +# define SM2_F_SM2_COMPUTE_ID_DIGEST_EX 127 # define SM2_F_SM2_DECRYPT 106 # define SM2_F_SM2_DO_DECRYPT 107 # define SM2_F_SM2_DO_ENCRYPT 108 diff --git a/crypto/sm2/sm2_err.c b/crypto/sm2/sm2_err.c index e8b766a8..cb9681db 100644 --- a/crypto/sm2/sm2_err.c +++ b/crypto/sm2/sm2_err.c @@ -79,6 +79,7 @@ static ERR_STRING_DATA SM2_str_functs[] = { {ERR_FUNC(SM2_F_SM2_CIPHERTEXT_VALUE_PRINT), "SM2_CIPHERTEXT_VALUE_print"}, {ERR_FUNC(SM2_F_SM2_CIPHERTEXT_VALUE_SIZE), "SM2_CIPHERTEXT_VALUE_size"}, {ERR_FUNC(SM2_F_SM2_COMPUTE_ID_DIGEST), "SM2_compute_id_digest"}, + {ERR_FUNC(SM2_F_SM2_COMPUTE_ID_DIGEST_EX), "SM2_COMPUTE_ID_DIGEST_EX"}, {ERR_FUNC(SM2_F_SM2_DECRYPT), "SM2_decrypt"}, {ERR_FUNC(SM2_F_SM2_DO_DECRYPT), "SM2_do_decrypt"}, {ERR_FUNC(SM2_F_SM2_DO_ENCRYPT), "SM2_do_encrypt"}, diff --git a/crypto/sm2/sm2_kap.c b/crypto/sm2/sm2_kap.c index 8204bdfc..e64f2795 100644 --- a/crypto/sm2/sm2_kap.c +++ b/crypto/sm2/sm2_kap.c @@ -58,7 +58,7 @@ int SM2_KAP_CTX_init(SM2_KAP_CTX *ctx, EC_KEY *ec_key, { int ret = 0; int w; - + memset(ctx, 0, sizeof(*ctx)); ctx->id_dgst_md = EVP_sm3(); @@ -90,7 +90,7 @@ int SM2_KAP_CTX_init(SM2_KAP_CTX *ctx, EC_KEY *ec_key, SM2err(SM2_F_SM2_KAP_CTX_INIT, ERR_R_EC_LIB); goto end; } - + if (!SM2_compute_id_digest(ctx->id_dgst_md, ctx->remote_id_dgst, &ctx->remote_id_dgstlen, remote_pubkey)) { SM2err(SM2_F_SM2_KAP_CTX_INIT, 0); @@ -155,97 +155,6 @@ void SM2_KAP_CTX_cleanup(SM2_KAP_CTX *ctx) memset(ctx, 0, sizeof(*ctx)); } -#if 0 -int SM2_update_key(EC_KEY *ec_key, EC_POINT **point) -{ - EC_KEY *tmp = NULL; - BIGNUM *d = EC_KEY_get0_private_key(ec_key); - - - if (!(tmp = EC_KEY_new())) { - goto end; - } - - if (!EC_KEY_set_group(tmp, EC_KEY_get0_group(ec_key))) { - goto end; - } - - if (!EC_KEY_generate_key(tmp)) { - goto end; - } - - if (!EC_KEY_get_affine_coordinates(tmp, x, y)) { - goto end; - } - - /* convert x to x' */ - - if (**point == NULL) { - *point = EC_POINT_dup(EC_KEY_get0_public_key(ec_key), EC_KEY_get0_group(ec_key)); - } else { - EC_POINT_copy(*point, EC_KEY_get0_public_key(ec_key), EC_KEY_get0_group(ec_key)); - } - -end: - EC_KEY_free(tmp); - return 0; -} - -int SM2_update_public_key(EC_KEY *ec_key, const EC_POINT *pub_key) -{ - EC_GROUP *group; - - - group = EC_KEY_get0_group(ec_key); - - - - if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) == NID_X9_62_prime_field) { - if (!EC_POINT_get_affine_coordinates_GFp(group, pub_key, x, NULL, bn_ctx)) { - goto end; - } - } else { - if (!EC_POINT_get_affine_coordinates_GF2m(group, pub_key, x, NULL, bn_ctx)) { - goto end; - } - } - - if (!BN_nnmod(x, x, ctx->two_pow_w, bn_ctx)) { - goto end; - } - - if (!BN_add(x, x, ctx->two_pow_w)) { - goto end; - } - - if (!BN_mod_mul(ctx->t, x, r, ctx->order, ctx->bn_ctx)) { - goto end; - } - - if (!EC_POINT_mul(group, point, NULL, point, x, ctx->bn_ctx)) { - goto end; - } - - if (!EC_POINT_add(group, pubkey, pubkey, point, bn_ctx)) { - goto end; - } - - ret = 1; -end: - return ret; -} - -int SM2_derive_key(void *out, size_t outlen, - const EC_POINT *pub_key, EC_KEY *ec_key, - void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen)) -{ - - - - return 0; -} -#endif - /* FIXME: ephem_point_len should be both input and output */ int SM2_KAP_prepare(SM2_KAP_CTX *ctx, unsigned char *ephem_point, size_t *ephem_point_len) @@ -306,7 +215,7 @@ int SM2_KAP_prepare(SM2_KAP_CTX *ctx, unsigned char *ephem_point, * w = ceil(keybits / 2) - 1 * x = 2^w + (x and (2^w - 1)) = 2^w + (x mod 2^w) * t = (d + x * r) mod n - * t = (h * t) mod n + * t = (h * t) mod n */ if (!ctx->t) { @@ -377,7 +286,7 @@ int SM2_KAP_compute_key(SM2_KAP_CTX *ctx, const unsigned char *remote_point, unsigned int len, bnlen; size_t klen = keylen; - + EVP_MD_CTX_init(&md_ctx); if (!(x = BN_new())) { diff --git a/crypto/sm2/sm2_lib.c b/crypto/sm2/sm2_lib.c index 6004d5ef..f7cc6b99 100644 --- a/crypto/sm2/sm2_lib.c +++ b/crypto/sm2/sm2_lib.c @@ -199,6 +199,14 @@ err: return ret; } +int SM2_compute_id_digest_ex(const EVP_MD *md, + unsigned char *dgst, size_t dgstlen, + const char *id, size_t idlen, EC_KEY *ec_key) +{ + SM2err(SM2_F_SM2_COMPUTE_ID_DIGEST_EX, ERR_R_SM2_LIB); + return 0; +} + //TODO: review this function again. int SM2_compute_id_digest(const EVP_MD *md, unsigned char *dgst, unsigned int *dgstlen, EC_KEY *ec_key) @@ -209,7 +217,7 @@ int SM2_compute_id_digest(const EVP_MD *md, unsigned char *dgst, unsigned char idbits[2]; int pkdatalen; char *id; - + if ((pkdatalen = sm2_get_public_key_data(pkdata, ec_key)) < 0) { fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__); goto err; @@ -272,7 +280,7 @@ int SM2_compute_message_digest(const EVP_MD *id_md, const EVP_MD *msg_md, goto err; } - if (!SM2_compute_id_digest(id_md, buf, &len, ec_key)) { + if (!SM2_compute_id_digest(id_md, buf, &len, ec_key)) { goto err; } @@ -300,7 +308,7 @@ int SM2_digest(const void *msg, size_t msglen, unsigned char *dgst, { const EVP_MD *id_md = EVP_sm3(); const EVP_MD *msg_md = EVP_sm3(); - + return SM2_compute_message_digest(id_md, msg_md, msg, msglen, dgst, dgstlen, ec_key); } diff --git a/crypto/sm3/Makefile b/crypto/sm3/Makefile index 919db984..97587764 100644 --- a/crypto/sm3/Makefile +++ b/crypto/sm3/Makefile @@ -22,8 +22,8 @@ TEST=sm3test.c APPS= LIB=$(TOP)/libcrypto.a -LIBSRC=sm3.c -LIBOBJ=sm3.o +LIBSRC=sm3.c sm3_hmac.c +LIBOBJ=sm3.o sm3_hmac.o SRC= $(LIBSRC) @@ -66,6 +66,8 @@ tests: lint: lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend + depend: @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) @@ -79,4 +81,5 @@ clean: # DO NOT DELETE THIS LINE -- make depend depends on it. -sm3.o: ../byteorder.h sm3.c sm3.h +sm3.o: ../../include/openssl/sm3.h ../byteorder.h sm3.c +sm3_hmac.o: ../../include/openssl/sm3.h sm3_hmac.c diff --git a/crypto/sm3/README.md b/crypto/sm3/README.md new file mode 100644 index 00000000..11fd674b --- /dev/null +++ b/crypto/sm3/README.md @@ -0,0 +1,66 @@ +## SM3 Sub-library of GMSSL + +SM3 Cryptographic Hash Algorithm is a chinese national cryptographic hash +algorithm standard published by the State Cryptography Administration Office +of Security Commercial Code Administration (OSCCA) of China in December 2010. +A draft of this algorithm can be found at + +[http://tools.ietf.org/html/draft-shen-sm3-hash-00](http://tools.ietf.org/html/draft-shen-sm3-hash-00 "RFC Draft") + + +The SM3 take input messages as 512 bits blocks and generates +256 bits digest values, same as SHA-256. + +The `SM3` sub-library of GmSSL provides the implementation of SM3 hash +algorithm, with init/update/final style of interfaces. There is also a +demo program in `demo/gmssl/sm3.c` on how to implement a command line +tool with the the inner API of SM3 sub-library. + +### Usage + +The SM3 sub-library provides the following C API: + +``` + void sm3_init(sm3_ctx_t *ctx); + void sm3_update(sm3_ctx_t *ctx, const unsigned char* data, size_t data_len); + void sm3_final(sm3_ctx_t *ctx, unsigned char digest[SM3_DIGEST_LENGTH]); + void sm3_compress(uint32_t digest[8], const unsigned char block[SM3_BLOCK_SIZE]); + void sm3(const unsigned char *data, size_t datalen, unsigned char digest[SM3_DIGEST_LENGTH]); + + void sm3_hmac_init(sm3_hmac_ctx_t *ctx, const unsigned char *key, size_t key_len); + void sm3_hmac_update(sm3_hmac_ctx_t *ctx, const unsigned char *data, size_t data_len); + void sm3_hmac_final(sm3_hmac_ctx_t *ctx, unsigned char mac[sm3_hmac_MAC_SIZE]); + void sm3_hmac(const unsigned char *data, size_t data_len, + const unsigned char *key, size_t key_len, unsigned char mac[sm3_hmac_MAC_SIZE]); +``` + +Example on using C API to digest a message: + +``` + unsigend char buffer[SM3_DIGEST_LENGTH]; + sm3("hello", strlen("hello"), buffer); +``` + +Example on using C API to digest a stream: + +``` + unsigned char dgst[SM3_DIGEST_LENGTH]; + sm3_ctx_t ctx; + sm3_init(&ctx); + sm3_update(&ctx, "hello", strlen("hello")); + sm3_update(&ctx, "world", strlen("world")); + sm3_final(&ctx, dgst); +``` + +Example on using C API to generate a HMAC tag: + +``` + unsigned char mac[sm3_hmac_MAC_SIZE]; + sm3_hmac_ctx_t ctx; + unsigned char key[16]; + sm3_hmac_init(&ctx, key, sizeof(key)); + sm3_hmac_update(&ctx, "hello", strlen("hello")); + sm3_hmac_update(&ctx, "world", strlen("world")); + sm3_hmac_final(&ctx, mac); +``` + diff --git a/crypto/sm3/hmac_sm3.c b/crypto/sm3/hmac_sm3.c deleted file mode 100644 index a3bfd2d3..00000000 --- a/crypto/sm3/hmac_sm3.c +++ /dev/null @@ -1,78 +0,0 @@ -#include -#include -#include "hmac_sm3.h" - -/** - * HMAC_k(m) = H((k ^ opad), H((k ^ ipad), m)) - * pseudo-code: - * function hmac(key, message) - * opad = [0x5c * blocksize] - * ipad = [0x36 * blocksize] - * if (length(key) > blocksize) then - * key = hash(key) - * end if - * for i from 0 to length(key) - 1 step 1 - * ipad[i] = ipad[i] XOR key[i] - * opad[i] = opad[i] XOR key[i] - * end for - * return hash(opad || hash(ipad || message)) - * end function - */ - - -#define IPAD 0x36 -#define OPAD 0x5C - -void hmac_sm3_init(hmac_sm3_ctx_t *ctx, const unsigned char *key, size_t key_len) -{ - int i; - unsigned char ipad[SM3_DIGEST_LENGTH]; - - if (key_len <= SM3_BLOCK_SIZE) { - memcpy(ctx->key, key, key_len); - memset(ctx->key + key_len, 0, SM3_BLOCK_SIZE - key_len); - } else { - sm3_init(&ctx->sm3_ctx); - sm3_update(&ctx->sm3_ctx, key, key_len); - sm3_final(&ctx->sm3_ctx, ctx->key); - memset(ctx->key + SM3_DIGEST_LENGTH, 0, - SM3_BLOCK_SIZE - SM3_DIGEST_LENGTH); - } - for (i = 0; i < SM3_BLOCK_SIZE; i++) { - ctx->key[i] ^= IPAD; - } - - sm3_init(&ctx->sm3_ctx); - sm3_update(&ctx->sm3_ctx, ctx->key, SM3_BLOCK_SIZE); -} - -void hmac_sm3_update(hmac_sm3_ctx_t *ctx, const unsigned char *data, size_t data_len) -{ - sm3_update(&ctx->sm3_ctx, data, data_len); -} - -void hmac_sm3_final(hmac_sm3_ctx_t *ctx, unsigned char mac[HMAC_SM3_MAC_SIZE]) -{ - int i; - for (i = 0; i < SM3_BLOCK_SIZE; i++) { - ctx->key[i] ^= (IPAD ^ OPAD); - } - sm3_final(&ctx->sm3_ctx, mac); - sm3_init(&ctx->sm3_ctx); - sm3_update(&ctx->sm3_ctx, ctx->key, SM3_BLOCK_SIZE); - sm3_update(&ctx->sm3_ctx, mac, SM3_DIGEST_LENGTH); - sm3_final(&ctx->sm3_ctx, mac); -} - -void hmac_sm3(const unsigned char *data, size_t data_len, - const unsigned char *key, size_t key_len, unsigned char mac[HMAC_SM3_MAC_SIZE]) -{ - hmac_sm3_ctx_t ctx; - - hmac_sm3_init(&ctx, key, key_len); - hmac_sm3_update(&ctx, data, data_len); - hmac_sm3_final(&ctx, mac); - - memset(&ctx, 0, sizeof(hmac_sm3_ctx_t)); -} - diff --git a/crypto/sm3/hmac_sm3.h b/crypto/sm3/hmac_sm3.h deleted file mode 100644 index 00b91c69..00000000 --- a/crypto/sm3/hmac_sm3.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef LIBSM3_HMAC_SM3_H -#define LIBSM3_HMAC_SM3_H - -#include "sm3.h" - -#define HMAC_SM3_MAC_SIZE SM3_DIGEST_LENGTH - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct { - sm3_ctx_t sm3_ctx; - unsigned char key[SM3_DIGEST_LENGTH]; -} hmac_sm3_ctx_t; - - -void hmac_sm3_init(hmac_sm3_ctx_t *ctx, const unsigned char *key, size_t key_len); -void hmac_sm3_update(hmac_sm3_ctx_t *ctx, const unsigned char *data, size_t data_len); -void hmac_sm3_final(hmac_sm3_ctx_t *ctx, unsigned char mac[HMAC_SM3_MAC_SIZE]); -void hmac_sm3(const unsigned char *data, size_t data_len, - const unsigned char *key, size_t key_len, unsigned char mac[HMAC_SM3_MAC_SIZE]); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/crypto/sm3/hmac_sm3_test.c b/crypto/sm3/hmac_sm3_test.c deleted file mode 100644 index 9a819f59..00000000 --- a/crypto/sm3/hmac_sm3_test.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "hmac_sm3.h" -#include -#include - -int hmac_sm3_test() -{ - int ret = 0; - int i, j; - unsigned char mac[HMAC_SM3_MAC_SIZE]; - hmac_sm3_ctx_t ctx; - - char *testarray[4] = { - "abc", - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "a", - "01234567012345670123456701234567" - }; - int repeatcount[4] = { 1, 1, 1000000, 20 }; - unsigned char key[4] = { - "hello", - "world", - "23492304982304982340923480", - "a" - }; - unsigned char result[4][32] = { - {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0}, - {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0}, - {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0}, - {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, - 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0}, - }; - - for (i = 0; i < sizeof(testarray)/sizeof(testarray[0]); i++) { - hmac_sm3_init(&ctx, key[i], key_length[i]); - for (j = 0; j < repeatcount[i]; j++) { - hmac_sm3_update(&ctx, (const unsigned char *)testarray[i], - strlen(testarray[i])); - } - hmac_sm3_final(&ctx, mac); - if (memcmp(mac, &result[i][0], sizeof(mac)) != 0) { - fprintf(stderr, "hmac-sm3 test-%d failed\n", i); - ret = 1; - } - } - - if (ret == 0) { - printf("hmac-sm3 test success!\n"); - } - - return ret; -} - -int main() -{ - return hmac_sm3_test(); -} - diff --git a/crypto/sm3/sm3.c b/crypto/sm3/sm3.c index 9c337029..1cb695c5 100644 --- a/crypto/sm3/sm3.c +++ b/crypto/sm3/sm3.c @@ -49,13 +49,11 @@ * */ - -#include "sm3.h" -#include "../byteorder.h" #include +#include "../byteorder.h" +#include - -int sm3_init(sm3_ctx_t *ctx) +void sm3_init(sm3_ctx_t *ctx) { ctx->digest[0] = 0x7380166F; ctx->digest[1] = 0x4914B2B9; @@ -65,22 +63,19 @@ int sm3_init(sm3_ctx_t *ctx) ctx->digest[5] = 0x163138AA; ctx->digest[6] = 0xE38DEE4D; ctx->digest[7] = 0xB0FB0E4E; - + ctx->nblocks = 0; ctx->num = 0; - if(ctx == NULL) return 0; - return 1; } -int sm3_update(sm3_ctx_t *ctx, const unsigned char* data, size_t data_len) +void sm3_update(sm3_ctx_t *ctx, const unsigned char* data, size_t data_len) { - if(ctx == NULL) return 0; if (ctx->num) { unsigned int left = SM3_BLOCK_SIZE - ctx->num; if (data_len < left) { memcpy(ctx->block + ctx->num, data, data_len); ctx->num += data_len; - return 1; + return; } else { memcpy(ctx->block + ctx->num, data, left); sm3_compress(ctx->digest, ctx->block); @@ -99,18 +94,16 @@ int sm3_update(sm3_ctx_t *ctx, const unsigned char* data, size_t data_len) if (data_len) { memcpy(ctx->block, data, data_len); } - return 1; } -int sm3_final(sm3_ctx_t *ctx, unsigned char *digest) +void sm3_final(sm3_ctx_t *ctx, unsigned char *digest) { - if(ctx == NULL) return 0; int i; uint32_t *pdigest = (uint32_t *)digest; uint32_t *count = (uint32_t *)(ctx->block + SM3_BLOCK_SIZE - 8); - + ctx->block[ctx->num] = 0x80; - + if (ctx->num + 9 <= SM3_BLOCK_SIZE) { memset(ctx->block + ctx->num + 1, 0, SM3_BLOCK_SIZE - ctx->num - 9); } else { @@ -121,23 +114,22 @@ int sm3_final(sm3_ctx_t *ctx, unsigned char *digest) count[0] = cpu_to_be32((ctx->nblocks) >> 23); count[1] = cpu_to_be32((ctx->nblocks << 9) + (ctx->num << 3)); - + sm3_compress(ctx->digest, ctx->block); for (i = 0; i < sizeof(ctx->digest)/sizeof(ctx->digest[0]); i++) { pdigest[i] = cpu_to_be32(ctx->digest[i]); } - return 1; } #define ROTATELEFT(X,n) (((X)<<(n)) | ((X)>>(32-(n)))) -#define P0(x) ((x) ^ ROTATELEFT((x),9) ^ ROTATELEFT((x),17)) -#define P1(x) ((x) ^ ROTATELEFT((x),15) ^ ROTATELEFT((x),23)) +#define P0(x) ((x) ^ ROTATELEFT((x),9) ^ ROTATELEFT((x),17)) +#define P1(x) ((x) ^ ROTATELEFT((x),15) ^ ROTATELEFT((x),23)) -#define FF0(x,y,z) ( (x) ^ (y) ^ (z)) +#define FF0(x,y,z) ( (x) ^ (y) ^ (z)) #define FF1(x,y,z) (((x) & (y)) | ( (x) & (z)) | ( (y) & (z))) -#define GG0(x,y,z) ( (x) ^ (y) ^ (z)) +#define GG0(x,y,z) ( (x) ^ (y) ^ (z)) #define GG1(x,y,z) (((x) & (y)) | ( (~(x)) & (z)) ) @@ -146,7 +138,7 @@ void sm3_compress(uint32_t digest[8], const unsigned char block[64]) int j; uint32_t W[68], W1[64]; const uint32_t *pblock = (const uint32_t *)block; - + uint32_t A = digest[0]; uint32_t B = digest[1]; uint32_t C = digest[2]; @@ -170,7 +162,7 @@ void sm3_compress(uint32_t digest[8], const unsigned char block[64]) for(j =0; j < 16; j++) { T[j] = 0x79CC4519; - SS1 = ROTATELEFT((ROTATELEFT(A,12) + E + ROTATELEFT(T[j],j)), 7); + SS1 = ROTATELEFT((ROTATELEFT(A,12) + E + ROTATELEFT(T[j],j)), 7); SS2 = SS1 ^ ROTATELEFT(A,12); TT1 = FF0(A,B,C) + D + SS2 + W1[j]; TT2 = GG0(E,F,G) + H + SS1 + W[j]; @@ -187,7 +179,7 @@ void sm3_compress(uint32_t digest[8], const unsigned char block[64]) for(j =16; j < 64; j++) { T[j] = 0x7A879D8A; - SS1 = ROTATELEFT((ROTATELEFT(A,12) + E + ROTATELEFT(T[j],j)), 7); + SS1 = ROTATELEFT((ROTATELEFT(A,12) + E + ROTATELEFT(T[j],j)), 7); SS2 = SS1 ^ ROTATELEFT(A,12); TT1 = FF1(A,B,C) + D + SS2 + W1[j]; TT2 = GG1(E,F,G) + H + SS1 + W[j]; @@ -211,7 +203,8 @@ void sm3_compress(uint32_t digest[8], const unsigned char block[64]) digest[7] ^= H; } -void sm3(const unsigned char *msg, size_t msglen, unsigned char dgst[SM3_DIGEST_LENGTH]) +void sm3(const unsigned char *msg, size_t msglen, + unsigned char dgst[SM3_DIGEST_LENGTH]) { sm3_ctx_t ctx; diff --git a/crypto/sm3/sm3.h b/crypto/sm3/sm3.h index 68ccde55..d0ef4608 100644 --- a/crypto/sm3/sm3.h +++ b/crypto/sm3/sm3.h @@ -54,6 +54,7 @@ #define SM3_DIGEST_LENGTH 32 #define SM3_BLOCK_SIZE 64 +#define SM3_HMAC_SIZE (SM3_DIGEST_LENGTH) #include #include @@ -71,11 +72,24 @@ typedef struct { int num; } sm3_ctx_t; -int sm3_init(sm3_ctx_t *ctx); -int sm3_update(sm3_ctx_t *ctx, const unsigned char* data, size_t data_len); -int sm3_final(sm3_ctx_t *ctx, unsigned char digest[SM3_DIGEST_LENGTH]); +void sm3_init(sm3_ctx_t *ctx); +void sm3_update(sm3_ctx_t *ctx, const unsigned char* data, size_t data_len); +void sm3_final(sm3_ctx_t *ctx, unsigned char digest[SM3_DIGEST_LENGTH]); void sm3_compress(uint32_t digest[8], const unsigned char block[SM3_BLOCK_SIZE]); -void sm3(const unsigned char *data, size_t datalen, unsigned char digest[SM3_DIGEST_LENGTH]); +void sm3(const unsigned char *data, size_t datalen, + unsigned char digest[SM3_DIGEST_LENGTH]); + + +typedef struct { + sm3_ctx_t sm3_ctx; + unsigned char key[SM3_DIGEST_LENGTH]; +} sm3_hmac_ctx_t; + +void sm3_hmac_init(sm3_hmac_ctx_t *ctx, const unsigned char *key, size_t key_len); +void sm3_hmac_update(sm3_hmac_ctx_t *ctx, const unsigned char *data, size_t data_len); +void sm3_hmac_final(sm3_hmac_ctx_t *ctx, unsigned char mac[SM3_HMAC_SIZE]); +void sm3_hmac(const unsigned char *data, size_t data_len, + const unsigned char *key, size_t key_len, unsigned char mac[SM3_HMAC_SIZE]); #ifdef __cplusplus } diff --git a/crypto/sm3/sm3_hmac.c b/crypto/sm3/sm3_hmac.c new file mode 100644 index 00000000..eedb13a6 --- /dev/null +++ b/crypto/sm3/sm3_hmac.c @@ -0,0 +1,129 @@ +/* crypto/sm3/sm3_hmac.c */ +/* ==================================================================== + * Copyright (c) 2014 - 2015 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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 +#include +#include +#include + +/** + * HMAC_k(m) = H((k ^ opad), H((k ^ ipad), m)) + * pseudo-code: + * function hmac(key, message) + * opad = [0x5c * blocksize] + * ipad = [0x36 * blocksize] + * if (length(key) > blocksize) then + * key = hash(key) + * end if + * for i from 0 to length(key) - 1 step 1 + * ipad[i] = ipad[i] XOR key[i] + * opad[i] = opad[i] XOR key[i] + * end for + * return hash(opad || hash(ipad || message)) + * end function + */ + + +#define IPAD 0x36 +#define OPAD 0x5C + +void sm3_hmac_init(sm3_hmac_ctx_t *ctx, const unsigned char *key, size_t key_len) +{ + int i; + //unsigned char ipad[SM3_DIGEST_LENGTH]; + + if (key_len <= SM3_BLOCK_SIZE) { + memcpy(ctx->key, key, key_len); + memset(ctx->key + key_len, 0, SM3_BLOCK_SIZE - key_len); + } else { + sm3_init(&ctx->sm3_ctx); + sm3_update(&ctx->sm3_ctx, key, key_len); + sm3_final(&ctx->sm3_ctx, ctx->key); + memset(ctx->key + SM3_DIGEST_LENGTH, 0, + SM3_BLOCK_SIZE - SM3_DIGEST_LENGTH); + } + for (i = 0; i < SM3_BLOCK_SIZE; i++) { + ctx->key[i] ^= IPAD; + } + + sm3_init(&ctx->sm3_ctx); + sm3_update(&ctx->sm3_ctx, ctx->key, SM3_BLOCK_SIZE); +} + +void sm3_hmac_update(sm3_hmac_ctx_t *ctx, + const unsigned char *data, size_t data_len) +{ + sm3_update(&ctx->sm3_ctx, data, data_len); +} + +void sm3_hmac_final(sm3_hmac_ctx_t *ctx, unsigned char mac[SM3_HMAC_SIZE]) +{ + int i; + for (i = 0; i < SM3_BLOCK_SIZE; i++) { + ctx->key[i] ^= (IPAD ^ OPAD); + } + sm3_final(&ctx->sm3_ctx, mac); + sm3_init(&ctx->sm3_ctx); + sm3_update(&ctx->sm3_ctx, ctx->key, SM3_BLOCK_SIZE); + sm3_update(&ctx->sm3_ctx, mac, SM3_DIGEST_LENGTH); + sm3_final(&ctx->sm3_ctx, mac); +} + +void sm3_hmac(const unsigned char *data, size_t data_len, + const unsigned char *key, size_t key_len, + unsigned char mac[SM3_HMAC_SIZE]) +{ + sm3_hmac_ctx_t ctx; + sm3_hmac_init(&ctx, key, key_len); + sm3_hmac_update(&ctx, data, data_len); + sm3_hmac_final(&ctx, mac); + bzero(&ctx, sizeof(ctx)); +} + diff --git a/crypto/sm3/sm3dgst.c b/crypto/sm3/sm3dgst.c deleted file mode 100644 index a1f3063d..00000000 --- a/crypto/sm3/sm3dgst.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include -#include -#include -#include -#include "sm3.h" - -/* - * usage of sm3dgst: - * ./sm3dgst - * 324234234234235234234234234234 - * - * echo "hello world" | sm3dgst - * lksjdlfksdjlfkjsdlfkjsdlfkjsdljkfffffffldjfk= - * - */ - -int main(int argc, char **argv) -{ - sm3_ctx_t ctx; - unsigned char dgst[SM3_DIGEST_LENGTH]; - unsigned char buf[4096]; - ssize_t len; - int i; - - if (argc > 1) { - printf("usage: %s < file\n", basename(argv[0])); - return 0; - } - - sm3_init(&ctx); - - while ((len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) { - sm3_update(&ctx, buf, len); - } - memset(dgst, 0, sizeof(dgst)); - sm3_final(&ctx, dgst); - - for (i = 0; i < sizeof(dgst); i++) { - printf("%02x", dgst[i]); - } - printf("\n"); - - return 0; -} - diff --git a/crypto/sm3/sm3test.c b/crypto/sm3/sm3test.c index 242f4d41..5659f485 100644 --- a/crypto/sm3/sm3test.c +++ b/crypto/sm3/sm3test.c @@ -120,26 +120,4 @@ static char *pt(unsigned char *md) return (buf); } - - - -/* - - - - - - - - - - -*/ - - - - - - - #endif diff --git a/crypto/sm3/sm3test2.c b/crypto/sm3/sm3test2.c index 9350a70c..dafe0642 100644 --- a/crypto/sm3/sm3test2.c +++ b/crypto/sm3/sm3test2.c @@ -82,6 +82,65 @@ int sm3_test2() return 0; } +int hmac_sm3_test() +{ + int ret = 0; + int i, j; + unsigned char mac[HMAC_SM3_MAC_SIZE]; + hmac_sm3_ctx_t ctx; + + char *testarray[4] = { + "abc", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "a", + "01234567012345670123456701234567" + }; + int repeatcount[4] = { 1, 1, 1000000, 20 }; + unsigned char key[4] = { + "hello", + "world", + "23492304982304982340923480", + "a" + }; + unsigned char result[4][32] = { + {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0}, + {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0}, + {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0}, + {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0}, + }; + + for (i = 0; i < sizeof(testarray)/sizeof(testarray[0]); i++) { + hmac_sm3_init(&ctx, key[i], key_length[i]); + for (j = 0; j < repeatcount[i]; j++) { + hmac_sm3_update(&ctx, (const unsigned char *)testarray[i], + strlen(testarray[i])); + } + hmac_sm3_final(&ctx, mac); + if (memcmp(mac, &result[i][0], sizeof(mac)) != 0) { + fprintf(stderr, "hmac-sm3 test-%d failed\n", i); + ret = 1; + } + } + + if (ret == 0) { + printf("hmac-sm3 test success!\n"); + } + + return ret; +} + int main(int argc, char *argv[]) { if (sm3_test1()) diff --git a/crypto/sm9/Makefile b/crypto/sm9/Makefile index f671cb7c..a18f73d9 100644 --- a/crypto/sm9/Makefile +++ b/crypto/sm9/Makefile @@ -66,6 +66,8 @@ tests: lint: lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend + depend: @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) @@ -88,3 +90,12 @@ sm9_err.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h sm9_err.o: ../../include/openssl/safestack.h ../../include/openssl/sm9.h sm9_err.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h sm9_err.o: sm9_err.c +sm9_lib.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h +sm9_lib.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h +sm9_lib.o: ../../include/openssl/err.h ../../include/openssl/evp.h +sm9_lib.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h +sm9_lib.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h +sm9_lib.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h +sm9_lib.o: ../../include/openssl/safestack.h ../../include/openssl/sm9.h +sm9_lib.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h sm9.h +sm9_lib.o: sm9_lcl.h sm9_lib.c diff --git a/crypto/sm9/sm9_lib.c b/crypto/sm9/sm9_lib.c index affe8502..ff294c73 100644 --- a/crypto/sm9/sm9_lib.c +++ b/crypto/sm9/sm9_lib.c @@ -49,6 +49,7 @@ * */ +#include #include #include "sm9_lcl.h" @@ -104,7 +105,7 @@ int SM9_encrypt(SM9_PUBLIC_PARAMS *params, const char *id, size_t idlen) { SM9err(SM9_F_SM9_ENCRYPT, SM9_R_NOT_IMPLEMENTED); - return NULL; + return 0; } int SM9_decrypt(SM9_PUBLIC_PARAMS *params, diff --git a/crypto/sms4/Makefile b/crypto/sms4/Makefile index ea9209b6..edfed0f5 100644 --- a/crypto/sms4/Makefile +++ b/crypto/sms4/Makefile @@ -61,6 +61,8 @@ tests: lint: lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend + depend: @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/crypto/sms4/README.md b/crypto/sms4/README.md new file mode 100644 index 00000000..83678814 --- /dev/null +++ b/crypto/sms4/README.md @@ -0,0 +1,22 @@ +## SMS4 Sub-Library of GMSSL + +Encryption modes: + + * ECB: encrypt or decrypt a block, process only one block per call. + * CBC: process variable length input with zero padding, IV works as both input and output. + * CFB: same as CBC + * OFB: same as CBC + +Optimization for specific architecture: + + * AVX2: support ECB, CTR and CBC-decrypt (todo) + * KNC-NI: support ECB, CTR and CBC-decrypt (todo) + +Some future plans: + + * more operation modes, GCM, XTS, FFX, OFB ... + * more optimiazations: ARM/NEON, X86 ASM, GPU, ... + * secure implementation: Bit Slicing, Timing attack ... + * formally verified. + + diff --git a/crypto/sms4/sms4test.c b/crypto/sms4/sms4test.c index 28325b59..1734266b 100644 --- a/crypto/sms4/sms4test.c +++ b/crypto/sms4/sms4test.c @@ -48,10 +48,10 @@ int main(int argc, char **argv) goto end; } printf("sms4 key scheduling passed!\n"); - + /* test encrypt once */ sms4_encrypt(&key, plaintext, buf); - + if (memcmp(buf, ciphertext1, sizeof(ciphertext1)) != 0) { printf("sms4 encrypt not pass!\n"); goto end; @@ -70,7 +70,7 @@ int main(int argc, char **argv) } printf("sms4 encrypt 1000000 times pass!\n"); printf("sms4 all test vectors pass!\n"); - + return 0; end: printf("some test vector failed\n"); diff --git a/crypto/x509/x509.h b/crypto/x509/x509.h index 524325d1..912abd31 100644 --- a/crypto/x509/x509.h +++ b/crypto/x509/x509.h @@ -91,7 +91,7 @@ # include # endif -# ifndef OPENSSL_NO_SM2 +# ifndef NO_GMSSL # include # endif diff --git a/crypto/x509/x509type.c b/crypto/x509/x509type.c index 84e1f68f..9219f753 100644 --- a/crypto/x509/x509type.c +++ b/crypto/x509/x509type.c @@ -116,9 +116,6 @@ int X509_certificate_type(X509 *x, EVP_PKEY *pkey) case NID_X9_62_id_ecPublicKey: ret |= EVP_PKS_EC; break; -#ifndef OPENSSL_NO_SM2 - /* what to do ? */ -#endif default: break; } diff --git a/crypto/zuc/zuc.c b/crypto/zuc/zuc.c index 4b043e50..f7c6b293 100755 --- a/crypto/zuc/zuc.c +++ b/crypto/zuc/zuc.c @@ -1,250 +1,70 @@ -#include -#include "../modes/modes_lcl.h" -#include "zuc.h" +/* crypto/zuc/zuc.c */ +/* ==================================================================== + * Copyright (c) 2015 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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 file includes code written by YOU for the GmSSL project + */ +#include +#include - -static uint8_t S0[256] = { - 0x3e,0x72,0x5b,0x47,0xca,0xe0,0x00,0x33,0x04,0xd1,0x54,0x98,0x09,0xb9,0x6d,0xcb, - 0x7b,0x1b,0xf9,0x32,0xaf,0x9d,0x6a,0xa5,0xb8,0x2d,0xfc,0x1d,0x08,0x53,0x03,0x90, - 0x4d,0x4e,0x84,0x99,0xe4,0xce,0xd9,0x91,0xdd,0xb6,0x85,0x48,0x8b,0x29,0x6e,0xac, - 0xcd,0xc1,0xf8,0x1e,0x73,0x43,0x69,0xc6,0xb5,0xbd,0xfd,0x39,0x63,0x20,0xd4,0x38, - 0x76,0x7d,0xb2,0xa7,0xcf,0xed,0x57,0xc5,0xf3,0x2c,0xbb,0x14,0x21,0x06,0x55,0x9b, - 0xe3,0xef,0x5e,0x31,0x4f,0x7f,0x5a,0xa4,0x0d,0x82,0x51,0x49,0x5f,0xba,0x58,0x1c, - 0x4a,0x16,0xd5,0x17,0xa8,0x92,0x24,0x1f,0x8c,0xff,0xd8,0xae,0x2e,0x01,0xd3,0xad, - 0x3b,0x4b,0xda,0x46,0xeb,0xc9,0xde,0x9a,0x8f,0x87,0xd7,0x3a,0x80,0x6f,0x2f,0xc8, - 0xb1,0xb4,0x37,0xf7,0x0a,0x22,0x13,0x28,0x7c,0xcc,0x3c,0x89,0xc7,0xc3,0x96,0x56, - 0x07,0xbf,0x7e,0xf0,0x0b,0x2b,0x97,0x52,0x35,0x41,0x79,0x61,0xa6,0x4c,0x10,0xfe, - 0xbc,0x26,0x95,0x88,0x8a,0xb0,0xa3,0xfb,0xc0,0x18,0x94,0xf2,0xe1,0xe5,0xe9,0x5d, - 0xd0,0xdc,0x11,0x66,0x64,0x5c,0xec,0x59,0x42,0x75,0x12,0xf5,0x74,0x9c,0xaa,0x23, - 0x0e,0x86,0xab,0xbe,0x2a,0x02,0xe7,0x67,0xe6,0x44,0xa2,0x6c,0xc2,0x93,0x9f,0xf1, - 0xf6,0xfa,0x36,0xd2,0x50,0x68,0x9e,0x62,0x71,0x15,0x3d,0xd6,0x40,0xc4,0xe2,0x0f, - 0x8e,0x83,0x77,0x6b,0x25,0x05,0x3f,0x0c,0x30,0xea,0x70,0xb7,0xa1,0xe8,0xa9,0x65, - 0x8d,0x27,0x1a,0xdb,0x81,0xb3,0xa0,0xf4,0x45,0x7a,0x19,0xdf,0xee,0x78,0x34,0x60 -}; - -static uint8_t S1[256] = { - 0x55,0xc2,0x63,0x71,0x3b,0xc8,0x47,0x86,0x9f,0x3c,0xda,0x5b,0x29,0xaa,0xfd,0x77, - 0x8c,0xc5,0x94,0x0c,0xa6,0x1a,0x13,0x00,0xe3,0xa8,0x16,0x72,0x40,0xf9,0xf8,0x42, - 0x44,0x26,0x68,0x96,0x81,0xd9,0x45,0x3e,0x10,0x76,0xc6,0xa7,0x8b,0x39,0x43,0xe1, - 0x3a,0xb5,0x56,0x2a,0xc0,0x6d,0xb3,0x05,0x22,0x66,0xbf,0xdc,0x0b,0xfa,0x62,0x48, - 0xdd,0x20,0x11,0x06,0x36,0xc9,0xc1,0xcf,0xf6,0x27,0x52,0xbb,0x69,0xf5,0xd4,0x87, - 0x7f,0x84,0x4c,0xd2,0x9c,0x57,0xa4,0xbc,0x4f,0x9a,0xdf,0xfe,0xd6,0x8d,0x7a,0xeb, - 0x2b,0x53,0xd8,0x5c,0xa1,0x14,0x17,0xfb,0x23,0xd5,0x7d,0x30,0x67,0x73,0x08,0x09, - 0xee,0xb7,0x70,0x3f,0x61,0xb2,0x19,0x8e,0x4e,0xe5,0x4b,0x93,0x8f,0x5d,0xdb,0xa9, - 0xad,0xf1,0xae,0x2e,0xcb,0x0d,0xfc,0xf4,0x2d,0x46,0x6e,0x1d,0x97,0xe8,0xd1,0xe9, - 0x4d,0x37,0xa5,0x75,0x5e,0x83,0x9e,0xab,0x82,0x9d,0xb9,0x1c,0xe0,0xcd,0x49,0x89, - 0x01,0xb6,0xbd,0x58,0x24,0xa2,0x5f,0x38,0x78,0x99,0x15,0x90,0x50,0xb8,0x95,0xe4, - 0xd0,0x91,0xc7,0xce,0xed,0x0f,0xb4,0x6f,0xa0,0xcc,0xf0,0x02,0x4a,0x79,0xc3,0xde, - 0xa3,0xef,0xea,0x51,0xe6,0x6b,0x18,0xec,0x1b,0x2c,0x80,0xf7,0x74,0xe7,0xff,0x21, - 0x5a,0x6a,0x54,0x1e,0x41,0x31,0x92,0x35,0xc4,0x33,0x07,0x0a,0xba,0x7e,0x0e,0x34, - 0x88,0xb1,0x98,0x7c,0xf3,0x3d,0x60,0x6c,0x7b,0xca,0xd3,0x1f,0x32,0x65,0x04,0x28, - 0x64,0xbe,0x85,0x9b,0x2f,0x59,0x8a,0xd7,0xb0,0x25,0xac,0xaf,0x12,0x03,0xe2,0xf2 -}; - -static uint32_t EK_d[16] = { - 0x44D7, 0x26BC, 0x626B, 0x135E, 0x5789, 0x35E2, 0x7135, 0x09AF, - 0x4D78, 0x2F13, 0x6BC4, 0x1AF1, 0x5E26, 0x3C4D, 0x789A, 0x47AC -}; - -static inline uint32_t AddM(uint32_t a, uint32_t b) +void zuc_set_key(zuc_key_t *key, const unsigned char *user_key, const unsigned char *iv) { - uint32_t c = a + b; - return (c & 0x7FFFFFFF) + (c >> 31); } -#define MulByPow2(x, k) ((((x) << k) | ((x) >> (31 - k))) & 0x7FFFFFFF) - -static void LFSRWithInitialisationMode(ZUC_KEY *key, uint32_t u) +void zuc_generate_keystream(zuc_key_t *key, size_t nwords, uint32_t *words) { - uint32_t f, v; - f = key->LFSR_S0; - - v = MulByPow2(key->LFSR_S0, 8); - f = AddM(f, v); - v = MulByPow2(key->LFSR_S4, 20); - f = AddM(f, v); - v = MulByPow2(key->LFSR_S10, 21); - f = AddM(f, v); - v = MulByPow2(key->LFSR_S13, 17); - f = AddM(f, v); - v = MulByPow2(key->LFSR_S15, 15); - f = AddM(f, v); - - f = AddM(f, u); - - /* update the state */ - key->LFSR_S0 = key->LFSR_S1; - key->LFSR_S1 = key->LFSR_S2; - key->LFSR_S2 = key->LFSR_S3; - key->LFSR_S3 = key->LFSR_S4; - key->LFSR_S4 = key->LFSR_S5; - key->LFSR_S5 = key->LFSR_S6; - key->LFSR_S6 = key->LFSR_S7; - key->LFSR_S7 = key->LFSR_S8; - key->LFSR_S8 = key->LFSR_S9; - key->LFSR_S9 = key->LFSR_S10; - key->LFSR_S10 = key->LFSR_S11; - key->LFSR_S11 = key->LFSR_S12; - key->LFSR_S12 = key->LFSR_S13; - key->LFSR_S13 = key->LFSR_S14; - key->LFSR_S14 = key->LFSR_S15; - key->LFSR_S15 = f; } -/* LFSR with work mode */ -static void LFSRWithWorkMode(ZUC_KEY *key) +void zuc_encrypt(zuc_key_t *key, size_t len, const unsigned char *in, unsigned char *out) { - uint32_t f, v; - f = key->LFSR_S0; - - v = MulByPow2(key->LFSR_S0, 8); - f = AddM(f, v); - v = MulByPow2(key->LFSR_S4, 20); - f = AddM(f, v); - v = MulByPow2(key->LFSR_S10, 21); - f = AddM(f, v); - v = MulByPow2(key->LFSR_S13, 17); - f = AddM(f, v); - v = MulByPow2(key->LFSR_S15, 15); - f = AddM(f, v); - - /* update the state */ - key->LFSR_S0 = key->LFSR_S1; - key->LFSR_S1 = key->LFSR_S2; - key->LFSR_S2 = key->LFSR_S3; - key->LFSR_S3 = key->LFSR_S4; - key->LFSR_S4 = key->LFSR_S5; - key->LFSR_S5 = key->LFSR_S6; - key->LFSR_S6 = key->LFSR_S7; - key->LFSR_S7 = key->LFSR_S8; - key->LFSR_S8 = key->LFSR_S9; - key->LFSR_S9 = key->LFSR_S10; - key->LFSR_S10 = key->LFSR_S11; - key->LFSR_S11 = key->LFSR_S12; - key->LFSR_S12 = key->LFSR_S13; - key->LFSR_S13 = key->LFSR_S14; - key->LFSR_S14 = key->LFSR_S15; - key->LFSR_S15 = f; + memcpy(out, in, len); } -/* BitReorganization */ -static inline void BitReorganization(ZUC_KEY *key) -{ - key->BRC_X0 = ((key->LFSR_S15 & 0x7FFF8000) << 1) | (key->LFSR_S14 & 0xFFFF); - key->BRC_X1 = ((key->LFSR_S11 & 0xFFFF) << 16) | (key->LFSR_S9 >> 15); - key->BRC_X2 = ((key->LFSR_S7 & 0xFFFF) << 16) | (key->LFSR_S5 >> 15); - key->BRC_X3 = ((key->LFSR_S2 & 0xFFFF) << 16) | (key->LFSR_S0 >> 15); -} - -#define ROT(a, k) (((a) << k) | ((a) >> (32 - k))) - -static inline uint32_t L1(uint32_t X) -{ - return (X ^ ROT(X, 2) ^ ROT(X, 10) ^ ROT(X, 18) ^ ROT(X, 24)); -} - -static inline uint32_t L2(uint32_t X) -{ - return (X ^ ROT(X, 8) ^ ROT(X, 14) ^ ROT(X, 22) ^ ROT(X, 30)); -} - -#define MAKEuint32_t(a, b, c, d) (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | ((uint32_t)(d))) - -static uint32_t F(ZUC_KEY *key) -{ - uint32_t W, W1, W2, u, v; - - W = (key->BRC_X0 ^ key->F_R1) + key->F_R2; - W1 = key->F_R1 + key->BRC_X1; - W2 = key->F_R2 ^ key->BRC_X2; - - u = L1((W1 << 16) | (W2 >> 16)); - v = L2((W2 << 16) | (W1 >> 16)); - - key->F_R1 = MAKEuint32_t(S0[u >> 24], S1[(u >> 16) & 0xFF], S0[(u >> 8) & 0xFF], S1[u & 0xFF]); - key->F_R2 = MAKEuint32_t(S0[v >> 24], S1[(v >> 16) & 0xFF], S0[(v >> 8) & 0xFF], S1[v & 0xFF]); - - return W; -} - -#define MAKEU31(a, b, c) (((uint32_t)(a) << 23) | ((uint32_t)(b) << 8) | (uint32_t)(c)) - -void ZUC_set_key(ZUC_KEY *key, const unsigned char *k, const unsigned char *iv) -{ - uint32_t w, nCount; - - key->LFSR_S0 = MAKEU31(k[0], EK_d[0], iv[0]); - key->LFSR_S1 = MAKEU31(k[1], EK_d[1], iv[1]); - key->LFSR_S2 = MAKEU31(k[2], EK_d[2], iv[2]); - key->LFSR_S3 = MAKEU31(k[3], EK_d[3], iv[3]); - key->LFSR_S4 = MAKEU31(k[4], EK_d[4], iv[4]); - key->LFSR_S5 = MAKEU31(k[5], EK_d[5], iv[5]); - key->LFSR_S6 = MAKEU31(k[6], EK_d[6], iv[6]); - key->LFSR_S7 = MAKEU31(k[7], EK_d[7], iv[7]); - key->LFSR_S8 = MAKEU31(k[8], EK_d[8], iv[8]); - key->LFSR_S9 = MAKEU31(k[9], EK_d[9], iv[9]); - key->LFSR_S10 = MAKEU31(k[10], EK_d[10], iv[10]); - key->LFSR_S11 = MAKEU31(k[11], EK_d[11], iv[11]); - key->LFSR_S12 = MAKEU31(k[12], EK_d[12], iv[12]); - key->LFSR_S13 = MAKEU31(k[13], EK_d[13], iv[13]); - key->LFSR_S14 = MAKEU31(k[14], EK_d[14], iv[14]); - key->LFSR_S15 = MAKEU31(k[15], EK_d[15], iv[15]); - - key->F_R1 = 0; - key->F_R2 = 0; - nCount = 32; - - while (nCount > 0) { - BitReorganization(key); - w = F(key); - LFSRWithInitialisationMode(key, w >> 1); - nCount--; - } - - BitReorganization(key); - F(key); - LFSRWithWorkMode(key); - -} - -void ZUC_encrypt(ZUC_KEY *key, size_t inlen, const unsigned char *in, unsigned char *out) -{ -#if 0 - uint32_t word; - int n = key->buf_index; - - assert(n < 4); - - while (n && inlen) { - *(out++) = *(in++) ^ key->buf[n]; - n = (n + 1) % 4; - inlen--; - } - - while (inlen >= 4) { - BitReorganization(key); - word = GETU32(in); - word ^= F(key) ^ key->BRC_X3; - PUTU32(out, word); - LFSRWithWorkMode(key); - inlen -= 4; - in += 4; - out += 4; - } - - if (inlen) { - BitReorganization(key); - word = F(key) ^ key->BRC_X3; - LFSRWithWorkMode(key); - PUTU32(key->buf, word); - while (inlen-- > 0) { - out[n] = in[n] ^ key->buf[n]; - n++; - } - } - - key->buf_index = n; - return; -#endif -} diff --git a/crypto/zuc/zuc.h b/crypto/zuc/zuc.h index 7e00a85f..ead0ca89 100755 --- a/crypto/zuc/zuc.h +++ b/crypto/zuc/zuc.h @@ -1,3 +1,54 @@ +/* crypto/zuc/zuc.h */ +/* ==================================================================== + * Copyright (c) 2015 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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. + * ==================================================================== + * + */ + #ifndef HEADER_ZUC_H #define HEADER_ZUC_H @@ -10,43 +61,32 @@ extern "C" { typedef struct { - uint32_t LFSR_S0; - uint32_t LFSR_S1; - uint32_t LFSR_S2; - uint32_t LFSR_S3; - uint32_t LFSR_S4; - uint32_t LFSR_S5; - uint32_t LFSR_S6; - uint32_t LFSR_S7; - uint32_t LFSR_S8; - uint32_t LFSR_S9; - uint32_t LFSR_S10; - uint32_t LFSR_S11; - uint32_t LFSR_S12; - uint32_t LFSR_S13; - uint32_t LFSR_S14; - uint32_t LFSR_S15; - - /* the registers of F */ - uint32_t F_R1; - uint32_t F_R2; - - /* the outputs of BitReorganization */ - uint32_t BRC_X0; - uint32_t BRC_X1; - uint32_t BRC_X2; - uint32_t BRC_X3; - - /* word buffer */ - unsigned char buf[4]; - int buf_index; -} ZUC_KEY; + unsigned char zuc_state[100]; /* change what you like */ + unsigned char word_buf[4]; +} zuc_key_t; -void ZUC_set_key(ZUC_KEY *key, const unsigned char *k, const unsigned char *iv); -void ZUC_encrypt(ZUC_KEY *key, size_t inlen, const unsigned char *in, unsigned char *out); +void zuc_set_key(zuc_key_t *key, const unsigned char *user_key, const unsigned char *iv); +void zuc_generate_keystream(zuc_key_t *key, size_t nwords, uint32_t *words); +void zuc_encrypt(zuc_key_t *key, size_t len, const unsigned char *in, unsigned char *out); +#define EEA3_MIN_BITS 1 +#define EEA3_MAX_BITS 65504 + + +/* 128-EEA3 + * Input: + * count - the counter + * bearer - the bearer ientity 5-bit + * direction - 0 or 1 + * nbits - the length of input message, in [1, 65504] + */ +#if 0 +void eea3_set_key(zuc_key_t *key, const unsigned char *user_key, + uint32_t count, uint32_t bearer, uint32_t direction); +void eea3_encrypt(zuc_key_t *key, size_t len, const unsigned char *in, unsigned char *out); +#endif #ifdef __cplusplus } diff --git a/crypto/zuc/zuctest.c b/crypto/zuc/zuctest.c index b28b04f6..5c7ef752 100755 --- a/crypto/zuc/zuctest.c +++ b/crypto/zuc/zuctest.c @@ -1,3 +1,512 @@ +/* crypto/zuc/zuctest.c */ +/* ==================================================================== + * Copyright (c) 2015 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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 +#include +#include +#include +#include "../../e_os.h" +typedef struct { + uint32_t *words; + size_t nwords; +} test_words_t; +/* The following test suites are from + * + * ETSI/SAGE Specification + * Specification of the 3GPP Confidentiality and Integrity Algorithms + * 128-EEA3 & 128-EIA3 + * Document 3: Implementor's Test Data + * Version 1.1 Date: Jan. 4, 2011 + * + * NOTE: eea3_test_count[1] might be error + */ + + +/* ZUC Test Suits */ + +static unsigned char zuc_test_key[][16] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x3d, 0x4c, 0x4b, 0xe9, 0x6a, 0x82, 0xfd, 0xae, + 0xb5, 0x8f, 0x64, 0x1d, 0xb1, 0x7b, 0x45, 0x5b}, + {0x4d, 0x32, 0x0b, 0xfa, 0xd4, 0xc2, 0x85, 0xbf, + 0xd6, 0xb8, 0xbd, 0x00, 0xf3, 0x9d, 0x8b, 0x41}, +}; + +static unsigned char zuc_test_iv[][16] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x84, 0x31, 0x9a, 0xa8, 0xde, 0x69, 0x15, 0xca, + 0x1f, 0x6b, 0xda, 0x6b, 0xfb, 0xd8, 0xc7, 0x66}, + {0x52, 0x95, 0x9d, 0xab, 0xa0, 0xbf, 0x17, 0x6e, + 0xce, 0x2d, 0xc3, 0x15, 0x04, 0x9e, 0xb5, 0x74}, +}; + +static uint32_t zuc_test_words[][2] = { + {0x27bede74, 0x018082da}, + {0x0657cfa0, 0x7096398b}, + {0x14f1c272, 0x3279c419}, + {0xed4400e7, 0x0633e5c5}, +}; + +static uint32_t zuc_test4_word1999 = 0x7a574cdb; + + +/* 128-EEA3 Test Suites */ + +static unsigned char eea3_test_key[][16] = { + {0x17, 0x3d, 0x14, 0xba, 0x50, 0x03, 0x73, 0x1d, + 0x7a, 0x60, 0x04, 0x94, 0x70, 0xf0, 0x0a, 0x29}, + {0xe5, 0xbd, 0x3e, 0xa0, 0xeb, 0x55, 0xad, 0xe8, + 0x66, 0xc6, 0xac, 0x58, 0xbd, 0x54, 0x30, 0x2a}, + {0xd4, 0x55, 0x2a, 0x8f, 0xd6, 0xe6, 0x1c, 0xc8, + 0x1a, 0x20, 0x09, 0x14, 0x1a, 0x29, 0xc1, 0x0b}, + {0xdb, 0x84, 0xb4, 0xfb, 0xcc, 0xda, 0x56, 0x3b, + 0x66, 0x22, 0x7b, 0xfe, 0x45, 0x6f, 0x0f, 0x77}, + {0xe1, 0x3f, 0xed, 0x21, 0xb4, 0x6e, 0x4e, 0x7e, + 0xc3, 0x12, 0x53, 0xb2, 0xbb, 0x17, 0xb3, 0xe0}, +}; + +static uint32_t eea3_test_count[] = { + 0x66035492, /* XXX: ? */0x56823, 0x76452ec1, 0xe4850fe1, + 0x2738cdaa, +}; + +static uint8_t eea3_test_bearer[] = { + 0x0f, 0x18, 0x02, 0x10, 0x1a, +}; + +static int eea3_test_direction[] = { + 0, 1, 1, 1 , 0, +}; + +static int eea3_test_nbits[] = { + 193, 800, 1570, 2798, 4019, +}; + +static uint32_t eea3_test1_plaintext[] = { + 0x6cf65340, 0x735552ab, 0x0c9752fa, 0x6f9025fe, + 0x0bd675d9, 0x005875b2, 0x00000000, +}; + +static uint32_t eea3_test1_ciphertext[] = { + 0xa6c85fc6, 0x6afb8533, 0xaafc2518, 0xdfe78494, + 0x0ee1e4b0, 0x30238cc8, 0x00000000, +}; + +static uint32_t eea3_test2_plaintext[] = { + 0x14a8ef69, 0x3d678507, 0xbbe7270a, 0x7f67ff50, + 0x06c3525b, 0x9807e467, 0xc4e56000, 0xba338f5d, + 0x42955903, 0x67518222, 0x46c80d3b, 0x38f07f4b, + 0xe2d8ff58, 0x05f51322, 0x29bde93b, 0xbbdcaf38, + 0x2bf1ee97, 0x2fbf9977, 0xbada8945, 0x847a2a6c, + 0x9ad34a66, 0x7554e04d, 0x1f7fa2c3, 0x3241bd8f, + 0x01ba220d, +}; + +static uint32_t eea3_test2_ciphertext[] = { + 0x131d43e0, 0xdea1be5c, 0x5a1bfd97, 0x1d852cbf, + 0x712d7b4f, 0x57961fea, 0x3208afa8, 0xbca433f4, + 0x56ad09c7, 0x417e58bc, 0x69cf8866, 0xd1353f74, + 0x865e8078, 0x1d202dfb, 0x3ecff7fc, 0xbc3b190f, + 0xe82a204e, 0xd0e350fc, 0x0f6f2613, 0xb2f2bca6, + 0xdf5a473a, 0x57a4a00d, 0x985ebad8, 0x80d6f238, + 0x64a07b01, +}; + +static uint32_t eea3_test3_plaintext[] = { + 0x38f07f4b, 0xe2d8ff58, 0x05f51322, 0x29bde93b, + 0xbbdcaf38, 0x2bf1ee97, 0x2fbf9977, 0xbada8945, + 0x847a2a6c, 0x9ad34a66, 0x7554e04d, 0x1f7fa2c3, + 0x3241bd8f, 0x01ba220d, 0x3ca4ec41, 0xe074595f, + 0x54ae2b45, 0x4fd97143, 0x20436019, 0x65cca85c, + 0x2417ed6c, 0xbec3bada, 0x84fc8a57, 0x9aea7837, + 0xb0271177, 0x242a64dc, 0x0a9de71a, 0x8edee86c, + 0xa3d47d03, 0x3d6bf539, 0x804eca86, 0xc584a905, + 0x2de46ad3, 0xfced6554, 0x3bd90207, 0x372b27af, + 0xb79234f5, 0xff43ea87, 0x0820e2c2, 0xb78a8aae, + 0x61cce52a, 0x0515e348, 0xd196664a, 0x3456b182, + 0xa07c406e, 0x4a207912, 0x71cfeda1, 0x65d535ec, + 0x5ea2d4df, 0x40000000, +}; + +static uint32_t eea3_test3_ciphertext[] = { + 0x8383b022, 0x9fcc0b9d, 0x2295ec41, 0xc977e9c2, + 0xbb72e220, 0x378141f9, 0xc8318f3a, 0x270dfbcd, + 0xee6411c2, 0xb3044f17, 0x6dc6e00f, 0x8960f97a, + 0xfacd131a, 0xd6a3b49b, 0x16b7babc, 0xf2a509eb, + 0xb16a75dc, 0xab14ff27, 0x5dbeeea1, 0xa2b155f9, + 0xd52c2645, 0x2d0187c3, 0x10a4ee55, 0xbeaa78ab, + 0x4024615b, 0xa9f5d5ad, 0xc7728f73, 0x560671f0, + 0x13e5e550, 0x085d3291, 0xdf7d5fec, 0xedded559, + 0x641b6c2f, 0x585233bc, 0x71e9602b, 0xd2305855, + 0xbbd25ffa, 0x7f17ecbc, 0x042daae3, 0x8c1f57ad, + 0x8e8ebd37, 0x346f71be, 0xfdbb7432, 0xe0e0bb2c, + 0xfc09bcd9, 0x6570cb0c, 0x0c39df5e, 0x29294e82, + 0x703a637f, 0x80000000, +}; + +static uint32_t eea3_test4_plaintext[] = { + 0xe539f3b8, 0x973240da, 0x03f2b8aa, 0x05ee0a00, + 0xdbafc0e1, 0x82055dfe, 0x3d7383d9, 0x2cef40e9, + 0x2928605d, 0x52d05f4f, 0x9018a1f1, 0x89ae3997, + 0xce19155f, 0xb1221db8, 0xbb0951a8, 0x53ad852c, + 0xe16cff07, 0x382c93a1, 0x57de00dd, 0xb125c753, + 0x9fd85045, 0xe4ee07e0, 0xc43f9e9d, 0x6f414fc4, + 0xd1c62917, 0x813f74c0, 0x0fc83f3e, 0x2ed7c45b, + 0xa5835264, 0xb43e0b20, 0xafda6b30, 0x53bfb642, + 0x3b7fce25, 0x479ff5f1, 0x39dd9b5b, 0x995558e2, + 0xa56be18d, 0xd581cd01, 0x7c735e6f, 0x0d0d97c4, + 0xddc1d1da, 0x70c6db4a, 0x12cc9277, 0x8e2fbbd6, + 0xf3ba52af, 0x91c9c6b6, 0x4e8da4f7, 0xa2c266d0, + 0x2d001753, 0xdf089603, 0x93c5d568, 0x88bf49eb, + 0x5c16d9a8, 0x0427a416, 0xbcb597df, 0x5bfe6f13, + 0x890a07ee, 0x1340e647, 0x6b0d9aa8, 0xf822ab0f, + 0xd1ab0d20, 0x4f40b7ce, 0x6f2e136e, 0xb67485e5, + 0x07804d50, 0x4588ad37, 0xffd81656, 0x8b2dc403, + 0x11dfb654, 0xcdead47e, 0x2385c343, 0x6203dd83, + 0x6f9c64d9, 0x7462ad5d, 0xfa63b5cf, 0xe08acb95, + 0x32866f5c, 0xa787566f, 0xca93e6b1, 0x693ee15c, + 0xf6f7a2d6, 0x89d97417, 0x98dc1c23, 0x8e1be650, + 0x733b18fb, 0x34ff880e, 0x16bbd21b, 0x47ac0000, +}; + +static uint32_t eea3_test4_ciphertext[] = { + 0x4bbfa91b, 0xa25d47db, 0x9a9f190d, 0x962a19ab, + 0x323926b3, 0x51fbd39e, 0x351e05da, 0x8b8925e3, + 0x0b1cce0d, 0x12211010, 0x95815cc7, 0xcb631950, + 0x9ec0d679, 0x40491987, 0xe13f0aff, 0xac332aa6, + 0xaa64626d, 0x3e9a1917, 0x519e0b97, 0xb655c6a1, + 0x65e44ca9, 0xfeac0790, 0xd2a321ad, 0x3d86b79c, + 0x5138739f, 0xa38d887e, 0xc7def449, 0xce8abdd3, + 0xe7f8dc4c, 0xa9e7b733, 0x14ad310f, 0x9025e619, + 0x46b3a56d, 0xc649ec0d, 0xa0d63943, 0xdff592cf, + 0x962a7efb, 0x2c8524e3, 0x5a2a6e78, 0x79d62604, + 0xef268695, 0xfa400302, 0x7e22e608, 0x30775220, + 0x64bd4a5b, 0x906b5f53, 0x1274f235, 0xed506cff, + 0x0154c754, 0x928a0ce5, 0x476f2cb1, 0x020a1222, + 0xd32c1455, 0xecaef1e3, 0x68fb344d, 0x1735bfbe, + 0xdeb71d0a, 0x33a2a54b, 0x1da5a294, 0xe679144d, + 0xdf11eb1a, 0x3de8cf0c, 0xc0619179, 0x74f35c1d, + 0x9ca0ac81, 0x807f8fcc, 0xe6199a6c, 0x7712da86, + 0x5021b04c, 0xe0439516, 0xf1a526cc, 0xda9fd9ab, + 0xbd53c3a6, 0x84f9ae1e, 0x7ee6b11d, 0xa138ea82, + 0x6c5516b5, 0xaadf1abb, 0xe36fa7ff, 0xf92e3a11, + 0x76064e8d, 0x95f2e488, 0x2b5500b9, 0x3228b219, + 0x4a475c1a, 0x27f63f9f, 0xfd264989, 0xa1bc0000, +}; + +static uint32_t eea3_test5_plaintext[] = { + 0x8d74e20d, 0x54894e06, 0xd3cb13cb, 0x3933065e, + 0x8674be62, 0xadb1c72b, 0x3a646965, 0xab63cb7b, + 0x7854dfdc, 0x27e84929, 0xf49c64b8, 0x72a490b1, + 0x3f957b64, 0x827e71f4, 0x1fbd4269, 0xa42c97f8, + 0x24537027, 0xf86e9f4a, 0xd82d1df4, 0x51690fdd, + 0x98b6d03f, 0x3a0ebe3a, 0x312d6b84, 0x0ba5a182, + 0x0b2a2c97, 0x09c090d2, 0x45ed267c, 0xf845ae41, + 0xfa975d33, 0x33ac3009, 0xfd40eba9, 0xeb5b8857, + 0x14b768b6, 0x97138baf, 0x21380eca, 0x49f644d4, + 0x8689e421, 0x5760b906, 0x739f0d2b, 0x3f091133, + 0xca15d981, 0xcbe401ba, 0xf72d05ac, 0xe05cccb2, + 0xd297f4ef, 0x6a5f58d9, 0x1246cfa7, 0x7215b892, + 0xab441d52, 0x78452795, 0xccb7f5d7, 0x9057a1c4, + 0xf77f80d4, 0x6db2033c, 0xb79bedf8, 0xe60551ce, + 0x10c667f6, 0x2a97abaf, 0xabbcd677, 0x2018df96, + 0xa282ea73, 0x7ce2cb33, 0x1211f60d, 0x5354ce78, + 0xf9918d9c, 0x206ca042, 0xc9b62387, 0xdd709604, + 0xa50af16d, 0x8d35a890, 0x6be484cf, 0x2e74a928, + 0x99403643, 0x53249b27, 0xb4c9ae29, 0xeddfc7da, + 0x6418791a, 0x4e7baa06, 0x60fa6451, 0x1f2d685c, + 0xc3a5ff70, 0xe0d2b742, 0x92e3b8a0, 0xcd6b04b1, + 0xc790b8ea, 0xd2703708, 0x540dea2f, 0xc09c3da7, + 0x70f65449, 0xe84d817a, 0x4f551055, 0xe19ab850, + 0x18a0028b, 0x71a144d9, 0x6791e9a3, 0x57793350, + 0x4eee0060, 0x340c69d2, 0x74e1bf9d, 0x805dcbcc, + 0x1a6faa97, 0x6800b6ff, 0x2b671dc4, 0x63652fa8, + 0xa33ee509, 0x74c1c21b, 0xe01eabb2, 0x16743026, + 0x9d72ee51, 0x1c9dde30, 0x797c9a25, 0xd86ce74f, + 0x5b961be5, 0xfdfb6807, 0x814039e7, 0x137636bd, + 0x1d7fa9e0, 0x9efd2007, 0x505906a5, 0xac45dfde, + 0xed7757bb, 0xee745749, 0xc2963335, 0x0bee0ea6, + 0xf409df45, 0x80160000, +}; + +static uint32_t eea3_test5_ciphertext[] = { + 0x94eaa4aa, 0x30a57137, 0xddf09b97, 0xb25618a2, + 0x0a13e2f1, 0x0fa5bf81, 0x61a879cc, 0x2ae797a6, + 0xb4cf2d9d, 0xf31debb9, 0x905ccfec, 0x97de605d, + 0x21c61ab8, 0x531b7f3c, 0x9da5f039, 0x31f8a064, + 0x2de48211, 0xf5f52ffe, 0xa10f392a, 0x04766998, + 0x5da454a2, 0x8f080961, 0xa6c2b62d, 0xaa17f33c, + 0xd60a4971, 0xf48d2d90, 0x9394a55f, 0x48117ace, + 0x43d708e6, 0xb77d3dc4, 0x6d8bc017, 0xd4d1abb7, + 0x7b7428c0, 0x42b06f2f, 0x99d8d07c, 0x9879d996, + 0x00127a31, 0x985f1099, 0xbbd7d6c1, 0x519ede8f, + 0x5eeb4a61, 0x0b349ac0, 0x1ea23506, 0x91756bd1, + 0x05c974a5, 0x3eddb35d, 0x1d4100b0, 0x12e522ab, + 0x41f4c5f2, 0xfde76b59, 0xcb8b96d8, 0x85cfe408, + 0x0d1328a0, 0xd636cc0e, 0xdc05800b, 0x76acca8f, + 0xef672084, 0xd1f52a8b, 0xbd8e0993, 0x320992c7, + 0xffbae17c, 0x408441e0, 0xee883fc8, 0xa8b05e22, + 0xf5ff7f8d, 0x1b48c74c, 0x468c467a, 0x028f09fd, + 0x7ce91109, 0xa570a2d5, 0xc4d5f4fa, 0x18c5dd3e, + 0x4562afe2, 0x4ef77190, 0x1f59af64, 0x5898acef, + 0x088abae0, 0x7e92d52e, 0xb2de5504, 0x5bb1b7c4, + 0x164ef2d7, 0xa6cac15e, 0xeb926d7e, 0xa2f08b66, + 0xe1f759f3, 0xaee44614, 0x725aa3c7, 0x482b3084, + 0x4c143ff8, 0x5b53f1e5, 0x83c50125, 0x7dddd096, + 0xb81268da, 0xa303f172, 0x34c23335, 0x41f0bb8e, + 0x190648c5, 0x807c866d, 0x71932286, 0x09adb948, + 0x686f7de2, 0x94a802cc, 0x38f7fe52, 0x08f5ea31, + 0x96d0167b, 0x9bdd02f0, 0xd2a5221c, 0xa508f893, + 0xaf5c4b4b, 0xb9f4f520, 0xfd84289b, 0x3dbe7e61, + 0x497a7e2a, 0x584037ea, 0x637b6981, 0x127174af, + 0x57b471df, 0x4b2768fd, 0x79c1540f, 0xb3edf2ea, + 0x22cb69be, 0xc0cf8d93, 0x3d9c6fdd, 0x645e8505, + 0x91cca3d6, 0x2c0cc000, +}; + +static test_words_t eea3_test_plaintext[] = { + {eea3_test1_plaintext, sizeof(eea3_test1_plaintext)/4}, + {eea3_test2_plaintext, sizeof(eea3_test2_plaintext)/4}, + {eea3_test3_plaintext, sizeof(eea3_test3_plaintext)/4}, + {eea3_test4_plaintext, sizeof(eea3_test4_plaintext)/4}, + {eea3_test5_plaintext, sizeof(eea3_test5_plaintext)/4}, +}; + +static test_words_t eea3_test_ciphertext[] = { + {eea3_test1_ciphertext, sizeof(eea3_test1_ciphertext)/4}, + {eea3_test2_ciphertext, sizeof(eea3_test2_ciphertext)/4}, + {eea3_test3_ciphertext, sizeof(eea3_test3_ciphertext)/4}, + {eea3_test4_ciphertext, sizeof(eea3_test4_ciphertext)/4}, + {eea3_test5_ciphertext, sizeof(eea3_test5_ciphertext)/4}, +}; + + +/* 128-EIA3 Test Suites */ + +static unsigned char eia3_test_key[][16] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x47, 0x05, 0x41, 0x25, 0x56, 0x1e, 0xb2, 0xdd, + 0xa9, 0x40, 0x59, 0xda, 0x05, 0x09, 0x78, 0x50}, + {0xc9, 0xe6, 0xce, 0xc4, 0x60, 0x7c, 0x72, 0xdb, + 0x00, 0x0a, 0xef, 0xa8, 0x83, 0x85, 0xab, 0x0a}, + {0xc8, 0xa4, 0x82, 0x62, 0xd0, 0xc2, 0xe2, 0xba, + 0xc4, 0xb9, 0x6e, 0xf7, 0x7e, 0x80, 0xca, 0x59}, + {0x6b, 0x8b, 0x08, 0xee, 0x79, 0xe0, 0xb5, 0x98, + 0x2d, 0x6d, 0x12, 0x8e, 0xa9, 0xf2, 0x20, 0xcb}, +}; + +static uint32_t eia3_test_count[] = { + 0x00000000, 0x561eb2dd, 0xa94059da, 0x05097850, + 0x561eb2dd, +}; + +static uint8_t eia3_test_bearer[] = { + 0x00, 0x14, 0x0a, 0x10, 0x1c, +}; + +static int eia3_test_direction[] = { + 0, 0, 1, 1, 0, +}; + +static int eia3_test_nbits[] = { + 1, 90, 577, 2079, 5670, +}; + +static uint32_t eia3_test1_msg[] = { + 0x00000000, +}; + +static uint32_t eia3_test2_msg[] = { + 0x00000000, 0x00000000, 0x00000000, +}; + +static uint32_t eia3_test3_msg[] = { + 0x983b41d4, 0x7d780c9e, 0x1ad11d7e, 0xb70391b1, + 0xde0b35da, 0x2dc62f83, 0xe7b78d63, 0x06ca0ea0, + 0x7e941b7b, 0xe91348f9, 0xfcb170e2, 0x217fecd9, + 0x7f9f68ad, 0xb16e5d7d, 0x21e569d2, 0x80ed775c, + 0xebde3f40, 0x93c53881, 0x00000000 +}; + +static uint32_t eia3_test4_msg[] = { + 0xb546430b, 0xf87b4f1e, 0xe834704c, 0xd6951c36, + 0xe26f108c, 0xf731788f, 0x48dc34f1, 0x678c0522, + 0x1c8fa7ff, 0x2f39f477, 0xe7e49ef6, 0x0a4ec2c3, + 0xde24312a, 0x96aa26e1, 0xcfba5756, 0x3838b297, + 0xf47e8510, 0xc779fd66, 0x54b14338, 0x6fa639d3, + 0x1edbd6c0, 0x6e47d159, 0xd94362f2, 0x6aeeedee, + 0x0e4f49d9, 0xbf841299, 0x5415bfad, 0x56ee82d1, + 0xca7463ab, 0xf085b082, 0xb09904d6, 0xd990d43c, + 0xf2e062f4, 0x0839d932, 0x48b1eb92, 0xcdfed530, + 0x0bc14828, 0x0430b6d0, 0xcaa094b6, 0xec8911ab, + 0x7dc36824, 0xb824dc0a, 0xf6682b09, 0x35fde7b4, + 0x92a14dc2, 0xf4364803, 0x8da2cf79, 0x170d2d50, + 0x133fd494, 0x16cb6e33, 0xbea90b8b, 0xf4559b03, + 0x732a01ea, 0x290e6d07, 0x4f79bb83, 0xc10e5800, + 0x15cc1a85, 0xb36b5501, 0x046e9c4b, 0xdcae5135, + 0x690b8666, 0xbd54b7a7, 0x03ea7b6f, 0x220a5469, + 0xa568027e, +}; + +static uint32_t eia3_test5_msg[] = { + 0x5bad7247, 0x10ba1c56, 0xd5a315f8, 0xd40f6e09, + 0x3780be8e, 0x8de07b69, 0x92432018, 0xe08ed96a, + 0x5734af8b, 0xad8a575d, 0x3a1f162f, 0x85045cc7, + 0x70925571, 0xd9f5b94e, 0x454a77c1, 0x6e72936b, + 0xf016ae15, 0x7499f054, 0x3b5d52ca, 0xa6dbeab6, + 0x97d2bb73, 0xe41b8075, 0xdce79b4b, 0x86044f66, + 0x1d4485a5, 0x43dd7860, 0x6e0419e8, 0x059859d3, + 0xcb2b67ce, 0x0977603f, 0x81ff839e, 0x33185954, + 0x4cfbc8d0, 0x0fef1a4c, 0x8510fb54, 0x7d6b06c6, + 0x11ef44f1, 0xbce107cf, 0xa45a06aa, 0xb360152b, + 0x28dc1ebe, 0x6f7fe09b, 0x0516f9a5, 0xb02a1bd8, + 0x4bb0181e, 0x2e89e19b, 0xd8125930, 0xd178682f, + 0x3862dc51, 0xb636f04e, 0x720c47c3, 0xce51ad70, + 0xd94b9b22, 0x55fbae90, 0x6549f499, 0xf8c6d399, + 0x47ed5e5d, 0xf8e2def1, 0x13253e7b, 0x08d0a76b, + 0x6bfc68c8, 0x12f375c7, 0x9b8fe5fd, 0x85976aa6, + 0xd46b4a23, 0x39d8ae51, 0x47f680fb, 0xe70f978b, + 0x38effd7b, 0x2f7866a2, 0x2554e193, 0xa94e98a6, + 0x8b74bd25, 0xbb2b3f5f, 0xb0a5fd59, 0x887f9ab6, + 0x8159b717, 0x8d5b7b67, 0x7cb546bf, 0x41eadca2, + 0x16fc1085, 0x0128f8bd, 0xef5c8d89, 0xf96afa4f, + 0xa8b54885, 0x565ed838, 0xa950fee5, 0xf1c3b0a4, + 0xf6fb71e5, 0x4dfd169e, 0x82cecc72, 0x66c850e6, + 0x7c5ef0ba, 0x960f5214, 0x060e71eb, 0x172a75fc, + 0x1486835c, 0xbea65344, 0x65b055c9, 0x6a72e410, + 0x52241823, 0x25d83041, 0x4b40214d, 0xaa8091d2, + 0xe0fb010a, 0xe15c6de9, 0x0850973b, 0xdf1e423b, + 0xe148a237, 0xb87a0c9f, 0x34d4b476, 0x05b803d7, + 0x43a86a90, 0x399a4af3, 0x96d3a120, 0x0a62f3d9, + 0x507962e8, 0xe5bee6d3, 0xda2bb3f7, 0x237664ac, + 0x7a292823, 0x900bc635, 0x03b29e80, 0xd63f6067, + 0xbf8e1716, 0xac25beba, 0x350deb62, 0xa99fe031, + 0x85eb4f69, 0x937ecd38, 0x7941fda5, 0x44ba67db, + 0x09117749, 0x38b01827, 0xbcc69c92, 0xb3f772a9, + 0xd2859ef0, 0x03398b1f, 0x6bbad7b5, 0x74f7989a, + 0x1d10b2df, 0x798e0dbf, 0x30d65874, 0x64d24878, + 0xcd00c0ea, 0xee8a1a0c, 0xc753a279, 0x79e11b41, + 0xdb1de3d5, 0x038afaf4, 0x9f5c682c, 0x3748d8a3, + 0xa9ec54e6, 0xa371275f, 0x1683510f, 0x8e4f9093, + 0x8f9ab6e1, 0x34c2cfdf, 0x4841cba8, 0x8e0cff2b, + 0x0bcc8e6a, 0xdcb71109, 0xb5198fec, 0xf1bb7e5c, + 0x531aca50, 0xa56a8a3b, 0x6de59862, 0xd41fa113, + 0xd9cd9578, 0x08f08571, 0xd9a4bb79, 0x2af271f6, + 0xcc6dbb8d, 0xc7ec36e3, 0x6be1ed30, 0x8164c31c, + 0x7c0afc54, 0x1c000000, +}; + +static test_words_t eia3_test_msg[5] = { + {eia3_test1_msg, sizeof(eia3_test1_msg)/4}, + {eia3_test2_msg, sizeof(eia3_test2_msg)/4}, + {eia3_test3_msg, sizeof(eia3_test3_msg)/4}, + {eia3_test4_msg, sizeof(eia3_test4_msg)/4}, + {eia3_test5_msg, sizeof(eia3_test5_msg)/4}, +}; + +static uint32_t eia3_test_mac[5] = { + 0xc8a9595e, 0x6719a088, 0xfae8ff0b, 0x004ac4d6, + 0x0ca12792, +}; + +static int test_zuc(int verbose) +{ +#if 0 + int i; + for (i = 0; i < sizeof(zuc_test_key)/sizeof(zuc_test_key[0]); i++) { + zuc_key_t key; + uint32_t word; + + zuc_set_key(&key, zuc_test_key[i], zuc_test_iv[i]); + + for (j = 0; j < 2; j++) { + zuc_generate_keystream(&key, 1, &word); + if (word != zuc_test_word[i][j]) { + return 0; + } + } + } + +#endif + return 0; +} + +static int test_eea3(int verbose) +{ +#if 0 + zuc_key_t key; + int i; + for (i = 0; i < sizeof(eea3_test_key)/sizeof(eea3_test_key[0]); i++) { + eea3_set_key(&key, eea3_test_count[i], eea3_test_bearer[i], eea3_test_direction[i]); + } +#endif + return 0; +} + +static int test_eia3(int verbose) +{ + return 0; +} + +int main(int argc, char *argv[]) +{ + return 0; +} diff --git a/demos/ameth.c b/demos/ameth.c deleted file mode 100644 index 2a130d7a..00000000 --- a/demos/ameth.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - - int i; - -/* -int EVP_PKEY_asn1_get_count(void); -const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx); -const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type); -const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, - const char *str, int len); - -*/ - - int count = EVP_PKEY_asn1_get_count(); - printf("EVP_PKEY_asn1_get_count() = %d\n", count); - - for (i = 0; i < count; i++) { - const EVP_PKEY_ASN1_METHOD *ameth; - ameth = EVP_PKEY_asn1_get0(i); - - int j; - const unsigned char *p = (const unsigned char *)ameth; - for (j = 0; j < 64; j++) { - printf("%02x", p[j]); - } - printf("\n"); - } - -} diff --git a/demos/gmssl/Makefile b/demos/gmssl/Makefile new file mode 100644 index 00000000..f08ea93b --- /dev/null +++ b/demos/gmssl/Makefile @@ -0,0 +1,14 @@ + +all: + cc -o ciphers -Wall ciphers.c -L/usr/local/lib -lcrypto + cc -o sm3 -Wall sm3.c -L/usr/local/lib -lcrypto + cc -o evpsm3 -Wall evpsm3.c -L/usr/local/lib -lcrypto + cc -o hmacsm3 -Wall hmacsm3.c -L/usr/local/lib -lcrypto + +clean: + rm -fr a.out *.o + rm -fr ciphers + rm -fr sm3 + rm -fr evpsm3 + rm -fr hmacsm3 + diff --git a/demos/gmssl/a.out b/demos/gmssl/a.out new file mode 100755 index 0000000000000000000000000000000000000000..764b9c6d001b1a39e205428ed0115e90675c67b0 GIT binary patch literal 1472832 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%0D3H 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�cBLcR*~s7^8Wv+>u| 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

fp6{UJO|&`O2tCo9Fpk` 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%0Ajsw|a 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 *}<9|Uiy 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�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�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%0Ap5UOgbzOEK%pbts&>&R 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 +#include +#include + +int main(int argc, char **argv) +{ + int i; + char *names[] = { + "sms4-ecb", + "sms4-cbc", + "sms4-cfb", + "sms4-ofb", + "sms4-ctr", + "zuc", + }; + const EVP_CIPHER *cipher; + + OpenSSL_add_all_ciphers(); + + printf("%s New Ciphers:\n\n", OPENSSL_VERSION_TEXT); + + for (i = 0; i < sizeof(names)/sizeof(names[i]); i++) { + if (!(cipher = EVP_get_cipherbyname(names[i]))) { + fprintf(stderr, "cipher \"%s\" is not supported\n", names[i]); + continue; + } + + printf(" cipher nid : %d\n", EVP_CIPHER_nid(cipher)); + printf(" cipher name : %s\n", EVP_CIPHER_name(cipher)); + printf(" block size : %d\n", EVP_CIPHER_block_size(cipher)); + printf(" key length : %d\n", EVP_CIPHER_key_length(cipher)); + printf(" iv length : %d\n", EVP_CIPHER_iv_length(cipher)); + printf(" flags : 0x%016lx\n", EVP_CIPHER_flags(cipher)); + printf("\n"); + } + + return 0; +} diff --git a/demos/ectool.c b/demos/gmssl/ectool.c similarity index 100% rename from demos/ectool.c rename to demos/gmssl/ectool.c diff --git a/demos/gmssl/evpsm3.c b/demos/gmssl/evpsm3.c new file mode 100644 index 00000000..5da698f1 --- /dev/null +++ b/demos/gmssl/evpsm3.c @@ -0,0 +1,109 @@ +/* demo/gmssl/sm3evp.c */ +/* ==================================================================== + * Copyright (c) 2014 - 2015 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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 +#include +#include +#include + +int main(int argc, char **argv) +{ + int ret = -1; + FILE *fp = stdin; + unsigned char buf[1024]; + size_t len; + const EVP_MD *md; + EVP_MD_CTX mdctx; + unsigned char dgst[EVP_MAX_MD_SIZE]; + unsigned int dgstlen, i; + + if (argc == 2) { + if (!(fp = fopen(argv[1], "r"))) { + fprintf(stderr, "open file %s failed\n", argv[1]); + return -1; + } + } + + OpenSSL_add_all_digests(); + if (!(md = EVP_get_digestbyname("sm3"))) { + ERR_print_errors_fp(stderr); + goto end; + } + + if (!EVP_DigestInit(&mdctx, md)) { + ERR_print_errors_fp(stderr); + goto end; + } + + while ((len = fread(buf, 1, sizeof(buf), fp))) { + if (!EVP_DigestUpdate(&mdctx, buf, len)) { + ERR_print_errors_fp(stderr); + goto end; + } + } + + if (!EVP_DigestFinal(&mdctx, dgst, &dgstlen)) { + ERR_print_errors_fp(stderr); + goto end; + } + + for (i = 0; i < dgstlen; i++) { + printf("%02x", dgst[i]); + } + printf("\n"); + ret = 0; + +end: + fclose(fp); + EVP_cleanup(); + return ret; +} + diff --git a/demos/gmssl/gmssl.sh b/demos/gmssl/gmssl.sh index e2b3a873..75fe9381 100755 --- a/demos/gmssl/gmssl.sh +++ b/demos/gmssl/gmssl.sh @@ -18,10 +18,15 @@ $gmssl genpkey -algorithm EC -out sm2key.pem -pkeyopt ec_paramgen_curve:sm2p256v #$gmssl pkey -text -noout -in sm2key.pem #$gmssl pkey -in sm2key.pem -pubout -out sm2pubkey.pem #$gmssl pkey -text -noout -pubin -in $pubkeyfile + echo hello | $gmssl pkeyutl -sign -inkey sm2key.pem -pkeyopt ec_sign_algor:sm2 > sm2sig.der + echo hello | $gmssl pkeyutl -verify -inkey sm2key.pem -sigfile sm2sig.der -pkeyopt ec_sign_algor:sm2 + echo hello | $gmssl pkeyutl -encrypt -inkey sm2key.pem -pkeyopt ec_encrypt_algor:sm2 > sm2ciphertext.bin + + cat sm2ciphertext.bin | $gmssl pkeyutl -decrypt -inkey sm2key.pem -pkeyopt ec_encrypt_algor:sm2 -$gmssl req -new -x509 -days 3650 -key sm2key.pem -out cert.pem -pkeyopt ec_sign_algor:sm2 +$gmssl req -new -x509 -days 3650 -key sm2key.pem -out cert.pem #$gmssl x509 -text -noout -in $DIR/cacert.pem diff --git a/demos/gmssl/sm3hmac.c b/demos/gmssl/hmacsm3.c similarity index 99% rename from demos/gmssl/sm3hmac.c rename to demos/gmssl/hmacsm3.c index fa467b29..5d1165f0 100644 --- a/demos/gmssl/sm3hmac.c +++ b/demos/gmssl/hmacsm3.c @@ -84,7 +84,7 @@ int main(int argc, char **argv) ERR_print_errors_fp(stderr); goto end; } - + HMAC_Init_ex(&hmctx, key, sizeof(key), md, NULL); while ((len = fread(buf, 1, sizeof(buf), fp))) { diff --git a/demos/gmssl/listciphers.c b/demos/gmssl/listciphers.c deleted file mode 100644 index 39bd7e97..00000000 --- a/demos/gmssl/listciphers.c +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - int i; - char *names[] = { - "sms4-ecb", - "sms4-cbc", - "sms4-cfb", - "sms4-ofb", - "sms4-ctr", - }; - const EVP_CIPHER *cipher; - - OpenSSL_add_all_ciphers(); - - printf("%s new ciphers:\n\n", OPENSSL_VERSION_TEXT); - - for (i = 0; i < sizeof(names)/sizeof(names[i]); i++) { - if (!(cipher = EVP_get_cipherbyname(names[i]))) { - fprintf(stderr, "cipher \"%s\" is not supported\n", names[i]); - continue; - } - - printf(" cipher nid : %d\n", EVP_CIPHER_nid(cipher)); - printf(" cipher name : %s\n", EVP_CIPHER_name(cipher)); - printf(" block size : %d\n", EVP_CIPHER_block_size(cipher)); - printf(" key length : %d\n", EVP_CIPHER_key_length(cipher)); - printf(" iv length : %d\n", EVP_CIPHER_iv_length(cipher)); - printf(" flags : 0x%016lx\n", EVP_CIPHER_flags(cipher)); - printf("\n"); - } - - return 0; -} diff --git a/demos/gmssl/memleak.c b/demos/gmssl/memleak.c new file mode 100644 index 00000000..4e857e27 --- /dev/null +++ b/demos/gmssl/memleak.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include + +int main() +{ + BIO *bio_err; + void *ptr; + + CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); + bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); + + ptr = OPENSSL_malloc(1024); + + CRYPTO_mem_leaks(bio_err); + BIO_free(bio_err); + + return (0); +} diff --git a/demos/gmssl/selfsign.c b/demos/gmssl/selfsign.c index e1d180fb..f658fb97 100644 --- a/demos/gmssl/selfsign.c +++ b/demos/gmssl/selfsign.c @@ -4,104 +4,55 @@ #include #include -int mkit(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days) -{ - X509 *x; - EVP_PKEY *pk; - EC_KEY *ec_key; - X509_NAME *name = NULL; - X509_NAME_ENTRY *ne = NULL; - X509_EXTENSION *ex = NULL; - - if ((pkeyp == NULL) || (*pkeyp == NULL)) { - if ((pk = EVP_PKEY_new()) == NULL) { - abort(); - return (0); - } - } else - pk = *pkeyp; - - if ((x509p == NULL) || (*x509p == NULL)) { - if ((x = X509_new()) == NULL) - goto err; - } else { - x = *x509p; - } - - - ec_key = EC_KEY_new_by_curve_name(NID_sm2p256v1); - EC_KEY_generate_key(ec_key); - - if (!EVP_PKEY_assign_EC_KEY(pk, ec_key)) { - abort(); - goto err; - } - ec_key = NULL; - - X509_set_version(x, 3); - ASN1_INTEGER_set(X509_get_serialNumber(x), serial); - X509_gmtime_adj(X509_get_notBefore(x), 0); - X509_gmtime_adj(X509_get_notAfter(x), (long)60 * 60 * 24 * days); - X509_set_pubkey(x, pk); - - name = X509_get_subject_name(x); - - /* - * This function creates and adds the entry, working out the correct - * string type and performing checks on its length. Normally we'd check - * the return value for errors... - */ - X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, "UK", -1, -1, 0); - X509_NAME_add_entry_by_txt(name, "CN", - MBSTRING_ASC, "OpenSSL Group", -1, -1, 0); - - X509_set_issuer_name(x, name); - - /* - * Add extension using V3 code: we can set the config file as NULL - * because we wont reference any other sections. We can also set the - * context to NULL because none of these extensions below will need to - * access it. - */ - - ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_cert_type, "server"); - X509_add_ext(x, ex, -1); - X509_EXTENSION_free(ex); - - ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_comment, - "example comment extension"); - X509_add_ext(x, ex, -1); - X509_EXTENSION_free(ex); - - ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_ssl_server_name, - "www.openssl.org"); - - X509_add_ext(x, ex, -1); - X509_EXTENSION_free(ex); - - - if (!X509_sign(x, pk, EVP_sm3())) - goto err; - - *x509p = x; - *pkeyp = pk; - return (1); -err: - return (0); -} - int main() { BIO *bio_err; - X509 *x509 = NULL; + + EC_KEY *ec_key = NULL; EVP_PKEY *pkey = NULL; + X509 *x509 = NULL; + int serial = 123; + int days = 365; + X509_NAME *name = NULL; + X509_NAME_ENTRY *ne = NULL; + X509_EXTENSION *ex = NULL; CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); + ec_key = EC_KEY_new_by_curve_name(NID_sm2p256v1); + EC_KEY_generate_key(ec_key); + pkey = EVP_PKEY_new(); + EVP_PKEY_set1_EC_KEY(pkey, ec_key); + ec_key = NULL; - mkit(&x509, &pkey, 512, 0, 365); + x509 = X509_new(); + X509_set_version(x509, 3); + ASN1_INTEGER_set(X509_get_serialNumber(x509), serial); + X509_gmtime_adj(X509_get_notBefore(x509), 0); + X509_gmtime_adj(X509_get_notAfter(x509), (long)60 * 60 * 24 * days); + X509_set_pubkey(x509, pkey); + + name = X509_get_subject_name(x509); + X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, "UK", -1, -1, 0); + X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, "OpenSSL Group", -1, -1, 0); + X509_set_issuer_name(x509, name); + + ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_cert_type, "server"); + X509_add_ext(x509, ex, -1); + X509_EXTENSION_free(ex); + + ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_comment, "example comment extension"); + X509_add_ext(x509, ex, -1); + X509_EXTENSION_free(ex); + + ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_ssl_server_name, "www.openssl.org"); + + X509_add_ext(x509, ex, -1); + X509_EXTENSION_free(ex); + + X509_sign(x509, pkey, EVP_sm3()); EC_KEY_print_fp(stdout, pkey->pkey.ec, 0); X509_print_fp(stdout, x509); @@ -114,5 +65,6 @@ int main() CRYPTO_mem_leaks(bio_err); BIO_free(bio_err); + return (0); } diff --git a/demos/gmssl/sm2ciphertext.bin b/demos/gmssl/sm2ciphertext.bin index e69de29b..10892f06 100644 --- a/demos/gmssl/sm2ciphertext.bin +++ b/demos/gmssl/sm2ciphertext.bin @@ -0,0 +1,2 @@ +' R.NZz+ +N&Jʏb l0wya>7]"~߻C9 5O4WJq/Z|ih[ \ No newline at end of file diff --git a/demos/gmssl/sm2key.pem b/demos/gmssl/sm2key.pem index d171a13c..84870a3c 100644 --- a/demos/gmssl/sm2key.pem +++ b/demos/gmssl/sm2key.pem @@ -1,5 +1,5 @@ -----BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQgyeMq+RmwB95Ohl+U -K1KmE5/3OzxoG1lOpbyMu8sZxrqhRANCAATGmXcprKn9kYmMBKBLaxckcTFqDzNF -qDwzk8rTcWr5/2CmI9KGeSMbp7G9X/v8qh/RIattztrYXlrVP0h7Zk+A +MIGHAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQgMfsFkjZrB5XuA5eX +Utr1XlgaqbL4aJHLSvtOteur2oehRANCAASygUdsxLAxiuHlr42o93jHr7lJnAbW +AsGM8lpqpz9803V6jGREo8Ajdh5lhqo0KPsfqwnVqjAE4CVLwCobJ6GZ -----END PRIVATE KEY----- diff --git a/demos/gmssl/sm2sig.der b/demos/gmssl/sm2sig.der index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c3d6b8aa98f9b6f4ca5d166e6dfa4eabbd366909 100644 GIT binary patch literal 71 zcmV-N0J#4!MFJoiSPMM6Ge`CdPA!8;Hc|8s@};Gos~~irX!tG#rvD@YApoBB@4Hh= dlCV*Gf>bXb(r7)4EBOt*p-UPQDhRYuOcds296SI3 literal 0 HcmV?d00001 diff --git a/demos/gmssl/sm2testpem.c b/demos/gmssl/sm2testpem.c deleted file mode 100644 index 06aab4db..00000000 --- a/demos/gmssl/sm2testpem.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - BIO *in = BIO_new_fp(stdin, BIO_NOCLOSE); - EC_GROUP *group = NULL; - EC_KEY *ec_key = NULL; - ERR_load_crypto_strings(); - - - - group = PEM_read_bio_SM2PKParameters(in, NULL, NULL, NULL); - if (!group) { - ERR_print_errors_fp(stderr); - return 0; - } - - if (!EC_GROUP_check(group, NULL)) { - ERR_print_errors_fp(stderr); - return 0; - } - - return 0; - - ec_key = EC_KEY_new(); - EC_KEY_set_group(ec_key, group); - - return 0; -} diff --git a/demos/gmssl/sm3.c b/demos/gmssl/sm3.c index 116ee430..5d8602cd 100644 --- a/demos/gmssl/sm3.c +++ b/demos/gmssl/sm3.c @@ -1,6 +1,6 @@ /* demo/gmssl/sm3.c */ /* ==================================================================== - * Copyright (c) 2014 - 2015 The GmSSL Project. All rights reserved. + * Copyright (c) 2014 - 2016 The GmSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -50,60 +50,48 @@ */ #include +#include #include -#include -#include +#include +#include +#include + +/* + * usage of sm3dgst: + * ./sm3dgst + * 324234234234235234234234234234 + * + * echo "hello world" | sm3dgst + * lksjdlfksdjlfkjsdlfkjsdlfkjsdljkfffffffldjfk= + * + */ int main(int argc, char **argv) { - int ret = -1; - FILE *fp = stdin; - unsigned char buf[1024]; - size_t len; - const EVP_MD *md; - EVP_MD_CTX mdctx; - unsigned char dgst[EVP_MAX_MD_SIZE]; - unsigned int dgstlen, i; + sm3_ctx_t ctx; + unsigned char dgst[SM3_DIGEST_LENGTH]; + unsigned char buf[4096]; + ssize_t len; + int i; - if (argc == 2) { - if (!(fp = fopen(argv[1], "r"))) { - fprintf(stderr, "open file %s failed\n", argv[1]); - return -1; - } + if (argc > 1) { + printf("usage: %s < file\n", basename(argv[0])); + return 0; } - OpenSSL_add_all_digests(); - if (!(md = EVP_get_digestbyname("sm3"))) { - ERR_print_errors_fp(stderr); - goto end; - } + sm3_init(&ctx); - if (!EVP_DigestInit(&mdctx, md)) { - ERR_print_errors_fp(stderr); - goto end; + while ((len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) { + sm3_update(&ctx, buf, len); } + memset(dgst, 0, sizeof(dgst)); + sm3_final(&ctx, dgst); - while ((len = fread(buf, 1, sizeof(buf), fp))) { - if (!EVP_DigestUpdate(&mdctx, buf, len)) { - ERR_print_errors_fp(stderr); - goto end; - } - } - - if (!EVP_DigestFinal(&mdctx, dgst, &dgstlen)) { - ERR_print_errors_fp(stderr); - goto end; - } - - for (i = 0; i < dgstlen; i++) { + for (i = 0; i < sizeof(dgst); i++) { printf("%02x", dgst[i]); } printf("\n"); - ret = 0; -end: - fclose(fp); - EVP_cleanup(); - return ret; + return 0; } diff --git a/demos/mycipher/Makefile b/demos/mycipher/Makefile new file mode 100644 index 00000000..b7ae6b9b --- /dev/null +++ b/demos/mycipher/Makefile @@ -0,0 +1,78 @@ +# +# OpenSSL/crypto/mycipher/Makefile +# + +DIR= mycipher +TOP= ../.. +CC= cc +INCLUDES= +CFLAG=-g +MAKEFILE= Makefile +AR= ar r + +CFLAGS= $(INCLUDES) $(CFLAG) + +GENERAL=Makefile +TEST= +APPS= + +LIB=$(TOP)/libcrypto.a +LIBSRC=mycipher.c +LIBOBJ=mycipher.o + +SRC= $(LIBSRC) + +EXHEADER= mycipher.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) || echo Never mind. + @touch lib + +files: + $(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO + +links: + @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER) + @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST) + @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS) + +install: + @[ -n "$(INSTALLTOP)" ] # should be set by top Makefile... + @headerlist="$(EXHEADER)"; for i in $$headerlist ; \ + 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 + +update: depend + +depend: + @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... + $(MAKEDEPEND) -- $(CFLAG) $(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 *.obj lib tags core .pure .nfs* *.old *.bak fluff + +# DO NOT DELETE THIS LINE -- make depend depends on it. + diff --git a/demos/mycipher/README.md b/demos/mycipher/README.md new file mode 100644 index 00000000..b9258478 --- /dev/null +++ b/demos/mycipher/README.md @@ -0,0 +1,9 @@ +## MyCipher Block Cipher + +The official specification of MyCipher can be found at +http://example.com/mycipher.pdf + +The OID (Object Identifier) of MyCipher is 1.2.345.6789, +which is defined in standard http://example.com/mycipher.pdf + + diff --git a/crypto/evp/m_btc.c b/demos/mycipher/mycipher.c similarity index 69% rename from crypto/evp/m_btc.c rename to demos/mycipher/mycipher.c index bad34d16..11660558 100644 --- a/crypto/evp/m_btc.c +++ b/demos/mycipher/mycipher.c @@ -1,4 +1,4 @@ -/* crypto/evp/m_btc.c */ +/* crypto/mycipher/mycipher.c */ /* ==================================================================== * Copyright (c) 2014 - 2016 The GmSSL Project. All rights reserved. * @@ -46,72 +46,27 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== + * */ /* - * This module is to support crypto-currency such as Bitcoin + * author's information */ -#include -#include "cryptlib.h" +#include "mycipher.h" -#ifndef OPENSSL_NO_GMSSL - -#include -#include -#include -#include -#include - -static int init(EVP_MD_CTX *ctx) +void mycipher_set_encrypt_key(mycipher_key_t *key, const unsigned char *user_key) { - SHA256_Init(ctx->md_data->sha256); - RIPEMD_Init(ctx->md_data->rmd160); } -static int update(EVP_MD_CTX *ctx, const void *in, size_t inlen) +void mycipher_set_decrypt_key(mycipher_key_t *key, const unsigned char *user_key) { - SHA256_Update(ctx, in, inlen); } -static int final(EVP_MD_CTX *ctx, unsigned char *md) +void mycipher_encrypt(const unsigned char *in, unsigned char *out, const mycipher_key_t *key) { - return sm3_final(ctx->md_data, md); } -static const EVP_MD sm3_md = { - NID_btchash, - NID_sm2sign_with_sm3, - SM3_DIGEST_LENGTH, - 0, - init, - update, - final, - NULL, - NULL, - (evp_sign_method *)SM2_sign, - (evp_verify_method *)SM2_verify, - {EVP_PKEY_EC, 0, 0, 0}, - SM3_BLOCK_SIZE, - sizeof(EVP_MD *) + sizeof(sm3_ctx_t), -}; - -const EVP_MD *EVP_btc160(void) +void mycipher_decrypt(const unsigned char *in, unsigned char *out, const mycipher_key_t *key) { - return &btc160_md; } -const EVP_MD *EVP_btc256(void) -{ - return &btc256_md; -} - -const EVP_MD *EVP_sm3_rmd160(void) -{ - return 0; -} - - -#endif - - - diff --git a/demos/mycipher/mycipher.h b/demos/mycipher/mycipher.h new file mode 100644 index 00000000..26cc8151 --- /dev/null +++ b/demos/mycipher/mycipher.h @@ -0,0 +1,85 @@ +/* crypto/mycipher/mycipher.h */ +/* ==================================================================== + * Copyright (c) 2014 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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. + * ==================================================================== + * + */ +/* + * author's information + */ + +#ifndef HEADER_MYCIPHER_H +#define HEADER_MYCIPHER_H + +#define MYCIPHER_KEY_LENGTH 16 +#define MYCIPHER_BLOCK_SIZE 16 +#define MYCIPHER_IV_LENGTH (MYCIPHER_BLOCK_SIZE) + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned char rk[100]; +} mycipher_key_t; + +void mycipher_set_encrypt_key(mycipher_key_t *key, const unsigned char *user_key); +void mycipher_set_decrypt_key(mycipher_key_t *key, const unsigned char *user_key); +void mycipher_encrypt(const unsigned char *in, unsigned char *out, const mycipher_key_t *key); +void mycipher_decrypt(const unsigned char *in, unsigned char *out, const mycipher_key_t *key); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/demos/mycipher/mycipher.o b/demos/mycipher/mycipher.o new file mode 100644 index 0000000000000000000000000000000000000000..c7aeadc1da7cfe2486b3ee847b6681ea6b166202 GIT binary patch literal 1020 zcma)3Jx{_=6n%UI2!7DPL8FNs9Gr}ch7lu12M1#?anM{yc?6d{Ru9P?#2N#)$D4O%=@p&Y@>6{1FW0x3+m6T`9<}%Q**1jN$1)l-Ef+1*P|2NR)b1e N|EGvQ> $(TOP)/MINFO + +links: + @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER) + @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST) + @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS) + +install: + @[ -n "$(INSTALLTOP)" ] # should be set by top Makefile... + @headerlist="$(EXHEADER)"; for i in $$headerlist ; \ + 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 + +update: depend + +depend: + @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... + $(MAKEDEPEND) -- $(CFLAG) $(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 *.obj lib tags core .pure .nfs* *.old *.bak fluff + +# DO NOT DELETE THIS LINE -- make depend depends on it. + diff --git a/demos/mystream/README.md b/demos/mystream/README.md new file mode 100644 index 00000000..dfaba31b --- /dev/null +++ b/demos/mystream/README.md @@ -0,0 +1,9 @@ +## MyStream Stream Cipher + +The official specification of MyStream can be found at +http://example.com/mystream.pdf + +The OID (Object Identifier) of MyStream is 1.2.345.6789, +which is defined in standard http://example.com/mystream.pdf + + diff --git a/demos/mystream/mystream.c b/demos/mystream/mystream.c new file mode 100644 index 00000000..e8e48832 --- /dev/null +++ b/demos/mystream/mystream.c @@ -0,0 +1,64 @@ +/* crypto/mycipher/mycipher.c */ +/* ==================================================================== + * Copyright (c) 2014 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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. + * ==================================================================== + * + */ +/* + * author's information + */ + +#include "mystream.h" + +void mystream_set_key(mystream_key_t *key, const unsigned char *user_key, const unsigned char *iv) +{ +} + +void mystream_encrypt(mystream_key_t *key, size_t len, const unsigned char *in, unsigned char *out) +{ +} + diff --git a/demos/mystream/mystream.h b/demos/mystream/mystream.h new file mode 100644 index 00000000..af920c98 --- /dev/null +++ b/demos/mystream/mystream.h @@ -0,0 +1,80 @@ +/* crypto/mystream/mystream.h */ +/* ==================================================================== + * Copyright (c) 2014 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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. + * ==================================================================== + * + */ +/* + * author's information + */ + +#ifndef HEADER_MYSTREAM_H +#define HEADER_MYSTREAM_H + +#define MYSTREAM_KEY_LENGTH 256 + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned char state[100]; +} mystream_key_t; + +void mystream_set_key(mystream_key_t *key, const unsigned char *user_key, const unsigned char *iv); +void mystream_encrypt(mystream_key_t *key, size_t len, const unsigned char *in, unsigned char *out); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/demos/mystream/mystream.o b/demos/mystream/mystream.o new file mode 100644 index 0000000000000000000000000000000000000000..8247973a450b024bf7fbf790c70c515ca3bed2f8 GIT binary patch literal 744 zcmX^A>+L^w1_nlE1|R{%EI_;g#83cYAdm!N3lJX%H~07^kP@$sn{@o7bgxv4Nds{0}!!VDQuS_7yX<~NWKHv?P> ztU?7y3V>K#Twp%PGLV}V02v_m0U)6Pq=EVv0)QA9faF1#91!Z!`84)$njXJ=3s^gZ zk1&Z1!o-MCuv>w0xa38kMle?eF)&sLFbeRnb4&o50`jK}5O@5C0H}Tj21h=DHYR6Y z7$2n01&9j>s8ax{0U8U|2BL+5e10GU<~|@3%m-2s5T9FFTvC*pm>XZ5S`wd~TFHPA NNzF?xsw@DfIsl@$OKkuE literal 0 HcmV?d00001 diff --git a/demos/mystream/mystreamtest.c b/demos/mystream/mystreamtest.c new file mode 100644 index 00000000..98b70022 --- /dev/null +++ b/demos/mystream/mystreamtest.c @@ -0,0 +1,62 @@ +/* crypto/mycipher/mycipher.h */ +/* ==================================================================== + * Copyright (c) 2014 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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. + * ==================================================================== + * + */ +/* + * author's information + */ + +#include "mystream.h" + +int main(int argc, char **argv) +{ + + return 0; +} + diff --git a/doc/crypto/sm2.pod b/doc/crypto/sm2.pod new file mode 100644 index 00000000..de255818 --- /dev/null +++ b/doc/crypto/sm2.pod @@ -0,0 +1,200 @@ +=pod + +=head1 NAME + +sm2 - SM2 functions + +=head1 SYNOPSIS + + #include + + const EC_METHOD *EC_GFp_simple_method(void); + const EC_METHOD *EC_GFp_mont_method(void); + const EC_METHOD *EC_GFp_nist_method(void); + const EC_METHOD *EC_GFp_nistp224_method(void); + const EC_METHOD *EC_GFp_nistp256_method(void); + const EC_METHOD *EC_GFp_nistp521_method(void); + + const EC_METHOD *EC_GF2m_simple_method(void); + + EC_GROUP *EC_GROUP_new(const EC_METHOD *meth); + void EC_GROUP_free(EC_GROUP *group); + void EC_GROUP_clear_free(EC_GROUP *group); + int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); + EC_GROUP *EC_GROUP_dup(const EC_GROUP *src); + const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); + int EC_METHOD_get_field_type(const EC_METHOD *meth); + int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor); + const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); + int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); + int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx); + void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); + int EC_GROUP_get_curve_name(const EC_GROUP *group); + void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); + int EC_GROUP_get_asn1_flag(const EC_GROUP *group); + void EC_GROUP_set_point_conversion_form(EC_GROUP *group, point_conversion_form_t form); + point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); + unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); + size_t EC_GROUP_get_seed_len(const EC_GROUP *); + size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); + int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); + int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx); + int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); + int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx); + int EC_GROUP_get_degree(const EC_GROUP *group); + int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); + int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); + int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); + EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); + EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); + EC_GROUP *EC_GROUP_new_by_curve_name(int nid); + + size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + + EC_POINT *EC_POINT_new(const EC_GROUP *group); + void EC_POINT_free(EC_POINT *point); + void EC_POINT_clear_free(EC_POINT *point); + int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); + EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); + const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); + int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); + int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx); + int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx); + int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx); + int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx); + int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, int y_bit, BN_CTX *ctx); + int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx); + int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx); + int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, int y_bit, BN_CTX *ctx); + size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, + point_conversion_form_t form, + unsigned char *buf, size_t len, BN_CTX *ctx); + int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, + const unsigned char *buf, size_t len, BN_CTX *ctx); + BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BIGNUM *, BN_CTX *); + EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, + EC_POINT *, BN_CTX *); + char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BN_CTX *); + EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, + EC_POINT *, BN_CTX *); + + int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx); + int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx); + int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); + int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); + int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx); + int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx); + int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); + int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], BN_CTX *ctx); + int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, size_t num, const EC_POINT *p[], const BIGNUM *m[], BN_CTX *ctx); + int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); + int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx); + int EC_GROUP_have_precompute_mult(const EC_GROUP *group); + + int EC_GROUP_get_basis_type(const EC_GROUP *); + int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); + int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); + EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); + int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); + #define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x) + #define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x) + #define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \ + (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x)) + #define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \ + (unsigned char *)(x)) + int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); + int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); + + EC_KEY *EC_KEY_new(void); + int EC_KEY_get_flags(const EC_KEY *key); + void EC_KEY_set_flags(EC_KEY *key, int flags); + void EC_KEY_clear_flags(EC_KEY *key, int flags); + EC_KEY *EC_KEY_new_by_curve_name(int nid); + void EC_KEY_free(EC_KEY *key); + EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); + EC_KEY *EC_KEY_dup(const EC_KEY *src); + int EC_KEY_up_ref(EC_KEY *key); + const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); + int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); + const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); + int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); + const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); + int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); + unsigned EC_KEY_get_enc_flags(const EC_KEY *key); + void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); + point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); + void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); + void *EC_KEY_get_key_method_data(EC_KEY *key, + void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); + void EC_KEY_insert_key_method_data(EC_KEY *key, void *data, + void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); + void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); + int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); + int EC_KEY_generate_key(EC_KEY *key); + int EC_KEY_check_key(const EC_KEY *key); + int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y); + + EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len); + int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out); + + EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len); + int i2d_ECParameters(EC_KEY *key, unsigned char **out); + + EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len); + int i2o_ECPublicKey(EC_KEY *key, unsigned char **out); + int ECParameters_print(BIO *bp, const EC_KEY *key); + int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); + int ECParameters_print_fp(FILE *fp, const EC_KEY *key); + int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); + #define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) + #define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) + + +=head1 DESCRIPTION + +This library provides an extensive set of functions for performing operations on elliptic curves over finite fields. +In general an elliptic curve is one with an equation of the form: + +y^2 = x^3 + ax + b + +An B structure is used to represent the definition of an elliptic curve. Points on a curve are stored using an +B structure. An B is used to hold a private/public key pair, where a private key is simply a BIGNUM and a +public key is a point on a curve (represented by an B). + +The library contains a number of alternative implementations of the different functions. Each implementation is optimised +for different scenarios. No matter which implementation is being used, the interface remains the same. The library +handles calling the correct implementation when an interface function is invoked. An implementation is represented by +an B structure. + +The creation and destruction of B objects is described in L. Functions for +manipulating B objects are described in L. + +Functions for creating, destroying and manipulating B objects are explained in L, +whilst functions for performing mathematical operations and tests on B are coverd in L. + +For working with private and public keys refer to L. Implementations are covered in +L. + +For information on encoding and decoding curve parameters to and from ASN1 see L. + +=head1 SEE ALSO + +L, L, L, +L, L, L, +L, L + + +=cut diff --git a/doc/gmssl/draft-shen-sm3-hash-01.txt b/doc/gmssl/draft-shen-sm3-hash-01.txt new file mode 100644 index 00000000..d16bc03a --- /dev/null +++ b/doc/gmssl/draft-shen-sm3-hash-01.txt @@ -0,0 +1,728 @@ + + + +Internet Engineering Task Force S. Shen, Ed. +Internet-Draft X. Lee, Ed. +Intended status: Standards Track Chinese Academy of Science +Expires: August 18, 2014 February 14, 2014 + + + SM3 Hash function + draft-shen-sm3-hash-01 + +Abstract + + This document discribles a hash function which is invented by Xiaoyun + Wang et al. This algorithm is published by Chinese Commercial + Cryptography Administration Office ([SM3]) for the use of electronic + authentication service system. This document gives IETF standard + description of the algorithm. + +Status of This Memo + + This Internet-Draft is submitted to IETF in full conformance with the + provisions of BCP 78 and BCP 79. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF). Note that other groups may also distribute + working documents as Internet-Drafts. The list of current Internet- + Drafts is at http://datatracker.ietf.org/drafts/current/. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + This Internet-Draft will expire on August 18, 2014. + +Copyright Notice + + Copyright (c) 2014 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + + +Shen & Lee Expires August 18, 2014 [Page 1] + +Internet-Draft SM3 Hash function February 2014 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 2. Conventions Used in this Document . . . . . . . . . . . . . . 3 + 3. Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 3.1. Scope of SM3 . . . . . . . . . . . . . . . . . . . . . . . 3 + 3.2. Definitions and Terms . . . . . . . . . . . . . . . . . . 3 + 3.3. Symbols . . . . . . . . . . . . . . . . . . . . . . . . . 4 + 3.3.1. Iteration Precedure . . . . . . . . . . . . . . . . . 4 + 3.3.2. Message Extension . . . . . . . . . . . . . . . . . . 4 + 3.3.3. Compression function . . . . . . . . . . . . . . . . . 4 + 3.3.4. Hash Value . . . . . . . . . . . . . . . . . . . . . . 5 + 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 5 + 5. Security Considerations . . . . . . . . . . . . . . . . . . . 5 + 6. References . . . . . . . . . . . . . . . . . . . . . . . . . . 5 + 6.1. Normative References . . . . . . . . . . . . . . . . . . . 5 + 6.2. Informative References . . . . . . . . . . . . . . . . . . 5 + Appendix A. Appendix A. Example 1 . . . . . . . . . . . . . . . . 6 + Appendix B. Appendix A. Example 2 . . . . . . . . . . . . . . . . 8 + Appendix C. Appendix C. Acknowledgments . . . . . . . . . . . . . 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Shen & Lee Expires August 18, 2014 [Page 2] + +Internet-Draft SM3 Hash function February 2014 + + +1. Introduction + + The algorithm described in this document is published ([SM3]) by + Chinese Commercial Cryptography Administration Office. This document + gives IETF standard description of these algorithms and parameters. + +2. Conventions Used in this Document + + The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" + in this document are to be interpreted as defined in "Key words for + use in RFCs to Indicate Requirement Levels" [RFC2119]. + +3. Algorithm + + This chatper introduced the algorithm itself. The content and + structure strictly follow what is published by Chinese Commercial + Cryptography Administration Office. + +3.1. Scope of SM3 + + This document defines SM3 Hash algorithms and gives computing + examples. It can be used in commercial cryptography applicaitons + like digital signature and verification, message authentication code + and verification, random number generation. This document can also + be technical reference of security product and standards in order to + improve the trustness and interoperability. + +3.2. Definitions and Terms + + + Bit String String composed of 0 and 1 + + Big-endian A format that describe the order in which data + are stored in computer memory. It defines that + the bytes with most significant value are stored + at the left and bytes with least significant value + are stored at the right. The high digits of a + number are stored at high storage address and + the low digits of a number are stored at low storage + address. + + Message Bit string with arbitary length. In this document a + message is consider the input of the hash algorithm. + + Hash Value The bit string which is the output after the hash algorithm + applied to a message. The length of the hash value in this + document is 256 bits. + + + + +Shen & Lee Expires August 18, 2014 [Page 3] + +Internet-Draft SM3 Hash function February 2014 + + + Word A bit string with length 32. + +3.3. Symbols + +3.3.1. Iteration Precedure + + The procedures are: Divide he message m' after padding into 512 bits + blocks: + + + m~ = B(0)B(1) ... B(n-1) where n=(l+k+65)/512 + + Apply iteration operation to m' as following: + + + FOR i=0 TO n-1 + V (i+1) = CF(V (i);B(i)) + ENDFOR + + where CF is compression function, V(0) is a 256 bits of IVAGBPA[not] + B(i) is a message block after padding, the result after iterative + compression is V(n). + +3.3.2. Message Extension + + Divide the message block B(i) into 132 words, apply the words into + the compression function: + + + a) divide message block B(i) into 16 words W0, W1, ... , W15. + b) FOR j=16 TO 67 + Wj < -- P1(WAGBPA"j-16AGBPA(C) XOR WAGBPA"j-9AGBPA(C) XOR (WAGBPA"j-3AGBPA(C)SHIFT15)) + XOR (WAGBPA"j-13AGBPA(C)SHIFT7) XOR WAGBPA"j-6AGBPA(C) + ENDFOR + c) FOR j=0 TO 63 + Wj~ = Wj XOR W(j+4) + ENDFOR + +3.3.3. Compression function + + Let A,B,C,D,E,F,G,H be registers to store words; SS1, SS2, TT1 and + TT2 be intermediate variable; compression function: + + + V(i+1) = CF(V(i);B(i)) where 0 A!U i A!U n + + The computation precedures are as following: + + + + +Shen & Lee Expires August 18, 2014 [Page 4] + +Internet-Draft SM3 Hash function February 2014 + + + ABCDEFGH < -- V(i) + FOR j=0 TO 63 + SS1 < -- ((A SHIFT12) + E + (Tj SHIFTj))?7 + SS2 < -- SS1 XOR (A SHIFT12) + TT1 < -- FFj(A,B,C) + D + SS2 +Wj~ + TT1 < -- GGj(E,F,G) + H + SS1 +Wj + D < -- C + C < -- B SHIFT9 + B < -- A + A < -- TT1 + H < -- G + G < -- F SHIFT19 + F < -- E + E < -- P0(TT2) + ENDFOR + V(i+1) < -- ABCDEFGH XOR V (i) + + where a word is stored in memory as big-endian format. + +3.3.4. Hash Value + + ABCDEFGH < -- V(n) + + The 256 bits of hash value is y=ABCDEFGH. + +4. IANA Considerations + + There is no iana related issue for this document. + +5. Security Considerations + + This document gives description of a cryptographic algorithm. Its + security properties are under public study. There are no known + feasible attacks against this algorithm by the time of publishing + this document. + +6. References + +6.1. Normative References + +6.2. Informative References + + [SM3] "http://www.oscca.gov.cn/UpFile/20101222141857786.pdf", , + December 2010. + + + + + + + +Shen & Lee Expires August 18, 2014 [Page 5] + +Internet-Draft SM3 Hash function February 2014 + + +Appendix A. Appendix A. Example 1 + + The input is "abc", which has ASCII expression: + + + 616263 + + The message after padding is: + + + 61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000018 + + The message after extension is: + + + W0W1...W67 + 61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000018 + 9092e200 00000000 000c0606 719c70ed 00000000 8001801f 939f7da9 00000000 + 2c6fa1f9 adaaef14 00000000 0001801e 9a965f89 49710048 23ce86a1 b2d12f1b + e1dae338 f8061807 055d68be 86cfd481 1f447d83 d9023dbf 185898e0 e0061807 + 050df55c cde0104c a5b9c955 a7df0184 6e46cd08 e3babdf8 70caa422 0353af50 + a92dbca1 5f33cfd2 e16f6e89 f70fe941 ca5462dc 85a90152 76af6296 c922bdb2 + 68378cf5 97585344 09008723 86faee74 2ab908b0 4a64bc50 864e6e08 f07e6590 + 325c8f78 accb8011 e11db9dd b99c0545 + W0'W1'...W63' + 61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000018 9092e200 00000000 000c0606 719c70f5 + 9092e200 8001801f 93937baf 719c70ed 2c6fa1f9 2dab6f0b 939f7da9 0001801e + b6f9fe70 e4dbef5c 23ce86a1 b2d0af05 7b4cbcb1 b177184f 2693ee1f 341efb9a + fe9e9ebb 210425b8 1d05f05e 66c9cc86 1a4988df 14e22df3 bde151b5 47d91983 + 6b4b3854 2e5aadb4 d5736d77 a48caed4 c76b71a9 bc89722a 91a5caab f45c4611 + 6379de7d da9ace80 97c00c1f 3e2d54f3 a263ee29 12f15216 7fafe5b5 4fd853c6 + 428e8445 dd3cef14 8f4ee92b 76848be4 18e587c8 e6af3c41 6753d7d5 49e260d5 + + The intermediate values during iterative compression are: + + +j A B C D E F G H + 7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e +0 b9edc12b 7380166f 29657292 172442d7 b2ad29f4 a96f30bc c550b189 e38dee4d +1 ea52428c b9edc12b 002cdee7 29657292 ac353a23 b2ad29f4 85e54b79 c550b189 +2 609f2850 ea52428c db825773 002cdee7 d33ad5fb ac353a23 4fa59569 85e54b79 +3 35037e59 609f2850 a48519d4 db825773 b8204b5f d33ad5fb d11d61a9 4fa59569 +4 1f995766 35037e59 3e50a0c1 a48519d4 8ad212ea b8204b5f afde99d6 d11d61a9 +5 374a0ca7 1f995766 06fcb26a 3e50a0c1 acf0f639 8ad212ea 5afdc102 afde99d6 +6 33130100 374a0ca7 32aecc3f 06fcb26a 3391ec8a acf0f639 97545690 5afdc102 + + + +Shen & Lee Expires August 18, 2014 [Page 6] + +Internet-Draft SM3 Hash function February 2014 + + +7 1022ac97 33130100 94194e6e 32aecc3f 367250a1 3391ec8a b1cd6787 97545690 +8 d47caf4c 1022ac97 26020066 94194e6e 6ad473a4 367250a1 64519c8f b1cd6787 +9 59c2744b d47caf4c 45592e20 26020066 c6a3ceae 6ad473a4 8509b392 64519c8f +10 481ba2a0 59c2744b f95e99a8 45592e20 02afb727 c6a3ceae 9d2356a3 8509b392 +11 694a3d09 481ba2a0 84e896b3 f95e99a8 9dd1b58c 02afb727 7576351e 9d2356a3 +12 89cbcd58 694a3d09 37454090 84e896b3 6370db62 9dd1b58c b938157d 7576351e +13 24c95abc 89cbcd58 947a12d2 37454090 1a4a2554 6370db62 ac64ee8d b938157d +14 7c529778 24c95abc 979ab113 947a12d2 3ee95933 1a4a2554 db131b86 ac64ee8d +15 34d1691e 7c529778 92b57849 979ab113 61f99646 3ee95933 2aa0d251 db131b86 +16 796afab1 34d1691e a52ef0f8 92b57849 067550f5 61f99646 c999f74a 2aa0d251 +17 7d27cc0e 796afab1 a2d23c69 a52ef0f8 b3c8669b 067550f5 b2330fcc c999f74a +18 d7820ad1 7d27cc0e d5f562f2 a2d23c69 575c37d8 b3c8669b 87a833aa b2330fcc +19 f84fd372 d7820ad1 4f981cfa d5f562f2 a5dceaf1 575c37d8 34dd9e43 87a833aa +20 02c57896 f84fd372 0415a3af 4f981cfa 74576681 a5dceaf1 bec2bae1 34dd9e43 +21 4d0c2fcd 02c57896 9fa6e5f0 0415a3af 576f1d09 74576681 578d2ee7 bec2bae1 +22 eeeec41a 4d0c2fcd 8af12c05 9fa6e5f0 b5523911 576f1d09 340ba2bb 578d2ee7 +23 f368da78 eeeec41a 185f9a9a 8af12c05 6a879032 b5523911 e84abb78 340ba2bb +24 15ce1286 f368da78 dd8835dd 185f9a9a 62063354 6a879032 c88daa91 e84abb78 +25 c3fd31c2 15ce1286 d1b4f1e6 dd8835dd 4db58f43 62063354 8193543c c88daa91 +26 6243be5e c3fd31c2 9c250c2b d1b4f1e6 131152fe 4db58f43 9aa31031 8193543c +27 a549beaa 6243be5e fa638587 9c250c2b cf65e309 131152fe 7a1a6dac 9aa31031 +28 e11eb847 a549beaa 877cbcc4 fa638587 e5b64e96 cf65e309 97f0988a 7a1a6dac +29 ff9bac9d e11eb847 937d554a 877cbcc4 9811b46d e5b64e96 184e7b2f 97f0988a +30 a5a4a2b3 ff9bac9d 3d708fc2 937d554a e92df4ea 9811b46d 74b72db2 184e7b2f +31 89a13e59 a5a4a2b3 37593bff 3d708fc2 0a1ff572 e92df4ea a36cc08d 74b72db2 +32 3720bd4e 89a13e59 4945674b 37593bff cf7d1683 0a1ff572 a757496f a36cc08d +33 9ccd089c 3720bd4e 427cb313 4945674b da8c835f cf7d1683 ab9050ff a757496f +34 c7a0744d 9ccd089c 417a9c6e 427cb313 0958ff1b da8c835f b41e7be8 ab9050ff +35 d955c3ed c7a0744d 9a113939 417a9c6e c533f0ff 0958ff1b 1afed464 b41e7be8 +36 e142d72b d955c3ed 40e89b8f 9a113939 d4509586 c533f0ff f8d84ac7 1afed464 +37 e7250598 e142d72b ab87dbb2 40e89b8f c7f93fd3 d4509586 87fe299f f8d84ac7 +38 2f13c4ad e7250598 85ae57c2 ab87dbb2 1a6cabc9 c7f93fd3 ac36a284 87fe299f +39 19f363f9 2f13c4ad 4a0b31ce 85ae57c2 c302badb 1a6cabc9 fe9e3fc9 ac36a284 +40 55e1dde2 19f363f9 27895a5e 4a0b31ce 459daccf c302badb 5e48d365 fe9e3fc9 +41 d4f4efe3 55e1dde2 e6c7f233 27895a5e 5cfba85a 459daccf d6de1815 5e48d365 +42 48dcbc62 d4f4efe3 c3bbc4ab e6c7f233 6f49c7bb 5cfba85a 667a2ced d6de1815 +43 8237b8a0 48dcbc62 e9dfc7a9 c3bbc4ab d89d2711 6f49c7bb 42d2e7dd 667a2ced +44 d8685939 8237b8a0 b978c491 e9dfc7a9 8ee87df5 d89d2711 3ddb7a4e 42d2e7dd +45 d2090a86 d8685939 6f714104 b978c491 2e533625 8ee87df5 388ec4e9 3ddb7a4e +46 e51076b3 d2090a86 d0b273b0 6f714104 d9f89e61 2e533625 efac7743 388ec4e9 +47 47c5be50 e51076b3 12150da4 d0b273b0 3567734e d9f89e61 b1297299 efac7743 +48 abddbdc8 47c5be50 20ed67ca 12150da4 3dfcdd11 3567734e f30ecfc4 b1297299 +49 bd708003 abddbdc8 8b7ca08f 20ed67ca 93494bc0 3dfcdd11 9a71ab3b f30ecfc4 +50 15e2f5d3 bd708003 bb7b9157 8b7ca08f c3956c3f 93494bc0 e889efe6 9a71ab3b +51 13826486 15e2f5d3 e100077a bb7b9157 cd09a51c c3956c3f 5e049a4a e889efe6 +52 4a00ed2f 13826486 c5eba62b e100077a 0741f675 cd09a51c 61fe1cab 5e049a4a +53 f4412e82 4a00ed2f 04c90c27 c5eba62b 7429807c 0741f675 28e6684d 61fe1cab +54 549db4b7 f4412e82 01da5e94 04c90c27 f6bc15ed 7429807c b3a83a0f 28e6684d + + + +Shen & Lee Expires August 18, 2014 [Page 7] + +Internet-Draft SM3 Hash function February 2014 + + +55 22a79585 549db4b7 825d05e8 01da5e94 9d4db19a f6bc15ed 03e3a14c b3a83a0f +56 30245b78 22a79585 3b696ea9 825d05e8 f6804c82 9d4db19a af6fb5e0 03e3a14c +57 6598314f 30245b78 4f2b0a45 3b696ea9 f522adb2 f6804c82 8cd4ea6d af6fb5e0 +58 c3d629a9 6598314f 48b6f060 4f2b0a45 14fb0764 f522adb2 6417b402 8cd4ea6d +59 ddb0a26a c3d629a9 30629ecb 48b6f060 589f7d5c 14fb0764 6d97a915 6417b402 +60 71034d71 ddb0a26a ac535387 30629ecb 14d5c7f6 589f7d5c 3b20a7d8 6d97a915 +61 5e636b4b 71034d71 6144d5bb ac535387 09ccd95e 14d5c7f6 eae2c4fb 3b20a7d8 +62 2bfa5f60 5e636b4b 069ae2e2 6144d5bb 4ac3cf08 09ccd95e 3fb0a6ae eae2c4fb +63 1547e69b 2bfa5f60 c6d696bc 069ae2e2 e808f43b 4ac3cf08 caf04e66 3fb0a6ae + + The hash value is: + + + 66c7f0f4 62eeedd9 d1f2d46b dc10e4e2 4167c487 5cf2f7a2 297da02b 8f4ba8e0 + +Appendix B. Appendix A. Example 2 + + A message of 512 bits: + + + 61626364 61626364 61626364 61626364 61626364 61626364 61626364 61626364 + 61626364 61626364 61626364 61626364 61626364 61626364 61626364 61626364 + + The message after padding is: + + + 61626364 61626364 61626364 61626364 61626364 61626364 61626364 61626364 + 61626364 61626364 61626364 61626364 61626364 61626364 61626364 61626364 + 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000200 + + The first message block: + + + + + + + + + + + + + + + + + + + +Shen & Lee Expires August 18, 2014 [Page 8] + +Internet-Draft SM3 Hash function February 2014 + + + The message after padding: + W0W1...W67 + 61626364 61626364 61626364 61626364 61626364 61626364 61626364 61626364 + 61626364 61626364 61626364 61626364 61626364 61626364 61626364 61626364 + a121a024 a121a024 a121a024 6061e0e5 6061e0e5 6061e0e5 a002e345 a002e345 + a002e345 49c969ed 49c969ed 49c969ed 85ae5679 a44ff619 a44ff619 694b6244 + e8c8e0c4 e8c8e0c4 240e103e 346e603e 346e603e 9a517ab5 8a01aa25 8a01aa25 + 0607191c 25f8a37a d528936a 89fbd8ae 00606206 10501256 7cff7ef9 3c78b9f9 + cc2b8a69 9f03f169 df45be20 9ec5bee1 0a212906 49ff72c0 46717241 67e09a19 + 6efaa333 2ebae676 3475c386 201dcff6 2f18fccf 2c5f2b5c a80b9f38 bc139f34 + c47f18a7 a25ce71d 42743705 51baf619 + W0'W1'...W63' + 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 c043c340 c043c340 c043c340 01038381 + c14040c1 c14040c1 01234361 c06303a0 c06303a0 29a88908 e9cb8aa8 e9cb8aa8 + 25acb53c ed869ff4 ed869ff4 20820ba9 6d66b6bd 4c8716dd 8041e627 5d25027a + dca680fa 72999a71 ae0fba1b be6fca1b 32697922 bfa9d9cf 5f29394f 03fa728b + 06677b1a 35a8b12c a9d7ed93 b5836157 cc4be86f 8f53e33f a3bac0d9 a2bd0718 + c60aa36f d6fc83a9 9934cc61 f92524f8 64db8a35 674594b6 7204b1c7 47fd55ef + 41e25ffc 02e5cd2a 9c7e5cbe 9c0e50c2 eb67e468 8e03cc41 ea7fa83d eda9692d + + The message after extension is: + + + W0W1...W67 + 61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000018 + 9092e200 00000000 000c0606 719c70ed 00000000 8001801f 939f7da9 00000000 + 2c6fa1f9 adaaef14 00000000 0001801e 9a965f89 49710048 23ce86a1 b2d12f1b + e1dae338 f8061807 055d68be 86cfd481 1f447d83 d9023dbf 185898e0 e0061807 + 050df55c cde0104c a5b9c955 a7df0184 6e46cd08 e3babdf8 70caa422 0353af50 + a92dbca1 5f33cfd2 e16f6e89 f70fe941 ca5462dc 85a90152 76af6296 c922bdb2 + 68378cf5 97585344 09008723 86faee74 2ab908b0 4a64bc50 864e6e08 f07e6590 + 325c8f78 accb8011 e11db9dd b99c0545 + W0'W1'...W63' + 61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000018 9092e200 00000000 000c0606 719c70f5 + 9092e200 8001801f 93937baf 719c70ed 2c6fa1f9 2dab6f0b 939f7da9 0001801e + b6f9fe70 e4dbef5c 23ce86a1 b2d0af05 7b4cbcb1 b177184f 2693ee1f 341efb9a + fe9e9ebb 210425b8 1d05f05e 66c9cc86 1a4988df 14e22df3 bde151b5 47d91983 + 6b4b3854 2e5aadb4 d5736d77 a48caed4 c76b71a9 bc89722a 91a5caab f45c4611 + 6379de7d da9ace80 97c00c1f 3e2d54f3 a263ee29 12f15216 7fafe5b5 4fd853c6 + 428e8445 dd3cef14 8f4ee92b 76848be4 18e587c8 e6af3c41 6753d7d5 49e260d5 + + The intermediate values during iterative compression are: + + +j A B C D E F G H + + + +Shen & Lee Expires August 18, 2014 [Page 9] + +Internet-Draft SM3 Hash function February 2014 + + + 7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e +0 588b5dab 7380166f 29657292 172442d7 b2e561d0 a96f30bc c550b189 e38dee4d +1 b31cecd3 588b5dab 002cdee7 29657292 887cdf53 b2e561d0 85e54b79 c550b189 +2 087b31df b31cecd3 16bb56b1 002cdee7 5234344f 887cdf53 0e85972b 85e54b79 +3 17448b12 087b31df 39d9a766 16bb56b1 16372ca6 5234344f fa9c43e6 0e85972b +4 dca06de5 17448b12 f663be10 39d9a766 f7bc113c 16372ca6 a27a91a1 fa9c43e6 +5 8eb847a3 dca06de5 8916242e f663be10 9fe64fb1 f7bc113c 6530b1b9 a27a91a1 +6 0e0f1218 8eb847a3 40dbcbb9 8916242e 57e5fc4e 9fe64fb1 89e7bde0 6530b1b9 +7 ada83827 0e0f1218 708f471d 40dbcbb9 55eb8591 57e5fc4e 7d8cff32 89e7bde0 +8 6e12c163 ada83827 1e24301c 708f471d c26a14b8 55eb8591 e272bf2f 7d8cff32 +9 f7578117 6e12c163 50704f5b 1e24301c 3433dd28 c26a14b8 2c8aaf5c e272bf2f +10 bc497c66 f7578117 2582c6dc 50704f5b 4f85c749 3433dd28 a5c61350 2c8aaf5c +11 ecc59168 bc497c66 af022fee 2582c6dc 8ce5ee61 4f85c749 e941a19e a5c61350 +12 63723715 ecc59168 92f8cd78 af022fee 38e2aa27 8ce5ee61 3a4a7c2e e941a19e +13 e57bfbf8 63723715 8b22d1d9 92f8cd78 542318e7 38e2aa27 730c672f 3a4a7c2e +14 8ba504b1 e57bfbf8 e46e2ac6 8b22d1d9 a8c73777 542318e7 5139c715 730c672f +15 b6a4be20 8ba504b1 f7f7f1ca e46e2ac6 8ae4d7a0 a8c73777 c73aa118 5139c715 +16 c0a0e3f7 b6a4be20 4a096317 f7f7f1ca f671e12a 8ae4d7a0 bbbd4639 c73aa118 +17 68ef7357 c0a0e3f7 497c416d 4a096317 673f9d46 f671e12a bd045726 bbbd4639 +18 4c6499d3 68ef7357 41c7ef81 497c416d f01924a3 673f9d46 0957b38f bd045726 +19 9f532735 4c6499d3 dee6aed1 41c7ef81 71c6ef02 f01924a3 ea3339fc 0957b38f +20 231d84bd 9f532735 c933a698 dee6aed1 108149de 71c6ef02 251f80c9 ea3339fc +21 6a203212 231d84bd a64e6b3e c933a698 90c31af9 108149de 78138e37 251f80c9 +22 175c3b57 6a203212 3b097a46 a64e6b3e 508f82d2 90c31af9 4ef0840a 78138e37 +23 cdcbabd5 175c3b57 406424d4 3b097a46 b5a2f2fb 508f82d2 d7cc8618 4ef0840a +24 7dd941f8 cdcbabd5 b876ae2e 406424d4 a541cb9b b5a2f2fb 1692847c d7cc8618 +25 eaf54f3e 7dd941f8 9757ab9b b876ae2e 912d4e17 a541cb9b 97ddad17 1692847c +26 f7310a83 eaf54f3e b283f0fb 9757ab9b b43da5e9 912d4e17 5cdd2a0e 97ddad17 +27 f8441d7e f7310a83 ea9e7dd5 b283f0fb cf194872 b43da5e9 70bc896a 5cdd2a0e +28 270dce67 f8441d7e 621507ee ea9e7dd5 7564b6c0 cf194872 2f4da1ed 70bc896a +29 ac12a6c0 270dce67 883afdf0 621507ee 964015e3 7564b6c0 439678ca 2f4da1ed +30 1bd9e6e3 ac12a6c0 1b9cce4e 883afdf0 0fac4cad 964015e3 b603ab25 439678ca +31 32418d74 1bd9e6e3 254d8158 1b9cce4e 3f717698 0fac4cad af1cb200 b603ab25 +32 9c89b505 32418d74 b3cdc637 254d8158 38766abf 3f717698 65687d62 af1cb200 +33 3c60352a 9c89b505 831ae864 b3cdc637 8aedd93b 38766abf b4c1fb8b 65687d62 +34 2a116c70 3c60352a 136a0b39 831ae864 476048d4 8aedd93b 55f9c3b3 b4c1fb8b +35 a0c7c66f 2a116c70 c06a5478 136a0b39 b47a7dc5 476048d4 c9dc576e 55f9c3b3 +36 b7e58f33 a0c7c66f 22d8e054 c06a5478 3a3537a9 b47a7dc5 46a23b02 c9dc576e +37 79baf4ca b7e58f33 8f8cdf41 22d8e054 9455b731 3a3537a9 ee2da3d3 46a23b02 +38 ad5b0bcf 79baf4ca cb1e676f 8f8cdf41 289d35e0 9455b731 bd49d1a9 ee2da3d3 +39 a167bd76 ad5b0bcf 75e994f3 cb1e676f da27276b 289d35e0 b98ca2ad bd49d1a9 +40 2ccc1878 a167bd76 b6179f5a 75e994f3 7eded43b da27276b af0144e9 b98ca2ad +41 610c6084 2ccc1878 cf7aed42 b6179f5a 9da32cab 7eded43b 3b5ed139 af0144e9 +42 a40209fe 610c6084 9830f059 cf7aed42 7d483846 9da32cab a1dbf6f6 3b5ed139 +43 6fa376a2 a40209fe 18c108c2 9830f059 12a851cf 7d483846 655ced19 a1dbf6f6 +44 53f9ffc5 6fa376a2 0413fd48 18c108c2 c3d3327b 12a851cf c233ea41 655ced19 +45 4f60bbd5 53f9ffc5 46ed44df 0413fd48 f3cae7e6 c3d3327b 8e789542 c233ea41 +46 6e89a7fb 4f60bbd5 f3ff8aa7 46ed44df 17394ca0 f3cae7e6 93de1e99 8e789542 + + + +Shen & Lee Expires August 18, 2014 [Page 10] + +Internet-Draft SM3 Hash function February 2014 + + +47 fef3cb16 6e89a7fb c177aa9e f3ff8aa7 4a9e594f 17394ca0 3f379e57 93de1e99 +48 fa8e6731 fef3cb16 134ff6dd c177aa9e 7d9e1966 4a9e594f 6500b9ca 3f379e57 +49 08a826c3 fa8e6731 e7962dfd 134ff6dd ebfa90cc 7d9e1966 ca7a54f2 6500b9ca +50 614c7627 08a826c3 1cce63f5 e7962dfd 969ecf53 ebfa90cc cb33ecf0 ca7a54f2 +51 d776618d 614c7627 504d8611 1cce63f5 423489f6 969ecf53 86675fd4 cb33ecf0 +52 ef958266 d776618d 98ec4ec2 504d8611 6ef4554d 423489f6 7a9cb4f6 86675fd4 +53 04b44fd2 ef958266 ecc31bae 98ec4ec2 290032b5 6ef4554d 4fb211a4 7a9cb4f6 +54 008d6012 04b44fd2 2b04cddf ecc31bae 50aa1faa 290032b5 aa6b77a2 4fb211a4 +55 57859fec 008d6012 689fa409 2b04cddf c00cd655 50aa1faa 95a94801 aa6b77a2 +56 c864420d 57859fec 1ac02401 689fa409 2fb3c502 c00cd655 fd528550 95a94801 +57 e7423482 c864420d 0b3fd8af 1ac02401 aac3b183 2fb3c502 b2ae0066 fd528550 +58 5c5be9dd e7423482 c8841b90 0b3fd8af 8b1ba117 aac3b183 28117d9e b2ae0066 +59 ebd4948c 5c5be9dd 846905ce c8841b90 74a75fe1 8b1ba117 8c1d561d 28117d9e +60 05627b53 ebd4948c b7d3bab8 846905ce f58d98d8 74a75fe1 08bc58dd 8c1d561d +61 28aaec87 05627b53 a92919d7 b7d3bab8 cc6b5f2a f58d98d8 ff0ba53a 08bc58dd +62 0f92d652 28aaec87 c4f6a60a a92919d7 b8ab6d40 cc6b5f2a c6c7ac6c ff0ba53a +63 2ad0c8ee 0f92d652 55d90e51 c4f6a60a 69caa1b7 b8ab6d40 f956635a c6c7ac6c + + The second message block: + + + The message after padding: + W0W1...W67 + 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000200 + 80404000 00000000 01008080 10005000 00000000 002002a0 ac545c04 00000000 + 09582a39 a0003000 00000000 00200280 a4515804 20200040 51609838 30005701 + a0002000 008200aa 6ad525d0 0a0e0216 b0f52042 fa7073b0 20000000 008200a8 + 7a542590 22a20044 d5d6ebd2 82005771 8a202240 b42826aa eaf84e59 4898eaf9 + 8207283d ee6775fa a3e0e0a0 8828488a 23b45a5d 628a22c4 8d6d0615 38300a7e + e96260e5 2b60c020 502ed531 9e878cb9 218c38f8 dcae3cb7 2a3e0e0a e9e0c461 + 8c3e3831 44aaa228 dc60a38b 518300f7 + W0'W1'...W63' + 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000200 80404000 00000000 01008080 10005200 + 80404000 002002a0 ad54dc84 10005000 09582a39 a02032a0 ac545c04 00200280 + ad09723d 80203040 51609838 30205581 04517804 20a200ea 3bb5bde8 3a0e5517 + 10f50042 faf2731a 4ad525d0 0a8c02be caa105d2 d8d273f4 f5d6ebd2 828257d9 + f07407d0 968a26ee 3f2ea58b ca98bd88 08270a7d 5a4f5350 4918aef9 c0b0a273 + a1b37260 8ced573e 2e8de6b5 b01842f4 cad63ab8 49eae2e4 dd43d324 a6b786c7 + c8ee581d f7cefc97 7a10db3b 776748d8 adb200c9 98049e9f f65ead81 b863c496 + + The intermediate values during iterative compression are: + + +j A B C D E F G H + 5950de81 468664eb 42fd4c86 1e7ca00a c0a5910b ae9a55ea 1adb8d17 763ca222 +0 1cc66027 5950de81 0cc9d68d 42fd4c86 24fe81a1 c0a5910b af5574d2 1adb8d17 + + + +Shen & Lee Expires August 18, 2014 [Page 11] + +Internet-Draft SM3 Hash function February 2014 + + +1 b7197324 1cc66027 a1bd02b2 0cc9d68d 61b7397a 24fe81a1 885e052c af5574d2 +2 b1aacb3f b7197324 8cc04e39 a1bd02b2 4c7cbb59 61b7397a 0d0927f4 885e052c +3 920d5d4d b1aacb3f 32e6496e 8cc04e39 c6c863a3 4c7cbb59 cbd30db9 0d0927f4 +4 03162191 920d5d4d 55967f63 32e6496e dbcb73dd c6c863a3 daca63e5 cbd30db9 +5 cbfddbb7 03162191 1aba9b24 55967f63 6a6eaafb dbcb73dd 1d1e3643 daca63e5 +6 67f45147 cbfddbb7 2c432206 1aba9b24 e0cc5b97 6a6eaafb 9eeede5b 1d1e3643 +7 dfc06393 67f45147 fbb76f97 2c432206 9d84a8d5 e0cc5b97 57db5375 9eeede5b +8 777f980d dfc06393 e8a28ecf fbb76f97 89d0a059 9d84a8d5 dcbf0662 57db5375 +9 502a9be2 777f980d 80c727bf e8a28ecf befc3eda 89d0a059 46acec25 dcbf0662 +10 df0f77ed 502a9be2 ff301aee 80c727bf c8b999f7 befc3eda 02cc4e85 46acec25 +11 b8bc2801 df0f77ed 5537c4a0 ff301aee 3a05da38 c8b999f7 f6d5f7e1 02cc4e85 +12 5b3baaa5 b8bc2801 1eefdbbe 5537c4a0 eebf718f 3a05da38 cfbe45cc f6d5f7e1 +13 0f7185e4 5b3baaa5 78500371 1eefdbbe f3fbf969 eebf718f d1c1d02e cfbe45cc +14 141cb1e7 0f7185e4 77554ab6 78500371 5cc495db f3fbf969 8c7f75fb d1c1d02e +15 f185448a 141cb1e7 e30bc81e 77554ab6 32028d02 5cc495db cb4f9fdf 8c7f75fb +16 a7374acd f185448a 3963ce28 e30bc81e 3d03e81b 32028d02 aedae624 cb4f9fdf +17 aaca2dcb a7374acd 0a8915e3 3963ce28 130bc932 3d03e81b 68119014 aedae624 +18 3d2dfd31 aaca2dcb 6e959b4e 0a8915e3 07fff8f8 130bc932 40d9e81f 68119014 +19 15bab3e6 3d2dfd31 945b9755 6e959b4e 85b2dd34 07fff8f8 4990985e 40d9e81f +20 f477625b 15bab3e6 5bfa627a 945b9755 d2b3c82b 85b2dd34 c7c03fff 4990985e +21 ecbfba29 f477625b 7567cc2b 5bfa627a 604bda38 d2b3c82b e9a42d96 c7c03fff +22 b9f6943d ecbfba29 eec4b7e8 7567cc2b e996d68b 604bda38 415e959e e9a42d96 +23 c537ac67 b9f6943d 7f7453d9 eec4b7e8 7f6c2bc6 e996d68b d1c3025e 415e959e +24 c59665b3 c537ac67 ed287b73 7f7453d9 1a89ef0d 7f6c2bc6 b45f4cb6 d1c3025e +25 50115e1f c59665b3 6f58cf8a ed287b73 3ddf2899 1a89ef0d 5e33fb61 b45f4cb6 +26 44196085 50115e1f 2ccb678b 6f58cf8a 0abc22da 3ddf2899 7868d44f 5e33fb61 +27 bde4e355 44196085 22bc3ea0 2ccb678b da96412a 0abc22da 44c9eef9 7868d44f +28 ca176dca bde4e355 32c10a88 22bc3ea0 b418ac1b da96412a 16d055e1 44c9eef9 +29 541e456e ca176dca c9c6ab7b 32c10a88 35cf8215 b418ac1b 0956d4b2 16d055e1 +30 b6feeef7 541e456e 2edb9594 c9c6ab7b d41f5fda 35cf8215 60dda0c5 0956d4b2 +31 026e42f7 b6feeef7 3c8adca8 2edb9594 c9436b11 d41f5fda 10a9ae7c 60dda0c5 +32 8fd27582 026e42f7 fdddef6d 3c8adca8 a48dc4c2 c9436b11 fed6a0fa 10a9ae7c +33 2527f8c6 8fd27582 dc85ee04 fdddef6d b29dc9d4 a48dc4c2 588e4a1b fed6a0fa +34 3218579f 2527f8c6 a4eb051f dc85ee04 0da81ad7 b29dc9d4 2615246e 588e4a1b +35 35421cf3 3218579f 4ff18c4a a4eb051f 644b37e4 0da81ad7 4ea594ee 2615246e +36 12cb048f 35421cf3 30af3e64 4ff18c4a 107cb2fb 644b37e4 d6b86d40 4ea594ee +37 c6716749 12cb048f 8439e66a 30af3e64 7903974d 107cb2fb bf232259 d6b86d40 +38 66bf4600 c6716749 96091e25 8439e66a e5575380 7903974d 97d883e5 bf232259 +39 046516a9 66bf4600 e2ce938c 96091e25 e23d4f18 e5575380 ba6bc81c 97d883e5 +40 e14ab898 046516a9 7e8c00cd e2ce938c 6e25affe e23d4f18 9c072aba ba6bc81c +41 bc44d883 e14ab898 ca2d5208 7e8c00cd 4ef0cb38 6e25affe 78c711ea 9c072aba +42 e017c779 bc44d883 957131c2 ca2d5208 10132c10 4ef0cb38 7ff3712d 78c711ea +43 11154e38 e017c779 89b10778 957131c2 c1d401bd 10132c10 59c27786 7ff3712d +44 3ba43e10 11154e38 2f8ef3c0 89b10778 953c1e65 c1d401bd 60808099 59c27786 +45 445e8d34 3ba43e10 2a9c7022 2f8ef3c0 94bcdd11 953c1e65 0dee0ea0 60808099 +46 34d09ee0 445e8d34 487c2077 2a9c7022 1d0ea72c 94bcdd11 f32ca9e0 0dee0ea0 +47 18c77c40 34d09ee0 bd1a6888 487c2077 a8ca98c6 1d0ea72c e88ca5e6 f32ca9e0 +48 a2507cea 18c77c40 a13dc069 bd1a6888 9845362a a8ca98c6 3960e875 e88ca5e6 + + + +Shen & Lee Expires August 18, 2014 [Page 12] + +Internet-Draft SM3 Hash function February 2014 + + +49 7e014176 a2507cea 8ef88031 a13dc069 2cb0c2f2 9845362a c6354654 3960e875 +50 eb39074b 7e014176 a0f9d544 8ef88031 0df22b74 2cb0c2f2 b154c229 c6354654 +51 f67597e1 eb39074b 0282ecfc a0f9d544 8d4f6b2f 0df22b74 17916586 b154c229 +52 31e9309d f67597e1 720e97d6 0282ecfc eecf99be 8d4f6b2f 5ba06f91 17916586 +53 c6329c3c 31e9309d eb2fc3ec 720e97d6 c672ad96 eecf99be 597c6a7b 5ba06f91 +54 75cc3800 c6329c3c d2613a63 eb2fc3ec 8515c87f c672ad96 cdf7767c 597c6a7b +55 925156ad 75cc3800 6538798c d2613a63 150cbd57 8515c87f 6cb63395 cdf7767c +56 7d0de10b 925156ad 987000eb 6538798c 7ee47610 150cbd57 43fc28ae 6cb63395 +57 2066f136 7d0de10b a2ad5b24 987000eb 7d7aadcc 7ee47610 eab8a865 43fc28ae +58 85b31359 2066f136 1bc216fa a2ad5b24 07b9cfd1 7d7aadcc b083f723 eab8a865 +59 6cddcb93 85b31359 cde26c40 1bc216fa c43eb29c 07b9cfd1 6e63ebd5 b083f723 +60 23eff97d 6cddcb93 6626b30b cde26c40 1ea21d46 c43eb29c 7e883dce 6e63ebd5 +61 07bd4e82 23eff97d bb9726d9 6626b30b c8d6867c 1ea21d46 94e621f5 7e883dce +62 64f3dc4a 07bd4e82 dff2fa47 bb9726d9 96e4028f c8d6867c ea30f510 94e621f5 +63 87ee4178 64f3dc4a 7a9d040f dff2fa47 af7ee1ee 96e4028f 33e646b4 ea30f510 + + The hash value is: + + + debe9ff9 2275b8a1 38604889 c18e5a4d 6fdb70e5 387e5765 293dcba3 9c0c5732 + +Appendix C. Appendix C. Acknowledgments + + TBD + +Authors' Addresses + + Sean Shen (editor) + Chinese Academy of Science + No.4 South 4th Zhongguancun Street + Beijing, 100190 + China + + Phone: +86 10-58813038 + EMail: shenshuo@cnnic.cn + + + Xiaodong Lee (editor) + Chinese Academy of Science + No.4 South 4th Zhongguancun Street + Beijing, 100190 + China + + Phone: +86 10-58813038 + EMail: shenshuo@cnnic.cn + + + + + + +Shen & Lee Expires August 18, 2014 [Page 13] + diff --git a/engines/Makefile b/engines/Makefile index 5c2043db..a2bb0e7a 100644 --- a/engines/Makefile +++ b/engines/Makefile @@ -321,7 +321,8 @@ e_padlock.o: ../include/openssl/stack.h ../include/openssl/symhacks.h e_padlock.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h e_padlock.o: e_padlock.c e_skf.o: ../include/openssl/asn1.h ../include/openssl/bio.h -e_skf.o: ../include/openssl/buffer.h ../include/openssl/crypto.h +e_skf.o: ../include/openssl/buffer.h ../include/openssl/cbcmac.h +e_skf.o: ../include/openssl/cmac.h ../include/openssl/crypto.h e_skf.o: ../include/openssl/e_os2.h ../include/openssl/ec.h e_skf.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h e_skf.o: ../include/openssl/engine.h ../include/openssl/err.h @@ -329,13 +330,15 @@ e_skf.o: ../include/openssl/evp.h ../include/openssl/kdf.h e_skf.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h e_skf.o: ../include/openssl/objects.h ../include/openssl/opensslconf.h e_skf.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h -e_skf.o: ../include/openssl/pkcs7.h ../include/openssl/safestack.h -e_skf.o: ../include/openssl/sha.h ../include/openssl/sm1.h -e_skf.o: ../include/openssl/sm2.h ../include/openssl/sm3.h -e_skf.o: ../include/openssl/sm9.h ../include/openssl/sms4.h -e_skf.o: ../include/openssl/ssf33.h ../include/openssl/stack.h -e_skf.o: ../include/openssl/symhacks.h ../include/openssl/x509.h -e_skf.o: ../include/openssl/x509_vfy.h e_skf.c e_skf_err.h +e_skf.o: ../include/openssl/pkcs7.h ../include/openssl/rsa.h +e_skf.o: ../include/openssl/safestack.h ../include/openssl/sha.h +e_skf.o: ../include/openssl/skf.h ../include/openssl/skf_ex.h +e_skf.o: ../include/openssl/sm1.h ../include/openssl/sm2.h +e_skf.o: ../include/openssl/sm3.h ../include/openssl/sm9.h +e_skf.o: ../include/openssl/sms4.h ../include/openssl/ssf33.h +e_skf.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +e_skf.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h e_skf.c +e_skf.o: e_skf_err.h e_sureware.o: ../include/openssl/asn1.h ../include/openssl/bio.h e_sureware.o: ../include/openssl/bn.h ../include/openssl/buffer.h e_sureware.o: ../include/openssl/crypto.h ../include/openssl/dh.h diff --git a/engines/e_skf.c b/engines/e_skf.c index cdc09697..5a81f4d7 100644 --- a/engines/e_skf.c +++ b/engines/e_skf.c @@ -64,9 +64,11 @@ #include #include #include +#include #include #include -#include "e_skf_err.h" +#include "e_skf_err.c" +#include "../crypto/ecdsa/ecs_locl.h" static DEVHANDLE hDev = NULL; static HAPPLICATION hApp = NULL; @@ -118,12 +120,10 @@ static int open_dev(const char *devname) ESKFerr(ESKF_F_OPEN_DEV, ESKF_R_DEV_ALREADY_CONNECTED); return 0; } - if ((rv = SKF_ConnectDev((LPSTR)devname, &hDev)) != SAR_OK) { ESKFerr(ESKF_F_OPEN_DEV, ESKF_R_SKF_CONNECT_DEV_FAILED); return 0; } - if ((rv = SKF_GetDevInfo(hDev, &devInfo)) != SAR_OK) { ESKFerr(ESKF_F_OPEN_DEV, ESKF_R_SKF_GET_DEV_INFO_FAILED); return 0; @@ -380,70 +380,23 @@ static int skf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, ULONG rv; ULONG ulAlgID; - switch (EVP_CIPHER_CTX_nid(ctx)) { - case NID_ssf33_ecb: - ulAlgID = SGD_SSF33_ECB; - break; - case NID_ssf33_cbc: - ulAlgID = SGD_SSF33_CBC; - break; - case NID_ssf33_cfb128: - ulAlgID = SGD_SSF33_CFB; - break; - case NID_ssf33_ofb128: - ulAlgID = SGD_SSF33_OFB; - break; - - case NID_sm1_ecb: - ulAlgID = SGD_SM1_ECB; - break; - case NID_sm1_cbc: - ulAlgID = SGD_SM1_CBC; - break; - case NID_sm1_cfb128: - ulAlgID = SGD_SM1_CFB; - break; - case NID_sm1_ofb128: - ulAlgID = SGD_SM1_OFB; - break; - - case NID_sms4_ecb: - ulAlgID = SGD_SM4_ECB; - break; - case NID_sms4_cbc: - ulAlgID = SGD_SM4_CBC; - break; - case NID_sms4_cfb128: - ulAlgID = SGD_SM4_CFB; - break; - case NID_sms4_ofb128: - ulAlgID = SGD_SM4_OFB; - break; - - default: - OPENSSL_assert(0); + if (!SKF_nid_to_encparam(EVP_CIPHER_CTX_nid(ctx), &ulAlgID, NULL)) { return 0; } - - if ((rv = SKF_SetSymmKey(hDev, (BYTE *)key, ulAlgID, - (HANDLE *)&(ctx->cipher_data))) != SAR_OK) { + if ((rv = SKF_SetSymmKey(hDev, (BYTE *)key, ulAlgID, &(ctx->cipher_data))) != SAR_OK) { ESKFerr(ESKF_F_SKF_INIT_KEY, ESKF_R_SKF_SET_SYMMKEY_FAILED); return 0; } - return 1; } static int skf_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t len) { -/* ULONG rv; - EVP_SKF_KEY *dat = (EVP_SKF_KEY *)ctx->cipher_data; BLOCKCIPHERPARAM param; ULONG ulDataLen, ulEncryptedLen; BYTE block[MAX_IV_LEN] = {0}; - int i; memcpy(&(param.IV), ctx->iv, ctx->cipher->block_size); param.IVLen = ctx->cipher->block_size; @@ -451,11 +404,11 @@ static int skf_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, param.FeedBitLen = 0; if (ctx->encrypt) { - if ((rv = SKF_EncryptInit(dat->hKey, ¶m)) != SAR_OK) { + if ((rv = SKF_EncryptInit(ctx->cipher_data, param)) != SAR_OK) { return 0; } } else { - if ((rv = SKF_DecryptInit(dat->hKey, ¶m)) != SAR_OK) { + if ((rv = SKF_DecryptInit(ctx->cipher_data, param)) != SAR_OK) { return 0; } } @@ -463,12 +416,12 @@ static int skf_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, ulDataLen = len - len % ctx->cipher->block_size; if (ctx->encrypt) { - if ((rv = SKF_EncryptUpdate(hKey, in, ulDataLen, + if ((rv = SKF_EncryptUpdate(ctx->cipher_data, (BYTE *)in, ulDataLen, (BYTE *)out, &ulEncryptedLen)) != SAR_OK) { return 0; } } else { - if ((rv = SKF_DecryptUpdate(hKey, in, ulDataLen, + if ((rv = SKF_DecryptUpdate(ctx->cipher_data, (BYTE *)in, ulDataLen, (BYTE *)out, &ulEncryptedLen)) != SAR_OK) { return 0; } @@ -480,14 +433,13 @@ static int skf_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, memcpy(block, in, len - ulDataLen); if (ctx->encrypt) { - if ((rv = SKF_EncryptUpdate(hKey, block, ctx->cipher->block_size, + if ((rv = SKF_EncryptUpdate(ctx->cipher_data, block, ctx->cipher->block_size, out, &ulEncryptedLen)) != SAR_OK) { return 0; } } else { return 0; } -*/ return 1; } @@ -566,7 +518,6 @@ static int skf_ciphers(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, i case NID_ssf33_ofb128: *cipher = &skf_ssf33_ofb128; break; - case NID_sm1_ecb: *cipher = &skf_sm1_ecb; break; @@ -579,7 +530,6 @@ static int skf_ciphers(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, i case NID_sm1_ofb128: *cipher = &skf_sm1_ofb128; break; - case NID_sms4_ecb: *cipher = &skf_sms4_ecb; break; @@ -605,12 +555,10 @@ static int skf_ciphers(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, i int skf_rand_bytes(unsigned char *buf, int num) { ULONG rv; - if ((rv = SKF_GenRandom(hDev, buf, (ULONG)num)) != SAR_OK) { ESKFerr(ESKF_F_SKF_RAND_BYTES, ESKF_R_GEN_RANDOM_FAILED); return 0; } - return 1; } @@ -623,17 +571,13 @@ static RAND_METHOD skf_rand = { NULL, }; - static int skf_sm3_init(EVP_MD_CTX *ctx) { ULONG rv; - - if ((rv = SKF_DigestInit(hDev, SGD_SM3, NULL, NULL, 0, - (HANDLE *)&(ctx->md_data))) != SAR_OK) { + if ((rv = SKF_DigestInit(hDev, SGD_SM3, NULL, NULL, 0, &(ctx->md_data))) != SAR_OK) { ESKFerr(ESKF_F_SKF_SM3_INIT, ESKF_R_SKF_DIGEST_INIT_FAILED); return 0; } - return 1; } @@ -643,7 +587,7 @@ static int skf_sm3_update(EVP_MD_CTX *ctx, const void *data, size_t count) BYTE *pbData = (BYTE *)data; ULONG ulDataLen = (ULONG)count; - if ((rv = SKF_DigestUpdate((HANDLE)ctx->md_data, pbData, ulDataLen)) != SAR_OK) { + if ((rv = SKF_DigestUpdate(ctx->md_data, pbData, ulDataLen)) != SAR_OK) { ESKFerr(ESKF_F_SKF_SM3_UPDATE, ESKF_R_SKF_DIGEST_UPDATE_FAILED); return 0; } @@ -657,16 +601,16 @@ static int skf_sm3_final(EVP_MD_CTX *ctx, unsigned char *md) BYTE *pHashData = (BYTE *)md; ULONG ulHashLen = SM3_DIGEST_LENGTH; - if ((rv = SKF_DigestFinal((HANDLE)ctx->md_data, pHashData, &ulHashLen)) != SAR_OK) { + if ((rv = SKF_DigestFinal(ctx->md_data, pHashData, &ulHashLen)) != SAR_OK) { ESKFerr(ESKF_F_SKF_SM3_FINAL, ESKF_R_SKF_DIGEST_FINAL_FAILED); return 0; } - - if ((rv = SKF_CloseHandle((HANDLE)ctx->md_data)) != SAR_OK) { + if ((rv = SKF_CloseHandle(ctx->md_data)) != SAR_OK) { ESKFerr(ESKF_F_SKF_SM3_FINAL, ESKF_R_SKF_CLOSE_HANDLE_FAILED); return 0; } + ctx->md_data = NULL; return 1; } @@ -712,18 +656,23 @@ static int skf_digests(ENGINE *e, const EVP_MD **digest, const int **nids, int n static int skf_rsa_sign(int type, const unsigned char *m, unsigned int mlen, unsigned char *sig, unsigned int *siglen, const RSA *rsa) { - int ret = 0; ULONG rv; - BYTE *pbData = (BYTE *)m; - ULONG ulDataLen = (ULONG)mlen; - BYTE signature[256]; - ULONG ulSigLen; + BYTE *data = (BYTE *)m; + ULONG dataLen = (ULONG)mlen; + BYTE signature[1024]; + ULONG sigLen; - if ((rv = SKF_RSASignData(hContainer, pbData, ulDataLen, - signature, &ulSigLen)) != SAR_OK) { + /* we need to check if container type is RSA */ + + sigLen = (ULONG)sizeof(signature); + if ((rv = SKF_RSASignData(hContainer, data, dataLen, signature, &sigLen)) != SAR_OK) { + ESKFerr(ESKF_F_SKF_RSA_SIGN, ESKF_R_SIGN_FAILED); return 0; } + /* do we need to convert signature format? */ + memcpy(sig, signature, sigLen); + *siglen = (unsigned int)sigLen; return 1; } @@ -744,28 +693,36 @@ static RSA_METHOD skf_rsa = { NULL, }; +static ECDSA_METHOD skf_sm2sign = { + "SKF ECDSA method (SM2 signature)", + NULL, + NULL, + NULL, + 0, + NULL, +}; + + static ECDSA_SIG *skf_sm2_do_sign(const unsigned char *dgst, int dgstlen, const BIGNUM *a, const BIGNUM *b, EC_KEY *ec_key) { ECDSA_SIG *ret = NULL; - /* - ULONG rv; BYTE *pbDigest = (BYTE *)dgst; ULONG ulDigestLen = (ULONG)dgstlen; ECCSIGNATUREBLOB sigBlob; + ULONG rv; int ok = 0; - OPENSSL_assert(!a); - OPENSSL_assert(!b); - + if (a || b) { + } if ((rv = SKF_ECCSignData(hContainer, pbDigest, ulDigestLen, &sigBlob)) != SAR_OK) { goto end; } if (!(ret = ECDSA_SIG_new())) { goto end; } - if (!ECDSA_SIG_set_ECCSIGNATUREBLOB(group, ret, &sigBlob)) { + if (!ECDSA_SIG_set_ECCSIGNATUREBLOB(ret, &sigBlob)) { goto end; } @@ -776,22 +733,9 @@ end: ret = NULL; } - */ - ESKFerr(ESKF_F_SKF_SM2_DO_SIGN, ESKF_R_NOT_IMPLEMENTED); return ret; } -/* -static ECDSA_METHOD skf_sm2sign = { - "SKF ECDSA method (SM2 signature)", - NULL, - NULL, - NULL, - 0, - NULL, -}; -*/ - #ifdef OPENSSL_NO_DYNAMIC_ENGINE static ENGINE *engine_skf(void) { diff --git a/engines/e_skf_err.c b/engines/e_skf_err.c index 9af4ae64..458c44d4 100644 --- a/engines/e_skf_err.c +++ b/engines/e_skf_err.c @@ -111,6 +111,7 @@ static ERR_STRING_DATA ESKF_str_reasons[] = { {ERR_REASON(ESKF_R_INVALID_CTRL_CMD), "invalid ctrl cmd"}, {ERR_REASON(ESKF_R_NOT_IMPLEMENTED), "not implemented"}, {ERR_REASON(ESKF_R_PIN_NOT_VERIFIED), "pin not verified"}, + {ERR_REASON(ESKF_R_SIGN_FAILED), "sign failed"}, {ERR_REASON(ESKF_R_SKF_CLOSE_HANDLE_FAILED), "skf close handle failed"}, {ERR_REASON(ESKF_R_SKF_CONNECT_DEV_FAILED), "skf connect dev failed"}, {ERR_REASON(ESKF_R_SKF_DEV_AUTH_FAILED), "skf dev auth failed"}, diff --git a/engines/e_skf_err.h b/engines/e_skf_err.h index 9f78adc4..e0627cca 100644 --- a/engines/e_skf_err.h +++ b/engines/e_skf_err.h @@ -107,6 +107,7 @@ static void ERR_ESKF_error(int function, int reason, char *file, int line); # define ESKF_R_INVALID_CTRL_CMD 113 # define ESKF_R_NOT_IMPLEMENTED 100 # define ESKF_R_PIN_NOT_VERIFIED 114 +# define ESKF_R_SIGN_FAILED 130 # define ESKF_R_SKF_CLOSE_HANDLE_FAILED 124 # define ESKF_R_SKF_CONNECT_DEV_FAILED 115 # define ESKF_R_SKF_DEV_AUTH_FAILED 116 diff --git a/engines/skf/Makefile b/engines/skf/Makefile new file mode 100644 index 00000000..929fe54a --- /dev/null +++ b/engines/skf/Makefile @@ -0,0 +1,6 @@ +all: + gcc -c -Wall -Werror -fpic skf_dummy.c + gcc -shared -o libskf_dummy.so skf_dummy.o +clean: + rm -fr *.o *.so *.dylib *.lib + diff --git a/engines/skf/README.md b/engines/skf/README.md new file mode 100644 index 00000000..9b5cae98 --- /dev/null +++ b/engines/skf/README.md @@ -0,0 +1,13 @@ +# Vendor's SKF Implementation + +This folder can be used to hold vendors' SKF libraries (.so) and header files. +For testing the GmSSL SKF ENGINE, a dummy SKF implementation is also provided. +This dummy implementation will always success with `SAR_OK` returned. +If there is a `HANDLE` need to be initialized, it will be pointed to a new +alloced memory. The application need to call `SKF_CloseHandle` to free this +small piece memory. If a `ULONG` length need to be returned such as the +ciphertext size in the `SKF_Encrypt`, this value will be assigned a non-zero +integer value. Some of these values might be correct, but dont check them :) +Normally dummy will do nothing to the output buffer, so the result will be +incorrect, and will not check NULL pointers. + diff --git a/engines/skf/skf_dummy.c b/engines/skf/skf_dummy.c index cf3e23ad..02c4d8aa 100755 --- a/engines/skf/skf_dummy.c +++ b/engines/skf/skf_dummy.c @@ -50,8 +50,10 @@ */ #include +#include #include -#include "skf.h" +#include + #define DEV_NAME "skf-soft-token" #define DEV_NAME_LIST DEV_NAME"\0" @@ -61,14 +63,19 @@ #define CONTAINER_NAME_LIST CONTAINER_NAME"\0" +#define PRINT_LOG() \ + printf("skf_dummy engine: %s() called\n", __FUNCTION__) + ULONG DEVAPI SKF_WaitForDevEvent(LPSTR szDevName, ULONG *pulDevNameLen, ULONG *pulEvent) { + PRINT_LOG(); return SAR_NOTSUPPORTYETERR; } ULONG DEVAPI SKF_CancelWaitForDevEvent() { + PRINT_LOG(); return SAR_NOTSUPPORTYETERR; } @@ -76,23 +83,35 @@ ULONG DEVAPI SKF_EnumDev(BOOL bPresent, LPSTR szNameList, ULONG *pulSize) { + PRINT_LOG(); + *pulSize = sizeof(DEV_NAME_LIST); + if (szNameList) { + memcpy(szNameList, DEV_NAME_LIST, sizeof(DEV_NAME_LIST)); + } return SAR_OK; } ULONG DEVAPI SKF_ConnectDev(LPSTR szName, DEVHANDLE *phDev) { + PRINT_LOG(); + *phDev = malloc(256); return SAR_OK; } ULONG DEVAPI SKF_DisConnectDev(DEVHANDLE hDev) { + PRINT_LOG(); + if (hDev) { + free(hDev); + } return SAR_OK; } ULONG DEVAPI SKF_GetDevState(LPSTR szDevName, ULONG *pulDevState) { + PRINT_LOG(); if (!pulDevState) { return SAR_INVALIDPARAMERR; } @@ -103,6 +122,7 @@ ULONG DEVAPI SKF_GetDevState(LPSTR szDevName, ULONG DEVAPI SKF_SetLabel(DEVHANDLE hDev, LPSTR szLabel) { + PRINT_LOG(); return SAR_OK; } @@ -110,6 +130,7 @@ ULONG DEVAPI SKF_GetDevInfo(DEVHANDLE hDev, DEVINFO *pDevInfo) { DEVINFO devInfo; + PRINT_LOG(); bzero(&devInfo, sizeof(DEVINFO)); devInfo.Version.major = 1; @@ -138,11 +159,13 @@ ULONG DEVAPI SKF_GetDevInfo(DEVHANDLE hDev, ULONG DEVAPI SKF_LockDev(DEVHANDLE hDev, ULONG ulTimeOut) { + PRINT_LOG(); return SAR_OK; } ULONG DEVAPI SKF_UnlockDev(DEVHANDLE hDev) { + PRINT_LOG(); return SAR_OK; } @@ -152,6 +175,8 @@ ULONG DEVAPI SKF_Transmit(DEVHANDLE hDev, BYTE *pbData, ULONG *pulDataLen) { + PRINT_LOG(); + *pulDataLen = ulCommandLen; return SAR_OK; } @@ -159,6 +184,7 @@ ULONG DEVAPI SKF_ChangeDevAuthKey(DEVHANDLE hDev, BYTE *pbKeyValue, ULONG ulKeyLen) { + PRINT_LOG(); return SAR_OK; } @@ -166,6 +192,7 @@ ULONG DEVAPI SKF_DevAuth(DEVHANDLE hDev, BYTE *pbAuthData, ULONG ulLen) { + PRINT_LOG(); return SAR_OK; } @@ -175,6 +202,8 @@ ULONG DEVAPI SKF_ChangePIN(HAPPLICATION hApplication, LPSTR szNewPin, ULONG *pulRetryCount) { + PRINT_LOG(); + *pulRetryCount = 10; return SAR_OK; } @@ -184,7 +213,11 @@ LONG DEVAPI SKF_GetPINInfo(HAPPLICATION hApplication, ULONG *pulRemainRetryCount, BOOL *pbDefaultPin) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulMaxRetryCount = 10; + *pulRemainRetryCount = 10; + *pbDefaultPin = 0; + return SAR_OK; } ULONG DEVAPI SKF_VerifyPIN(HAPPLICATION hApplication, @@ -192,6 +225,8 @@ ULONG DEVAPI SKF_VerifyPIN(HAPPLICATION hApplication, LPSTR szPIN, ULONG *pulRetryCount) { + PRINT_LOG(); + *pulRetryCount = 10; return SAR_OK; } @@ -200,11 +235,14 @@ ULONG DEVAPI SKF_UnblockPIN(HAPPLICATION hApplication, LPSTR szNewUserPIN, ULONG *pulRetryCount) { + PRINT_LOG(); + *pulRetryCount = 10; return SAR_OK; } ULONG DEVAPI SKF_ClearSecureState(HAPPLICATION hApplication) { + PRINT_LOG(); return SAR_OK; } @@ -217,6 +255,8 @@ ULONG DEVAPI SKF_CreateApplication(DEVHANDLE hDev, DWORD dwCreateFileRights, HAPPLICATION *phApplication) { + PRINT_LOG(); + *phApplication = malloc(256); return SAR_OK; } @@ -224,6 +264,7 @@ ULONG DEVAPI SKF_EnumApplication(DEVHANDLE hDev, LPSTR szAppName, ULONG *pulSize) { + PRINT_LOG(); if (!szAppName) { *pulSize = sizeof(APP_NAME_LIST); return SAR_OK; @@ -238,6 +279,7 @@ ULONG DEVAPI SKF_EnumApplication(DEVHANDLE hDev, ULONG DEVAPI SKF_DeleteApplication(DEVHANDLE hDev, LPSTR szAppName) { + PRINT_LOG(); return SAR_OK; } @@ -245,75 +287,93 @@ ULONG DEVAPI SKF_OpenApplication(DEVHANDLE hDev, LPSTR szAppName, HAPPLICATION *phApplication) { - if (!phApplication) { - return SAR_INVALIDPARAMERR; - } + PRINT_LOG(); + *phApplication = malloc(256); return SAR_OK; } ULONG DEVAPI SKF_CloseApplication(HAPPLICATION hApplication) { + PRINT_LOG(); + if (hApplication) { + free(hApplication); + } return SAR_OK; } ULONG DEVAPI SKF_CreateFile(HAPPLICATION hApplication, LPSTR szFileName, - ULONG ulFileSize, + ULONG ulFileSize, ULONG ulReadRights, ULONG ulWriteRights) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } ULONG DEVAPI SKF_DeleteFile(HAPPLICATION hApplication, LPSTR szFileName) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } -ULONG DEVAPI SKF_EnumFiles(HAPPLICATION hApplication, +ULONG DEVAPI SKF_EnumFiles(HAPPLICATION hApplication, LPSTR szFileList, ULONG *pulSize) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulSize = sizeof("File1\0"); + if (szFileList) { + memcpy(szFileList, "File1\0", sizeof("File1\0")); + } + return SAR_OK; } ULONG DEVAPI SKF_GetFileInfo(HAPPLICATION hApplication, LPSTR szFileName, FILEATTRIBUTE *pFileInfo) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + bzero(pFileInfo, sizeof(*pFileInfo)); + return SAR_OK; } ULONG DEVAPI SKF_ReadFile(HAPPLICATION hApplication, LPSTR szFileName, - ULONG ulOffset, - ULONG ulSize, - BYTE * pbOutData, + ULONG ulOffset, + ULONG ulSize, + BYTE * pbOutData, ULONG *pulOutLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulOutLen = ulSize; + return SAR_OK; } -ULONG DEVAPI SKF_WriteFile(HAPPLICATION hApplication, +ULONG DEVAPI SKF_WriteFile(HAPPLICATION hApplication, LPSTR szFileName, - ULONG ulOffset, + ULONG ulOffset, BYTE *pbData, ULONG ulSize) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } ULONG DEVAPI SKF_CreateContainer(HAPPLICATION hApplication, LPSTR szContainerName, HCONTAINER *phContainer) { + PRINT_LOG(); + *phContainer = malloc(256); return SAR_OK; } -ULONG DEVAPI SKF_DeleteContainer(HAPPLICATION hApplication, +ULONG DEVAPI SKF_DeleteContainer(HAPPLICATION hApplication, LPSTR szContainerName) { + PRINT_LOG(); return SAR_OK; } @@ -321,6 +381,7 @@ ULONG DEVAPI SKF_EnumContainer(HAPPLICATION hApplication, LPSTR szContainerName, ULONG *pulSize) { + PRINT_LOG(); if (!pulSize) { return SAR_INVALIDPARAMERR; } @@ -339,29 +400,32 @@ ULONG DEVAPI SKF_OpenContainer(HAPPLICATION hApplication, LPSTR szContainerName, HCONTAINER *phContainer) { + PRINT_LOG(); + *phContainer = malloc(256); return SAR_OK; } ULONG DEVAPI SKF_CloseContainer(HCONTAINER hContainer) { + PRINT_LOG(); + free(hContainer); return SAR_OK; } ULONG DEVAPI SKF_GetContainerType(HCONTAINER hContainer, ULONG *pulContainerType) { - if (!pulContainerType) { - return SAR_INVALIDPARAMERR; - } + PRINT_LOG(); *pulContainerType = CONTAINER_TYPE_ECC; return SAR_OK; } -ULONG DEVAPI SKF_ImportCertificate(HCONTAINER hContainer, +ULONG DEVAPI SKF_ImportCertificate(HCONTAINER hContainer, BOOL bSignFlag, BYTE *pbCert, ULONG ulCertLen) { + PRINT_LOG(); return SAR_OK; } @@ -370,77 +434,91 @@ ULONG DEVAPI SKF_ExportCertificate(HCONTAINER hContainer, BYTE* pbCert, ULONG *pulCertLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulCertLen = 2048; + return SAR_OK; } ULONG DEVAPI SKF_GenRandom(DEVHANDLE hDev, BYTE *pbRandom, ULONG ulRandomLen) { + PRINT_LOG(); return SAR_OK; } -ULONG DEVAPI SKF_GenExtRSAKey(DEVHANDLE hDev, +ULONG DEVAPI SKF_GenExtRSAKey(DEVHANDLE hDev, ULONG ulBitsLen, RSAPRIVATEKEYBLOB *pBlob) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } -ULONG DEVAPI SKF_GenRSAKeyPair(HCONTAINER hContainer, +ULONG DEVAPI SKF_GenRSAKeyPair(HCONTAINER hContainer, ULONG ulBitsLen, RSAPUBLICKEYBLOB *pBlob) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } -ULONG DEVAPI SKF_ImportRSAKeyPair(HCONTAINER hContainer, +ULONG DEVAPI SKF_ImportRSAKeyPair(HCONTAINER hContainer, ULONG ulSymAlgId, BYTE *pbWrappedKey, ULONG ulWrappedKeyLen, BYTE *pbEncryptedData, ULONG ulEncryptedDataLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } -ULONG DEVAPI SKF_RSASignData(HCONTAINER hContainer, +ULONG DEVAPI SKF_RSASignData(HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, BYTE *pbSignature, ULONG *pulSignLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulSignLen = 256; + return SAR_OK; } -ULONG DEVAPI SKF_RSAVerify(DEVHANDLE hDev, +ULONG DEVAPI SKF_RSAVerify(DEVHANDLE hDev, RSAPUBLICKEYBLOB *pRSAPubKeyBlob, BYTE *pbData, ULONG ulDataLen, BYTE *pbSignature, ULONG ulSignLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } -ULONG DEVAPI SKF_RSAExportSessionKey(HCONTAINER hContainer, +ULONG DEVAPI SKF_RSAExportSessionKey(HCONTAINER hContainer, ULONG ulAlgId, RSAPUBLICKEYBLOB *pPubKey, BYTE *pbData, ULONG *pulDataLen, HANDLE *phSessionKey) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulDataLen = 100; + *phSessionKey = malloc(256); + return SAR_OK; } -ULONG DEVAPI SKF_ExtRSAPubKeyOperation(DEVHANDLE hDev, +ULONG DEVAPI SKF_ExtRSAPubKeyOperation(DEVHANDLE hDev, RSAPUBLICKEYBLOB *pRSAPubKeyBlob, BYTE *pbInput, ULONG ulInputLen, BYTE *pbOutput, ULONG *pulOutputLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulOutputLen = ulInputLen; + return SAR_OK; } ULONG DEVAPI SKF_ExtRSAPriKeyOperation(DEVHANDLE hDev, @@ -450,82 +528,95 @@ ULONG DEVAPI SKF_ExtRSAPriKeyOperation(DEVHANDLE hDev, BYTE *pbOutput, ULONG *pulOutputLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulOutputLen = ulInputLen; + return SAR_OK; } ULONG DEVAPI SKF_GenECCKeyPair(HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pBlob) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } ULONG DEVAPI SKF_ImportECCKeyPair(HCONTAINER hContainer, - PENVELOPEDKEYBLOB pEnvelopedKeyBlob) + ENVELOPEDKEYBLOB *pEnvelopedKeyBlob) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } ULONG DEVAPI SKF_ECCSignData(HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, - PECCSIGNATUREBLOB pSignature) + ECCSIGNATUREBLOB *pSignature) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } ULONG DEVAPI SKF_ECCVerify(DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, - PECCSIGNATUREBLOB pSignature) + ECCSIGNATUREBLOB *pSignature) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } -ULONG DEVAPI SKF_ECCExportSessionKey(HCONTAINER hContainer, +ULONG DEVAPI SKF_ECCExportSessionKey(HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pPubKey, PECCCIPHERBLOB pData, HANDLE *phSessionKey) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *phSessionKey = malloc(256); + return SAR_OK; } ULONG DEVAPI SKF_ExtECCEncrypt(DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbPlainText, ULONG ulPlainTextLen, - PECCCIPHERBLOB pCipherText) + ECCCIPHERBLOB *pCipherText) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } ULONG DEVAPI SKF_ExtECCDecrypt(DEVHANDLE hDev, ECCPRIVATEKEYBLOB *pECCPriKeyBlob, - PECCCIPHERBLOB pCipherText, + ECCCIPHERBLOB *pCipherText, BYTE *pbPlainText, ULONG *pulPlainTextLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulPlainTextLen = sizeof(ECCCIPHERBLOB) + pCipherText->CipherLen - 1; + return SAR_OK; } -ULONG DEVAPI SKF_ExtECCSign(DEVHANDLE hDev, +ULONG DEVAPI SKF_ExtECCSign(DEVHANDLE hDev, ECCPRIVATEKEYBLOB *pECCPriKeyBlob, BYTE *pbData, ULONG ulDataLen, + ECCSIGNATUREBLOB *pSignature) +{ + PRINT_LOG(); + return SAR_OK; +} + +ULONG DEVAPI SKF_ExtECCVerify(DEVHANDLE hDev, + ECCPUBLICKEYBLOB *pECCPubKeyBlob, + BYTE *pbData, + ULONG ulDataLen, PECCSIGNATUREBLOB pSignature) { - return SAR_NOTSUPPORTYETERR; -} - -ULONG DEVAPI SKF_ExtECCVerify(DEVHANDLE hDev, - ECCPUBLICKEYBLOB *pECCPubKeyBlob, - BYTE *pbData, - ULONG ulDataLen, - PECCSIGNATUREBLOB pSignature) -{ - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } ULONG DEVAPI SKF_GenerateAgreementDataWithECC(HCONTAINER hContainer, @@ -535,10 +626,12 @@ ULONG DEVAPI SKF_GenerateAgreementDataWithECC(HCONTAINER hContainer, ULONG ulIDLen, HANDLE *phAgreementHandle) { + PRINT_LOG(); + *phAgreementHandle = malloc(256); return SAR_NOTSUPPORTYETERR; } -ULONG DEVAPI SKF_GenerateAgreementDataAndKeyWithECC(HANDLE hContainer, +ULONG DEVAPI SKF_GenerateAgreementDataAndKeyWithECC(HANDLE hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pSponsorECCPubKeyBlob, ECCPUBLICKEYBLOB *pSponsorTempECCPubKeyBlob, @@ -549,47 +642,58 @@ ULONG DEVAPI SKF_GenerateAgreementDataAndKeyWithECC(HANDLE hContainer, ULONG ulSponsorIDLen, HANDLE *phKeyHandle) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *phKeyHandle = malloc(256); + return SAR_OK; } ULONG DEVAPI SKF_GenerateKeyWithECC(HANDLE hAgreementHandle, ECCPUBLICKEYBLOB *pECCPubKeyBlob, ECCPUBLICKEYBLOB *pTempECCPubKeyBlob, - BYTE *pbID, - ULONG ulIDLen, + BYTE *pbID, + ULONG ulIDLen, HANDLE *phKeyHandle) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *phKeyHandle = malloc(256); + return SAR_OK; } -ULONG DEVAPI SKF_ExportPublicKey(HCONTAINER hContainer, +ULONG DEVAPI SKF_ExportPublicKey(HCONTAINER hContainer, BOOL bSignFlag, - BYTE* pbBlob, - ULONG* pulBlobLen) + BYTE *pbBlob, + ULONG *pulBlobLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulBlobLen = 1024; + return SAR_OK; } -ULONG DEVAPI SKF_ImportSessionKey(HCONTAINER hContainer, +ULONG DEVAPI SKF_ImportSessionKey(HCONTAINER hContainer, ULONG ulAlgId, BYTE *pbWrapedData, ULONG ulWrapedLen, HANDLE *phKey) { - return SAR_NOTSUPPORTYETERR; -} - -ULONG DEVAPI SKF_SetSymmKey(DEVHANDLE hDev, - BYTE *pbKey, - ULONG ulAlgID, - HANDLE *phKey) -{ + PRINT_LOG(); + *phKey = malloc(256); return SAR_OK; } -ULONG DEVAPI SKF_EncryptInit(HANDLE hKey, +ULONG DEVAPI SKF_SetSymmKey(DEVHANDLE hDev, + BYTE *pbKey, + ULONG ulAlgID, + HANDLE *phKey) +{ + PRINT_LOG(); + *phKey = malloc(256); + return SAR_OK; +} + +ULONG DEVAPI SKF_EncryptInit(HANDLE hKey, BLOCKCIPHERPARAM EncryptParam) { + PRINT_LOG(); return SAR_OK; } @@ -599,15 +703,19 @@ ULONG DEVAPI SKF_Encrypt(HANDLE hKey, BYTE *pbEncryptedData, ULONG *pulEncryptedLen) { + PRINT_LOG(); + *pulEncryptedLen = ulDataLen; return SAR_OK; } ULONG DEVAPI SKF_EncryptUpdate(HANDLE hKey, BYTE *pbData, - ULONG ulDataLen, - BYTE *pbEncryptedData, + ULONG ulDataLen, + BYTE *pbEncryptedData, ULONG *pulEncryptedLen) { + PRINT_LOG(); + *pulEncryptedLen = ulDataLen; return SAR_OK; } @@ -615,37 +723,46 @@ ULONG DEVAPI SKF_EncryptFinal(HANDLE hKey, BYTE *pbEncryptedData, ULONG *pulEncryptedDataLen) { + PRINT_LOG(); + *pulEncryptedDataLen = 0; return SAR_OK; } -ULONG DEVAPI SKF_DecryptInit(HANDLE hKey, +ULONG DEVAPI SKF_DecryptInit(HANDLE hKey, BLOCKCIPHERPARAM DecryptParam) { + PRINT_LOG(); return SAR_OK; } -ULONG DEVAPI SKF_Decrypt(HANDLE hKey, +ULONG DEVAPI SKF_Decrypt(HANDLE hKey, BYTE *pbEncryptedData, - ULONG ulEncryptedLen, - BYTE *pbData, + ULONG ulEncryptedLen, + BYTE *pbData, ULONG *pulDataLen) { + PRINT_LOG(); + *pulDataLen = ulEncryptedLen; return SAR_OK; } -ULONG DEVAPI SKF_DecryptUpdate(HANDLE hKey, +ULONG DEVAPI SKF_DecryptUpdate(HANDLE hKey, BYTE *pbEncryptedData, - ULONG ulEncryptedLen, - BYTE *pbData, + ULONG ulEncryptedLen, + BYTE *pbData, ULONG *pulDataLen) { + PRINT_LOG(); + *pulDataLen = ulEncryptedLen; return SAR_OK; } -ULONG DEVAPI SKF_DecryptFinal(HANDLE hKey, +ULONG DEVAPI SKF_DecryptFinal(HANDLE hKey, BYTE *pbDecryptedData, ULONG *pulDecryptedDataLen) { + PRINT_LOG(); + *pulDecryptedDataLen = 0; return SAR_OK; } @@ -656,6 +773,8 @@ ULONG DEVAPI SKF_DigestInit(DEVHANDLE hDev, ULONG ulIDLen, HANDLE *phHash) { + PRINT_LOG(); + *phHash = malloc(256); return SAR_OK; } @@ -665,6 +784,8 @@ ULONG DEVAPI SKF_Digest(HANDLE hHash, BYTE *pbHashData, ULONG *pulHashLen) { + PRINT_LOG(); + *pulHashLen = 32; return SAR_OK; } @@ -672,6 +793,7 @@ ULONG DEVAPI SKF_DigestUpdate(HANDLE hHash, BYTE *pbData, ULONG ulDataLen) { + PRINT_LOG(); return SAR_OK; } @@ -679,41 +801,54 @@ ULONG DEVAPI SKF_DigestFinal(HANDLE hHash, BYTE *pHashData, ULONG *pulHashLen) { + PRINT_LOG(); + *pulHashLen = 32; return SAR_OK; } -ULONG DEVAPI SKF_MacInit(HANDLE hKey, +ULONG DEVAPI SKF_MacInit(HANDLE hKey, BLOCKCIPHERPARAM *pMacParam, HANDLE *phMac) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *phMac = malloc(256); + return SAR_OK; } ULONG DEVAPI SKF_Mac(HANDLE hMac, BYTE *pbData, - ULONG ulDataLen, - BYTE *pbMacData, + ULONG ulDataLen, + BYTE *pbMac, ULONG *pulMacLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulMacLen = 16; + return SAR_OK; } -ULONG DEVAPI SKF_MacUpdate(HANDLE hMac, +ULONG DEVAPI SKF_MacUpdate(HANDLE hMac, BYTE *pbData, ULONG ulDataLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + return SAR_OK; } -ULONG DEVAPI SKF_MacFinal(HANDLE hMac, - BYTE *pbMacData, - ULONG *pulMacDataLen) +ULONG DEVAPI SKF_MacFinal(HANDLE hMac, + BYTE *pbMac, + ULONG *pulMacLen) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + *pulMacLen = 16; + return SAR_OK; } -ULONG DEVAPI SKF_CloseHandle(HANDLE hHandle) +ULONG DEVAPI SKF_CloseHandle(HANDLE handle) { - return SAR_NOTSUPPORTYETERR; + PRINT_LOG(); + if (handle) { + free(handle); + } + return SAR_OK; } diff --git a/jni/GmSSL.c b/jni/GmSSL.c new file mode 100644 index 00000000..2f9f8221 --- /dev/null +++ b/jni/GmSSL.c @@ -0,0 +1,726 @@ +/* jni/GmSSL.c */ +/* ==================================================================== + * Copyright (c) 2015 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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 +#include +#include +#include +#include +#include +#include "GmSSL.h" + +#define PRINT_ERROR() \ + fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__) + +static int alg2pktype(const char *alg) +{ + return 0; +} + +JNIEXPORT +jint JNICALL JNI_onload(JavaVM *jvm, void *reserved) +{ + ERR_load_crypto_strings(); + OpenSSL_add_all_algorithms(); + return JNI_VERSION_1_2; +} + +JNIEXPORT +void JNICALL JNI_onunload(JavaVM *vm, void *reserved) +{ + ERR_free_strings(); + EVP_cleanup(); +} + +JNIEXPORT +jbyteArray JNICALL Java_GmSSL_symmetricEncrypt(JNIEnv *env, jobject this, + jstring algor, jint flag, jbyteArray in, jbyteArray key, jbyteArray iv) +{ + jbyteArray ret = NULL; + const char *alg = NULL; + unsigned char *inbuf = NULL; + unsigned char *keybuf = NULL; + unsigned char *ivbuf = NULL; + unsigned char *outbuf = NULL; + size_t inlen, keylen, ivlen, outlen; + unsigned char *p; + int len; + const EVP_CIPHER *cipher; + EVP_CIPHER_CTX *cctx = NULL; + + if (!(alg = (*env)->GetStringUTFChars(env, algor, 0))) { + PRINT_ERROR(); + goto end; + } + if (!(cipher = EVP_get_cipherbyname(alg))) { + PRINT_ERROR(); + goto end; + } + + if (!(inbuf = (unsigned char *)(*env)->GetByteArrayElements(env, in, 0))) { + PRINT_ERROR(); + goto end; + } + inlen = (size_t)(*env)->GetArrayLength(env, in); + if (inlen <= 0) { + PRINT_ERROR(); + goto end; + } + + if (!(keybuf = (unsigned char *)(*env)->GetByteArrayElements(env, key, 0))) { + PRINT_ERROR(); + goto end; + } + keylen = (size_t)(*env)->GetArrayLength(env, key); + if (keylen < EVP_CIPHER_key_length(cipher)) { + PRINT_ERROR(); + goto end; + } + + if (!(ivbuf = (unsigned char *)(*env)->GetByteArrayElements(env, iv, 0))) { + PRINT_ERROR(); + goto end; + } + ivlen = (size_t)(*env)->GetArrayLength(env, iv); + if (ivlen != EVP_CIPHER_iv_length(cipher)) { + PRINT_ERROR(); + goto end; + } + + outlen = inlen + EVP_CIPHER_block_size(cipher) * 2; + if (!(outbuf = malloc(outlen))) { + PRINT_ERROR(); + goto end; + } + bzero(outbuf, outlen); + + if (!(cctx = EVP_CIPHER_CTX_new())) { + PRINT_ERROR(); + goto end; + } + + if (!EVP_EncryptInit_ex(cctx, cipher, NULL, keybuf, ivbuf)) { + PRINT_ERROR(); + goto end; + } + + p = outbuf; + len = outlen; + + if (!EVP_EncryptUpdate(cctx, p, &len, inbuf, inlen)) { + PRINT_ERROR(); + goto end; + } + p += len; + len = outlen - len; + + if (!EVP_EncryptFinal_ex(cctx, p, &len)) { + PRINT_ERROR(); + goto end; + } + p += len; + + if (!(ret = (*env)->NewByteArray(env, outlen))) { + PRINT_ERROR(); + goto end; + } + + outlen = p - outbuf; + (*env)->SetByteArrayRegion(env, ret, 0, outlen, (jbyte *)outbuf); +end: + if (alg) (*env)->ReleaseStringUTFChars(env, algor, alg); + if (inbuf) (*env)->ReleaseByteArrayElements(env, in, (jbyte *)inbuf, JNI_ABORT); + if (keybuf) (*env)->ReleaseByteArrayElements(env, key, (jbyte *)keybuf, JNI_ABORT); + if (ivbuf) (*env)->ReleaseByteArrayElements(env, iv, (jbyte *)ivbuf, JNI_ABORT); + if (outbuf) free(outbuf); + EVP_CIPHER_CTX_free(cctx); + return ret; +} + +JNIEXPORT +jbyteArray JNICALL Java_GmSSL_symmetricDecrypt(JNIEnv *env, jobject this, + jstring algor, jint flag, jbyteArray in, jbyteArray key, jbyteArray iv) +{ + jbyteArray ret = NULL; + const char *alg = NULL; + unsigned char *inbuf = NULL; + unsigned char *keybuf = NULL; + unsigned char *ivbuf = NULL; + unsigned char *outbuf = NULL; + size_t inlen, keylen, ivlen, outlen; + unsigned char *p; + int len; + const EVP_CIPHER *cipher; + EVP_CIPHER_CTX *cctx = NULL; + + if (!(alg = (*env)->GetStringUTFChars(env, algor, 0))) { + PRINT_ERROR(); + goto end; + } + if (!(cipher = EVP_get_cipherbyname(alg))) { + PRINT_ERROR(); + goto end; + } + + if (!(inbuf = (unsigned char *)(*env)->GetByteArrayElements(env, in, 0))) { + PRINT_ERROR(); + goto end; + } + inlen = (size_t)(*env)->GetArrayLength(env, in); + if (inlen <= 0) { + PRINT_ERROR(); + goto end; + } + + if (!(keybuf = (unsigned char *)(*env)->GetByteArrayElements(env, key, 0))) { + PRINT_ERROR(); + goto end; + } + keylen = (size_t)(*env)->GetArrayLength(env, key); + if (keylen < EVP_CIPHER_key_length(cipher)) { + PRINT_ERROR(); + goto end; + } + + if (!(ivbuf = (unsigned char *)(*env)->GetByteArrayElements(env, iv, 0))) { + PRINT_ERROR(); + goto end; + } + ivlen = (size_t)(*env)->GetArrayLength(env, iv); + if (ivlen != EVP_CIPHER_iv_length(cipher)) { + PRINT_ERROR(); + goto end; + } + + outlen = inlen + EVP_CIPHER_block_size(cipher) * 2; + if (!(outbuf = malloc(outlen))) { + PRINT_ERROR(); + goto end; + } + bzero(outbuf, outlen); + + if (!(cctx = EVP_CIPHER_CTX_new())) { + PRINT_ERROR(); + goto end; + } + + if (!EVP_DecryptInit_ex(cctx, cipher, NULL, keybuf, ivbuf)) { + PRINT_ERROR(); + goto end; + } + + p = outbuf; + len = outlen; + + if (!EVP_DecryptUpdate(cctx, p, &len, inbuf, inlen)) { + PRINT_ERROR(); + goto end; + } + p += len; + len = outlen - len; + + if (!EVP_DecryptFinal_ex(cctx, p, &len)) { + PRINT_ERROR(); + goto end; + } + p += len; + + if (!(ret = (*env)->NewByteArray(env, outlen))) { + PRINT_ERROR(); + goto end; + } + + outlen = p - outbuf; + (*env)->SetByteArrayRegion(env, ret, 0, outlen, (jbyte *)outbuf); + +end: + if (alg) (*env)->ReleaseStringUTFChars(env, algor, alg); + if (inbuf) (*env)->ReleaseByteArrayElements(env, in, (jbyte *)inbuf, JNI_ABORT); + if (keybuf) (*env)->ReleaseByteArrayElements(env, key, (jbyte *)keybuf, JNI_ABORT); + if (ivbuf) (*env)->ReleaseByteArrayElements(env, iv, (jbyte *)ivbuf, JNI_ABORT); + if (outbuf) free(outbuf); + EVP_CIPHER_CTX_free(cctx); + return ret; + +} + +JNIEXPORT +jbyteArray JNICALL Java_GmSSL_digest(JNIEnv *env, jobject this, + jstring algor, jint flag, jbyteArray in) +{ + jbyteArray ret = NULL; + const char *alg = NULL; + unsigned char *inbuf = NULL; + unsigned char *outbuf = NULL; + size_t inlen, outlen; + unsigned int len; + const EVP_MD *md; + + if (!(alg = (*env)->GetStringUTFChars(env, algor, 0))) { + PRINT_ERROR(); + goto end; + } + if (!(md = EVP_get_digestbyname(alg))) { + PRINT_ERROR(); + goto end; + } + + if (!(inbuf = (unsigned char *)(*env)->GetByteArrayElements(env, in, 0))) { + PRINT_ERROR(); + goto end; + } + inlen = (size_t)(*env)->GetArrayLength(env, in); + if (inlen <= 0) { + PRINT_ERROR(); + goto end; + } + + outlen = EVP_MD_size(md); + if (!(outbuf = malloc(outlen))) { + PRINT_ERROR(); + goto end; + } + bzero(outbuf, outlen); + + if (!EVP_Digest(inbuf, inlen, outbuf, &len, md, NULL)) { + PRINT_ERROR(); + goto end; + } + + if (!(ret = (*env)->NewByteArray(env, outlen))) { + PRINT_ERROR(); + goto end; + } + + outlen = len; + (*env)->SetByteArrayRegion(env, ret, 0, outlen, (jbyte *)outbuf); + +end: + if (alg) (*env)->ReleaseStringUTFChars(env, algor, alg); + if (inbuf) (*env)->ReleaseByteArrayElements(env, in, (jbyte *)inbuf, JNI_ABORT); + if (outbuf) free(outbuf); + return ret; +} + +JNIEXPORT +jbyteArray JNICALL Java_GmSSL_mac(JNIEnv *env, jobject this, + jstring algor, jint flag, jbyteArray in, jbyteArray key) +{ + jbyteArray ret = NULL; + return ret; +} + +JNIEXPORT +jbyteArray JNICALL Java_GmSSL_sign(JNIEnv *env, jobject this, + jstring algor, jint flag, jbyteArray in, jbyteArray key) +{ + jbyteArray ret = NULL; + const char *alg = NULL; + unsigned char *inbuf = NULL; + unsigned char *keybuf = NULL; + unsigned char *outbuf = NULL; + size_t inlen, keylen, outlen; + const unsigned char *p; + int type; + EVP_PKEY *pkey = NULL; + EVP_PKEY_CTX *pkctx = NULL; + + if (!(alg = (*env)->GetStringUTFChars(env, algor, 0))) { + PRINT_ERROR(); + goto end; + } + if ((type = alg2pktype(alg)) == NID_undef) { + PRINT_ERROR(); + goto end; + } + + if (!(inbuf = (unsigned char *)(*env)->GetByteArrayElements(env, in, 0))) { + PRINT_ERROR(); + goto end; + } + inlen = (size_t)(*env)->GetArrayLength(env, in); + if (inlen < SHA_DIGEST_LENGTH) { + PRINT_ERROR(); + goto end; + } + + if (!(keybuf = (unsigned char *)(*env)->GetByteArrayElements(env, key, 0))) { + PRINT_ERROR(); + goto end; + } + keylen = (size_t)(*env)->GetArrayLength(env, key); + + p = keybuf; + if (!(pkey = d2i_AutoPrivateKey(NULL, &p, keylen))) { + PRINT_ERROR(); + goto end; + } + + outlen = EVP_PKEY_size(pkey); + if (!(outbuf = malloc(outlen))) { + PRINT_ERROR(); + goto end; + } + + if (!(pkctx = EVP_PKEY_CTX_new(pkey, NULL))) { + PRINT_ERROR(); + goto end; + } + + if (!EVP_PKEY_sign_init(pkctx)) { + PRINT_ERROR(); + goto end; + } + + if (EVP_PKEY_base_id(pkey) == EVP_PKEY_EC) { + if (!EVP_PKEY_CTX_ctrl_str(pkctx, "ec_sign_algor", alg)) { + PRINT_ERROR(); + goto end; + } + } + + if (!EVP_PKEY_sign(pkctx, outbuf, &outlen, inbuf, inlen)) { + PRINT_ERROR(); + goto end; + } + + if (!(ret = (*env)->NewByteArray(env, outlen))) { + PRINT_ERROR(); + goto end; + } + + (*env)->SetByteArrayRegion(env, ret, 0, outlen, (jbyte *)outbuf); + +end: + if (alg) (*env)->ReleaseStringUTFChars(env, algor, alg); + if (inbuf) (*env)->ReleaseByteArrayElements(env, in, (jbyte *)inbuf, JNI_ABORT); + if (keybuf) (*env)->ReleaseByteArrayElements(env, key, (jbyte *)keybuf, JNI_ABORT); + if (outbuf) free(outbuf); + EVP_PKEY_free(pkey); + EVP_PKEY_CTX_free(pkctx); + return ret; +} + +JNIEXPORT +jint JNICALL Java_GmSSL_verify(JNIEnv *env, jobject this, + jstring algor, jint flag, jbyteArray in, jbyteArray signature, + jbyteArray key) +{ + jint ret = 0; + const char *alg = NULL; + unsigned char *inbuf = NULL; + unsigned char *sigbuf = NULL; + unsigned char *keybuf = NULL; + size_t inlen, siglen, keylen; + const unsigned char *p; + int type; + EVP_PKEY *pkey = NULL; + EVP_PKEY_CTX *pkctx = NULL; + + if (!(alg = (*env)->GetStringUTFChars(env, algor, 0))) { + PRINT_ERROR(); + goto end; + } + if ((type = alg2pktype(alg)) == NID_undef) { + PRINT_ERROR(); + goto end; + } + + if (!(inbuf = (unsigned char *)(*env)->GetByteArrayElements(env, in, 0))) { + PRINT_ERROR(); + goto end; + } + inlen = (size_t)(*env)->GetArrayLength(env, in); + if (inlen < SHA_DIGEST_LENGTH) { + PRINT_ERROR(); + goto end; + } + + if (!(sigbuf = (unsigned char *)(*env)->GetByteArrayElements(env, signature, 0))) { + PRINT_ERROR(); + goto end; + } + siglen = (size_t)(*env)->GetArrayLength(env, signature); + if (siglen < 40) { + PRINT_ERROR(); + goto end; + } + + if (!(keybuf = (unsigned char *)(*env)->GetByteArrayElements(env, key, 0))) { + PRINT_ERROR(); + goto end; + } + keylen = (size_t)(*env)->GetArrayLength(env, key); + + p = keybuf; + if (!(pkey = d2i_PublicKey(type, NULL, &p, keylen))) { + PRINT_ERROR(); + goto end; + } + + if (!(pkctx = EVP_PKEY_CTX_new(pkey, NULL))) { + PRINT_ERROR(); + goto end; + } + + if (!EVP_PKEY_verify_init(pkctx)) { + PRINT_ERROR(); + goto end; + } + + if (EVP_PKEY_base_id(pkey) == EVP_PKEY_EC) { + if (!EVP_PKEY_CTX_ctrl_str(pkctx, "ec_sign_algor", alg)) { + PRINT_ERROR(); + goto end; + } + } + + if ((ret = EVP_PKEY_verify(pkctx, sigbuf, siglen, inbuf, inlen)) != 1) { + PRINT_ERROR(); + goto end; + } + +end: + if (alg) (*env)->ReleaseStringUTFChars(env, algor, alg); + if (inbuf) (*env)->ReleaseByteArrayElements(env, in, (jbyte *)inbuf, JNI_ABORT); + if (sigbuf) (*env)->ReleaseByteArrayElements(env, signature, (jbyte *)sigbuf, JNI_ABORT); + if (keybuf) (*env)->ReleaseByteArrayElements(env, key, (jbyte *)keybuf, JNI_ABORT); + EVP_PKEY_free(pkey); + EVP_PKEY_CTX_free(pkctx); + return ret; +} + +JNIEXPORT +jbyteArray JNICALL Java_GmSSL_publicKeyEncrypt(JNIEnv *env, jobject this, + jstring algor, jint flag, jbyteArray in, jbyteArray key) +{ + jbyteArray ret = NULL; + const char *alg = NULL; + unsigned char *inbuf = NULL; + unsigned char *keybuf = NULL; + unsigned char *outbuf = NULL; + size_t inlen, keylen, outlen; + const unsigned char *p; + int type; + EVP_PKEY *pkey = NULL; + EVP_PKEY_CTX *pkctx = NULL; + + if (!(alg = (*env)->GetStringUTFChars(env, algor, 0))) { + PRINT_ERROR(); + goto end; + } + if ((type = alg2pktype(alg)) == NID_undef) { + PRINT_ERROR(); + goto end; + } + + if (!(inbuf = (unsigned char *)(*env)->GetByteArrayElements(env, in, 0))) { + PRINT_ERROR(); + goto end; + } + inlen = (size_t)(*env)->GetArrayLength(env, in); + if (inlen <= 0) { + PRINT_ERROR(); + goto end; + } + + if (!(keybuf = (unsigned char *)(*env)->GetByteArrayElements(env, key, 0))) { + PRINT_ERROR(); + goto end; + } + keylen = (size_t)(*env)->GetArrayLength(env, key); + + p = keybuf; + if (!(pkey = d2i_PublicKey(type, NULL, &p, keylen))) { + PRINT_ERROR(); + goto end; + } + + /* we can not get ciphertext length from plaintext + * so malloc the max buffer + */ + outlen = inlen + 2048; + if (!(outbuf = malloc(outlen))) { + PRINT_ERROR(); + goto end; + } + + if (!(pkctx = EVP_PKEY_CTX_new(pkey, NULL))) { + PRINT_ERROR(); + goto end; + } + + if (!EVP_PKEY_encrypt_init(pkctx)) { + PRINT_ERROR(); + goto end; + } + + if (EVP_PKEY_base_id(pkey) == EVP_PKEY_EC) { + if (!EVP_PKEY_CTX_ctrl_str(pkctx, "ec_encrypt_algor", alg)) { + PRINT_ERROR(); + goto end; + } + } + + if (!EVP_PKEY_encrypt(pkctx, outbuf, &outlen, inbuf, inlen)) { + PRINT_ERROR(); + goto end; + } + + if (!(ret = (*env)->NewByteArray(env, outlen))) { + PRINT_ERROR(); + goto end; + } + + (*env)->SetByteArrayRegion(env, ret, 0, outlen, (jbyte *)outbuf); + +end: + if (alg) (*env)->ReleaseStringUTFChars(env, algor, alg); + if (inbuf) (*env)->ReleaseByteArrayElements(env, in, (jbyte *)inbuf, JNI_ABORT); + if (keybuf) (*env)->ReleaseByteArrayElements(env, key, (jbyte *)keybuf, JNI_ABORT); + if (outbuf) free(outbuf); + EVP_PKEY_free(pkey); + EVP_PKEY_CTX_free(pkctx); + return ret; + +} + +JNIEXPORT +jbyteArray JNICALL Java_GmSSL_publicKeyDecrypt(JNIEnv *env, jobject this, + jstring algor, jint flag, jbyteArray in, jbyteArray key) +{ + jbyteArray ret = NULL; + const char *alg = NULL; + unsigned char *inbuf = NULL; + unsigned char *keybuf = NULL; + unsigned char *outbuf = NULL; + size_t inlen, keylen, outlen; + const unsigned char *p; + int type; + EVP_PKEY *pkey = NULL; + EVP_PKEY_CTX *pkctx = NULL; + + if (!(alg = (*env)->GetStringUTFChars(env, algor, 0))) { + PRINT_ERROR(); + goto end; + } + if ((type = alg2pktype(alg)) == NID_undef) { + PRINT_ERROR(); + goto end; + } + + if (!(inbuf = (unsigned char *)(*env)->GetByteArrayElements(env, in, 0))) { + PRINT_ERROR(); + goto end; + } + inlen = (size_t)(*env)->GetArrayLength(env, in); + if (inlen <= 0) { + PRINT_ERROR(); + goto end; + } + + if (!(keybuf = (unsigned char *)(*env)->GetByteArrayElements(env, key, 0))) { + PRINT_ERROR(); + goto end; + } + keylen = (size_t)(*env)->GetArrayLength(env, key); + + p = keybuf; + if (!(pkey = d2i_AutoPrivateKey(NULL, &p, keylen))) { + PRINT_ERROR(); + goto end; + } + + outlen = inlen; + if (!(outbuf = malloc(outlen))) { + PRINT_ERROR(); + goto end; + } + + if (!(pkctx = EVP_PKEY_CTX_new(pkey, NULL))) { + PRINT_ERROR(); + goto end; + } + + if (!EVP_PKEY_encrypt_init(pkctx)) { + PRINT_ERROR(); + goto end; + } + + if (EVP_PKEY_base_id(pkey) == EVP_PKEY_EC) { + if (!EVP_PKEY_CTX_ctrl_str(pkctx, "ec_encrypt_algor", alg)) { + PRINT_ERROR(); + goto end; + } + } + + if (!EVP_PKEY_encrypt(pkctx, outbuf, &outlen, inbuf, inlen)) { + PRINT_ERROR(); + goto end; + } + + if (!(ret = (*env)->NewByteArray(env, outlen))) { + PRINT_ERROR(); + goto end; + } + + (*env)->SetByteArrayRegion(env, ret, 0, outlen, (jbyte *)outbuf); + +end: + if (alg) (*env)->ReleaseStringUTFChars(env, algor, alg); + if (inbuf) (*env)->ReleaseByteArrayElements(env, in, (jbyte *)inbuf, JNI_ABORT); + if (keybuf) (*env)->ReleaseByteArrayElements(env, key, (jbyte *)keybuf, JNI_ABORT); + if (outbuf) free(outbuf); + EVP_PKEY_free(pkey); + EVP_PKEY_CTX_free(pkctx); + return ret; +} + diff --git a/jni/GmSSL.java b/jni/GmSSL.java new file mode 100644 index 00000000..6ec69dfa --- /dev/null +++ b/jni/GmSSL.java @@ -0,0 +1,88 @@ +/* jni/GmSSL.java */ +/* ==================================================================== + * Copyright (c) 2015 - 2016 The GmSSL 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 GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL 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 GmSSL 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. + * ==================================================================== + * + */ + +public class GmSSL { + + public native byte [] symmetricEncrypt(String algor, int flag, byte [] in, byte [] key, byte [] iv); + public native byte [] symmetricDecrypt(String algor, int flag, byte [] in, byte [] key, byte [] iv); + public native byte [] digest(String algor, int flag, byte [] data); + public native byte [] mac(String algor, int flag, byte [] data, byte [] key); + public native byte [] sign(String algor, int flag, byte [] digest, byte [] privateKey); + public native int verify(String algor, int flag, byte [] digest, byte [] signature, byte [] publicKey); + public native byte [] publicKeyEncrypt(String algor, int flag, byte [] in, byte [] publicKey); + public native byte [] publicKeyDecrypt(String algor, int falg, byte [] in, byte [] privateKey); + + public static void main(String[] args) { + + final GmSSL gmssl = new GmSSL(); + final byte [] key = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; + final byte [] iv = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; + final byte [] data = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; + + /* here we need tests */ + final byte [] ciphertext = gmssl.symmetricEncrypt("SMS4-CBC", 0, data, key, iv); + } + + static { + System.loadLibrary("gmssl"); + } +} + diff --git a/jni/Makefile b/jni/Makefile new file mode 100644 index 00000000..990e5aa6 --- /dev/null +++ b/jni/Makefile @@ -0,0 +1,24 @@ +# maybe a config is required to cross platform + + +all: libgmssl.jnilib + +libgmssl.jnilib: GmSSL.h + gcc -shared -fPIC -Wall -I./jni/ GmSSL.c ../libcrypto.a -o libgmssl.jnilib + +GmSSL.h: GmSSL.class + javah -jni GmSSL + +GmSSL.class: + javac GmSSL.java + +clean: + rm -f GmSSL.h + rm -f *.class + rm -f *.jnilib + rm -f *.o + rm -f a.out + +test: + java -Djava.library.path=. GmSSL + diff --git a/jni/README.md b/jni/README.md new file mode 100644 index 00000000..4e87395e --- /dev/null +++ b/jni/README.md @@ -0,0 +1,12 @@ +## GmSSL Java Wrapper + +Thi purpose of this module is to provide a simple Java API to access GmSSL +crypto library. To be simple, no key schedule or context is used. So the +functions will not be very efficient for processing large files or stream data. +And this module is not intend to be integrated with Java crypto frameworks such +as JCE. + +The implementation is based on the Java Native Interface (JNI). The JNI header +files are also included, but you can replace them with version from you own +compiling environment. + diff --git a/jni/jni/jni.h b/jni/jni/jni.h new file mode 100644 index 00000000..b56fb7fc --- /dev/null +++ b/jni/jni/jni.h @@ -0,0 +1,1961 @@ +/* + * @(#)jni.h 1.62 06/02/02 + * + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +/* + * We used part of Netscape's Java Runtime Interface (JRI) as the starting + * point of our design and implementation. + */ + +/****************************************************************************** + * Java Runtime Interface + * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved. + *****************************************************************************/ + +#ifndef _JAVASOFT_JNI_H_ +#define _JAVASOFT_JNI_H_ + +#include +#include + +/* jni_md.h contains the machine-dependent typedefs for jbyte, jint + and jlong */ + +#include "jni_md.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * JNI Types + */ + +#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H + +typedef unsigned char jboolean; +typedef unsigned short jchar; +typedef short jshort; +typedef float jfloat; +typedef double jdouble; + +typedef jint jsize; + +#ifdef __cplusplus + +class _jobject {}; +class _jclass : public _jobject {}; +class _jthrowable : public _jobject {}; +class _jstring : public _jobject {}; +class _jarray : public _jobject {}; +class _jbooleanArray : public _jarray {}; +class _jbyteArray : public _jarray {}; +class _jcharArray : public _jarray {}; +class _jshortArray : public _jarray {}; +class _jintArray : public _jarray {}; +class _jlongArray : public _jarray {}; +class _jfloatArray : public _jarray {}; +class _jdoubleArray : public _jarray {}; +class _jobjectArray : public _jarray {}; + +typedef _jobject *jobject; +typedef _jclass *jclass; +typedef _jthrowable *jthrowable; +typedef _jstring *jstring; +typedef _jarray *jarray; +typedef _jbooleanArray *jbooleanArray; +typedef _jbyteArray *jbyteArray; +typedef _jcharArray *jcharArray; +typedef _jshortArray *jshortArray; +typedef _jintArray *jintArray; +typedef _jlongArray *jlongArray; +typedef _jfloatArray *jfloatArray; +typedef _jdoubleArray *jdoubleArray; +typedef _jobjectArray *jobjectArray; + +#else + +struct _jobject; + +typedef struct _jobject *jobject; +typedef jobject jclass; +typedef jobject jthrowable; +typedef jobject jstring; +typedef jobject jarray; +typedef jarray jbooleanArray; +typedef jarray jbyteArray; +typedef jarray jcharArray; +typedef jarray jshortArray; +typedef jarray jintArray; +typedef jarray jlongArray; +typedef jarray jfloatArray; +typedef jarray jdoubleArray; +typedef jarray jobjectArray; + +#endif + +typedef jobject jweak; + +typedef union jvalue { + jboolean z; + jbyte b; + jchar c; + jshort s; + jint i; + jlong j; + jfloat f; + jdouble d; + jobject l; +} jvalue; + +struct _jfieldID; +typedef struct _jfieldID *jfieldID; + +struct _jmethodID; +typedef struct _jmethodID *jmethodID; + +/* Return values from jobjectRefType */ +typedef enum _jobjectType { + JNIInvalidRefType = 0, + JNILocalRefType = 1, + JNIGlobalRefType = 2, + JNIWeakGlobalRefType = 3 +} jobjectRefType; + + +#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */ + +/* + * jboolean constants + */ + +#define JNI_FALSE 0 +#define JNI_TRUE 1 + +/* + * possible return values for JNI functions. + */ + +#define JNI_OK 0 /* success */ +#define JNI_ERR (-1) /* unknown error */ +#define JNI_EDETACHED (-2) /* thread detached from the VM */ +#define JNI_EVERSION (-3) /* JNI version error */ +#define JNI_ENOMEM (-4) /* not enough memory */ +#define JNI_EEXIST (-5) /* VM already created */ +#define JNI_EINVAL (-6) /* invalid arguments */ + +/* + * used in ReleaseScalarArrayElements + */ + +#define JNI_COMMIT 1 +#define JNI_ABORT 2 + +/* + * used in RegisterNatives to describe native method name, signature, + * and function pointer. + */ + +typedef struct { + char *name; + char *signature; + void *fnPtr; +} JNINativeMethod; + +/* + * JNI Native Method Interface. + */ + +struct JNINativeInterface_; + +struct JNIEnv_; + +#ifdef __cplusplus +typedef JNIEnv_ JNIEnv; +#else +typedef const struct JNINativeInterface_ *JNIEnv; +#endif + +/* + * JNI Invocation Interface. + */ + +struct JNIInvokeInterface_; + +struct JavaVM_; + +#ifdef __cplusplus +typedef JavaVM_ JavaVM; +#else +typedef const struct JNIInvokeInterface_ *JavaVM; +#endif + +struct JNINativeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + + void *reserved3; + +#if !TARGET_RT_MAC_CFM && defined(__ppc__) + void* cfm_vectors[225]; +#endif /* !TARGET_RT_MAC_CFM && defined(__ppc__) */ + + jint (JNICALL *GetVersion)(JNIEnv *env); + + jclass (JNICALL *DefineClass) + (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, + jsize len); + jclass (JNICALL *FindClass) + (JNIEnv *env, const char *name); + + jmethodID (JNICALL *FromReflectedMethod) + (JNIEnv *env, jobject method); + jfieldID (JNICALL *FromReflectedField) + (JNIEnv *env, jobject field); + + jobject (JNICALL *ToReflectedMethod) + (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic); + + jclass (JNICALL *GetSuperclass) + (JNIEnv *env, jclass sub); + jboolean (JNICALL *IsAssignableFrom) + (JNIEnv *env, jclass sub, jclass sup); + + jobject (JNICALL *ToReflectedField) + (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic); + + jint (JNICALL *Throw) + (JNIEnv *env, jthrowable obj); + jint (JNICALL *ThrowNew) + (JNIEnv *env, jclass clazz, const char *msg); + jthrowable (JNICALL *ExceptionOccurred) + (JNIEnv *env); + void (JNICALL *ExceptionDescribe) + (JNIEnv *env); + void (JNICALL *ExceptionClear) + (JNIEnv *env); + void (JNICALL *FatalError) + (JNIEnv *env, const char *msg); + + jint (JNICALL *PushLocalFrame) + (JNIEnv *env, jint capacity); + jobject (JNICALL *PopLocalFrame) + (JNIEnv *env, jobject result); + + jobject (JNICALL *NewGlobalRef) + (JNIEnv *env, jobject lobj); + void (JNICALL *DeleteGlobalRef) + (JNIEnv *env, jobject gref); + void (JNICALL *DeleteLocalRef) + (JNIEnv *env, jobject obj); + jboolean (JNICALL *IsSameObject) + (JNIEnv *env, jobject obj1, jobject obj2); + jobject (JNICALL *NewLocalRef) + (JNIEnv *env, jobject ref); + jint (JNICALL *EnsureLocalCapacity) + (JNIEnv *env, jint capacity); + + jobject (JNICALL *AllocObject) + (JNIEnv *env, jclass clazz); + jobject (JNICALL *NewObject) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *NewObjectV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jobject (JNICALL *NewObjectA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jclass (JNICALL *GetObjectClass) + (JNIEnv *env, jobject obj); + jboolean (JNICALL *IsInstanceOf) + (JNIEnv *env, jobject obj, jclass clazz); + + jmethodID (JNICALL *GetMethodID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *CallObjectMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jobject (JNICALL *CallObjectMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jobject (JNICALL *CallObjectMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jboolean (JNICALL *CallBooleanMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jboolean (JNICALL *CallBooleanMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jboolean (JNICALL *CallBooleanMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jbyte (JNICALL *CallByteMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jbyte (JNICALL *CallByteMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jbyte (JNICALL *CallByteMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jchar (JNICALL *CallCharMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jchar (JNICALL *CallCharMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jchar (JNICALL *CallCharMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jshort (JNICALL *CallShortMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jshort (JNICALL *CallShortMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jshort (JNICALL *CallShortMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jint (JNICALL *CallIntMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jint (JNICALL *CallIntMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jint (JNICALL *CallIntMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jlong (JNICALL *CallLongMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jlong (JNICALL *CallLongMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jlong (JNICALL *CallLongMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jfloat (JNICALL *CallFloatMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jfloat (JNICALL *CallFloatMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jfloat (JNICALL *CallFloatMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jdouble (JNICALL *CallDoubleMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jdouble (JNICALL *CallDoubleMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jdouble (JNICALL *CallDoubleMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + void (JNICALL *CallVoidMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + void (JNICALL *CallVoidMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + void (JNICALL *CallVoidMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jobject (JNICALL *CallNonvirtualObjectMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *CallNonvirtualObjectMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jobject (JNICALL *CallNonvirtualObjectMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jboolean (JNICALL *CallNonvirtualBooleanMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jboolean (JNICALL *CallNonvirtualBooleanMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jboolean (JNICALL *CallNonvirtualBooleanMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jbyte (JNICALL *CallNonvirtualByteMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jbyte (JNICALL *CallNonvirtualByteMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jbyte (JNICALL *CallNonvirtualByteMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jchar (JNICALL *CallNonvirtualCharMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jchar (JNICALL *CallNonvirtualCharMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jchar (JNICALL *CallNonvirtualCharMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jshort (JNICALL *CallNonvirtualShortMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jshort (JNICALL *CallNonvirtualShortMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jshort (JNICALL *CallNonvirtualShortMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jint (JNICALL *CallNonvirtualIntMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jint (JNICALL *CallNonvirtualIntMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jint (JNICALL *CallNonvirtualIntMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jlong (JNICALL *CallNonvirtualLongMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jlong (JNICALL *CallNonvirtualLongMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jlong (JNICALL *CallNonvirtualLongMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jfloat (JNICALL *CallNonvirtualFloatMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jfloat (JNICALL *CallNonvirtualFloatMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jfloat (JNICALL *CallNonvirtualFloatMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jdouble (JNICALL *CallNonvirtualDoubleMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jdouble (JNICALL *CallNonvirtualDoubleMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jdouble (JNICALL *CallNonvirtualDoubleMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + void (JNICALL *CallNonvirtualVoidMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + void (JNICALL *CallNonvirtualVoidMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + void (JNICALL *CallNonvirtualVoidMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jfieldID (JNICALL *GetFieldID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *GetObjectField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jboolean (JNICALL *GetBooleanField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jbyte (JNICALL *GetByteField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jchar (JNICALL *GetCharField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jshort (JNICALL *GetShortField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jint (JNICALL *GetIntField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jlong (JNICALL *GetLongField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jfloat (JNICALL *GetFloatField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jdouble (JNICALL *GetDoubleField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + + void (JNICALL *SetObjectField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val); + void (JNICALL *SetBooleanField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val); + void (JNICALL *SetByteField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val); + void (JNICALL *SetCharField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val); + void (JNICALL *SetShortField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val); + void (JNICALL *SetIntField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jint val); + void (JNICALL *SetLongField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val); + void (JNICALL *SetFloatField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val); + void (JNICALL *SetDoubleField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val); + + jmethodID (JNICALL *GetStaticMethodID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *CallStaticObjectMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *CallStaticObjectMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jobject (JNICALL *CallStaticObjectMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jboolean (JNICALL *CallStaticBooleanMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jboolean (JNICALL *CallStaticBooleanMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jboolean (JNICALL *CallStaticBooleanMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jbyte (JNICALL *CallStaticByteMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jbyte (JNICALL *CallStaticByteMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jbyte (JNICALL *CallStaticByteMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jchar (JNICALL *CallStaticCharMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jchar (JNICALL *CallStaticCharMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jchar (JNICALL *CallStaticCharMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jshort (JNICALL *CallStaticShortMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jshort (JNICALL *CallStaticShortMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jshort (JNICALL *CallStaticShortMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jint (JNICALL *CallStaticIntMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jint (JNICALL *CallStaticIntMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jint (JNICALL *CallStaticIntMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jlong (JNICALL *CallStaticLongMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jlong (JNICALL *CallStaticLongMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jlong (JNICALL *CallStaticLongMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jfloat (JNICALL *CallStaticFloatMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jfloat (JNICALL *CallStaticFloatMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jfloat (JNICALL *CallStaticFloatMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jdouble (JNICALL *CallStaticDoubleMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jdouble (JNICALL *CallStaticDoubleMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jdouble (JNICALL *CallStaticDoubleMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + void (JNICALL *CallStaticVoidMethod) + (JNIEnv *env, jclass cls, jmethodID methodID, ...); + void (JNICALL *CallStaticVoidMethodV) + (JNIEnv *env, jclass cls, jmethodID methodID, va_list args); + void (JNICALL *CallStaticVoidMethodA) + (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args); + + jfieldID (JNICALL *GetStaticFieldID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + jobject (JNICALL *GetStaticObjectField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jboolean (JNICALL *GetStaticBooleanField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jbyte (JNICALL *GetStaticByteField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jchar (JNICALL *GetStaticCharField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jshort (JNICALL *GetStaticShortField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jint (JNICALL *GetStaticIntField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jlong (JNICALL *GetStaticLongField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jfloat (JNICALL *GetStaticFloatField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jdouble (JNICALL *GetStaticDoubleField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + + void (JNICALL *SetStaticObjectField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value); + void (JNICALL *SetStaticBooleanField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value); + void (JNICALL *SetStaticByteField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value); + void (JNICALL *SetStaticCharField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value); + void (JNICALL *SetStaticShortField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value); + void (JNICALL *SetStaticIntField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value); + void (JNICALL *SetStaticLongField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value); + void (JNICALL *SetStaticFloatField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value); + void (JNICALL *SetStaticDoubleField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value); + + jstring (JNICALL *NewString) + (JNIEnv *env, const jchar *unicode, jsize len); + jsize (JNICALL *GetStringLength) + (JNIEnv *env, jstring str); + const jchar *(JNICALL *GetStringChars) + (JNIEnv *env, jstring str, jboolean *isCopy); + void (JNICALL *ReleaseStringChars) + (JNIEnv *env, jstring str, const jchar *chars); + + jstring (JNICALL *NewStringUTF) + (JNIEnv *env, const char *utf); + jsize (JNICALL *GetStringUTFLength) + (JNIEnv *env, jstring str); + const char* (JNICALL *GetStringUTFChars) + (JNIEnv *env, jstring str, jboolean *isCopy); + void (JNICALL *ReleaseStringUTFChars) + (JNIEnv *env, jstring str, const char* chars); + + + jsize (JNICALL *GetArrayLength) + (JNIEnv *env, jarray array); + + jobjectArray (JNICALL *NewObjectArray) + (JNIEnv *env, jsize len, jclass clazz, jobject init); + jobject (JNICALL *GetObjectArrayElement) + (JNIEnv *env, jobjectArray array, jsize index); + void (JNICALL *SetObjectArrayElement) + (JNIEnv *env, jobjectArray array, jsize index, jobject val); + + jbooleanArray (JNICALL *NewBooleanArray) + (JNIEnv *env, jsize len); + jbyteArray (JNICALL *NewByteArray) + (JNIEnv *env, jsize len); + jcharArray (JNICALL *NewCharArray) + (JNIEnv *env, jsize len); + jshortArray (JNICALL *NewShortArray) + (JNIEnv *env, jsize len); + jintArray (JNICALL *NewIntArray) + (JNIEnv *env, jsize len); + jlongArray (JNICALL *NewLongArray) + (JNIEnv *env, jsize len); + jfloatArray (JNICALL *NewFloatArray) + (JNIEnv *env, jsize len); + jdoubleArray (JNICALL *NewDoubleArray) + (JNIEnv *env, jsize len); + + jboolean * (JNICALL *GetBooleanArrayElements) + (JNIEnv *env, jbooleanArray array, jboolean *isCopy); + jbyte * (JNICALL *GetByteArrayElements) + (JNIEnv *env, jbyteArray array, jboolean *isCopy); + jchar * (JNICALL *GetCharArrayElements) + (JNIEnv *env, jcharArray array, jboolean *isCopy); + jshort * (JNICALL *GetShortArrayElements) + (JNIEnv *env, jshortArray array, jboolean *isCopy); + jint * (JNICALL *GetIntArrayElements) + (JNIEnv *env, jintArray array, jboolean *isCopy); + jlong * (JNICALL *GetLongArrayElements) + (JNIEnv *env, jlongArray array, jboolean *isCopy); + jfloat * (JNICALL *GetFloatArrayElements) + (JNIEnv *env, jfloatArray array, jboolean *isCopy); + jdouble * (JNICALL *GetDoubleArrayElements) + (JNIEnv *env, jdoubleArray array, jboolean *isCopy); + + void (JNICALL *ReleaseBooleanArrayElements) + (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode); + void (JNICALL *ReleaseByteArrayElements) + (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode); + void (JNICALL *ReleaseCharArrayElements) + (JNIEnv *env, jcharArray array, jchar *elems, jint mode); + void (JNICALL *ReleaseShortArrayElements) + (JNIEnv *env, jshortArray array, jshort *elems, jint mode); + void (JNICALL *ReleaseIntArrayElements) + (JNIEnv *env, jintArray array, jint *elems, jint mode); + void (JNICALL *ReleaseLongArrayElements) + (JNIEnv *env, jlongArray array, jlong *elems, jint mode); + void (JNICALL *ReleaseFloatArrayElements) + (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode); + void (JNICALL *ReleaseDoubleArrayElements) + (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode); + + void (JNICALL *GetBooleanArrayRegion) + (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf); + void (JNICALL *GetByteArrayRegion) + (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf); + void (JNICALL *GetCharArrayRegion) + (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf); + void (JNICALL *GetShortArrayRegion) + (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf); + void (JNICALL *GetIntArrayRegion) + (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf); + void (JNICALL *GetLongArrayRegion) + (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf); + void (JNICALL *GetFloatArrayRegion) + (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf); + void (JNICALL *GetDoubleArrayRegion) + (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf); + + void (JNICALL *SetBooleanArrayRegion) + (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf); + void (JNICALL *SetByteArrayRegion) + (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf); + void (JNICALL *SetCharArrayRegion) + (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf); + void (JNICALL *SetShortArrayRegion) + (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf); + void (JNICALL *SetIntArrayRegion) + (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf); + void (JNICALL *SetLongArrayRegion) + (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf); + void (JNICALL *SetFloatArrayRegion) + (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf); + void (JNICALL *SetDoubleArrayRegion) + (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf); + + jint (JNICALL *RegisterNatives) + (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, + jint nMethods); + jint (JNICALL *UnregisterNatives) + (JNIEnv *env, jclass clazz); + + jint (JNICALL *MonitorEnter) + (JNIEnv *env, jobject obj); + jint (JNICALL *MonitorExit) + (JNIEnv *env, jobject obj); + + jint (JNICALL *GetJavaVM) + (JNIEnv *env, JavaVM **vm); + + void (JNICALL *GetStringRegion) + (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf); + void (JNICALL *GetStringUTFRegion) + (JNIEnv *env, jstring str, jsize start, jsize len, char *buf); + + void * (JNICALL *GetPrimitiveArrayCritical) + (JNIEnv *env, jarray array, jboolean *isCopy); + void (JNICALL *ReleasePrimitiveArrayCritical) + (JNIEnv *env, jarray array, void *carray, jint mode); + + const jchar * (JNICALL *GetStringCritical) + (JNIEnv *env, jstring string, jboolean *isCopy); + void (JNICALL *ReleaseStringCritical) + (JNIEnv *env, jstring string, const jchar *cstring); + + jweak (JNICALL *NewWeakGlobalRef) + (JNIEnv *env, jobject obj); + void (JNICALL *DeleteWeakGlobalRef) + (JNIEnv *env, jweak ref); + + jboolean (JNICALL *ExceptionCheck) + (JNIEnv *env); + + jobject (JNICALL *NewDirectByteBuffer) + (JNIEnv* env, void* address, jlong capacity); + void* (JNICALL *GetDirectBufferAddress) + (JNIEnv* env, jobject buf); + jlong (JNICALL *GetDirectBufferCapacity) + (JNIEnv* env, jobject buf); + + /* New JNI 1.6 Features */ + + jobjectRefType (JNICALL *GetObjectRefType) + (JNIEnv* env, jobject obj); + + #if TARGET_RT_MAC_CFM && defined(__ppc__) + void* real_functions[228]; + #endif /* TARGET_RT_MAC_CFM && defined(__ppc__) */ +}; + +/* + * We use inlined functions for C++ so that programmers can write: + * + * env->FindClass("java/lang/String") + * + * in C++ rather than: + * + * (*env)->FindClass(env, "java/lang/String") + * + * in C. + */ + +struct JNIEnv_ { + const struct JNINativeInterface_ *functions; +#ifdef __cplusplus + + jint GetVersion() { + return functions->GetVersion(this); + } + jclass DefineClass(const char *name, jobject loader, const jbyte *buf, + jsize len) { + return functions->DefineClass(this, name, loader, buf, len); + } + jclass FindClass(const char *name) { + return functions->FindClass(this, name); + } + jmethodID FromReflectedMethod(jobject method) { + return functions->FromReflectedMethod(this,method); + } + jfieldID FromReflectedField(jobject field) { + return functions->FromReflectedField(this,field); + } + + jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) { + return functions->ToReflectedMethod(this, cls, methodID, isStatic); + } + + jclass GetSuperclass(jclass sub) { + return functions->GetSuperclass(this, sub); + } + jboolean IsAssignableFrom(jclass sub, jclass sup) { + return functions->IsAssignableFrom(this, sub, sup); + } + + jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) { + return functions->ToReflectedField(this,cls,fieldID,isStatic); + } + + jint Throw(jthrowable obj) { + return functions->Throw(this, obj); + } + jint ThrowNew(jclass clazz, const char *msg) { + return functions->ThrowNew(this, clazz, msg); + } + jthrowable ExceptionOccurred() { + return functions->ExceptionOccurred(this); + } + void ExceptionDescribe() { + functions->ExceptionDescribe(this); + } + void ExceptionClear() { + functions->ExceptionClear(this); + } + void FatalError(const char *msg) { + functions->FatalError(this, msg); + } + + jint PushLocalFrame(jint capacity) { + return functions->PushLocalFrame(this,capacity); + } + jobject PopLocalFrame(jobject result) { + return functions->PopLocalFrame(this,result); + } + + jobject NewGlobalRef(jobject lobj) { + return functions->NewGlobalRef(this,lobj); + } + void DeleteGlobalRef(jobject gref) { + functions->DeleteGlobalRef(this,gref); + } + void DeleteLocalRef(jobject obj) { + functions->DeleteLocalRef(this, obj); + } + + jboolean IsSameObject(jobject obj1, jobject obj2) { + return functions->IsSameObject(this,obj1,obj2); + } + + jobject NewLocalRef(jobject ref) { + return functions->NewLocalRef(this,ref); + } + jint EnsureLocalCapacity(jint capacity) { + return functions->EnsureLocalCapacity(this,capacity); + } + + jobject AllocObject(jclass clazz) { + return functions->AllocObject(this,clazz); + } + jobject NewObject(jclass clazz, jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args, methodID); + result = functions->NewObjectV(this,clazz,methodID,args); + va_end(args); + return result; + } + jobject NewObjectV(jclass clazz, jmethodID methodID, + va_list args) { + return functions->NewObjectV(this,clazz,methodID,args); + } + jobject NewObjectA(jclass clazz, jmethodID methodID, + const jvalue *args) { + return functions->NewObjectA(this,clazz,methodID,args); + } + + jclass GetObjectClass(jobject obj) { + return functions->GetObjectClass(this,obj); + } + jboolean IsInstanceOf(jobject obj, jclass clazz) { + return functions->IsInstanceOf(this,obj,clazz); + } + + jmethodID GetMethodID(jclass clazz, const char *name, + const char *sig) { + return functions->GetMethodID(this,clazz,name,sig); + } + + jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallObjectMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jobject CallObjectMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallObjectMethodV(this,obj,methodID,args); + } + jobject CallObjectMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallObjectMethodA(this,obj,methodID,args); + } + + jboolean CallBooleanMethod(jobject obj, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallBooleanMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jboolean CallBooleanMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallBooleanMethodV(this,obj,methodID,args); + } + jboolean CallBooleanMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallBooleanMethodA(this,obj,methodID, args); + } + + jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallByteMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jbyte CallByteMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallByteMethodV(this,obj,methodID,args); + } + jbyte CallByteMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallByteMethodA(this,obj,methodID,args); + } + + jchar CallCharMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallCharMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jchar CallCharMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallCharMethodV(this,obj,methodID,args); + } + jchar CallCharMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallCharMethodA(this,obj,methodID,args); + } + + jshort CallShortMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallShortMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jshort CallShortMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallShortMethodV(this,obj,methodID,args); + } + jshort CallShortMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallShortMethodA(this,obj,methodID,args); + } + + jint CallIntMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallIntMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jint CallIntMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallIntMethodV(this,obj,methodID,args); + } + jint CallIntMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallIntMethodA(this,obj,methodID,args); + } + + jlong CallLongMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallLongMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jlong CallLongMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallLongMethodV(this,obj,methodID,args); + } + jlong CallLongMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallLongMethodA(this,obj,methodID,args); + } + + jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallFloatMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jfloat CallFloatMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallFloatMethodV(this,obj,methodID,args); + } + jfloat CallFloatMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallFloatMethodA(this,obj,methodID,args); + } + + jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallDoubleMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jdouble CallDoubleMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallDoubleMethodV(this,obj,methodID,args); + } + jdouble CallDoubleMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallDoubleMethodA(this,obj,methodID,args); + } + + void CallVoidMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallVoidMethodV(this,obj,methodID,args); + va_end(args); + } + void CallVoidMethodV(jobject obj, jmethodID methodID, + va_list args) { + functions->CallVoidMethodV(this,obj,methodID,args); + } + void CallVoidMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + functions->CallVoidMethodA(this,obj,methodID,args); + } + + jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallNonvirtualObjectMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualObjectMethodV(this,obj,clazz, + methodID,args); + } + jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualObjectMethodA(this,obj,clazz, + methodID,args); + } + + jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualBooleanMethodV(this,obj,clazz, + methodID,args); + } + jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualBooleanMethodA(this,obj,clazz, + methodID, args); + } + + jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallNonvirtualByteMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualByteMethodV(this,obj,clazz, + methodID,args); + } + jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualByteMethodA(this,obj,clazz, + methodID,args); + } + + jchar CallNonvirtualCharMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallNonvirtualCharMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualCharMethodV(this,obj,clazz, + methodID,args); + } + jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualCharMethodA(this,obj,clazz, + methodID,args); + } + + jshort CallNonvirtualShortMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallNonvirtualShortMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualShortMethodV(this,obj,clazz, + methodID,args); + } + jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualShortMethodA(this,obj,clazz, + methodID,args); + } + + jint CallNonvirtualIntMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallNonvirtualIntMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jint CallNonvirtualIntMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualIntMethodV(this,obj,clazz, + methodID,args); + } + jint CallNonvirtualIntMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualIntMethodA(this,obj,clazz, + methodID,args); + } + + jlong CallNonvirtualLongMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallNonvirtualLongMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualLongMethodV(this,obj,clazz, + methodID,args); + } + jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualLongMethodA(this,obj,clazz, + methodID,args); + } + + jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallNonvirtualFloatMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + return functions->CallNonvirtualFloatMethodV(this,obj,clazz, + methodID,args); + } + jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + return functions->CallNonvirtualFloatMethodA(this,obj,clazz, + methodID,args); + } + + jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + return functions->CallNonvirtualDoubleMethodV(this,obj,clazz, + methodID,args); + } + jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + return functions->CallNonvirtualDoubleMethodA(this,obj,clazz, + methodID,args); + } + + void CallNonvirtualVoidMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); + va_end(args); + } + void CallNonvirtualVoidMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); + } + void CallNonvirtualVoidMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args); + } + + jfieldID GetFieldID(jclass clazz, const char *name, + const char *sig) { + return functions->GetFieldID(this,clazz,name,sig); + } + + jobject GetObjectField(jobject obj, jfieldID fieldID) { + return functions->GetObjectField(this,obj,fieldID); + } + jboolean GetBooleanField(jobject obj, jfieldID fieldID) { + return functions->GetBooleanField(this,obj,fieldID); + } + jbyte GetByteField(jobject obj, jfieldID fieldID) { + return functions->GetByteField(this,obj,fieldID); + } + jchar GetCharField(jobject obj, jfieldID fieldID) { + return functions->GetCharField(this,obj,fieldID); + } + jshort GetShortField(jobject obj, jfieldID fieldID) { + return functions->GetShortField(this,obj,fieldID); + } + jint GetIntField(jobject obj, jfieldID fieldID) { + return functions->GetIntField(this,obj,fieldID); + } + jlong GetLongField(jobject obj, jfieldID fieldID) { + return functions->GetLongField(this,obj,fieldID); + } + jfloat GetFloatField(jobject obj, jfieldID fieldID) { + return functions->GetFloatField(this,obj,fieldID); + } + jdouble GetDoubleField(jobject obj, jfieldID fieldID) { + return functions->GetDoubleField(this,obj,fieldID); + } + + void SetObjectField(jobject obj, jfieldID fieldID, jobject val) { + functions->SetObjectField(this,obj,fieldID,val); + } + void SetBooleanField(jobject obj, jfieldID fieldID, + jboolean val) { + functions->SetBooleanField(this,obj,fieldID,val); + } + void SetByteField(jobject obj, jfieldID fieldID, + jbyte val) { + functions->SetByteField(this,obj,fieldID,val); + } + void SetCharField(jobject obj, jfieldID fieldID, + jchar val) { + functions->SetCharField(this,obj,fieldID,val); + } + void SetShortField(jobject obj, jfieldID fieldID, + jshort val) { + functions->SetShortField(this,obj,fieldID,val); + } + void SetIntField(jobject obj, jfieldID fieldID, + jint val) { + functions->SetIntField(this,obj,fieldID,val); + } + void SetLongField(jobject obj, jfieldID fieldID, + jlong val) { + functions->SetLongField(this,obj,fieldID,val); + } + void SetFloatField(jobject obj, jfieldID fieldID, + jfloat val) { + functions->SetFloatField(this,obj,fieldID,val); + } + void SetDoubleField(jobject obj, jfieldID fieldID, + jdouble val) { + functions->SetDoubleField(this,obj,fieldID,val); + } + + jmethodID GetStaticMethodID(jclass clazz, const char *name, + const char *sig) { + return functions->GetStaticMethodID(this,clazz,name,sig); + } + + jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, + ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallStaticObjectMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID, + va_list args) { + return functions->CallStaticObjectMethodV(this,clazz,methodID,args); + } + jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID, + const jvalue *args) { + return functions->CallStaticObjectMethodA(this,clazz,methodID,args); + } + + jboolean CallStaticBooleanMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jboolean CallStaticBooleanMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticBooleanMethodV(this,clazz,methodID,args); + } + jboolean CallStaticBooleanMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticBooleanMethodA(this,clazz,methodID,args); + } + + jbyte CallStaticByteMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallStaticByteMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jbyte CallStaticByteMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticByteMethodV(this,clazz,methodID,args); + } + jbyte CallStaticByteMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticByteMethodA(this,clazz,methodID,args); + } + + jchar CallStaticCharMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallStaticCharMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jchar CallStaticCharMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticCharMethodV(this,clazz,methodID,args); + } + jchar CallStaticCharMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticCharMethodA(this,clazz,methodID,args); + } + + jshort CallStaticShortMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallStaticShortMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jshort CallStaticShortMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticShortMethodV(this,clazz,methodID,args); + } + jshort CallStaticShortMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticShortMethodA(this,clazz,methodID,args); + } + + jint CallStaticIntMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallStaticIntMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jint CallStaticIntMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticIntMethodV(this,clazz,methodID,args); + } + jint CallStaticIntMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticIntMethodA(this,clazz,methodID,args); + } + + jlong CallStaticLongMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallStaticLongMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jlong CallStaticLongMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticLongMethodV(this,clazz,methodID,args); + } + jlong CallStaticLongMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticLongMethodA(this,clazz,methodID,args); + } + + jfloat CallStaticFloatMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallStaticFloatMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jfloat CallStaticFloatMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticFloatMethodV(this,clazz,methodID,args); + } + jfloat CallStaticFloatMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticFloatMethodA(this,clazz,methodID,args); + } + + jdouble CallStaticDoubleMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jdouble CallStaticDoubleMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticDoubleMethodV(this,clazz,methodID,args); + } + jdouble CallStaticDoubleMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticDoubleMethodA(this,clazz,methodID,args); + } + + void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallStaticVoidMethodV(this,cls,methodID,args); + va_end(args); + } + void CallStaticVoidMethodV(jclass cls, jmethodID methodID, + va_list args) { + functions->CallStaticVoidMethodV(this,cls,methodID,args); + } + void CallStaticVoidMethodA(jclass cls, jmethodID methodID, + const jvalue * args) { + functions->CallStaticVoidMethodA(this,cls,methodID,args); + } + + jfieldID GetStaticFieldID(jclass clazz, const char *name, + const char *sig) { + return functions->GetStaticFieldID(this,clazz,name,sig); + } + jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticObjectField(this,clazz,fieldID); + } + jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticBooleanField(this,clazz,fieldID); + } + jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticByteField(this,clazz,fieldID); + } + jchar GetStaticCharField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticCharField(this,clazz,fieldID); + } + jshort GetStaticShortField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticShortField(this,clazz,fieldID); + } + jint GetStaticIntField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticIntField(this,clazz,fieldID); + } + jlong GetStaticLongField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticLongField(this,clazz,fieldID); + } + jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticFloatField(this,clazz,fieldID); + } + jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticDoubleField(this,clazz,fieldID); + } + + void SetStaticObjectField(jclass clazz, jfieldID fieldID, + jobject value) { + functions->SetStaticObjectField(this,clazz,fieldID,value); + } + void SetStaticBooleanField(jclass clazz, jfieldID fieldID, + jboolean value) { + functions->SetStaticBooleanField(this,clazz,fieldID,value); + } + void SetStaticByteField(jclass clazz, jfieldID fieldID, + jbyte value) { + functions->SetStaticByteField(this,clazz,fieldID,value); + } + void SetStaticCharField(jclass clazz, jfieldID fieldID, + jchar value) { + functions->SetStaticCharField(this,clazz,fieldID,value); + } + void SetStaticShortField(jclass clazz, jfieldID fieldID, + jshort value) { + functions->SetStaticShortField(this,clazz,fieldID,value); + } + void SetStaticIntField(jclass clazz, jfieldID fieldID, + jint value) { + functions->SetStaticIntField(this,clazz,fieldID,value); + } + void SetStaticLongField(jclass clazz, jfieldID fieldID, + jlong value) { + functions->SetStaticLongField(this,clazz,fieldID,value); + } + void SetStaticFloatField(jclass clazz, jfieldID fieldID, + jfloat value) { + functions->SetStaticFloatField(this,clazz,fieldID,value); + } + void SetStaticDoubleField(jclass clazz, jfieldID fieldID, + jdouble value) { + functions->SetStaticDoubleField(this,clazz,fieldID,value); + } + + jstring NewString(const jchar *unicode, jsize len) { + return functions->NewString(this,unicode,len); + } + jsize GetStringLength(jstring str) { + return functions->GetStringLength(this,str); + } + const jchar *GetStringChars(jstring str, jboolean *isCopy) { + return functions->GetStringChars(this,str,isCopy); + } + void ReleaseStringChars(jstring str, const jchar *chars) { + functions->ReleaseStringChars(this,str,chars); + } + + jstring NewStringUTF(const char *utf) { + return functions->NewStringUTF(this,utf); + } + jsize GetStringUTFLength(jstring str) { + return functions->GetStringUTFLength(this,str); + } + const char* GetStringUTFChars(jstring str, jboolean *isCopy) { + return functions->GetStringUTFChars(this,str,isCopy); + } + void ReleaseStringUTFChars(jstring str, const char* chars) { + functions->ReleaseStringUTFChars(this,str,chars); + } + + jsize GetArrayLength(jarray array) { + return functions->GetArrayLength(this,array); + } + + jobjectArray NewObjectArray(jsize len, jclass clazz, + jobject init) { + return functions->NewObjectArray(this,len,clazz,init); + } + jobject GetObjectArrayElement(jobjectArray array, jsize index) { + return functions->GetObjectArrayElement(this,array,index); + } + void SetObjectArrayElement(jobjectArray array, jsize index, + jobject val) { + functions->SetObjectArrayElement(this,array,index,val); + } + + jbooleanArray NewBooleanArray(jsize len) { + return functions->NewBooleanArray(this,len); + } + jbyteArray NewByteArray(jsize len) { + return functions->NewByteArray(this,len); + } + jcharArray NewCharArray(jsize len) { + return functions->NewCharArray(this,len); + } + jshortArray NewShortArray(jsize len) { + return functions->NewShortArray(this,len); + } + jintArray NewIntArray(jsize len) { + return functions->NewIntArray(this,len); + } + jlongArray NewLongArray(jsize len) { + return functions->NewLongArray(this,len); + } + jfloatArray NewFloatArray(jsize len) { + return functions->NewFloatArray(this,len); + } + jdoubleArray NewDoubleArray(jsize len) { + return functions->NewDoubleArray(this,len); + } + + jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) { + return functions->GetBooleanArrayElements(this,array,isCopy); + } + jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) { + return functions->GetByteArrayElements(this,array,isCopy); + } + jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) { + return functions->GetCharArrayElements(this,array,isCopy); + } + jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) { + return functions->GetShortArrayElements(this,array,isCopy); + } + jint * GetIntArrayElements(jintArray array, jboolean *isCopy) { + return functions->GetIntArrayElements(this,array,isCopy); + } + jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) { + return functions->GetLongArrayElements(this,array,isCopy); + } + jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) { + return functions->GetFloatArrayElements(this,array,isCopy); + } + jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) { + return functions->GetDoubleArrayElements(this,array,isCopy); + } + + void ReleaseBooleanArrayElements(jbooleanArray array, + jboolean *elems, + jint mode) { + functions->ReleaseBooleanArrayElements(this,array,elems,mode); + } + void ReleaseByteArrayElements(jbyteArray array, + jbyte *elems, + jint mode) { + functions->ReleaseByteArrayElements(this,array,elems,mode); + } + void ReleaseCharArrayElements(jcharArray array, + jchar *elems, + jint mode) { + functions->ReleaseCharArrayElements(this,array,elems,mode); + } + void ReleaseShortArrayElements(jshortArray array, + jshort *elems, + jint mode) { + functions->ReleaseShortArrayElements(this,array,elems,mode); + } + void ReleaseIntArrayElements(jintArray array, + jint *elems, + jint mode) { + functions->ReleaseIntArrayElements(this,array,elems,mode); + } + void ReleaseLongArrayElements(jlongArray array, + jlong *elems, + jint mode) { + functions->ReleaseLongArrayElements(this,array,elems,mode); + } + void ReleaseFloatArrayElements(jfloatArray array, + jfloat *elems, + jint mode) { + functions->ReleaseFloatArrayElements(this,array,elems,mode); + } + void ReleaseDoubleArrayElements(jdoubleArray array, + jdouble *elems, + jint mode) { + functions->ReleaseDoubleArrayElements(this,array,elems,mode); + } + + void GetBooleanArrayRegion(jbooleanArray array, + jsize start, jsize len, jboolean *buf) { + functions->GetBooleanArrayRegion(this,array,start,len,buf); + } + void GetByteArrayRegion(jbyteArray array, + jsize start, jsize len, jbyte *buf) { + functions->GetByteArrayRegion(this,array,start,len,buf); + } + void GetCharArrayRegion(jcharArray array, + jsize start, jsize len, jchar *buf) { + functions->GetCharArrayRegion(this,array,start,len,buf); + } + void GetShortArrayRegion(jshortArray array, + jsize start, jsize len, jshort *buf) { + functions->GetShortArrayRegion(this,array,start,len,buf); + } + void GetIntArrayRegion(jintArray array, + jsize start, jsize len, jint *buf) { + functions->GetIntArrayRegion(this,array,start,len,buf); + } + void GetLongArrayRegion(jlongArray array, + jsize start, jsize len, jlong *buf) { + functions->GetLongArrayRegion(this,array,start,len,buf); + } + void GetFloatArrayRegion(jfloatArray array, + jsize start, jsize len, jfloat *buf) { + functions->GetFloatArrayRegion(this,array,start,len,buf); + } + void GetDoubleArrayRegion(jdoubleArray array, + jsize start, jsize len, jdouble *buf) { + functions->GetDoubleArrayRegion(this,array,start,len,buf); + } + + void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, + const jboolean *buf) { + functions->SetBooleanArrayRegion(this,array,start,len,buf); + } + void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, + const jbyte *buf) { + functions->SetByteArrayRegion(this,array,start,len,buf); + } + void SetCharArrayRegion(jcharArray array, jsize start, jsize len, + const jchar *buf) { + functions->SetCharArrayRegion(this,array,start,len,buf); + } + void SetShortArrayRegion(jshortArray array, jsize start, jsize len, + const jshort *buf) { + functions->SetShortArrayRegion(this,array,start,len,buf); + } + void SetIntArrayRegion(jintArray array, jsize start, jsize len, + const jint *buf) { + functions->SetIntArrayRegion(this,array,start,len,buf); + } + void SetLongArrayRegion(jlongArray array, jsize start, jsize len, + const jlong *buf) { + functions->SetLongArrayRegion(this,array,start,len,buf); + } + void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, + const jfloat *buf) { + functions->SetFloatArrayRegion(this,array,start,len,buf); + } + void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, + const jdouble *buf) { + functions->SetDoubleArrayRegion(this,array,start,len,buf); + } + + jint RegisterNatives(jclass clazz, const JNINativeMethod *methods, + jint nMethods) { + return functions->RegisterNatives(this,clazz,methods,nMethods); + } + jint UnregisterNatives(jclass clazz) { + return functions->UnregisterNatives(this,clazz); + } + + jint MonitorEnter(jobject obj) { + return functions->MonitorEnter(this,obj); + } + jint MonitorExit(jobject obj) { + return functions->MonitorExit(this,obj); + } + + jint GetJavaVM(JavaVM **vm) { + return functions->GetJavaVM(this,vm); + } + + void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) { + functions->GetStringRegion(this,str,start,len,buf); + } + void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) { + functions->GetStringUTFRegion(this,str,start,len,buf); + } + + void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) { + return functions->GetPrimitiveArrayCritical(this,array,isCopy); + } + void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) { + functions->ReleasePrimitiveArrayCritical(this,array,carray,mode); + } + + const jchar * GetStringCritical(jstring string, jboolean *isCopy) { + return functions->GetStringCritical(this,string,isCopy); + } + void ReleaseStringCritical(jstring string, const jchar *cstring) { + functions->ReleaseStringCritical(this,string,cstring); + } + + jweak NewWeakGlobalRef(jobject obj) { + return functions->NewWeakGlobalRef(this,obj); + } + void DeleteWeakGlobalRef(jweak ref) { + functions->DeleteWeakGlobalRef(this,ref); + } + + jboolean ExceptionCheck() { + return functions->ExceptionCheck(this); + } + + jobject NewDirectByteBuffer(void* address, jlong capacity) { + return functions->NewDirectByteBuffer(this, address, capacity); + } + void* GetDirectBufferAddress(jobject buf) { + return functions->GetDirectBufferAddress(this, buf); + } + jlong GetDirectBufferCapacity(jobject buf) { + return functions->GetDirectBufferCapacity(this, buf); + } + jobjectRefType GetObjectRefType(jobject obj) { + return functions->GetObjectRefType(this, obj); + } + +#endif /* __cplusplus */ +}; + +typedef struct JavaVMOption { + char *optionString; + void *extraInfo; +} JavaVMOption; + +typedef struct JavaVMInitArgs { + jint version; + + jint nOptions; + JavaVMOption *options; + jboolean ignoreUnrecognized; +} JavaVMInitArgs; + +typedef struct JavaVMAttachArgs { + jint version; + + char *name; + jobject group; +} JavaVMAttachArgs; + +/* These will be VM-specific. */ + +#define JDK1_2 +#define JDK1_4 + +/* End VM-specific. */ + +struct JNIInvokeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + +#if !TARGET_RT_MAC_CFM && defined(__ppc__) + void* cfm_vectors[4]; +#endif /* !TARGET_RT_MAC_CFM && defined(__ppc__) */ + + jint (JNICALL *DestroyJavaVM)(JavaVM *vm); + + jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args); + + jint (JNICALL *DetachCurrentThread)(JavaVM *vm); + + jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version); + + jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args); + +#if TARGET_RT_MAC_CFM && defined(__ppc__) + void* real_functions[5]; +#endif /* TARGET_RT_MAC_CFM && defined(__ppc__) */ +}; + +struct JavaVM_ { + const struct JNIInvokeInterface_ *functions; +#ifdef __cplusplus + + jint DestroyJavaVM() { + return functions->DestroyJavaVM(this); + } + jint AttachCurrentThread(void **penv, void *args) { + return functions->AttachCurrentThread(this, penv, args); + } + jint DetachCurrentThread() { + return functions->DetachCurrentThread(this); + } + + jint GetEnv(void **penv, jint version) { + return functions->GetEnv(this, penv, version); + } + jint AttachCurrentThreadAsDaemon(void **penv, void *args) { + return functions->AttachCurrentThreadAsDaemon(this, penv, args); + } +#endif +}; + +#ifdef _JNI_IMPLEMENTATION_ +#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT +#else +#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT +#endif +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_GetDefaultJavaVMInitArgs(void *args); + +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args); + +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *); + +/* Defined by native libraries. */ +JNIEXPORT jint JNICALL +JNI_OnLoad(JavaVM *vm, void *reserved); + +JNIEXPORT void JNICALL +JNI_OnUnload(JavaVM *vm, void *reserved); + +#define JNI_VERSION_1_1 0x00010001 +#define JNI_VERSION_1_2 0x00010002 +#define JNI_VERSION_1_4 0x00010004 +#define JNI_VERSION_1_6 0x00010006 + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !_JAVASOFT_JNI_H_ */ + + + diff --git a/jni/jni/jni_md.h b/jni/jni/jni_md.h new file mode 100644 index 00000000..a3289eed --- /dev/null +++ b/jni/jni/jni_md.h @@ -0,0 +1,23 @@ +/* + * @(#)jni_md.h 1.19 05/11/17 + * + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +#ifndef _JAVASOFT_JNI_MD_H_ +#define _JAVASOFT_JNI_MD_H_ + +#define JNIEXPORT __attribute__((visibility("default"))) +#define JNIIMPORT +#define JNICALL + +#if __LP64__ +typedef int jint; +#else +typedef long jint; +#endif +typedef long long jlong; +typedef signed char jbyte; + +#endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/ms/version32.rc b/ms/version32.rc new file mode 100644 index 00000000..09f31720 --- /dev/null +++ b/ms/version32.rc @@ -0,0 +1,47 @@ +#include + +LANGUAGE 0x09,0x01 + +1 VERSIONINFO + FILEVERSION 1,2,1,0 + PRODUCTVERSION 1,2,1,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L +#else + FILEFLAGS 0x00L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + // Required: + VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\0" + VALUE "FileDescription", "OpenSSL Shared Library\0" + VALUE "FileVersion", "1.0.2d-fips\0" +#if defined(CRYPTO) + VALUE "InternalName", "libeay32\0" + VALUE "OriginalFilename", "libeay32.dll\0" +#elif defined(SSL) + VALUE "InternalName", "ssleay32\0" + VALUE "OriginalFilename", "ssleay32.dll\0" +#endif + VALUE "ProductName", "The OpenSSL Toolkit\0" + VALUE "ProductVersion", "1.0.2d-fips\0" + // Optional: + //VALUE "Comments", "\0" + VALUE "LegalCopyright", "Copyright 1998-2005 The OpenSSL Project. Copyright 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\0" + //VALUE "LegalTrademarks", "\0" + //VALUE "PrivateBuild", "\0" + //VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END +END diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c index 7ab62faf..ae2d9cb3 100644 --- a/ssl/s3_lib.c +++ b/ssl/s3_lib.c @@ -2891,7 +2891,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] = { 256}, #endif -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL /* (GmSSL specific) */ { 1, diff --git a/ssl/ssl.h b/ssl/ssl.h index c783f763..00786d5b 100644 --- a/ssl/ssl.h +++ b/ssl/ssl.h @@ -1699,7 +1699,7 @@ struct ssl_st { # include /* Datagram TLS */ # include # include /* Support for the use_srtp extension */ -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # include # endif @@ -2392,7 +2392,7 @@ const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL const SSL_METHOD *GMSSLv1_method(void); const SSL_METHOD *GMSSLv1_server_method(void); const SSL_METHOD *GMSSLv1_client_method(void); diff --git a/ssl/ssl_algs.c b/ssl/ssl_algs.c index 45fc7dec..7e55b075 100644 --- a/ssl/ssl_algs.c +++ b/ssl/ssl_algs.c @@ -137,7 +137,7 @@ int SSL_library_init(void) #ifndef OPENSSL_NO_ECDSA EVP_add_digest(EVP_ecdsa()); #endif -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL EVP_add_cipher(EVP_sms4_cbc()); EVP_add_digest(EVP_sm3()); #endif diff --git a/ssl/ssl_ciph.c b/ssl/ssl_ciph.c index 5805ab5a..6194a226 100644 --- a/ssl/ssl_ciph.c +++ b/ssl/ssl_ciph.c @@ -164,7 +164,7 @@ #define SSL_ENC_SEED_IDX 11 #define SSL_ENC_AES128GCM_IDX 12 #define SSL_ENC_AES256GCM_IDX 13 -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL #define SSL_ENC_SM4_IDX 14 #define SSL_ENC_NUM_IDX 15 #else @@ -174,7 +174,7 @@ static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL NULL #endif }; @@ -191,7 +191,7 @@ static STACK_OF(SSL_COMP) *ssl_comp_methods = NULL; #define SSL_MD_GOST89MAC_IDX 3 #define SSL_MD_SHA256_IDX 4 #define SSL_MD_SHA384_IDX 5 -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL #define SSL_MD_SM3_IDX 6 #endif @@ -202,7 +202,7 @@ static STACK_OF(SSL_COMP) *ssl_comp_methods = NULL; #define SSL_MD_NUM_IDX SSL_MAX_DIGEST static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = { NULL, NULL, NULL, NULL, NULL, NULL, -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL NULL #endif }; @@ -215,14 +215,14 @@ static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = { static int ssl_mac_pkey_id[SSL_MD_NUM_IDX] = { EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, NID_undef, EVP_PKEY_HMAC, EVP_PKEY_HMAC, -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL EVP_PKEY_HMAC #endif }; static int ssl_mac_secret_size[SSL_MD_NUM_IDX] = { 0, 0, 0, 0, 0, 0, -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL 0 #endif }; @@ -231,7 +231,7 @@ static int ssl_handshake_digest_flag[SSL_MD_NUM_IDX] = { SSL_HANDSHAKE_MAC_MD5, SSL_HANDSHAKE_MAC_SHA, SSL_HANDSHAKE_MAC_GOST94, 0, SSL_HANDSHAKE_MAC_SHA256, SSL_HANDSHAKE_MAC_SHA384, -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL SSL_HANDSHAKE_MAC_SM3, #endif }; @@ -482,7 +482,7 @@ void ssl_load_ciphers(void) ssl_mac_secret_size[SSL_MD_SHA384_IDX] = EVP_MD_size(ssl_digest_methods[SSL_MD_SHA384_IDX]); -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL ssl_cipher_methods[SSL_ENC_SM4_IDX] = EVP_get_cipherbyname(SN_sms4_cbc); ssl_digest_methods[SSL_MD_SM3_IDX] = EVP_get_digestbyname(SN_sm3); ssl_mac_secret_size[SSL_MD_SM3_IDX] = EVP_MD_size(ssl_digest_methods[SSL_MD_SM3_IDX]); @@ -609,7 +609,7 @@ int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, case SSL_AES256GCM: i = SSL_ENC_AES256GCM_IDX; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case SSL_SM4: i = SSL_ENC_SM4_IDX; break; @@ -647,7 +647,7 @@ int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, case SSL_GOST89MAC: i = SSL_MD_GOST89MAC_IDX; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case SSL_SM3: i = SSL_MD_SM3_IDX; break; @@ -706,7 +706,7 @@ int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, c->algorithm_mac == SSL_SHA256 && (evp = EVP_get_cipherbyname("AES-256-CBC-HMAC-SHA256"))) *enc = evp, *md = NULL; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL else if (c->algorithm_enc == SSL_SM4 && c->algorithm_mac == SSL_SM3 && (evp = EVP_get_cipherbyname("SM4-CBC-HMAC-SM3"))) @@ -859,7 +859,7 @@ static void ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, || ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX] == NID_undef) ? SSL_GOST89MAC : 0; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL /* what we should do? */ #endif } @@ -1745,7 +1745,7 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) ver = "SSLv3"; else if (alg_ssl & SSL_TLSV1_2) ver = "TLSv1.2"; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL else if (alg_ssl & SSL_GMV1) ver = "GMSSLv1.1"; #endif @@ -1786,7 +1786,7 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) case SSL_kGOST: kx = "GOST"; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case SSL_kECDHE2: kx = "ECDHE2"; break; @@ -1841,7 +1841,7 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) case SSL_aGOST01: au = "GOST01"; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case SSL_aSM2: au = "SM2"; break; @@ -1895,7 +1895,7 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) case SSL_eGOST2814789CNT: enc = "GOST89(256)"; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case SSL_SM4: enc = "SM4(128)"; break; @@ -1927,7 +1927,7 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) case SSL_GOST94: mac = "GOST94"; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case SSL_SM3: mac = "SM3"; break; @@ -1966,7 +1966,7 @@ char *SSL_CIPHER_get_version(const SSL_CIPHER *c) return ("TLSv1/SSLv3"); else if (i == 2) return ("SSLv2"); -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL else if (i == 1) return ("GMSSLv1"); #endif diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index 6db022c1..da05eb0d 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -2850,7 +2850,7 @@ const char *SSL_get_version(const SSL *s) return ("DTLSv1"); else if (s->version == DTLS1_2_VERSION) return ("DTLSv1.2"); -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL else if (s->version == GM1_VERSION) return ("GMSSLv1.1"); #endif diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h index 01a6a876..cbb39fa0 100644 --- a/ssl/ssl_locl.h +++ b/ssl/ssl_locl.h @@ -314,7 +314,7 @@ # define SSL_kGOST 0x00000200L /* SRP */ # define SSL_kSRP 0x00000400L -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL /* GM/T 0024 ECDHE */ # define SSL_kECDHE2 0x00000800L /* GM/T 0024 ECC */ @@ -350,7 +350,7 @@ # define SSL_aGOST01 0x00000200L /* SRP auth */ # define SSL_aSRP 0x00000400L -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL /* GM/T 0024 ECDHE, ECC, IBSDH, IBC */ # define SSL_aSM2 0x00000800L # endif @@ -371,7 +371,7 @@ # define SSL_SEED 0x00000800L # define SSL_AES128GCM 0x00001000L # define SSL_AES256GCM 0x00002000L -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define SSL_SM4 0x00004000L # define SSL_SM1 0x00008000L # endif @@ -389,7 +389,7 @@ # define SSL_SHA384 0x00000020L /* Not a real MAC, just an indication it is part of cipher */ # define SSL_AEAD 0x00000040L -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define SSL_SM3 0x00000080L # endif @@ -398,7 +398,7 @@ # define SSL_SSLV3 0x00000002UL # define SSL_TLSV1 SSL_SSLV3/* for now */ # define SSL_TLSV1_2 0x00000004UL -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define SSL_GMV1 0x00000008UL # endif @@ -409,7 +409,7 @@ # define SSL_HANDSHAKE_MAC_GOST94 0x40 # define SSL_HANDSHAKE_MAC_SHA256 0x80 # define SSL_HANDSHAKE_MAC_SHA384 0x100 -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define SSL_HANDSHAKE_MAC_SM3 0x200 # endif # define SSL_HANDSHAKE_MAC_DEFAULT (SSL_HANDSHAKE_MAC_MD5 | SSL_HANDSHAKE_MAC_SHA) @@ -418,7 +418,7 @@ * When adding new digest in the ssl_ciph.c and increment SSM_MD_NUM_IDX make * sure to update this constant too */ -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL #define SSL_MAX_DIGEST 7 #else #define SSL_MAX_DIGEST 6 @@ -534,7 +534,7 @@ # define SSL_PKEY_ECC 5 # define SSL_PKEY_GOST94 6 # define SSL_PKEY_GOST01 7 -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define SSL_PKEY_SM9 8 # define SSL_PKEY_NUM 9 # else @@ -886,11 +886,11 @@ extern SSL3_ENC_METHOD TLSv1_2_enc_data; extern SSL3_ENC_METHOD SSLv3_enc_data; extern SSL3_ENC_METHOD DTLSv1_enc_data; extern SSL3_ENC_METHOD DTLSv1_2_enc_data; -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL extern SSL3_ENC_METHOD GMSSLv1_enc_data; # endif -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL # define IMPLEMENT_gm1_meth_func(func_name, s_accept, s_connect, \ s_get_meth) \ const SSL_METHOD *func_name(void) \ @@ -1385,7 +1385,7 @@ void tls1_clear(SSL *s); long tls1_ctrl(SSL *s, int cmd, long larg, void *parg); long tls1_callback_ctrl(SSL *s, int cmd, void (*fp) (void)); -# ifndef OPENSSL_NO_GMSSL +# ifndef NO_GMSSL int gm1_num_ciphers(void); const SSL_CIPHER *gm1_get_cipher(unsigned int u); # endif diff --git a/ssl/ssl_sess.c b/ssl/ssl_sess.c index 8d908202..6a25ca6d 100644 --- a/ssl/ssl_sess.c +++ b/ssl/ssl_sess.c @@ -447,7 +447,7 @@ int ssl_get_new_session(SSL *s, int session) } else if (s->version == DTLS1_2_VERSION) { ss->ssl_version = DTLS1_2_VERSION; ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL } else if (s->version == GM1_VERSION) { ss->ssl_version = GM1_VERSION; ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; diff --git a/ssl/ssl_stat.c b/ssl/ssl_stat.c index 3507cb5c..58b2a928 100644 --- a/ssl/ssl_stat.c +++ b/ssl/ssl_stat.c @@ -823,7 +823,7 @@ const char *SSL_state_string(const SSL *s) str = "DWCHVB"; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL /* GMSSL */ #endif @@ -951,7 +951,7 @@ const char *SSL_alert_desc_string(int value) case TLS1_AD_UNKNOWN_PSK_IDENTITY: str = "UP"; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case GM1_AD_UNSUPPORTED_SITE2SITE: str = "U2"; break; @@ -1073,7 +1073,7 @@ const char *SSL_alert_desc_string_long(int value) case TLS1_AD_UNKNOWN_PSK_IDENTITY: str = "unknown PSK identity"; break; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL case GM1_AD_UNSUPPORTED_SITE2SITE: str = "unsupported site2site"; break; diff --git a/ssl/ssl_txt.c b/ssl/ssl_txt.c index 7045e5f4..3bf150b5 100644 --- a/ssl/ssl_txt.c +++ b/ssl/ssl_txt.c @@ -128,7 +128,7 @@ int SSL_SESSION_print(BIO *bp, const SSL_SESSION *x) s = "DTLSv1.2"; else if (x->ssl_version == DTLS1_BAD_VER) s = "DTLSv1-bad"; -#ifndef OPENSSL_NO_GMSSL +#ifndef NO_GMSSL else if (x->ssl_version == GM1_VERSION) s = "GMSSLv1.1"; #endif diff --git a/test/p.zuc.cipher b/test/p.zuc.cipher index 492361f2f0952e29f5c7de5ea40488b6abcedfad..236fa1f76df9fe94829d39a467bb56cd129163b4 100644 GIT binary patch literal 1032 zcmWGe%qdAtiH|?b8fEvh`JaR5BprUuqInKq*yhO2b9WH(teB=SQ|jvm%_0lyz4nuR zLR24p7Q8x-n_<_%3A5@M7!>{;0MiTRL+A-m@eNRMg9Q+Ah20SK4*wzi15oh|qZW<^ L>1d)E@N5A9qUgQ2 literal 1036 zcmWGe%qdAtiH{HdwSSR;T3g2b-Wew6`WR~(r|lLz7cpBz>f0sV&Y)9=&-IlnXU5q0 zTTVZB+5Tij!-Rwb3H2%TUH5q|&`-vAZ=02ME|4^cO2A9cg? TL&E`v(J-ZMn9@5u2PzH$p2xYW diff --git a/test/p.zuc.clear b/test/p.zuc.clear index fffb0991efee8b2143a2919621d918e2d7594829..c9b3771bff21dab718040e1ce076f9efb837fb32 100644 GIT binary patch literal 1016 zcmeaAq{FXSG|%A++Z@?>?hZnp71I=EN`2j+S!7|o*M723i0Y%yf>-BpGYkaq9CaL- P!9E&tWCk3=2njg=ESqp+ literal 1016 zcmccLJHzB$A7f49wB3T|B4&$7eY>RF8FcFKxxRAc%orPg%jxGX+n=mxn2_KQaJQa; z;ew4Lm=3rH;VUFU=mcAc_yef;2B`Q4sCdDBh`J9A5W2w*qMqRagnuCkLJQbK#3um7 a?~l5TVYr1GC=CtP^agU