diff --git a/.travis.yml b/.travis.yml index a618262d..29016c5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ compiler: - gcc env: - - CONFIG_OPTS="no-paillier no-serpent --prefix=/home/travis/dist/" DESTDIR="_install" + - CONFIG_OPTS=" --prefix=/home/travis/dist/" DESTDIR="_install" before_script: - env diff --git a/crypto/sm2/build.info b/crypto/sm2/build.info index d87944c2..b5dc0873 100644 --- a/crypto/sm2/build.info +++ b/crypto/sm2/build.info @@ -1,7 +1,3 @@ LIBS=../../libcrypto SOURCE[../../libcrypto]=sm2_err.c sm2_asn1.c sm2_id.c sm2_sign.c sm2_enc.c \ - sm2_oct.c sm2_exch.c sm2_kmeth.c sm2_standard_enc.c sm2_standard_exch.c \ - sm2_standard_sign.c ./miracl/mralloc.c ./miracl/mrarth0.c \ - ./miracl/mrarth1.c ./miracl/mrarth2.c ./miracl/mrarth3.c ./miracl/mrbits.c \ - ./miracl/mrcore.c ./miracl/mrcurve.c ./miracl/mrjack.c ./miracl/mrlucas.c\ - ./miracl/mrmonty.c ./miracl/mrmuldv.c ./miracl/mrsroot.c ./miracl/mrxgcd.c + sm2_oct.c sm2_exch.c sm2_kmeth.c diff --git a/crypto/sm9/build.info b/crypto/sm9/build.info index 4d9af353..19bd5822 100644 --- a/crypto/sm9/build.info +++ b/crypto/sm9/build.info @@ -1,3 +1,3 @@ LIBS=../../libcrypto SOURCE[../../libcrypto]=sm9_lib.c sm9_err.c sm9_asn1.c sm9_params.c \ - sm9_setup.c sm9_keygen.c sm9_sign.c sm9_enc.c sm9_kap.c + sm9_setup.c sm9_keygen.c sm9_sign.c sm9_enc.c sm9_kap.c diff --git a/doc/CT_POLICY_EVAL_CTX_new.pod b/doc/CT_POLICY_EVAL_CTX_new.pod index fedc58d0..01f042b1 100644 --- a/doc/CT_POLICY_EVAL_CTX_new.pod +++ b/doc/CT_POLICY_EVAL_CTX_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CT_POLICY_EVAL_CTX_new, CT_POLICY_EVAL_CTX_free, diff --git a/doc/SCT_validate.pod b/doc/SCT_validate.pod index 9868a282..a4fbde6b 100644 --- a/doc/SCT_validate.pod +++ b/doc/SCT_validate.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SCT_validate, SCT_LIST_validate, SCT_get_validation_status - diff --git a/doc/SSL_CTX_set_ct_validation_callback.pod b/doc/SSL_CTX_set_ct_validation_callback.pod index d818e00f..80e3fec9 100644 --- a/doc/SSL_CTX_set_ct_validation_callback.pod +++ b/doc/SSL_CTX_set_ct_validation_callback.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_enable_ct, SSL_CTX_enable_ct, SSL_disable_ct, SSL_CTX_disable_ct, diff --git a/doc/apps/CA.pl.pod b/doc/apps/CA.pl.pod index 34438cbb..c86b7ee4 100644 --- a/doc/apps/CA.pl.pod +++ b/doc/apps/CA.pl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CA.pl - friendlier interface for GmSSL certificate programs diff --git a/doc/apps/asn1parse.pod b/doc/apps/asn1parse.pod index 988a0934..52d4903f 100644 --- a/doc/apps/asn1parse.pod +++ b/doc/apps/asn1parse.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME asn1parse - ASN.1 parsing tool diff --git a/doc/apps/ca.pod b/doc/apps/ca.pod index 76d9d5d8..6c918e07 100644 --- a/doc/apps/ca.pod +++ b/doc/apps/ca.pod @@ -1,7 +1,11 @@ =pod +=encoding utf8 + =head1 NAME +=encoding utf8 + ca - sample minimal CA application =head1 SYNOPSIS @@ -62,6 +66,9 @@ and their status. The options descriptions will be divided into each purpose. +ca指令是CA中很小的应用。它可以用来签发各种形式的用户证书并产生CRL。它还可以用来更新证书库。 +在这些选项的介绍中,将尽可能地对它们进行分类介绍。 + =head1 OPTIONS =over 4 @@ -70,70 +77,99 @@ The options descriptions will be divided into each purpose. Print out a usage message. +显示用法信息。 + =item B<-verbose> this prints extra details about the operations being performed. +输出更详细的一些操作过程信息。 + =item B<-config filename> specifies the configuration file to use. +指定将要使用的配置文件。 + =item B<-name section> specifies the configuration file section to use (overrides B in the B section). +指定将要使用的配置文件部分(覆盖ca部分中的default_ca部分) + =item B<-in filename> an input filename containing a single certificate request to be signed by the CA. +一个输入文件名包含了一个要由CA签名的单独证书请求。 + =item B<-ss_cert filename> a single self-signed certificate to be signed by the CA. +一个要由CA签名的自签名证书。 + =item B<-spkac filename> a file containing a single Netscape signed public key and challenge and additional field values to be signed by the CA. See the B section for information on the required input and output format. +一个包含了一个单独的Netscape签名的公钥和其他附加用户信息。 +关于输入输出格式的信息具体可以参考SPKAC部分。 + =item B<-infiles> if present this should be the last option, all subsequent arguments are taken as the names of files containing certificate requests. +该选项总是作为指令的最后一个选项,其后面所有的参数都被认为是证书请求文件。 + =item B<-out filename> the output file to output certificates to. The default is standard output. The certificate details will also be printed out to this file in PEM format (except that B<-spkac> outputs DER format). +输出文件输出签发好的证书。默认值为标准输出。输出的证书都是PEM编码的(除了spkac输出DER编码) + =item B<-outdir directory> the directory to output certificates to. The certificate will be written to a filename consisting of the serial number in hex with ".pem" appended. +将新生成的证书输出到目录。新生成证书将会序列号加“pem”后缀成为一个完整的证书文件名。 + =item B<-cert> the CA certificate file. +CA证书文件。 + =item B<-keyfile filename> the private key to sign requests with. +用于签署请求的私钥。 + =item B<-keyform PEM|DER> the format of the data in the private key file. The default is PEM. +私钥文件中数据的格式。默认为PEM。 + =item B<-key password> the password used to encrypt the private key. Since on some systems the command line arguments are visible (e.g. Unix with the 'ps' utility) this option should be used with caution. +用于加密私钥的密码。因为在某些系统上命令行参数是可见的(例如使用“ps”实用程序的Unix),应谨慎使用此选项。 + =item B<-selfsign> indicates the issued certificates are to be signed with the key @@ -148,35 +184,54 @@ certificate appears among the entries in the certificate database serial number counter as all other certificates sign with the self-signed certificate. +表示发出的证书将使用证书请求签名的密钥(以-keyfile命名)进行签名。 +使用不同密钥签名的证书请求将被忽略。如果给出-spkac,-ss_cert或-gencrl,则忽略-selfsign + +使用-selfsign的结果是自签名证书出现在证书数据库的条目中,并使用与其他证书相同的序列号计数器。 + =item B<-passin arg> the key password source. For more information about the format of B see the B section in L. +给定了读取私钥文件的时候需要提供的口令。 + =item B<-notext> don't output the text form of a certificate to the output file. +不把证书的文本形式输出到输出文件。 + =item B<-startdate date> this allows the start date to be explicitly set. The format of the date is YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure). +设置证书的生效时间,其参数格式是“YYMMDDHHMMSSZ”。 + =item B<-enddate date> this allows the expiry date to be explicitly set. The format of the date is YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure). +设置证书的到期时间,其参数格式是“YYMMDDHHMMSSZ”。 + =item B<-days arg> the number of days to certify the certificate for. +设置证书的有效天数。 + =item B<-md alg> the message digest to use. Any digest supported by the GmSSL B command can be used. This option also applies to CRLs. +消息摘要使用。 +可以使用GmSSL dgst命令支持的任何摘要。 +该选项也适用于CRLs。 + =item B<-policy arg> this option defines the CA "policy" to use. This is a section in @@ -184,6 +239,9 @@ the configuration file which decides which fields should be mandatory or match the CA certificate. Check out the B section for more information. +该选项定义了CA的匹配策略。这是配置文件中的一部分,它决定了哪些字段应该是必须的 +或与CA证书匹配。查看policy format部分来了解更多信息。 + =item B<-msie_hack> this is a legacy option to make B work with very old versions of @@ -192,6 +250,10 @@ for almost everything. Since the old control has various security bugs its use is strongly discouraged. The newer control "Xenroll" does not need this option. +这是一个遗留的项目,它可以使ca可以使用非常老的ie证书注册控件centenr3.它几乎所有东西 +都使用了UniversalStrings。我们非常不推荐使用旧版控件应为它有很多的安全漏洞。新的控件 +Xenroll不需要这一项。 + =item B<-preserveDN> Normally the DN order of a certificate is the same as the order of the @@ -200,6 +262,11 @@ is the same as the request. This is largely for compatibility with the older IE enrollment control which would only accept certificates if their DNs match the order of the request. This is not needed for Xenroll. +使指令在签发证书的时候让证书主体名称内的各项内容顺序跟证书请求中的顺序保持一致。 +而在默认情况下,证书主题名称内的各个选项顺序是按照配置文件中的证书匹配策略子段的 +选项顺序进行排列的。 + + =item B<-noemailDN> The DN of a certificate can contain the EMAIL field if present in the @@ -209,6 +276,8 @@ EMAIL field is removed from the certificate' subject and set only in the, eventually present, extensions. The B keyword can be used in the configuration file to enable this behaviour. + + =item B<-batch> this sets the batch mode. In this mode no questions will be asked diff --git a/doc/apps/ciphers.pod b/doc/apps/ciphers.pod index ac3790bf..fc0a500c 100644 --- a/doc/apps/ciphers.pod +++ b/doc/apps/ciphers.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ciphers - SSL cipher display and cipher list tool diff --git a/doc/apps/cms.pod b/doc/apps/cms.pod index b2975a72..77e7b460 100644 --- a/doc/apps/cms.pod +++ b/doc/apps/cms.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME cms - CMS utility diff --git a/doc/apps/config.pod b/doc/apps/config.pod index f0902919..59b1eb17 100644 --- a/doc/apps/config.pod +++ b/doc/apps/config.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment gmssl_manual_section:5 =head1 NAME diff --git a/doc/apps/crl.pod b/doc/apps/crl.pod index 481a671f..0b6e8b0e 100644 --- a/doc/apps/crl.pod +++ b/doc/apps/crl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME crl - CRL utility diff --git a/doc/apps/crl2pkcs7.pod b/doc/apps/crl2pkcs7.pod index 12ddce86..2ef3441a 100644 --- a/doc/apps/crl2pkcs7.pod +++ b/doc/apps/crl2pkcs7.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME crl2pkcs7 - Create a PKCS#7 structure from a CRL and certificates diff --git a/doc/apps/dgst.pod b/doc/apps/dgst.pod index 268dfaf3..7155c88c 100644 --- a/doc/apps/dgst.pod +++ b/doc/apps/dgst.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME dgst, sha, sha1, mdc2, ripemd160, sha224, sm3, sha384, sha512, md4, md5, blake2b, blake2s - message digests diff --git a/doc/apps/dhparam.pod b/doc/apps/dhparam.pod index d7f56487..79ca3193 100644 --- a/doc/apps/dhparam.pod +++ b/doc/apps/dhparam.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME dhparam - DH parameter manipulation and generation diff --git a/doc/apps/dsa.pod b/doc/apps/dsa.pod index c159ba83..930641d6 100644 --- a/doc/apps/dsa.pod +++ b/doc/apps/dsa.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME dsa - DSA key processing diff --git a/doc/apps/dsaparam.pod b/doc/apps/dsaparam.pod index 7be32673..06e29dbe 100644 --- a/doc/apps/dsaparam.pod +++ b/doc/apps/dsaparam.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME dsaparam - DSA parameter manipulation and generation diff --git a/doc/apps/ec.pod b/doc/apps/ec.pod index 773296ae..24463224 100644 --- a/doc/apps/ec.pod +++ b/doc/apps/ec.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ec - EC key processing diff --git a/doc/apps/ecparam.pod b/doc/apps/ecparam.pod index 1cea4bcb..052661db 100644 --- a/doc/apps/ecparam.pod +++ b/doc/apps/ecparam.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ecparam - EC parameter manipulation and generation diff --git a/doc/apps/enc.pod b/doc/apps/enc.pod index 15818e1b..269a2882 100644 --- a/doc/apps/enc.pod +++ b/doc/apps/enc.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME enc - symmetric cipher routines diff --git a/doc/apps/engine.pod b/doc/apps/engine.pod index 0a5b5b82..e680cbab 100644 --- a/doc/apps/engine.pod +++ b/doc/apps/engine.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME engine - load and query engines diff --git a/doc/apps/errstr.pod b/doc/apps/errstr.pod index ad33f222..930fb944 100644 --- a/doc/apps/errstr.pod +++ b/doc/apps/errstr.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME errstr - lookup error codes diff --git a/doc/apps/gendsa.pod b/doc/apps/gendsa.pod index 7ef070be..97ca6ac4 100644 --- a/doc/apps/gendsa.pod +++ b/doc/apps/gendsa.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME gendsa - generate a DSA private key from a set of parameters diff --git a/doc/apps/genpkey.pod b/doc/apps/genpkey.pod index ef81fbc4..46e83983 100644 --- a/doc/apps/genpkey.pod +++ b/doc/apps/genpkey.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME genpkey - generate a private key diff --git a/doc/apps/genrsa.pod b/doc/apps/genrsa.pod index 1d4a4d15..d97c6631 100644 --- a/doc/apps/genrsa.pod +++ b/doc/apps/genrsa.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME genrsa - generate an RSA private key diff --git a/doc/apps/gmssl.pod b/doc/apps/gmssl.pod index 93c5fe31..4cc2b466 100644 --- a/doc/apps/gmssl.pod +++ b/doc/apps/gmssl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME gmssl - GmSSL command line tool diff --git a/doc/apps/list.pod b/doc/apps/list.pod index 72eb41d4..81a71b67 100644 --- a/doc/apps/list.pod +++ b/doc/apps/list.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME list - list algorithms and features diff --git a/doc/apps/nseq.pod b/doc/apps/nseq.pod index 9cc5bf27..648417a5 100644 --- a/doc/apps/nseq.pod +++ b/doc/apps/nseq.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME nseq - create or examine a Netscape certificate sequence diff --git a/doc/apps/ocsp.pod b/doc/apps/ocsp.pod index fa89fa88..692aef9b 100644 --- a/doc/apps/ocsp.pod +++ b/doc/apps/ocsp.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ocsp - Online Certificate Status Protocol utility diff --git a/doc/apps/passwd.pod b/doc/apps/passwd.pod index fedd79ec..f75733b8 100644 --- a/doc/apps/passwd.pod +++ b/doc/apps/passwd.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME passwd - compute password hashes diff --git a/doc/apps/pkcs12.pod b/doc/apps/pkcs12.pod index 0d35e439..bba3b531 100644 --- a/doc/apps/pkcs12.pod +++ b/doc/apps/pkcs12.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME pkcs12 - PKCS#12 file utility diff --git a/doc/apps/pkcs7.pod b/doc/apps/pkcs7.pod index 46944071..184f5a12 100644 --- a/doc/apps/pkcs7.pod +++ b/doc/apps/pkcs7.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME pkcs7 - PKCS#7 utility diff --git a/doc/apps/pkcs8.pod b/doc/apps/pkcs8.pod index d7653c44..e6044dc2 100644 --- a/doc/apps/pkcs8.pod +++ b/doc/apps/pkcs8.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME pkcs8 - PKCS#8 format private key conversion tool diff --git a/doc/apps/pkey.pod b/doc/apps/pkey.pod index dbe9585e..e8e7d661 100644 --- a/doc/apps/pkey.pod +++ b/doc/apps/pkey.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME pkey - public or private key processing tool diff --git a/doc/apps/pkeyparam.pod b/doc/apps/pkeyparam.pod index b25b1c8f..84daa537 100644 --- a/doc/apps/pkeyparam.pod +++ b/doc/apps/pkeyparam.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME pkeyparam - public key algorithm parameter processing tool diff --git a/doc/apps/pkeyutl.pod b/doc/apps/pkeyutl.pod index ab0c7b05..fdd4c759 100644 --- a/doc/apps/pkeyutl.pod +++ b/doc/apps/pkeyutl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME pkeyutl - public key algorithm utility diff --git a/doc/apps/rand.pod b/doc/apps/rand.pod index ba451873..f1c18643 100644 --- a/doc/apps/rand.pod +++ b/doc/apps/rand.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME rand - generate pseudo-random bytes diff --git a/doc/apps/rehash.pod b/doc/apps/rehash.pod index ec5c0b8c..2f5b62e9 100644 --- a/doc/apps/rehash.pod +++ b/doc/apps/rehash.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment Original text by James Westby, contributed under the GmSSL license. diff --git a/doc/apps/req.pod b/doc/apps/req.pod index b834560c..0985586c 100644 --- a/doc/apps/req.pod +++ b/doc/apps/req.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME req - PKCS#10 certificate request and certificate generating utility diff --git a/doc/apps/rsa.pod b/doc/apps/rsa.pod index 4b4e37e4..a3e1b547 100644 --- a/doc/apps/rsa.pod +++ b/doc/apps/rsa.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME rsa - RSA key processing tool diff --git a/doc/apps/rsautl.pod b/doc/apps/rsautl.pod index ff00be6e..3299dce0 100644 --- a/doc/apps/rsautl.pod +++ b/doc/apps/rsautl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME rsautl - RSA utility diff --git a/doc/apps/s_client.pod b/doc/apps/s_client.pod index 173b26ca..bb94f938 100644 --- a/doc/apps/s_client.pod +++ b/doc/apps/s_client.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME s_client - SSL/TLS client program diff --git a/doc/apps/s_server.pod b/doc/apps/s_server.pod index 880c24e5..b440c09e 100644 --- a/doc/apps/s_server.pod +++ b/doc/apps/s_server.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME s_server - SSL/TLS server program diff --git a/doc/apps/s_time.pod b/doc/apps/s_time.pod index 4b799c51..225ccace 100644 --- a/doc/apps/s_time.pod +++ b/doc/apps/s_time.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME s_time - SSL/TLS performance timing program diff --git a/doc/apps/sess_id.pod b/doc/apps/sess_id.pod index f5ad8e89..2224d935 100644 --- a/doc/apps/sess_id.pod +++ b/doc/apps/sess_id.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME sess_id - SSL/TLS session handling utility diff --git a/doc/apps/smime.pod b/doc/apps/smime.pod index d096145e..34c821fd 100644 --- a/doc/apps/smime.pod +++ b/doc/apps/smime.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME smime - S/MIME utility diff --git a/doc/apps/speed.pod b/doc/apps/speed.pod index 466af692..c32c95ee 100644 --- a/doc/apps/speed.pod +++ b/doc/apps/speed.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME speed - test library performance diff --git a/doc/apps/spkac.pod b/doc/apps/spkac.pod index cb1c8208..4198fc07 100644 --- a/doc/apps/spkac.pod +++ b/doc/apps/spkac.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME spkac - SPKAC printing and generating utility diff --git a/doc/apps/ts.pod b/doc/apps/ts.pod index e535120e..959cf7d9 100644 --- a/doc/apps/ts.pod +++ b/doc/apps/ts.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ts - Time Stamping Authority tool (client/server) diff --git a/doc/apps/tsget.pod b/doc/apps/tsget.pod index ad7e4479..81fc0974 100644 --- a/doc/apps/tsget.pod +++ b/doc/apps/tsget.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME tsget - Time Stamping HTTP/HTTPS client diff --git a/doc/apps/verify.pod b/doc/apps/verify.pod index 53496d38..336f63d0 100644 --- a/doc/apps/verify.pod +++ b/doc/apps/verify.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME verify - Utility to verify certificates diff --git a/doc/apps/version.pod b/doc/apps/version.pod index 88eb5e6b..1708f37b 100644 --- a/doc/apps/version.pod +++ b/doc/apps/version.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME version - print GmSSL version information diff --git a/doc/apps/x509.pod b/doc/apps/x509.pod index b0263d58..105bffc3 100644 --- a/doc/apps/x509.pod +++ b/doc/apps/x509.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME x509 - Certificate display and signing utility diff --git a/doc/apps/x509v3_config.pod b/doc/apps/x509v3_config.pod index 03e06500..3b610a48 100644 --- a/doc/apps/x509v3_config.pod +++ b/doc/apps/x509v3_config.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment gmssl_manual_section:5 =head1 NAME diff --git a/doc/crypto/ASN1_INTEGER_get_int64.pod b/doc/crypto/ASN1_INTEGER_get_int64.pod index 6fa1428c..af7f55c9 100644 --- a/doc/crypto/ASN1_INTEGER_get_int64.pod +++ b/doc/crypto/ASN1_INTEGER_get_int64.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASN1_INTEGER_get_uint64, ASN1_INTEGER_set_uint64, diff --git a/doc/crypto/ASN1_OBJECT_new.pod b/doc/crypto/ASN1_OBJECT_new.pod index 4c018eff..ef35045d 100644 --- a/doc/crypto/ASN1_OBJECT_new.pod +++ b/doc/crypto/ASN1_OBJECT_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASN1_OBJECT_new, ASN1_OBJECT_free - object allocation functions diff --git a/doc/crypto/ASN1_STRING_length.pod b/doc/crypto/ASN1_STRING_length.pod index 26cb1761..7046c674 100644 --- a/doc/crypto/ASN1_STRING_length.pod +++ b/doc/crypto/ASN1_STRING_length.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASN1_STRING_dup, ASN1_STRING_cmp, ASN1_STRING_set, ASN1_STRING_length, diff --git a/doc/crypto/ASN1_STRING_new.pod b/doc/crypto/ASN1_STRING_new.pod index 7bd2fc19..ae2e3088 100644 --- a/doc/crypto/ASN1_STRING_new.pod +++ b/doc/crypto/ASN1_STRING_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASN1_STRING_new, ASN1_STRING_type_new, ASN1_STRING_free - diff --git a/doc/crypto/ASN1_STRING_print_ex.pod b/doc/crypto/ASN1_STRING_print_ex.pod index d2bf538f..5d61f019 100644 --- a/doc/crypto/ASN1_STRING_print_ex.pod +++ b/doc/crypto/ASN1_STRING_print_ex.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASN1_STRING_print_ex, ASN1_STRING_print_ex_fp, ASN1_STRING_print - ASN1_STRING output routines diff --git a/doc/crypto/ASN1_TIME_set.pod b/doc/crypto/ASN1_TIME_set.pod index 457b7218..c56e7cae 100644 --- a/doc/crypto/ASN1_TIME_set.pod +++ b/doc/crypto/ASN1_TIME_set.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASN1_TIME_set, ASN1_TIME_adj, ASN1_TIME_check, ASN1_TIME_set_string, diff --git a/doc/crypto/ASN1_TYPE_get.pod b/doc/crypto/ASN1_TYPE_get.pod index 70c56878..503081d0 100644 --- a/doc/crypto/ASN1_TYPE_get.pod +++ b/doc/crypto/ASN1_TYPE_get.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASN1_TYPE_get, ASN1_TYPE_set, ASN1_TYPE_set1, ASN1_TYPE_cmp, ASN1_TYPE_unpack_sequence, ASN1_TYPE_pack_sequence - ASN1_TYPE utility diff --git a/doc/crypto/ASN1_generate_nconf.pod b/doc/crypto/ASN1_generate_nconf.pod index 92f624fa..0b2be353 100644 --- a/doc/crypto/ASN1_generate_nconf.pod +++ b/doc/crypto/ASN1_generate_nconf.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASN1_generate_nconf, ASN1_generate_v3 - ASN1 generation functions diff --git a/doc/crypto/ASYNC_WAIT_CTX_new.pod b/doc/crypto/ASYNC_WAIT_CTX_new.pod index 580c4e5d..787deb54 100644 --- a/doc/crypto/ASYNC_WAIT_CTX_new.pod +++ b/doc/crypto/ASYNC_WAIT_CTX_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASYNC_WAIT_CTX_new, ASYNC_WAIT_CTX_free, ASYNC_WAIT_CTX_set_wait_fd, diff --git a/doc/crypto/ASYNC_start_job.pod b/doc/crypto/ASYNC_start_job.pod index c10a66f5..60685549 100644 --- a/doc/crypto/ASYNC_start_job.pod +++ b/doc/crypto/ASYNC_start_job.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ASYNC_get_wait_ctx, diff --git a/doc/crypto/BF_encrypt.pod b/doc/crypto/BF_encrypt.pod index 0401e90a..ba0fd4f5 100644 --- a/doc/crypto/BF_encrypt.pod +++ b/doc/crypto/BF_encrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BF_set_key, BF_encrypt, BF_decrypt, BF_ecb_encrypt, BF_cbc_encrypt, diff --git a/doc/crypto/BIO_ADDR.pod b/doc/crypto/BIO_ADDR.pod index 4b169e8a..050ab20e 100644 --- a/doc/crypto/BIO_ADDR.pod +++ b/doc/crypto/BIO_ADDR.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_ADDR, BIO_ADDR_new, BIO_ADDR_clear, BIO_ADDR_free, BIO_ADDR_rawmake, diff --git a/doc/crypto/BIO_ADDRINFO.pod b/doc/crypto/BIO_ADDRINFO.pod index 9ebf99a8..85ed3dd3 100644 --- a/doc/crypto/BIO_ADDRINFO.pod +++ b/doc/crypto/BIO_ADDRINFO.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_ADDRINFO, BIO_ADDRINFO_next, BIO_ADDRINFO_free, diff --git a/doc/crypto/BIO_connect.pod b/doc/crypto/BIO_connect.pod index 5194033f..92cdc658 100644 --- a/doc/crypto/BIO_connect.pod +++ b/doc/crypto/BIO_connect.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_socket, BIO_connect, BIO_listen, BIO_accept_ex, BIO_closesocket - BIO diff --git a/doc/crypto/BIO_ctrl.pod b/doc/crypto/BIO_ctrl.pod index a098946d..76148eb6 100644 --- a/doc/crypto/BIO_ctrl.pod +++ b/doc/crypto/BIO_ctrl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_ctrl, BIO_callback_ctrl, BIO_ptr_ctrl, BIO_int_ctrl, BIO_reset, diff --git a/doc/crypto/BIO_f_base64.pod b/doc/crypto/BIO_f_base64.pod index 19df1dd6..40a0a099 100644 --- a/doc/crypto/BIO_f_base64.pod +++ b/doc/crypto/BIO_f_base64.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_f_base64 - base64 BIO filter diff --git a/doc/crypto/BIO_f_buffer.pod b/doc/crypto/BIO_f_buffer.pod index 32247109..aab59206 100644 --- a/doc/crypto/BIO_f_buffer.pod +++ b/doc/crypto/BIO_f_buffer.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_get_buffer_num_lines, diff --git a/doc/crypto/BIO_f_cipher.pod b/doc/crypto/BIO_f_cipher.pod index 87ab3ccc..c51e8731 100644 --- a/doc/crypto/BIO_f_cipher.pod +++ b/doc/crypto/BIO_f_cipher.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_f_cipher, BIO_set_cipher, BIO_get_cipher_status, BIO_get_cipher_ctx - cipher BIO filter diff --git a/doc/crypto/BIO_f_md.pod b/doc/crypto/BIO_f_md.pod index 32f00467..ffde1eb4 100644 --- a/doc/crypto/BIO_f_md.pod +++ b/doc/crypto/BIO_f_md.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_f_md, BIO_set_md, BIO_get_md, BIO_get_md_ctx - message digest BIO filter diff --git a/doc/crypto/BIO_f_null.pod b/doc/crypto/BIO_f_null.pod index c4e4c667..86b0e966 100644 --- a/doc/crypto/BIO_f_null.pod +++ b/doc/crypto/BIO_f_null.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_f_null - null filter diff --git a/doc/crypto/BIO_f_ssl.pod b/doc/crypto/BIO_f_ssl.pod index 3f9635ee..363172b5 100644 --- a/doc/crypto/BIO_f_ssl.pod +++ b/doc/crypto/BIO_f_ssl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_do_handshake, diff --git a/doc/crypto/BIO_find_type.pod b/doc/crypto/BIO_find_type.pod index ff7b4886..417231e6 100644 --- a/doc/crypto/BIO_find_type.pod +++ b/doc/crypto/BIO_find_type.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_find_type, BIO_next, BIO_method_type - BIO chain traversal diff --git a/doc/crypto/BIO_get_data.pod b/doc/crypto/BIO_get_data.pod index 14f21fa7..43a287e2 100644 --- a/doc/crypto/BIO_get_data.pod +++ b/doc/crypto/BIO_get_data.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_set_data, BIO_get_data, BIO_set_init, BIO_get_init, BIO_set_shutdown, diff --git a/doc/crypto/BIO_get_ex_new_index.pod b/doc/crypto/BIO_get_ex_new_index.pod index 3e24f10b..285b7104 100644 --- a/doc/crypto/BIO_get_ex_new_index.pod +++ b/doc/crypto/BIO_get_ex_new_index.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_get_ex_new_index, BIO_set_ex_data, BIO_get_ex_data, diff --git a/doc/crypto/BIO_meth_new.pod b/doc/crypto/BIO_meth_new.pod index bf331610..9fa37e0b 100644 --- a/doc/crypto/BIO_meth_new.pod +++ b/doc/crypto/BIO_meth_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_get_new_index, diff --git a/doc/crypto/BIO_new.pod b/doc/crypto/BIO_new.pod index 006cf592..b071b883 100644 --- a/doc/crypto/BIO_new.pod +++ b/doc/crypto/BIO_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_new, BIO_up_ref, BIO_free, BIO_vfree, BIO_free_all, diff --git a/doc/crypto/BIO_new_CMS.pod b/doc/crypto/BIO_new_CMS.pod index b06c224f..e6a84880 100644 --- a/doc/crypto/BIO_new_CMS.pod +++ b/doc/crypto/BIO_new_CMS.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_new_CMS - CMS streaming filter BIO diff --git a/doc/crypto/BIO_parse_hostserv.pod b/doc/crypto/BIO_parse_hostserv.pod index 4ee4f46a..59d4e1c3 100644 --- a/doc/crypto/BIO_parse_hostserv.pod +++ b/doc/crypto/BIO_parse_hostserv.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_parse_hostserv - utility routines to parse a standard host and service diff --git a/doc/crypto/BIO_push.pod b/doc/crypto/BIO_push.pod index 762027ff..de7b9af9 100644 --- a/doc/crypto/BIO_push.pod +++ b/doc/crypto/BIO_push.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_push, BIO_pop, BIO_set_next - add and remove BIOs from a chain diff --git a/doc/crypto/BIO_read.pod b/doc/crypto/BIO_read.pod index 45871c1b..05afdce5 100644 --- a/doc/crypto/BIO_read.pod +++ b/doc/crypto/BIO_read.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_read, BIO_write, BIO_gets, BIO_puts - BIO I/O functions diff --git a/doc/crypto/BIO_s_accept.pod b/doc/crypto/BIO_s_accept.pod index ce9995dc..fd4f0a44 100644 --- a/doc/crypto/BIO_s_accept.pod +++ b/doc/crypto/BIO_s_accept.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_s_accept, BIO_set_accept_name, BIO_set_accept_port, BIO_get_accept_name, diff --git a/doc/crypto/BIO_s_bio.pod b/doc/crypto/BIO_s_bio.pod index cb46546e..20dfc745 100644 --- a/doc/crypto/BIO_s_bio.pod +++ b/doc/crypto/BIO_s_bio.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_s_bio, BIO_make_bio_pair, BIO_destroy_bio_pair, BIO_shutdown_wr, diff --git a/doc/crypto/BIO_s_connect.pod b/doc/crypto/BIO_s_connect.pod index 2143acd0..74b09eb4 100644 --- a/doc/crypto/BIO_s_connect.pod +++ b/doc/crypto/BIO_s_connect.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_set_conn_address, BIO_get_conn_address, diff --git a/doc/crypto/BIO_s_fd.pod b/doc/crypto/BIO_s_fd.pod index 79c4a599..f08c0ac8 100644 --- a/doc/crypto/BIO_s_fd.pod +++ b/doc/crypto/BIO_s_fd.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_s_fd, BIO_set_fd, BIO_get_fd, BIO_new_fd - file descriptor BIO diff --git a/doc/crypto/BIO_s_file.pod b/doc/crypto/BIO_s_file.pod index e19d8242..214c67dc 100644 --- a/doc/crypto/BIO_s_file.pod +++ b/doc/crypto/BIO_s_file.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_s_file, BIO_new_file, BIO_new_fp, BIO_set_fp, BIO_get_fp, diff --git a/doc/crypto/BIO_s_mem.pod b/doc/crypto/BIO_s_mem.pod index b272c410..fd594078 100644 --- a/doc/crypto/BIO_s_mem.pod +++ b/doc/crypto/BIO_s_mem.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_s_secmem, diff --git a/doc/crypto/BIO_s_null.pod b/doc/crypto/BIO_s_null.pod index 5a1d84dd..f1418d2d 100644 --- a/doc/crypto/BIO_s_null.pod +++ b/doc/crypto/BIO_s_null.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_s_null - null data sink diff --git a/doc/crypto/BIO_s_socket.pod b/doc/crypto/BIO_s_socket.pod index ad0574ae..ec8a410d 100644 --- a/doc/crypto/BIO_s_socket.pod +++ b/doc/crypto/BIO_s_socket.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_s_socket, BIO_new_socket - socket BIO diff --git a/doc/crypto/BIO_set_callback.pod b/doc/crypto/BIO_set_callback.pod index ed395fa0..e29f8334 100644 --- a/doc/crypto/BIO_set_callback.pod +++ b/doc/crypto/BIO_set_callback.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_set_callback_ex, BIO_get_callback_ex, BIO_set_callback, BIO_get_callback, diff --git a/doc/crypto/BIO_should_retry.pod b/doc/crypto/BIO_should_retry.pod index d6ddf48e..397687f2 100644 --- a/doc/crypto/BIO_should_retry.pod +++ b/doc/crypto/BIO_should_retry.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BIO_should_read, BIO_should_write, diff --git a/doc/crypto/BN_BLINDING_new.pod b/doc/crypto/BN_BLINDING_new.pod index 5f56aa3f..8dc38eba 100644 --- a/doc/crypto/BN_BLINDING_new.pod +++ b/doc/crypto/BN_BLINDING_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_BLINDING_new, BN_BLINDING_free, BN_BLINDING_update, BN_BLINDING_convert, diff --git a/doc/crypto/BN_CTX_new.pod b/doc/crypto/BN_CTX_new.pod index ca545905..e52d6089 100644 --- a/doc/crypto/BN_CTX_new.pod +++ b/doc/crypto/BN_CTX_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_CTX_new, BN_CTX_secure_new, BN_CTX_free - allocate and free BN_CTX structures diff --git a/doc/crypto/BN_CTX_start.pod b/doc/crypto/BN_CTX_start.pod index 372da506..ad0e1032 100644 --- a/doc/crypto/BN_CTX_start.pod +++ b/doc/crypto/BN_CTX_start.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_CTX_start, BN_CTX_get, BN_CTX_end - use temporary BIGNUM variables diff --git a/doc/crypto/BN_add.pod b/doc/crypto/BN_add.pod index 72cc09f6..963dc530 100644 --- a/doc/crypto/BN_add.pod +++ b/doc/crypto/BN_add.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_add, BN_sub, BN_mul, BN_sqr, BN_div, BN_mod, BN_nnmod, BN_mod_add, diff --git a/doc/crypto/BN_add_word.pod b/doc/crypto/BN_add_word.pod index 35bdcf45..faac4edb 100644 --- a/doc/crypto/BN_add_word.pod +++ b/doc/crypto/BN_add_word.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_add_word, BN_sub_word, BN_mul_word, BN_div_word, BN_mod_word - arithmetic diff --git a/doc/crypto/BN_bn2bin.pod b/doc/crypto/BN_bn2bin.pod index b272010b..d257f1f5 100644 --- a/doc/crypto/BN_bn2bin.pod +++ b/doc/crypto/BN_bn2bin.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_bn2binpad, diff --git a/doc/crypto/BN_cmp.pod b/doc/crypto/BN_cmp.pod index ec005718..e7438323 100644 --- a/doc/crypto/BN_cmp.pod +++ b/doc/crypto/BN_cmp.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_cmp, BN_ucmp, BN_is_zero, BN_is_one, BN_is_word, BN_is_odd - BIGNUM comparison and test functions diff --git a/doc/crypto/BN_copy.pod b/doc/crypto/BN_copy.pod index b044b98a..6afa95d5 100644 --- a/doc/crypto/BN_copy.pod +++ b/doc/crypto/BN_copy.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_copy, BN_dup, BN_with_flags - copy BIGNUMs diff --git a/doc/crypto/BN_generate_prime.pod b/doc/crypto/BN_generate_prime.pod index 0472b9b8..df2c6914 100644 --- a/doc/crypto/BN_generate_prime.pod +++ b/doc/crypto/BN_generate_prime.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_generate_prime_ex, BN_is_prime_ex, BN_is_prime_fasttest_ex, BN_GENCB_call, diff --git a/doc/crypto/BN_mod_inverse.pod b/doc/crypto/BN_mod_inverse.pod index b4792add..8217775c 100644 --- a/doc/crypto/BN_mod_inverse.pod +++ b/doc/crypto/BN_mod_inverse.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_mod_inverse - compute inverse modulo n diff --git a/doc/crypto/BN_mod_mul_montgomery.pod b/doc/crypto/BN_mod_mul_montgomery.pod index bf1ef343..28ee9902 100644 --- a/doc/crypto/BN_mod_mul_montgomery.pod +++ b/doc/crypto/BN_mod_mul_montgomery.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_mod_mul_montgomery, BN_MONT_CTX_new, diff --git a/doc/crypto/BN_mod_mul_reciprocal.pod b/doc/crypto/BN_mod_mul_reciprocal.pod index d0536cd9..966e0fd1 100644 --- a/doc/crypto/BN_mod_mul_reciprocal.pod +++ b/doc/crypto/BN_mod_mul_reciprocal.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_mod_mul_reciprocal, BN_div_recp, BN_RECP_CTX_new, diff --git a/doc/crypto/BN_new.pod b/doc/crypto/BN_new.pod index 02776142..4f5433ef 100644 --- a/doc/crypto/BN_new.pod +++ b/doc/crypto/BN_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_new, BN_secure_new, BN_clear, BN_free, BN_clear_free - allocate and free BIGNUMs diff --git a/doc/crypto/BN_num_bytes.pod b/doc/crypto/BN_num_bytes.pod index 4680cf7a..f901abe4 100644 --- a/doc/crypto/BN_num_bytes.pod +++ b/doc/crypto/BN_num_bytes.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_num_bits, BN_num_bytes, BN_num_bits_word - get BIGNUM size diff --git a/doc/crypto/BN_rand.pod b/doc/crypto/BN_rand.pod index ae15ada7..20b4926f 100644 --- a/doc/crypto/BN_rand.pod +++ b/doc/crypto/BN_rand.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_rand, BN_pseudo_rand, BN_rand_range, BN_pseudo_rand_range - generate pseudo-random number diff --git a/doc/crypto/BN_set_bit.pod b/doc/crypto/BN_set_bit.pod index 363227ad..6b16d407 100644 --- a/doc/crypto/BN_set_bit.pod +++ b/doc/crypto/BN_set_bit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_set_bit, BN_clear_bit, BN_is_bit_set, BN_mask_bits, BN_lshift, diff --git a/doc/crypto/BN_swap.pod b/doc/crypto/BN_swap.pod index fe7cc848..89a980a1 100644 --- a/doc/crypto/BN_swap.pod +++ b/doc/crypto/BN_swap.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_swap - exchange BIGNUMs diff --git a/doc/crypto/BN_zero.pod b/doc/crypto/BN_zero.pod index fadc21b7..c627c0fb 100644 --- a/doc/crypto/BN_zero.pod +++ b/doc/crypto/BN_zero.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BN_zero, BN_one, BN_value_one, BN_set_word, BN_get_word - BIGNUM assignment diff --git a/doc/crypto/BUF_MEM_new.pod b/doc/crypto/BUF_MEM_new.pod index 29466088..1bf5c8a2 100644 --- a/doc/crypto/BUF_MEM_new.pod +++ b/doc/crypto/BUF_MEM_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME BUF_MEM_new, BUF_MEM_new_ex, BUF_MEM_free, BUF_MEM_grow diff --git a/doc/crypto/CMS_add0_cert.pod b/doc/crypto/CMS_add0_cert.pod index 5b0cc2a2..e10c64bb 100644 --- a/doc/crypto/CMS_add0_cert.pod +++ b/doc/crypto/CMS_add0_cert.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_add0_cert, CMS_add1_cert, CMS_get1_certs, CMS_add0_crl, CMS_add1_crl, CMS_get1_crls, - CMS certificate and CRL utility functions diff --git a/doc/crypto/CMS_add1_recipient_cert.pod b/doc/crypto/CMS_add1_recipient_cert.pod index 0dae5cf5..98cc664d 100644 --- a/doc/crypto/CMS_add1_recipient_cert.pod +++ b/doc/crypto/CMS_add1_recipient_cert.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_add1_recipient_cert, CMS_add0_recipient_key - add recipients to a CMS enveloped data structure diff --git a/doc/crypto/CMS_add1_signer.pod b/doc/crypto/CMS_add1_signer.pod index f4738e06..e6ec62a5 100644 --- a/doc/crypto/CMS_add1_signer.pod +++ b/doc/crypto/CMS_add1_signer.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_add1_signer, CMS_SignerInfo_sign - add a signer to a CMS_ContentInfo signed data structure diff --git a/doc/crypto/CMS_compress.pod b/doc/crypto/CMS_compress.pod index e4051083..740f166e 100644 --- a/doc/crypto/CMS_compress.pod +++ b/doc/crypto/CMS_compress.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_compress - create a CMS CompressedData structure diff --git a/doc/crypto/CMS_decrypt.pod b/doc/crypto/CMS_decrypt.pod index b3b196c3..9f9edc5a 100644 --- a/doc/crypto/CMS_decrypt.pod +++ b/doc/crypto/CMS_decrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_decrypt - decrypt content from a CMS envelopedData structure diff --git a/doc/crypto/CMS_encrypt.pod b/doc/crypto/CMS_encrypt.pod index 0ed42628..8a29a6be 100644 --- a/doc/crypto/CMS_encrypt.pod +++ b/doc/crypto/CMS_encrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_encrypt - create a CMS envelopedData structure diff --git a/doc/crypto/CMS_final.pod b/doc/crypto/CMS_final.pod index 264fe7bc..5973b280 100644 --- a/doc/crypto/CMS_final.pod +++ b/doc/crypto/CMS_final.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_final - finalise a CMS_ContentInfo structure diff --git a/doc/crypto/CMS_get0_RecipientInfos.pod b/doc/crypto/CMS_get0_RecipientInfos.pod index 6c33c224..c446b9a4 100644 --- a/doc/crypto/CMS_get0_RecipientInfos.pod +++ b/doc/crypto/CMS_get0_RecipientInfos.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_get0_RecipientInfos, CMS_RecipientInfo_type, diff --git a/doc/crypto/CMS_get0_SignerInfos.pod b/doc/crypto/CMS_get0_SignerInfos.pod index c8071591..638bfcbe 100644 --- a/doc/crypto/CMS_get0_SignerInfos.pod +++ b/doc/crypto/CMS_get0_SignerInfos.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_SignerInfo_set1_signer_cert, diff --git a/doc/crypto/CMS_get0_type.pod b/doc/crypto/CMS_get0_type.pod index cad8d3f6..11d4a0ea 100644 --- a/doc/crypto/CMS_get0_type.pod +++ b/doc/crypto/CMS_get0_type.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_get0_type, CMS_set1_eContentType, CMS_get0_eContentType, CMS_get0_content - get and set CMS content types and content diff --git a/doc/crypto/CMS_get1_ReceiptRequest.pod b/doc/crypto/CMS_get1_ReceiptRequest.pod index 79f5f423..f99e6424 100644 --- a/doc/crypto/CMS_get1_ReceiptRequest.pod +++ b/doc/crypto/CMS_get1_ReceiptRequest.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_ReceiptRequest_create0, CMS_add1_ReceiptRequest, CMS_get1_ReceiptRequest, CMS_ReceiptRequest_get0_values - CMS signed receipt request functions diff --git a/doc/crypto/CMS_sign.pod b/doc/crypto/CMS_sign.pod index 396deef7..b2d1e78a 100644 --- a/doc/crypto/CMS_sign.pod +++ b/doc/crypto/CMS_sign.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_sign - create a CMS SignedData structure diff --git a/doc/crypto/CMS_sign_receipt.pod b/doc/crypto/CMS_sign_receipt.pod index 8ea6df1f..b0354356 100644 --- a/doc/crypto/CMS_sign_receipt.pod +++ b/doc/crypto/CMS_sign_receipt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_sign_receipt - create a CMS signed receipt diff --git a/doc/crypto/CMS_uncompress.pod b/doc/crypto/CMS_uncompress.pod index 80f9c0d1..684ec64b 100644 --- a/doc/crypto/CMS_uncompress.pod +++ b/doc/crypto/CMS_uncompress.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_uncompress - uncompress a CMS CompressedData structure diff --git a/doc/crypto/CMS_verify.pod b/doc/crypto/CMS_verify.pod index c2ff57bc..c2ca1233 100644 --- a/doc/crypto/CMS_verify.pod +++ b/doc/crypto/CMS_verify.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_verify, CMS_get0_signers - verify a CMS SignedData structure diff --git a/doc/crypto/CMS_verify_receipt.pod b/doc/crypto/CMS_verify_receipt.pod index 193241c6..f4d3cdfc 100644 --- a/doc/crypto/CMS_verify_receipt.pod +++ b/doc/crypto/CMS_verify_receipt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CMS_verify_receipt - verify a CMS signed receipt diff --git a/doc/crypto/CONF_modules_free.pod b/doc/crypto/CONF_modules_free.pod index ac59f373..2b027b25 100644 --- a/doc/crypto/CONF_modules_free.pod +++ b/doc/crypto/CONF_modules_free.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CONF_modules_free, CONF_modules_finish, CONF_modules_unload - diff --git a/doc/crypto/CONF_modules_load_file.pod b/doc/crypto/CONF_modules_load_file.pod index 9e4071f2..2cd26227 100644 --- a/doc/crypto/CONF_modules_load_file.pod +++ b/doc/crypto/CONF_modules_load_file.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CONF_modules_load_file, CONF_modules_load - OpenSSL configuration functions diff --git a/doc/crypto/CRYPTO_THREAD_run_once.pod b/doc/crypto/CRYPTO_THREAD_run_once.pod index 7795a044..20343d29 100644 --- a/doc/crypto/CRYPTO_THREAD_run_once.pod +++ b/doc/crypto/CRYPTO_THREAD_run_once.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CRYPTO_THREAD_run_once, diff --git a/doc/crypto/CRYPTO_get_ex_new_index.pod b/doc/crypto/CRYPTO_get_ex_new_index.pod index 98085f52..ceabf188 100644 --- a/doc/crypto/CRYPTO_get_ex_new_index.pod +++ b/doc/crypto/CRYPTO_get_ex_new_index.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CRYPTO_EX_new, CRYPTO_EX_free, CRYPTO_EX_dup, diff --git a/doc/crypto/CTLOG_STORE_get0_log_by_id.pod b/doc/crypto/CTLOG_STORE_get0_log_by_id.pod index c517e95e..67b5db40 100644 --- a/doc/crypto/CTLOG_STORE_get0_log_by_id.pod +++ b/doc/crypto/CTLOG_STORE_get0_log_by_id.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CTLOG_STORE_get0_log_by_id - diff --git a/doc/crypto/CTLOG_STORE_new.pod b/doc/crypto/CTLOG_STORE_new.pod index 2a38f263..0f02d8ba 100644 --- a/doc/crypto/CTLOG_STORE_new.pod +++ b/doc/crypto/CTLOG_STORE_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CTLOG_STORE_new, CTLOG_STORE_free, diff --git a/doc/crypto/CTLOG_new.pod b/doc/crypto/CTLOG_new.pod index ccda6b9c..fa95a9dd 100644 --- a/doc/crypto/CTLOG_new.pod +++ b/doc/crypto/CTLOG_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CTLOG_new, CTLOG_new_from_base64, CTLOG_free, diff --git a/doc/crypto/CT_POLICY_EVAL_CTX_new.pod b/doc/crypto/CT_POLICY_EVAL_CTX_new.pod index 62792992..931e60ce 100644 --- a/doc/crypto/CT_POLICY_EVAL_CTX_new.pod +++ b/doc/crypto/CT_POLICY_EVAL_CTX_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CT_POLICY_EVAL_CTX_new, CT_POLICY_EVAL_CTX_free, diff --git a/doc/crypto/DEFINE_STACK_OF.pod b/doc/crypto/DEFINE_STACK_OF.pod index ae443b0a..d2ce303e 100644 --- a/doc/crypto/DEFINE_STACK_OF.pod +++ b/doc/crypto/DEFINE_STACK_OF.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DEFINE_STACK_OF, DEFINE_STACK_OF_CONST, DEFINE_SPECIAL_STACK_OF, diff --git a/doc/crypto/DES_random_key.pod b/doc/crypto/DES_random_key.pod index 0131093b..23efb3de 100644 --- a/doc/crypto/DES_random_key.pod +++ b/doc/crypto/DES_random_key.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DES_random_key, DES_set_key, DES_key_sched, DES_set_key_checked, diff --git a/doc/crypto/DH_generate_key.pod b/doc/crypto/DH_generate_key.pod index de0847a9..59cf4743 100644 --- a/doc/crypto/DH_generate_key.pod +++ b/doc/crypto/DH_generate_key.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DH_generate_key, DH_compute_key - perform Diffie-Hellman key exchange diff --git a/doc/crypto/DH_generate_parameters.pod b/doc/crypto/DH_generate_parameters.pod index ce178af0..4530f59c 100644 --- a/doc/crypto/DH_generate_parameters.pod +++ b/doc/crypto/DH_generate_parameters.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DH_generate_parameters_ex, DH_generate_parameters, diff --git a/doc/crypto/DH_get0_pqg.pod b/doc/crypto/DH_get0_pqg.pod index 79647bf8..a15d1b5f 100644 --- a/doc/crypto/DH_get0_pqg.pod +++ b/doc/crypto/DH_get0_pqg.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DH_get0_pqg, DH_set0_pqg, DH_get0_key, DH_set0_key, DH_clear_flags, diff --git a/doc/crypto/DH_get_1024_160.pod b/doc/crypto/DH_get_1024_160.pod index 4044f104..55c6fcae 100644 --- a/doc/crypto/DH_get_1024_160.pod +++ b/doc/crypto/DH_get_1024_160.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DH_get_1024_160, diff --git a/doc/crypto/DH_meth_new.pod b/doc/crypto/DH_meth_new.pod index bcf55921..5172c208 100644 --- a/doc/crypto/DH_meth_new.pod +++ b/doc/crypto/DH_meth_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DH_meth_new, DH_meth_free, DH_meth_dup, DH_meth_get0_name, DH_meth_set1_name, diff --git a/doc/crypto/DH_new.pod b/doc/crypto/DH_new.pod index 959a470e..cde5bce7 100644 --- a/doc/crypto/DH_new.pod +++ b/doc/crypto/DH_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DH_new, DH_free - allocate and free DH objects diff --git a/doc/crypto/DH_set_method.pod b/doc/crypto/DH_set_method.pod index cd75a9b5..758b2efb 100644 --- a/doc/crypto/DH_set_method.pod +++ b/doc/crypto/DH_set_method.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DH_set_default_method, DH_get_default_method, diff --git a/doc/crypto/DH_size.pod b/doc/crypto/DH_size.pod index 8c1d151f..77cad4b3 100644 --- a/doc/crypto/DH_size.pod +++ b/doc/crypto/DH_size.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DH_size, DH_bits - get Diffie-Hellman prime size diff --git a/doc/crypto/DSA_SIG_new.pod b/doc/crypto/DSA_SIG_new.pod index 7503460a..f9aef9ea 100644 --- a/doc/crypto/DSA_SIG_new.pod +++ b/doc/crypto/DSA_SIG_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_SIG_get0, DSA_SIG_set0, diff --git a/doc/crypto/DSA_do_sign.pod b/doc/crypto/DSA_do_sign.pod index 5e56d209..a23b8ce6 100644 --- a/doc/crypto/DSA_do_sign.pod +++ b/doc/crypto/DSA_do_sign.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_do_sign, DSA_do_verify - raw DSA signature operations diff --git a/doc/crypto/DSA_dup_DH.pod b/doc/crypto/DSA_dup_DH.pod index 6967ef3d..b2afac75 100644 --- a/doc/crypto/DSA_dup_DH.pod +++ b/doc/crypto/DSA_dup_DH.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_dup_DH - create a DH structure out of DSA structure diff --git a/doc/crypto/DSA_generate_key.pod b/doc/crypto/DSA_generate_key.pod index 4781abed..0a752dd9 100644 --- a/doc/crypto/DSA_generate_key.pod +++ b/doc/crypto/DSA_generate_key.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_generate_key - generate DSA key pair diff --git a/doc/crypto/DSA_generate_parameters.pod b/doc/crypto/DSA_generate_parameters.pod index ca2c2ce7..85ca8f75 100644 --- a/doc/crypto/DSA_generate_parameters.pod +++ b/doc/crypto/DSA_generate_parameters.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_generate_parameters_ex, DSA_generate_parameters - generate DSA parameters diff --git a/doc/crypto/DSA_get0_pqg.pod b/doc/crypto/DSA_get0_pqg.pod index e87e42a4..5ba89372 100644 --- a/doc/crypto/DSA_get0_pqg.pod +++ b/doc/crypto/DSA_get0_pqg.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_get0_pqg, DSA_set0_pqg, DSA_get0_key, DSA_set0_key, DSA_clear_flags, diff --git a/doc/crypto/DSA_meth_new.pod b/doc/crypto/DSA_meth_new.pod index 68f744ab..e69f206c 100644 --- a/doc/crypto/DSA_meth_new.pod +++ b/doc/crypto/DSA_meth_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_meth_new, DSA_meth_free, DSA_meth_dup, DSA_meth_get0_name, diff --git a/doc/crypto/DSA_new.pod b/doc/crypto/DSA_new.pod index a967ab5d..f80a7510 100644 --- a/doc/crypto/DSA_new.pod +++ b/doc/crypto/DSA_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_new, DSA_free - allocate and free DSA objects diff --git a/doc/crypto/DSA_set_method.pod b/doc/crypto/DSA_set_method.pod index a64725f7..a628e774 100644 --- a/doc/crypto/DSA_set_method.pod +++ b/doc/crypto/DSA_set_method.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_set_default_method, DSA_get_default_method, diff --git a/doc/crypto/DSA_sign.pod b/doc/crypto/DSA_sign.pod index ba0f6b86..152a1b21 100644 --- a/doc/crypto/DSA_sign.pod +++ b/doc/crypto/DSA_sign.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_sign, DSA_sign_setup, DSA_verify - DSA signatures diff --git a/doc/crypto/DSA_size.pod b/doc/crypto/DSA_size.pod index 16e6f3a9..d89e777e 100644 --- a/doc/crypto/DSA_size.pod +++ b/doc/crypto/DSA_size.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DSA_size, DSA_bits - get DSA signature size or key bits diff --git a/doc/crypto/ECDSA_SIG_new.pod b/doc/crypto/ECDSA_SIG_new.pod index 9e1f662c..a33e0c94 100644 --- a/doc/crypto/ECDSA_SIG_new.pod +++ b/doc/crypto/ECDSA_SIG_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ECDSA_SIG_get0, ECDSA_SIG_set0, diff --git a/doc/crypto/ECPKParameters_print.pod b/doc/crypto/ECPKParameters_print.pod index c9c36283..af55920d 100644 --- a/doc/crypto/ECPKParameters_print.pod +++ b/doc/crypto/ECPKParameters_print.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ECPKParameters_print, ECPKParameters_print_fp - Functions for decoding and diff --git a/doc/crypto/EC_GFp_simple_method.pod b/doc/crypto/EC_GFp_simple_method.pod index 89c590eb..8eff76a3 100644 --- a/doc/crypto/EC_GFp_simple_method.pod +++ b/doc/crypto/EC_GFp_simple_method.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EC_GFp_simple_method, EC_GFp_mont_method, EC_GFp_nist_method, EC_GFp_nistp224_method, EC_GFp_nistp256_method, EC_GFp_nistp521_method, EC_GF2m_simple_method, EC_METHOD_get_field_type - Functions for obtaining EC_METHOD objects diff --git a/doc/crypto/EC_GROUP_copy.pod b/doc/crypto/EC_GROUP_copy.pod index 6b398dfe..4147c05a 100644 --- a/doc/crypto/EC_GROUP_copy.pod +++ b/doc/crypto/EC_GROUP_copy.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EC_GROUP_get0_order, EC_GROUP_order_bits, EC_GROUP_get0_cofactor, diff --git a/doc/crypto/EC_GROUP_new.pod b/doc/crypto/EC_GROUP_new.pod index 25129100..1fb2806d 100644 --- a/doc/crypto/EC_GROUP_new.pod +++ b/doc/crypto/EC_GROUP_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EC_GROUP_get_ecparameters, EC_GROUP_get_ecpkparameters, diff --git a/doc/crypto/EC_KEY_get_enc_flags.pod b/doc/crypto/EC_KEY_get_enc_flags.pod index abc55c14..a7db55bd 100644 --- a/doc/crypto/EC_KEY_get_enc_flags.pod +++ b/doc/crypto/EC_KEY_get_enc_flags.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EC_KEY_get_enc_flags, EC_KEY_set_enc_flags diff --git a/doc/crypto/EC_KEY_new.pod b/doc/crypto/EC_KEY_new.pod index 83a2c6d0..c0450a11 100644 --- a/doc/crypto/EC_KEY_new.pod +++ b/doc/crypto/EC_KEY_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EC_KEY_get_method, EC_KEY_set_method, diff --git a/doc/crypto/EC_POINT_add.pod b/doc/crypto/EC_POINT_add.pod index c029de42..637f27a8 100644 --- a/doc/crypto/EC_POINT_add.pod +++ b/doc/crypto/EC_POINT_add.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EC_POINT_add, EC_POINT_dbl, EC_POINT_invert, EC_POINT_is_at_infinity, EC_POINT_is_on_curve, EC_POINT_cmp, EC_POINT_make_affine, EC_POINTs_make_affine, EC_POINTs_mul, EC_POINT_mul, EC_GROUP_precompute_mult, EC_GROUP_have_precompute_mult - Functions for performing mathematical operations and tests on EC_POINT objects diff --git a/doc/crypto/EC_POINT_new.pod b/doc/crypto/EC_POINT_new.pod index 206648c8..f8a48efd 100644 --- a/doc/crypto/EC_POINT_new.pod +++ b/doc/crypto/EC_POINT_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EC_POINT_set_Jprojective_coordinates_GFp, EC_POINT_point2buf, diff --git a/doc/crypto/ENGINE_add.pod b/doc/crypto/ENGINE_add.pod index 37384f69..e41efd4f 100644 --- a/doc/crypto/ENGINE_add.pod +++ b/doc/crypto/ENGINE_add.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ENGINE_get_DH, ENGINE_get_DSA, ENGINE_get_ECDH, ENGINE_get_ECDSA, diff --git a/doc/crypto/ERR_GET_LIB.pod b/doc/crypto/ERR_GET_LIB.pod index 7368a401..7a45df31 100644 --- a/doc/crypto/ERR_GET_LIB.pod +++ b/doc/crypto/ERR_GET_LIB.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_GET_LIB, ERR_GET_FUNC, ERR_GET_REASON, ERR_FATAL_ERROR diff --git a/doc/crypto/ERR_clear_error.pod b/doc/crypto/ERR_clear_error.pod index 892c67fc..49791d18 100644 --- a/doc/crypto/ERR_clear_error.pod +++ b/doc/crypto/ERR_clear_error.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_clear_error - clear the error queue diff --git a/doc/crypto/ERR_error_string.pod b/doc/crypto/ERR_error_string.pod index 12f4f72b..cc187b3d 100644 --- a/doc/crypto/ERR_error_string.pod +++ b/doc/crypto/ERR_error_string.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_error_string, ERR_error_string_n, ERR_lib_error_string, diff --git a/doc/crypto/ERR_get_error.pod b/doc/crypto/ERR_get_error.pod index a7efc74d..9812a1f6 100644 --- a/doc/crypto/ERR_get_error.pod +++ b/doc/crypto/ERR_get_error.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_get_error, ERR_peek_error, ERR_peek_last_error, diff --git a/doc/crypto/ERR_load_crypto_strings.pod b/doc/crypto/ERR_load_crypto_strings.pod index 15f8000c..9fe8931f 100644 --- a/doc/crypto/ERR_load_crypto_strings.pod +++ b/doc/crypto/ERR_load_crypto_strings.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_load_crypto_strings, SSL_load_error_strings, ERR_free_strings - diff --git a/doc/crypto/ERR_load_strings.pod b/doc/crypto/ERR_load_strings.pod index 86ee5fda..9a8f36ba 100644 --- a/doc/crypto/ERR_load_strings.pod +++ b/doc/crypto/ERR_load_strings.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_load_strings, ERR_PACK, ERR_get_next_error_library - load diff --git a/doc/crypto/ERR_print_errors.pod b/doc/crypto/ERR_print_errors.pod index 17229af3..a5441bdc 100644 --- a/doc/crypto/ERR_print_errors.pod +++ b/doc/crypto/ERR_print_errors.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_print_errors, ERR_print_errors_fp, ERR_print_errors_cb diff --git a/doc/crypto/ERR_put_error.pod b/doc/crypto/ERR_put_error.pod index 9d2405e3..00ffc527 100644 --- a/doc/crypto/ERR_put_error.pod +++ b/doc/crypto/ERR_put_error.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_put_error, ERR_add_error_data - record an error diff --git a/doc/crypto/ERR_remove_state.pod b/doc/crypto/ERR_remove_state.pod index f2e71e39..807e2346 100644 --- a/doc/crypto/ERR_remove_state.pod +++ b/doc/crypto/ERR_remove_state.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_remove_thread_state, ERR_remove_state - DEPRECATED diff --git a/doc/crypto/ERR_set_mark.pod b/doc/crypto/ERR_set_mark.pod index 9c55f5a7..40ce2f6e 100644 --- a/doc/crypto/ERR_set_mark.pod +++ b/doc/crypto/ERR_set_mark.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME ERR_set_mark, ERR_pop_to_mark - set marks and pop errors until mark diff --git a/doc/crypto/EVP_BytesToKey.pod b/doc/crypto/EVP_BytesToKey.pod index 728c94e9..220154df 100644 --- a/doc/crypto/EVP_BytesToKey.pod +++ b/doc/crypto/EVP_BytesToKey.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_BytesToKey - password based encryption routine diff --git a/doc/crypto/EVP_CIPHER_CTX_get_cipher_data.pod b/doc/crypto/EVP_CIPHER_CTX_get_cipher_data.pod index 3a57fcdb..31c5ab1e 100644 --- a/doc/crypto/EVP_CIPHER_CTX_get_cipher_data.pod +++ b/doc/crypto/EVP_CIPHER_CTX_get_cipher_data.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_CIPHER_CTX_get_cipher_data, EVP_CIPHER_CTX_set_cipher_data - Routines to diff --git a/doc/crypto/EVP_CIPHER_meth_new.pod b/doc/crypto/EVP_CIPHER_meth_new.pod index 6e18ed54..5798bc23 100644 --- a/doc/crypto/EVP_CIPHER_meth_new.pod +++ b/doc/crypto/EVP_CIPHER_meth_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_CIPHER_meth_new, EVP_CIPHER_meth_dup, EVP_CIPHER_meth_free, diff --git a/doc/crypto/EVP_DigestInit.pod b/doc/crypto/EVP_DigestInit.pod index bb7ef7a2..54d51b7d 100644 --- a/doc/crypto/EVP_DigestInit.pod +++ b/doc/crypto/EVP_DigestInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_MD_CTX_new, EVP_MD_CTX_reset, EVP_MD_CTX_free, EVP_MD_CTX_copy_ex, diff --git a/doc/crypto/EVP_DigestSignInit.pod b/doc/crypto/EVP_DigestSignInit.pod index 13d6c7b3..786c0f76 100644 --- a/doc/crypto/EVP_DigestSignInit.pod +++ b/doc/crypto/EVP_DigestSignInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_DigestSignInit, EVP_DigestSignUpdate, EVP_DigestSignFinal - EVP signing functions diff --git a/doc/crypto/EVP_DigestVerifyInit.pod b/doc/crypto/EVP_DigestVerifyInit.pod index c665d127..daba6a7e 100644 --- a/doc/crypto/EVP_DigestVerifyInit.pod +++ b/doc/crypto/EVP_DigestVerifyInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_DigestVerifyInit, EVP_DigestVerifyUpdate, EVP_DigestVerifyFinal - EVP signature verification functions diff --git a/doc/crypto/EVP_EncodeInit.pod b/doc/crypto/EVP_EncodeInit.pod index d919b14b..181802f3 100644 --- a/doc/crypto/EVP_EncodeInit.pod +++ b/doc/crypto/EVP_EncodeInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_ENCODE_CTX_new, EVP_ENCODE_CTX_free, EVP_ENCODE_CTX_copy, diff --git a/doc/crypto/EVP_EncryptInit.pod b/doc/crypto/EVP_EncryptInit.pod index db578e50..b09f4785 100644 --- a/doc/crypto/EVP_EncryptInit.pod +++ b/doc/crypto/EVP_EncryptInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_CIPHER_CTX_new, EVP_CIPHER_CTX_reset, EVP_CIPHER_CTX_free, diff --git a/doc/crypto/EVP_MD_meth_new.pod b/doc/crypto/EVP_MD_meth_new.pod index c15a31e7..e75f64a0 100644 --- a/doc/crypto/EVP_MD_meth_new.pod +++ b/doc/crypto/EVP_MD_meth_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_MD_meth_dup, diff --git a/doc/crypto/EVP_OpenInit.pod b/doc/crypto/EVP_OpenInit.pod index ff84490a..fcfc1c5b 100644 --- a/doc/crypto/EVP_OpenInit.pod +++ b/doc/crypto/EVP_OpenInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_OpenInit, EVP_OpenUpdate, EVP_OpenFinal - EVP envelope decryption diff --git a/doc/crypto/EVP_PKEY_CTX_ctrl.pod b/doc/crypto/EVP_PKEY_CTX_ctrl.pod index a30450bb..4f1aa62c 100644 --- a/doc/crypto/EVP_PKEY_CTX_ctrl.pod +++ b/doc/crypto/EVP_PKEY_CTX_ctrl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_CTX_ctrl, EVP_PKEY_CTX_ctrl_str, diff --git a/doc/crypto/EVP_PKEY_CTX_new.pod b/doc/crypto/EVP_PKEY_CTX_new.pod index eff94cd9..de8fde2e 100644 --- a/doc/crypto/EVP_PKEY_CTX_new.pod +++ b/doc/crypto/EVP_PKEY_CTX_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_CTX_new, EVP_PKEY_CTX_new_id, EVP_PKEY_CTX_dup, EVP_PKEY_CTX_free - public key algorithm context functions diff --git a/doc/crypto/EVP_PKEY_CTX_set_hkdf_md.pod b/doc/crypto/EVP_PKEY_CTX_set_hkdf_md.pod index 61e0eec5..38be410b 100644 --- a/doc/crypto/EVP_PKEY_CTX_set_hkdf_md.pod +++ b/doc/crypto/EVP_PKEY_CTX_set_hkdf_md.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_CTX_set_hkdf_md, EVP_PKEY_CTX_set1_hkdf_salt, diff --git a/doc/crypto/EVP_PKEY_CTX_set_tls1_prf_md.pod b/doc/crypto/EVP_PKEY_CTX_set_tls1_prf_md.pod index f1f0ae4f..c6521a70 100644 --- a/doc/crypto/EVP_PKEY_CTX_set_tls1_prf_md.pod +++ b/doc/crypto/EVP_PKEY_CTX_set_tls1_prf_md.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_CTX_set_tls1_prf_md, diff --git a/doc/crypto/EVP_PKEY_cmp.pod b/doc/crypto/EVP_PKEY_cmp.pod index 270d635c..8353bf06 100644 --- a/doc/crypto/EVP_PKEY_cmp.pod +++ b/doc/crypto/EVP_PKEY_cmp.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_copy_parameters, EVP_PKEY_missing_parameters, EVP_PKEY_cmp_parameters, diff --git a/doc/crypto/EVP_PKEY_decrypt.pod b/doc/crypto/EVP_PKEY_decrypt.pod index ca732ed0..a998dcbb 100644 --- a/doc/crypto/EVP_PKEY_decrypt.pod +++ b/doc/crypto/EVP_PKEY_decrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_decrypt_init, EVP_PKEY_decrypt - decrypt using a public key algorithm diff --git a/doc/crypto/EVP_PKEY_derive.pod b/doc/crypto/EVP_PKEY_derive.pod index f70a0b8d..a45d0485 100644 --- a/doc/crypto/EVP_PKEY_derive.pod +++ b/doc/crypto/EVP_PKEY_derive.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_derive_init, EVP_PKEY_derive_set_peer, EVP_PKEY_derive - derive public key algorithm shared secret diff --git a/doc/crypto/EVP_PKEY_encrypt.pod b/doc/crypto/EVP_PKEY_encrypt.pod index 01336e12..5233b8ba 100644 --- a/doc/crypto/EVP_PKEY_encrypt.pod +++ b/doc/crypto/EVP_PKEY_encrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_encrypt_init, EVP_PKEY_encrypt - encrypt using a public key algorithm diff --git a/doc/crypto/EVP_PKEY_get_default_digest_nid.pod b/doc/crypto/EVP_PKEY_get_default_digest_nid.pod index 3dce5c59..dedce2ba 100644 --- a/doc/crypto/EVP_PKEY_get_default_digest_nid.pod +++ b/doc/crypto/EVP_PKEY_get_default_digest_nid.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_get_default_digest_nid - get default signature digest diff --git a/doc/crypto/EVP_PKEY_keygen.pod b/doc/crypto/EVP_PKEY_keygen.pod index ed4a3e1d..56e42c26 100644 --- a/doc/crypto/EVP_PKEY_keygen.pod +++ b/doc/crypto/EVP_PKEY_keygen.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_keygen_init, EVP_PKEY_keygen, EVP_PKEY_paramgen_init, diff --git a/doc/crypto/EVP_PKEY_new.pod b/doc/crypto/EVP_PKEY_new.pod index 956d6990..5da06cfe 100644 --- a/doc/crypto/EVP_PKEY_new.pod +++ b/doc/crypto/EVP_PKEY_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_new, EVP_PKEY_up_ref, EVP_PKEY_free - private key allocation functions diff --git a/doc/crypto/EVP_PKEY_print_private.pod b/doc/crypto/EVP_PKEY_print_private.pod index 9f1d324f..6652da45 100644 --- a/doc/crypto/EVP_PKEY_print_private.pod +++ b/doc/crypto/EVP_PKEY_print_private.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_print_public, EVP_PKEY_print_private, EVP_PKEY_print_params - public key algorithm printing routines diff --git a/doc/crypto/EVP_PKEY_set1_RSA.pod b/doc/crypto/EVP_PKEY_set1_RSA.pod index e1b7110f..f6229c82 100644 --- a/doc/crypto/EVP_PKEY_set1_RSA.pod +++ b/doc/crypto/EVP_PKEY_set1_RSA.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_set1_RSA, EVP_PKEY_set1_DSA, EVP_PKEY_set1_DH, EVP_PKEY_set1_EC_KEY, diff --git a/doc/crypto/EVP_PKEY_sign.pod b/doc/crypto/EVP_PKEY_sign.pod index 9b3c8d45..dc8f09d2 100644 --- a/doc/crypto/EVP_PKEY_sign.pod +++ b/doc/crypto/EVP_PKEY_sign.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_sign_init, EVP_PKEY_sign - sign using a public key algorithm diff --git a/doc/crypto/EVP_PKEY_verify.pod b/doc/crypto/EVP_PKEY_verify.pod index e84f8804..7b4b7c02 100644 --- a/doc/crypto/EVP_PKEY_verify.pod +++ b/doc/crypto/EVP_PKEY_verify.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_verify_init, EVP_PKEY_verify - signature verification using a public key algorithm diff --git a/doc/crypto/EVP_PKEY_verify_recover.pod b/doc/crypto/EVP_PKEY_verify_recover.pod index 837bc64e..bf842047 100644 --- a/doc/crypto/EVP_PKEY_verify_recover.pod +++ b/doc/crypto/EVP_PKEY_verify_recover.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_verify_recover_init, EVP_PKEY_verify_recover - recover signature using a public key algorithm diff --git a/doc/crypto/EVP_SealInit.pod b/doc/crypto/EVP_SealInit.pod index 30bd6808..1cc0b83d 100644 --- a/doc/crypto/EVP_SealInit.pod +++ b/doc/crypto/EVP_SealInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_SealInit, EVP_SealUpdate, EVP_SealFinal - EVP envelope encryption diff --git a/doc/crypto/EVP_SignInit.pod b/doc/crypto/EVP_SignInit.pod index cfbfd5ef..c7fd722c 100644 --- a/doc/crypto/EVP_SignInit.pod +++ b/doc/crypto/EVP_SignInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_PKEY_size, diff --git a/doc/crypto/EVP_VerifyInit.pod b/doc/crypto/EVP_VerifyInit.pod index 518c05ea..ee80b8da 100644 --- a/doc/crypto/EVP_VerifyInit.pod +++ b/doc/crypto/EVP_VerifyInit.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME EVP_VerifyInit_ex, diff --git a/doc/crypto/MDC2_Init.pod b/doc/crypto/MDC2_Init.pod index f7db71b4..f8799471 100644 --- a/doc/crypto/MDC2_Init.pod +++ b/doc/crypto/MDC2_Init.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME MDC2, MDC2_Init, MDC2_Update, MDC2_Final - MDC2 hash function diff --git a/doc/crypto/OBJ_nid2obj.pod b/doc/crypto/OBJ_nid2obj.pod index 3ada6679..9303dc2e 100644 --- a/doc/crypto/OBJ_nid2obj.pod +++ b/doc/crypto/OBJ_nid2obj.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME i2t_ASN1_OBJECT, diff --git a/doc/crypto/OCSP_REQUEST_new.pod b/doc/crypto/OCSP_REQUEST_new.pod index 97c2337d..e182edad 100644 --- a/doc/crypto/OCSP_REQUEST_new.pod +++ b/doc/crypto/OCSP_REQUEST_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OCSP_REQUEST_new, OCSP_REQUEST_free, OCSP_request_add0_id, OCSP_request_sign, diff --git a/doc/crypto/OCSP_cert_to_id.pod b/doc/crypto/OCSP_cert_to_id.pod index 0e37937f..09ee3c79 100644 --- a/doc/crypto/OCSP_cert_to_id.pod +++ b/doc/crypto/OCSP_cert_to_id.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OCSP_cert_to_id, OCSP_cert_id_new, OCSP_CERTID_free, OCSP_id_issuer_cmp, diff --git a/doc/crypto/OCSP_request_add1_nonce.pod b/doc/crypto/OCSP_request_add1_nonce.pod index dab42c67..0db100d2 100644 --- a/doc/crypto/OCSP_request_add1_nonce.pod +++ b/doc/crypto/OCSP_request_add1_nonce.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OCSP_request_add1_nonce, OCSP_basic_add1_nonce, OCSP_check_nonce, OCSP_copy_nonce - OCSP nonce functions diff --git a/doc/crypto/OCSP_resp_find_status.pod b/doc/crypto/OCSP_resp_find_status.pod index 36f66a85..dea283b0 100644 --- a/doc/crypto/OCSP_resp_find_status.pod +++ b/doc/crypto/OCSP_resp_find_status.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OCSP_resp_get0_certs, diff --git a/doc/crypto/OCSP_response_status.pod b/doc/crypto/OCSP_response_status.pod index 81946a63..75044fc9 100644 --- a/doc/crypto/OCSP_response_status.pod +++ b/doc/crypto/OCSP_response_status.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OCSP_response_status, OCSP_response_get1_basic, OCSP_response_create, diff --git a/doc/crypto/OCSP_sendreq_new.pod b/doc/crypto/OCSP_sendreq_new.pod index c7fdc9b1..645974f9 100644 --- a/doc/crypto/OCSP_sendreq_new.pod +++ b/doc/crypto/OCSP_sendreq_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OCSP_sendreq_new, OCSP_sendreq_nbio, OCSP_REQ_CTX_free, diff --git a/doc/crypto/OPENSSL_Applink.pod b/doc/crypto/OPENSSL_Applink.pod index d3a461ba..a91da35e 100644 --- a/doc/crypto/OPENSSL_Applink.pod +++ b/doc/crypto/OPENSSL_Applink.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_Applink - glue between OpenSSL BIO and Win32 compiler run-time diff --git a/doc/crypto/OPENSSL_LH_COMPFUNC.pod b/doc/crypto/OPENSSL_LH_COMPFUNC.pod index e760ae3b..f42704ad 100644 --- a/doc/crypto/OPENSSL_LH_COMPFUNC.pod +++ b/doc/crypto/OPENSSL_LH_COMPFUNC.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DECLARE_LHASH_OF, diff --git a/doc/crypto/OPENSSL_LH_stats.pod b/doc/crypto/OPENSSL_LH_stats.pod index c454a47e..b33d26c2 100644 --- a/doc/crypto/OPENSSL_LH_stats.pod +++ b/doc/crypto/OPENSSL_LH_stats.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_LH_stats, OPENSSL_LH_node_stats, OPENSSL_LH_node_usage_stats, diff --git a/doc/crypto/OPENSSL_VERSION_NUMBER.pod b/doc/crypto/OPENSSL_VERSION_NUMBER.pod index 9cc1ed1d..76f49524 100644 --- a/doc/crypto/OPENSSL_VERSION_NUMBER.pod +++ b/doc/crypto/OPENSSL_VERSION_NUMBER.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_VERSION_NUMBER, OpenSSL_version, diff --git a/doc/crypto/OPENSSL_config.pod b/doc/crypto/OPENSSL_config.pod index eae634a8..edeeccf1 100644 --- a/doc/crypto/OPENSSL_config.pod +++ b/doc/crypto/OPENSSL_config.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_config, OPENSSL_no_config - simple OpenSSL configuration functions diff --git a/doc/crypto/OPENSSL_ia32cap.pod b/doc/crypto/OPENSSL_ia32cap.pod index 7ea70c0f..57939bc4 100644 --- a/doc/crypto/OPENSSL_ia32cap.pod +++ b/doc/crypto/OPENSSL_ia32cap.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_ia32cap - the x86[_64] processor capabilities vector diff --git a/doc/crypto/OPENSSL_init_crypto.pod b/doc/crypto/OPENSSL_init_crypto.pod index 19898807..cf1c2a07 100644 --- a/doc/crypto/OPENSSL_init_crypto.pod +++ b/doc/crypto/OPENSSL_init_crypto.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_init_new, OPENSSL_INIT_set_config_appname, OPENSSL_INIT_free, diff --git a/doc/crypto/OPENSSL_instrument_bus.pod b/doc/crypto/OPENSSL_instrument_bus.pod index 14072610..20c60405 100644 --- a/doc/crypto/OPENSSL_instrument_bus.pod +++ b/doc/crypto/OPENSSL_instrument_bus.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_instrument_bus, OPENSSL_instrument_bus2 - instrument references to memory bus diff --git a/doc/crypto/OPENSSL_load_builtin_modules.pod b/doc/crypto/OPENSSL_load_builtin_modules.pod index 112718a6..3b9f93ab 100644 --- a/doc/crypto/OPENSSL_load_builtin_modules.pod +++ b/doc/crypto/OPENSSL_load_builtin_modules.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_load_builtin_modules, ASN1_add_oid_module, ENGINE_add_conf_module - add standard configuration modules diff --git a/doc/crypto/OPENSSL_malloc.pod b/doc/crypto/OPENSSL_malloc.pod index 2104f431..1e42e2d9 100644 --- a/doc/crypto/OPENSSL_malloc.pod +++ b/doc/crypto/OPENSSL_malloc.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_malloc_init, diff --git a/doc/crypto/OPENSSL_secure_malloc.pod b/doc/crypto/OPENSSL_secure_malloc.pod index 3f49abf6..89ab352a 100644 --- a/doc/crypto/OPENSSL_secure_malloc.pod +++ b/doc/crypto/OPENSSL_secure_malloc.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME CRYPTO_secure_malloc_init, CRYPTO_secure_malloc_initialized, diff --git a/doc/crypto/OpenSSL_add_all_algorithms.pod b/doc/crypto/OpenSSL_add_all_algorithms.pod index aaa28dd6..c2bb2ac5 100644 --- a/doc/crypto/OpenSSL_add_all_algorithms.pod +++ b/doc/crypto/OpenSSL_add_all_algorithms.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OpenSSL_add_all_algorithms, OpenSSL_add_all_ciphers, OpenSSL_add_all_digests, EVP_cleanup - diff --git a/doc/crypto/PEM_read.pod b/doc/crypto/PEM_read.pod index 66cbc7d2..0b3391c7 100644 --- a/doc/crypto/PEM_read.pod +++ b/doc/crypto/PEM_read.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PEM_write, PEM_write_bio, diff --git a/doc/crypto/PEM_read_CMS.pod b/doc/crypto/PEM_read_CMS.pod index 649c8089..0f5b9e97 100644 --- a/doc/crypto/PEM_read_CMS.pod +++ b/doc/crypto/PEM_read_CMS.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DECLARE_PEM_rw, diff --git a/doc/crypto/PEM_read_bio_PrivateKey.pod b/doc/crypto/PEM_read_bio_PrivateKey.pod index fbfe975b..6b9235b2 100644 --- a/doc/crypto/PEM_read_bio_PrivateKey.pod +++ b/doc/crypto/PEM_read_bio_PrivateKey.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME pem_password_cb, diff --git a/doc/crypto/PEM_write_bio_CMS_stream.pod b/doc/crypto/PEM_write_bio_CMS_stream.pod index c73fafd4..b50ca07e 100644 --- a/doc/crypto/PEM_write_bio_CMS_stream.pod +++ b/doc/crypto/PEM_write_bio_CMS_stream.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PEM_write_bio_CMS_stream - output CMS_ContentInfo structure in PEM format diff --git a/doc/crypto/PEM_write_bio_PKCS7_stream.pod b/doc/crypto/PEM_write_bio_PKCS7_stream.pod index 77f97aaa..c10a6ab4 100644 --- a/doc/crypto/PEM_write_bio_PKCS7_stream.pod +++ b/doc/crypto/PEM_write_bio_PKCS7_stream.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PEM_write_bio_PKCS7_stream - output PKCS7 structure in PEM format diff --git a/doc/crypto/PKCS12_create.pod b/doc/crypto/PKCS12_create.pod index 0a43b96c..13cbdfa7 100644 --- a/doc/crypto/PKCS12_create.pod +++ b/doc/crypto/PKCS12_create.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS12_create - create a PKCS#12 structure diff --git a/doc/crypto/PKCS12_newpass.pod b/doc/crypto/PKCS12_newpass.pod index b9105119..2e6296f5 100644 --- a/doc/crypto/PKCS12_newpass.pod +++ b/doc/crypto/PKCS12_newpass.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS12_newpass - change the password of a PKCS12 structure diff --git a/doc/crypto/PKCS12_parse.pod b/doc/crypto/PKCS12_parse.pod index 2dfa7e25..d0a01d48 100644 --- a/doc/crypto/PKCS12_parse.pod +++ b/doc/crypto/PKCS12_parse.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS12_parse - parse a PKCS#12 structure diff --git a/doc/crypto/PKCS5_PBKDF2_HMAC.pod b/doc/crypto/PKCS5_PBKDF2_HMAC.pod index 5cc2caa5..50e85305 100644 --- a/doc/crypto/PKCS5_PBKDF2_HMAC.pod +++ b/doc/crypto/PKCS5_PBKDF2_HMAC.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS5_PBKDF2_HMAC, PKCS5_PBKDF2_HMAC_SHA1 - password based derivation routines with salt and iteration count diff --git a/doc/crypto/PKCS7_decrypt.pod b/doc/crypto/PKCS7_decrypt.pod index 4ed8aa77..6ce359e7 100644 --- a/doc/crypto/PKCS7_decrypt.pod +++ b/doc/crypto/PKCS7_decrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS7_decrypt - decrypt content from a PKCS#7 envelopedData structure diff --git a/doc/crypto/PKCS7_encrypt.pod b/doc/crypto/PKCS7_encrypt.pod index 4e1afc91..5d908e73 100644 --- a/doc/crypto/PKCS7_encrypt.pod +++ b/doc/crypto/PKCS7_encrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS7_encrypt - create a PKCS#7 envelopedData structure diff --git a/doc/crypto/PKCS7_sign.pod b/doc/crypto/PKCS7_sign.pod index b5a52da9..518c6e96 100644 --- a/doc/crypto/PKCS7_sign.pod +++ b/doc/crypto/PKCS7_sign.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS7_sign - create a PKCS#7 signedData structure diff --git a/doc/crypto/PKCS7_sign_add_signer.pod b/doc/crypto/PKCS7_sign_add_signer.pod index c2a06e7a..c301bc23 100644 --- a/doc/crypto/PKCS7_sign_add_signer.pod +++ b/doc/crypto/PKCS7_sign_add_signer.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS7_sign_add_signer - add a signer PKCS7 signed data structure diff --git a/doc/crypto/PKCS7_verify.pod b/doc/crypto/PKCS7_verify.pod index c34808ec..8c906eeb 100644 --- a/doc/crypto/PKCS7_verify.pod +++ b/doc/crypto/PKCS7_verify.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME PKCS7_verify, PKCS7_get0_signers - verify a PKCS#7 signedData structure diff --git a/doc/crypto/RAND_add.pod b/doc/crypto/RAND_add.pod index 46de165a..0d6bc8f8 100644 --- a/doc/crypto/RAND_add.pod +++ b/doc/crypto/RAND_add.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RAND_add, RAND_seed, RAND_status, RAND_event, RAND_screen - add diff --git a/doc/crypto/RAND_bytes.pod b/doc/crypto/RAND_bytes.pod index 684215ce..4df5fbcc 100644 --- a/doc/crypto/RAND_bytes.pod +++ b/doc/crypto/RAND_bytes.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RAND_bytes, RAND_pseudo_bytes - generate random data diff --git a/doc/crypto/RAND_cleanup.pod b/doc/crypto/RAND_cleanup.pod index 2640c7d2..9df59090 100644 --- a/doc/crypto/RAND_cleanup.pod +++ b/doc/crypto/RAND_cleanup.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RAND_cleanup - erase the PRNG state diff --git a/doc/crypto/RAND_egd.pod b/doc/crypto/RAND_egd.pod index fcc57c06..fe5ef4cd 100644 --- a/doc/crypto/RAND_egd.pod +++ b/doc/crypto/RAND_egd.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RAND_egd, RAND_egd_bytes, RAND_query_egd_bytes - query entropy gathering daemon diff --git a/doc/crypto/RAND_load_file.pod b/doc/crypto/RAND_load_file.pod index 39084b2c..d9d84f29 100644 --- a/doc/crypto/RAND_load_file.pod +++ b/doc/crypto/RAND_load_file.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RAND_load_file, RAND_write_file, RAND_file_name - PRNG seed file diff --git a/doc/crypto/RAND_set_rand_method.pod b/doc/crypto/RAND_set_rand_method.pod index 02fe90ca..d279d7e3 100644 --- a/doc/crypto/RAND_set_rand_method.pod +++ b/doc/crypto/RAND_set_rand_method.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RAND_set_rand_method, RAND_get_rand_method, RAND_OpenSSL - select RAND method diff --git a/doc/crypto/RC4_set_key.pod b/doc/crypto/RC4_set_key.pod index fe5d2d14..5d135293 100644 --- a/doc/crypto/RC4_set_key.pod +++ b/doc/crypto/RC4_set_key.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RC4_set_key, RC4 - RC4 encryption diff --git a/doc/crypto/RIPEMD160_Init.pod b/doc/crypto/RIPEMD160_Init.pod index a372e32c..f33346cd 100644 --- a/doc/crypto/RIPEMD160_Init.pod +++ b/doc/crypto/RIPEMD160_Init.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RIPEMD160, RIPEMD160_Init, RIPEMD160_Update, RIPEMD160_Final - diff --git a/doc/crypto/RSA_blinding_on.pod b/doc/crypto/RSA_blinding_on.pod index 33d49d37..60260251 100644 --- a/doc/crypto/RSA_blinding_on.pod +++ b/doc/crypto/RSA_blinding_on.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_blinding_on, RSA_blinding_off - protect the RSA operation from timing attacks diff --git a/doc/crypto/RSA_check_key.pod b/doc/crypto/RSA_check_key.pod index d8689f4a..4f30eb17 100644 --- a/doc/crypto/RSA_check_key.pod +++ b/doc/crypto/RSA_check_key.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_check_key_ex, RSA_check_key - validate private RSA keys diff --git a/doc/crypto/RSA_generate_key.pod b/doc/crypto/RSA_generate_key.pod index 19f834ef..4751ad21 100644 --- a/doc/crypto/RSA_generate_key.pod +++ b/doc/crypto/RSA_generate_key.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_generate_key_ex, RSA_generate_key - generate RSA key pair diff --git a/doc/crypto/RSA_get0_key.pod b/doc/crypto/RSA_get0_key.pod index 52f83e1b..dfb7810a 100644 --- a/doc/crypto/RSA_get0_key.pod +++ b/doc/crypto/RSA_get0_key.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_set0_key, RSA_set0_factors, RSA_set0_crt_params, RSA_get0_key, diff --git a/doc/crypto/RSA_meth_new.pod b/doc/crypto/RSA_meth_new.pod index e46b3984..09867796 100644 --- a/doc/crypto/RSA_meth_new.pod +++ b/doc/crypto/RSA_meth_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_meth_get0_app_data, RSA_meth_set0_app_data, diff --git a/doc/crypto/RSA_new.pod b/doc/crypto/RSA_new.pod index 33179207..105bafb9 100644 --- a/doc/crypto/RSA_new.pod +++ b/doc/crypto/RSA_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_new, RSA_free - allocate and free RSA objects diff --git a/doc/crypto/RSA_padding_add_PKCS1_type_1.pod b/doc/crypto/RSA_padding_add_PKCS1_type_1.pod index 30899440..770677f3 100644 --- a/doc/crypto/RSA_padding_add_PKCS1_type_1.pod +++ b/doc/crypto/RSA_padding_add_PKCS1_type_1.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_padding_add_PKCS1_type_1, RSA_padding_check_PKCS1_type_1, diff --git a/doc/crypto/RSA_print.pod b/doc/crypto/RSA_print.pod index 1367478f..0698f188 100644 --- a/doc/crypto/RSA_print.pod +++ b/doc/crypto/RSA_print.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_print, RSA_print_fp, diff --git a/doc/crypto/RSA_private_encrypt.pod b/doc/crypto/RSA_private_encrypt.pod index 78703719..cea006e8 100644 --- a/doc/crypto/RSA_private_encrypt.pod +++ b/doc/crypto/RSA_private_encrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_private_encrypt, RSA_public_decrypt - low level signature operations diff --git a/doc/crypto/RSA_public_encrypt.pod b/doc/crypto/RSA_public_encrypt.pod index 2f78c274..25f2faef 100644 --- a/doc/crypto/RSA_public_encrypt.pod +++ b/doc/crypto/RSA_public_encrypt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_public_encrypt, RSA_private_decrypt - RSA public key cryptography diff --git a/doc/crypto/RSA_set_method.pod b/doc/crypto/RSA_set_method.pod index 7e7d27cf..4acd0fd9 100644 --- a/doc/crypto/RSA_set_method.pod +++ b/doc/crypto/RSA_set_method.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_set_default_method, RSA_get_default_method, RSA_set_method, diff --git a/doc/crypto/RSA_sign.pod b/doc/crypto/RSA_sign.pod index fbb38d81..4f93e430 100644 --- a/doc/crypto/RSA_sign.pod +++ b/doc/crypto/RSA_sign.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_sign, RSA_verify - RSA signatures diff --git a/doc/crypto/RSA_sign_ASN1_OCTET_STRING.pod b/doc/crypto/RSA_sign_ASN1_OCTET_STRING.pod index 16303c9f..d2c04c43 100644 --- a/doc/crypto/RSA_sign_ASN1_OCTET_STRING.pod +++ b/doc/crypto/RSA_sign_ASN1_OCTET_STRING.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_sign_ASN1_OCTET_STRING, RSA_verify_ASN1_OCTET_STRING - RSA signatures diff --git a/doc/crypto/RSA_size.pod b/doc/crypto/RSA_size.pod index eb6e4813..641e77aa 100644 --- a/doc/crypto/RSA_size.pod +++ b/doc/crypto/RSA_size.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME RSA_size, RSA_bits - get RSA modulus size diff --git a/doc/crypto/SCT_new.pod b/doc/crypto/SCT_new.pod index 4ee41a6d..353fffbe 100644 --- a/doc/crypto/SCT_new.pod +++ b/doc/crypto/SCT_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SCT_new, SCT_new_from_base64, SCT_free, SCT_LIST_free, diff --git a/doc/crypto/SCT_print.pod b/doc/crypto/SCT_print.pod index 88ad43ec..20a0aba8 100644 --- a/doc/crypto/SCT_print.pod +++ b/doc/crypto/SCT_print.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SCT_print, SCT_LIST_print, SCT_validation_status_string - diff --git a/doc/crypto/SCT_validate.pod b/doc/crypto/SCT_validate.pod index 713bcd29..368f466b 100644 --- a/doc/crypto/SCT_validate.pod +++ b/doc/crypto/SCT_validate.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SCT_validate, SCT_LIST_validate, SCT_get_validation_status - diff --git a/doc/crypto/SHA256_Init.pod b/doc/crypto/SHA256_Init.pod index f3565bb2..1ddf2078 100644 --- a/doc/crypto/SHA256_Init.pod +++ b/doc/crypto/SHA256_Init.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SHA1, SHA1_Init, SHA1_Update, SHA1_Final, SHA224, SHA224_Init, SHA224_Update, diff --git a/doc/crypto/SMIME_read_CMS.pod b/doc/crypto/SMIME_read_CMS.pod index efde0bda..934ef949 100644 --- a/doc/crypto/SMIME_read_CMS.pod +++ b/doc/crypto/SMIME_read_CMS.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SMIME_read_CMS - parse S/MIME message diff --git a/doc/crypto/SMIME_read_PKCS7.pod b/doc/crypto/SMIME_read_PKCS7.pod index 86d5cc30..9fe8f471 100644 --- a/doc/crypto/SMIME_read_PKCS7.pod +++ b/doc/crypto/SMIME_read_PKCS7.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SMIME_read_PKCS7 - parse S/MIME message diff --git a/doc/crypto/SMIME_write_CMS.pod b/doc/crypto/SMIME_write_CMS.pod index d58baeb7..0cc61f40 100644 --- a/doc/crypto/SMIME_write_CMS.pod +++ b/doc/crypto/SMIME_write_CMS.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SMIME_write_CMS - convert CMS structure to S/MIME format diff --git a/doc/crypto/SMIME_write_PKCS7.pod b/doc/crypto/SMIME_write_PKCS7.pod index b5731238..eb4032a7 100644 --- a/doc/crypto/SMIME_write_PKCS7.pod +++ b/doc/crypto/SMIME_write_PKCS7.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SMIME_write_PKCS7 - convert PKCS#7 structure to S/MIME format diff --git a/doc/crypto/SSL_set_bio.pod b/doc/crypto/SSL_set_bio.pod index 58d22b63..91c75c44 100644 --- a/doc/crypto/SSL_set_bio.pod +++ b/doc/crypto/SSL_set_bio.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_set_bio, SSL_set0_rbio, SSL_set0_wbio - connect the SSL object with a BIO diff --git a/doc/crypto/UI_new.pod b/doc/crypto/UI_new.pod index 9abb6978..656ae918 100644 --- a/doc/crypto/UI_new.pod +++ b/doc/crypto/UI_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME UI, UI_METHOD, diff --git a/doc/crypto/X509V3_get_d2i.pod b/doc/crypto/X509V3_get_d2i.pod index ac560b21..eb3da2bc 100644 --- a/doc/crypto/X509V3_get_d2i.pod +++ b/doc/crypto/X509V3_get_d2i.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get0_extensions, X509_CRL_get0_extensions, X509_REVOKED_get0_extensions, diff --git a/doc/crypto/X509_ALGOR_dup.pod b/doc/crypto/X509_ALGOR_dup.pod index 21845e97..bfe469ef 100644 --- a/doc/crypto/X509_ALGOR_dup.pod +++ b/doc/crypto/X509_ALGOR_dup.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_ALGOR_dup, X509_ALGOR_set0, X509_ALGOR_get0, X509_ALGOR_set_md, X509_ALGOR_cmp - AlgorithmIdentifier functions diff --git a/doc/crypto/X509_CRL_get0_by_serial.pod b/doc/crypto/X509_CRL_get0_by_serial.pod index d9d4360f..46852e5d 100644 --- a/doc/crypto/X509_CRL_get0_by_serial.pod +++ b/doc/crypto/X509_CRL_get0_by_serial.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_CRL_get0_by_serial, X509_CRL_get0_by_cert, X509_CRL_get_REVOKED, diff --git a/doc/crypto/X509_EXTENSION_set_object.pod b/doc/crypto/X509_EXTENSION_set_object.pod index f3f0de63..9e791624 100644 --- a/doc/crypto/X509_EXTENSION_set_object.pod +++ b/doc/crypto/X509_EXTENSION_set_object.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_EXTENSION_set_object, X509_EXTENSION_set_critical, diff --git a/doc/crypto/X509_LOOKUP_hash_dir.pod b/doc/crypto/X509_LOOKUP_hash_dir.pod index 08fa7312..b3567640 100644 --- a/doc/crypto/X509_LOOKUP_hash_dir.pod +++ b/doc/crypto/X509_LOOKUP_hash_dir.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_LOOKUP_hash_dir, X509_LOOKUP_file, diff --git a/doc/crypto/X509_NAME_ENTRY_get_object.pod b/doc/crypto/X509_NAME_ENTRY_get_object.pod index 72e0f7b1..9c4fa1ea 100644 --- a/doc/crypto/X509_NAME_ENTRY_get_object.pod +++ b/doc/crypto/X509_NAME_ENTRY_get_object.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_NAME_ENTRY_get_object, X509_NAME_ENTRY_get_data, diff --git a/doc/crypto/X509_NAME_add_entry_by_txt.pod b/doc/crypto/X509_NAME_add_entry_by_txt.pod index 27e5baf8..138f4459 100644 --- a/doc/crypto/X509_NAME_add_entry_by_txt.pod +++ b/doc/crypto/X509_NAME_add_entry_by_txt.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_NAME_add_entry_by_txt, X509_NAME_add_entry_by_OBJ, X509_NAME_add_entry_by_NID, diff --git a/doc/crypto/X509_NAME_get0_der.pod b/doc/crypto/X509_NAME_get0_der.pod index f91fd4d9..b6744bbf 100644 --- a/doc/crypto/X509_NAME_get0_der.pod +++ b/doc/crypto/X509_NAME_get0_der.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_NAME_get0_der - get X509_NAME DER encoding diff --git a/doc/crypto/X509_NAME_get_index_by_NID.pod b/doc/crypto/X509_NAME_get_index_by_NID.pod index 2d6713ba..382ae153 100644 --- a/doc/crypto/X509_NAME_get_index_by_NID.pod +++ b/doc/crypto/X509_NAME_get_index_by_NID.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_NAME_get_index_by_NID, X509_NAME_get_index_by_OBJ, X509_NAME_get_entry, diff --git a/doc/crypto/X509_NAME_print_ex.pod b/doc/crypto/X509_NAME_print_ex.pod index 3e9caa88..53cda761 100644 --- a/doc/crypto/X509_NAME_print_ex.pod +++ b/doc/crypto/X509_NAME_print_ex.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_NAME_print_ex, X509_NAME_print_ex_fp, X509_NAME_print, diff --git a/doc/crypto/X509_PUBKEY_new.pod b/doc/crypto/X509_PUBKEY_new.pod index b1331051..995324e7 100644 --- a/doc/crypto/X509_PUBKEY_new.pod +++ b/doc/crypto/X509_PUBKEY_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_PUBKEY_new, X509_PUBKEY_free, X509_PUBKEY_set, X509_PUBKEY_get0, diff --git a/doc/crypto/X509_SIG_get0.pod b/doc/crypto/X509_SIG_get0.pod index d24eadcd..a8bcf157 100644 --- a/doc/crypto/X509_SIG_get0.pod +++ b/doc/crypto/X509_SIG_get0.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_SIG_get0, X509_SIG_getm - DigestInfo functions diff --git a/doc/crypto/X509_STORE_CTX_get_error.pod b/doc/crypto/X509_STORE_CTX_get_error.pod index 105e051a..ca2318e9 100644 --- a/doc/crypto/X509_STORE_CTX_get_error.pod +++ b/doc/crypto/X509_STORE_CTX_get_error.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_STORE_CTX_get_error, X509_STORE_CTX_set_error, diff --git a/doc/crypto/X509_STORE_CTX_new.pod b/doc/crypto/X509_STORE_CTX_new.pod index 0d8ce3b7..d7703b68 100644 --- a/doc/crypto/X509_STORE_CTX_new.pod +++ b/doc/crypto/X509_STORE_CTX_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_STORE_CTX_new, X509_STORE_CTX_cleanup, X509_STORE_CTX_free, diff --git a/doc/crypto/X509_STORE_CTX_set_verify_cb.pod b/doc/crypto/X509_STORE_CTX_set_verify_cb.pod index 3be256dc..508385cb 100644 --- a/doc/crypto/X509_STORE_CTX_set_verify_cb.pod +++ b/doc/crypto/X509_STORE_CTX_set_verify_cb.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_STORE_CTX_get_cleanup, diff --git a/doc/crypto/X509_STORE_get0_param.pod b/doc/crypto/X509_STORE_get0_param.pod index 2144f2b0..582afdd1 100644 --- a/doc/crypto/X509_STORE_get0_param.pod +++ b/doc/crypto/X509_STORE_get0_param.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_STORE_get0_param, X509_STORE_set1_param, diff --git a/doc/crypto/X509_STORE_new.pod b/doc/crypto/X509_STORE_new.pod index f7a5c814..fdda1306 100644 --- a/doc/crypto/X509_STORE_new.pod +++ b/doc/crypto/X509_STORE_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_STORE_new, X509_STORE_up_ref, X509_STORE_free, X509_STORE_lock, diff --git a/doc/crypto/X509_STORE_set_verify_cb_func.pod b/doc/crypto/X509_STORE_set_verify_cb_func.pod index f9fc1b12..8faed557 100644 --- a/doc/crypto/X509_STORE_set_verify_cb_func.pod +++ b/doc/crypto/X509_STORE_set_verify_cb_func.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_STORE_set_lookup_crls_cb, diff --git a/doc/crypto/X509_VERIFY_PARAM_set_flags.pod b/doc/crypto/X509_VERIFY_PARAM_set_flags.pod index 76f19011..31a647d8 100644 --- a/doc/crypto/X509_VERIFY_PARAM_set_flags.pod +++ b/doc/crypto/X509_VERIFY_PARAM_set_flags.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_VERIFY_PARAM_set_flags, X509_VERIFY_PARAM_clear_flags, diff --git a/doc/crypto/X509_check_ca.pod b/doc/crypto/X509_check_ca.pod index b79efb5b..38749ac6 100644 --- a/doc/crypto/X509_check_ca.pod +++ b/doc/crypto/X509_check_ca.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_check_ca - check if given certificate is CA certificate diff --git a/doc/crypto/X509_check_host.pod b/doc/crypto/X509_check_host.pod index 93848152..a69e8c07 100644 --- a/doc/crypto/X509_check_host.pod +++ b/doc/crypto/X509_check_host.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_check_host, X509_check_email, X509_check_ip, X509_check_ip_asc - X.509 certificate matching diff --git a/doc/crypto/X509_check_issued.pod b/doc/crypto/X509_check_issued.pod index 8e4b1117..dae09dcf 100644 --- a/doc/crypto/X509_check_issued.pod +++ b/doc/crypto/X509_check_issued.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_check_issued - checks if certificate is issued by another diff --git a/doc/crypto/X509_digest.pod b/doc/crypto/X509_digest.pod index 267e7bd2..973c0c90 100644 --- a/doc/crypto/X509_digest.pod +++ b/doc/crypto/X509_digest.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_digest, X509_CRL_digest, diff --git a/doc/crypto/X509_dup.pod b/doc/crypto/X509_dup.pod index c5d01b28..383c9787 100644 --- a/doc/crypto/X509_dup.pod +++ b/doc/crypto/X509_dup.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DECLARE_ASN1_FUNCTIONS, diff --git a/doc/crypto/X509_get0_signature.pod b/doc/crypto/X509_get0_signature.pod index 61a2dda9..a91a71f1 100644 --- a/doc/crypto/X509_get0_signature.pod +++ b/doc/crypto/X509_get0_signature.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get0_signature, X509_get_signature_nid, X509_get0_tbs_sigalg, diff --git a/doc/crypto/X509_get0_uids.pod b/doc/crypto/X509_get0_uids.pod index 4eab26e2..85e026e5 100644 --- a/doc/crypto/X509_get0_uids.pod +++ b/doc/crypto/X509_get0_uids.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get0_uids - get certificate unique identifiers diff --git a/doc/crypto/X509_get_extension_flags.pod b/doc/crypto/X509_get_extension_flags.pod index 92e8a6ba..904299c0 100644 --- a/doc/crypto/X509_get_extension_flags.pod +++ b/doc/crypto/X509_get_extension_flags.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get0_subject_key_id, diff --git a/doc/crypto/X509_get_notBefore.pod b/doc/crypto/X509_get_notBefore.pod index 82502f65..c6519364 100644 --- a/doc/crypto/X509_get_notBefore.pod +++ b/doc/crypto/X509_get_notBefore.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get0_notBefore, X509_getm_notBefore, X509_get0_notAfter, diff --git a/doc/crypto/X509_get_pubkey.pod b/doc/crypto/X509_get_pubkey.pod index 2b9a956c..d1147bb5 100644 --- a/doc/crypto/X509_get_pubkey.pod +++ b/doc/crypto/X509_get_pubkey.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get_pubkey, X509_get0_pubkey, X509_set_pubkey, X509_get_X509_PUBKEY, diff --git a/doc/crypto/X509_get_serialNumber.pod b/doc/crypto/X509_get_serialNumber.pod index 2e81c623..e1ec13a3 100644 --- a/doc/crypto/X509_get_serialNumber.pod +++ b/doc/crypto/X509_get_serialNumber.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get_serialNumber, diff --git a/doc/crypto/X509_get_subject_name.pod b/doc/crypto/X509_get_subject_name.pod index ce36bbf0..f5b829da 100644 --- a/doc/crypto/X509_get_subject_name.pod +++ b/doc/crypto/X509_get_subject_name.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get_subject_name, X509_set_subject_name, X509_get_issuer_name, diff --git a/doc/crypto/X509_get_version.pod b/doc/crypto/X509_get_version.pod index c1826ea3..b52fbfd9 100644 --- a/doc/crypto/X509_get_version.pod +++ b/doc/crypto/X509_get_version.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_get_version, X509_set_version, X509_REQ_get_version, X509_REQ_set_version, diff --git a/doc/crypto/X509_new.pod b/doc/crypto/X509_new.pod index 4f534993..089fd03e 100644 --- a/doc/crypto/X509_new.pod +++ b/doc/crypto/X509_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_chain_up_ref, diff --git a/doc/crypto/X509_sign.pod b/doc/crypto/X509_sign.pod index 994fd438..6eead2f9 100644 --- a/doc/crypto/X509_sign.pod +++ b/doc/crypto/X509_sign.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_sign, X509_sign_ctx, X509_verify, X509_REQ_sign, X509_REQ_sign_ctx, diff --git a/doc/crypto/X509_verify_cert.pod b/doc/crypto/X509_verify_cert.pod index 74acf8df..f96ed288 100644 --- a/doc/crypto/X509_verify_cert.pod +++ b/doc/crypto/X509_verify_cert.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509_verify_cert - discover and verify X509 certificate chain diff --git a/doc/crypto/X509v3_get_ext_by_NID.pod b/doc/crypto/X509v3_get_ext_by_NID.pod index 032f71c4..caeb66c3 100644 --- a/doc/crypto/X509v3_get_ext_by_NID.pod +++ b/doc/crypto/X509v3_get_ext_by_NID.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME X509v3_get_ext_count, X509v3_get_ext, X509v3_get_ext_by_NID, diff --git a/doc/crypto/bio.pod b/doc/crypto/bio.pod index 1e1dd021..365b388f 100644 --- a/doc/crypto/bio.pod +++ b/doc/crypto/bio.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment openssl_manual_section 7 =head1 NAME diff --git a/doc/crypto/crypto.pod b/doc/crypto/crypto.pod index 082f8435..1fd7dea0 100644 --- a/doc/crypto/crypto.pod +++ b/doc/crypto/crypto.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment openssl_manual_section:7 =head1 NAME diff --git a/doc/crypto/ct.pod b/doc/crypto/ct.pod index bdcda986..8ecd4ffa 100644 --- a/doc/crypto/ct.pod +++ b/doc/crypto/ct.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment openssl_manual_section:7 =head1 NAME diff --git a/doc/crypto/d2i_DHparams.pod b/doc/crypto/d2i_DHparams.pod index cd1c162b..f55f1e4c 100644 --- a/doc/crypto/d2i_DHparams.pod +++ b/doc/crypto/d2i_DHparams.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME d2i_DHparams, i2d_DHparams - PKCS#3 DH parameter functions diff --git a/doc/crypto/d2i_Netscape_RSA.pod b/doc/crypto/d2i_Netscape_RSA.pod index ee39bd81..dd227b74 100644 --- a/doc/crypto/d2i_Netscape_RSA.pod +++ b/doc/crypto/d2i_Netscape_RSA.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME i2d_Netscape_RSA, diff --git a/doc/crypto/d2i_PKCS8PrivateKey_bio.pod b/doc/crypto/d2i_PKCS8PrivateKey_bio.pod index 164d93ff..77b9dc02 100644 --- a/doc/crypto/d2i_PKCS8PrivateKey_bio.pod +++ b/doc/crypto/d2i_PKCS8PrivateKey_bio.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME d2i_PKCS8PrivateKey_bio, d2i_PKCS8PrivateKey_fp, diff --git a/doc/crypto/d2i_PrivateKey.pod b/doc/crypto/d2i_PrivateKey.pod index 6b12ad9e..6988e21a 100644 --- a/doc/crypto/d2i_PrivateKey.pod +++ b/doc/crypto/d2i_PrivateKey.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME d2i_PrivateKey, d2i_AutoPrivateKey, i2d_PrivateKey, diff --git a/doc/crypto/d2i_X509.pod b/doc/crypto/d2i_X509.pod index 06546a48..77b8012e 100644 --- a/doc/crypto/d2i_X509.pod +++ b/doc/crypto/d2i_X509.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME d2i_ACCESS_DESCRIPTION, diff --git a/doc/crypto/des_modes.pod b/doc/crypto/des_modes.pod index 5107b77c..9ff09693 100644 --- a/doc/crypto/des_modes.pod +++ b/doc/crypto/des_modes.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment openssl_manual_section:7 =head1 NAME diff --git a/doc/crypto/evp.pod b/doc/crypto/evp.pod index 31f45908..3d805915 100644 --- a/doc/crypto/evp.pod +++ b/doc/crypto/evp.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment openssl_manual_section:7 =head1 NAME diff --git a/doc/crypto/hmac.pod b/doc/crypto/hmac.pod index 87f7e330..b63b0d2a 100644 --- a/doc/crypto/hmac.pod +++ b/doc/crypto/hmac.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME HMAC, diff --git a/doc/crypto/i2d_CMS_bio_stream.pod b/doc/crypto/i2d_CMS_bio_stream.pod index ece7a480..3ded029c 100644 --- a/doc/crypto/i2d_CMS_bio_stream.pod +++ b/doc/crypto/i2d_CMS_bio_stream.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME i2d_CMS_bio_stream - output CMS_ContentInfo structure in BER format diff --git a/doc/crypto/i2d_PKCS7_bio_stream.pod b/doc/crypto/i2d_PKCS7_bio_stream.pod index b42940a8..0282b151 100644 --- a/doc/crypto/i2d_PKCS7_bio_stream.pod +++ b/doc/crypto/i2d_PKCS7_bio_stream.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME i2d_PKCS7_bio_stream - output PKCS7 structure in BER format diff --git a/doc/crypto/i2d_re_X509_tbs.pod b/doc/crypto/i2d_re_X509_tbs.pod index 672c7ab5..15a37fc3 100644 --- a/doc/crypto/i2d_re_X509_tbs.pod +++ b/doc/crypto/i2d_re_X509_tbs.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME d2i_X509_AUX, i2d_X509_AUX, diff --git a/doc/crypto/md5.pod b/doc/crypto/md5.pod index 78da7507..70b62c26 100644 --- a/doc/crypto/md5.pod +++ b/doc/crypto/md5.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME MD2, MD4, MD5, MD2_Init, MD2_Update, MD2_Final, MD4_Init, MD4_Update, diff --git a/doc/crypto/o2i_SCT_LIST.pod b/doc/crypto/o2i_SCT_LIST.pod index 82922fce..107784e2 100644 --- a/doc/crypto/o2i_SCT_LIST.pod +++ b/doc/crypto/o2i_SCT_LIST.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME o2i_SCT_LIST, i2o_SCT_LIST, o2i_SCT, i2o_SCT - diff --git a/doc/crypto/x509.pod b/doc/crypto/x509.pod index 8319b152..711895c6 100644 --- a/doc/crypto/x509.pod +++ b/doc/crypto/x509.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment openssl_manual_section:7 =head1 NAME diff --git a/doc/ssl/DTLSv1_listen.pod b/doc/ssl/DTLSv1_listen.pod index a839d9fe..170bcfe2 100644 --- a/doc/ssl/DTLSv1_listen.pod +++ b/doc/ssl/DTLSv1_listen.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME DTLSv1_listen - listen for incoming DTLS connections diff --git a/doc/ssl/OPENSSL_init_ssl.pod b/doc/ssl/OPENSSL_init_ssl.pod index b963e5e7..bbdbf35a 100644 --- a/doc/ssl/OPENSSL_init_ssl.pod +++ b/doc/ssl/OPENSSL_init_ssl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME OPENSSL_init_ssl - OpenSSL (libssl and libcrypto) initialisation diff --git a/doc/ssl/SSL_CIPHER_get_name.pod b/doc/ssl/SSL_CIPHER_get_name.pod index b7ee3c84..86a7cb11 100644 --- a/doc/ssl/SSL_CIPHER_get_name.pod +++ b/doc/ssl/SSL_CIPHER_get_name.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CIPHER_get_cipher_nid, SSL_CIPHER_get_digest_nid, SSL_CIPHER_get_kx_nid, diff --git a/doc/ssl/SSL_COMP_add_compression_method.pod b/doc/ssl/SSL_COMP_add_compression_method.pod index 15929df3..0c0eb52f 100644 --- a/doc/ssl/SSL_COMP_add_compression_method.pod +++ b/doc/ssl/SSL_COMP_add_compression_method.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_COMP_add_compression_method, SSL_COMP_get_compression_methods, diff --git a/doc/ssl/SSL_CONF_CTX_new.pod b/doc/ssl/SSL_CONF_CTX_new.pod index 79f0bbc7..729cda62 100644 --- a/doc/ssl/SSL_CONF_CTX_new.pod +++ b/doc/ssl/SSL_CONF_CTX_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CONF_CTX_new, SSL_CONF_CTX_free - SSL configuration allocation functions diff --git a/doc/ssl/SSL_CONF_CTX_set1_prefix.pod b/doc/ssl/SSL_CONF_CTX_set1_prefix.pod index da9e5802..c72ff948 100644 --- a/doc/ssl/SSL_CONF_CTX_set1_prefix.pod +++ b/doc/ssl/SSL_CONF_CTX_set1_prefix.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CONF_CTX_set1_prefix - Set configuration context command prefix diff --git a/doc/ssl/SSL_CONF_CTX_set_flags.pod b/doc/ssl/SSL_CONF_CTX_set_flags.pod index efd8da3b..3b3c1cd5 100644 --- a/doc/ssl/SSL_CONF_CTX_set_flags.pod +++ b/doc/ssl/SSL_CONF_CTX_set_flags.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CONF_CTX_set_flags, SSL_CONF_CTX_clear_flags - Set of clear SSL configuration context flags diff --git a/doc/ssl/SSL_CONF_CTX_set_ssl_ctx.pod b/doc/ssl/SSL_CONF_CTX_set_ssl_ctx.pod index 7e4120f7..da1c9de7 100644 --- a/doc/ssl/SSL_CONF_CTX_set_ssl_ctx.pod +++ b/doc/ssl/SSL_CONF_CTX_set_ssl_ctx.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CONF_CTX_set_ssl_ctx, SSL_CONF_CTX_set_ssl - set context to configure diff --git a/doc/ssl/SSL_CONF_cmd.pod b/doc/ssl/SSL_CONF_cmd.pod index d8c0e9b9..6b45d54f 100644 --- a/doc/ssl/SSL_CONF_cmd.pod +++ b/doc/ssl/SSL_CONF_cmd.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CONF_cmd_value_type, SSL_CONF_finish, diff --git a/doc/ssl/SSL_CONF_cmd_argv.pod b/doc/ssl/SSL_CONF_cmd_argv.pod index 15529a59..0e3d2bfe 100644 --- a/doc/ssl/SSL_CONF_cmd_argv.pod +++ b/doc/ssl/SSL_CONF_cmd_argv.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CONF_cmd_argv - SSL configuration command line processing diff --git a/doc/ssl/SSL_CTX_add1_chain_cert.pod b/doc/ssl/SSL_CTX_add1_chain_cert.pod index 1f0418b2..93fc5e82 100644 --- a/doc/ssl/SSL_CTX_add1_chain_cert.pod +++ b/doc/ssl/SSL_CTX_add1_chain_cert.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set0_chain, SSL_CTX_set1_chain, SSL_CTX_add0_chain_cert, diff --git a/doc/ssl/SSL_CTX_add_extra_chain_cert.pod b/doc/ssl/SSL_CTX_add_extra_chain_cert.pod index e2783de9..d7619b9a 100644 --- a/doc/ssl/SSL_CTX_add_extra_chain_cert.pod +++ b/doc/ssl/SSL_CTX_add_extra_chain_cert.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_add_extra_chain_cert, SSL_CTX_clear_extra_chain_certs - add or clear diff --git a/doc/ssl/SSL_CTX_add_session.pod b/doc/ssl/SSL_CTX_add_session.pod index dbdd9f0c..1397b9e2 100644 --- a/doc/ssl/SSL_CTX_add_session.pod +++ b/doc/ssl/SSL_CTX_add_session.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_add_session, SSL_add_session, SSL_CTX_remove_session, SSL_remove_session - manipulate session cache diff --git a/doc/ssl/SSL_CTX_config.pod b/doc/ssl/SSL_CTX_config.pod index 802c4c35..0baa2346 100644 --- a/doc/ssl/SSL_CTX_config.pod +++ b/doc/ssl/SSL_CTX_config.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_config, SSL_config - configure SSL_CTX or SSL structure diff --git a/doc/ssl/SSL_CTX_ctrl.pod b/doc/ssl/SSL_CTX_ctrl.pod index e8386a59..b550f698 100644 --- a/doc/ssl/SSL_CTX_ctrl.pod +++ b/doc/ssl/SSL_CTX_ctrl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_ctrl, SSL_CTX_callback_ctrl, SSL_ctrl, SSL_callback_ctrl - internal handling functions for SSL_CTX and SSL objects diff --git a/doc/ssl/SSL_CTX_dane_enable.pod b/doc/ssl/SSL_CTX_dane_enable.pod index fb535ec5..e43fb7f9 100644 --- a/doc/ssl/SSL_CTX_dane_enable.pod +++ b/doc/ssl/SSL_CTX_dane_enable.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_dane_enable, SSL_CTX_dane_mtype_set, SSL_dane_enable, diff --git a/doc/ssl/SSL_CTX_flush_sessions.pod b/doc/ssl/SSL_CTX_flush_sessions.pod index 7639451c..4393371e 100644 --- a/doc/ssl/SSL_CTX_flush_sessions.pod +++ b/doc/ssl/SSL_CTX_flush_sessions.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_flush_sessions, SSL_flush_sessions - remove expired sessions diff --git a/doc/ssl/SSL_CTX_free.pod b/doc/ssl/SSL_CTX_free.pod index e5cc1aab..59a2fc33 100644 --- a/doc/ssl/SSL_CTX_free.pod +++ b/doc/ssl/SSL_CTX_free.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_free - free an allocated SSL_CTX object diff --git a/doc/ssl/SSL_CTX_get0_param.pod b/doc/ssl/SSL_CTX_get0_param.pod index 6b937374..4548f87a 100644 --- a/doc/ssl/SSL_CTX_get0_param.pod +++ b/doc/ssl/SSL_CTX_get0_param.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_get0_param, SSL_get0_param, SSL_CTX_set1_param, SSL_set1_param - diff --git a/doc/ssl/SSL_CTX_get_verify_mode.pod b/doc/ssl/SSL_CTX_get_verify_mode.pod index bd100344..65fe7715 100644 --- a/doc/ssl/SSL_CTX_get_verify_mode.pod +++ b/doc/ssl/SSL_CTX_get_verify_mode.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_get_verify_mode, SSL_get_verify_mode, SSL_CTX_get_verify_depth, SSL_get_verify_depth, SSL_get_verify_callback, SSL_CTX_get_verify_callback - get currently set verification parameters diff --git a/doc/ssl/SSL_CTX_has_client_custom_ext.pod b/doc/ssl/SSL_CTX_has_client_custom_ext.pod index d9e9a066..f21fa787 100644 --- a/doc/ssl/SSL_CTX_has_client_custom_ext.pod +++ b/doc/ssl/SSL_CTX_has_client_custom_ext.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_has_client_custom_ext - check whether a handler exists for a particular diff --git a/doc/ssl/SSL_CTX_load_verify_locations.pod b/doc/ssl/SSL_CTX_load_verify_locations.pod index 59d11e03..0e9f8322 100644 --- a/doc/ssl/SSL_CTX_load_verify_locations.pod +++ b/doc/ssl/SSL_CTX_load_verify_locations.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_load_verify_locations, SSL_CTX_set_default_verify_paths, diff --git a/doc/ssl/SSL_CTX_new.pod b/doc/ssl/SSL_CTX_new.pod index 7b35bdda..36825012 100644 --- a/doc/ssl/SSL_CTX_new.pod +++ b/doc/ssl/SSL_CTX_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME TLSv1_2_method, TLSv1_2_server_method, TLSv1_2_client_method, diff --git a/doc/ssl/SSL_CTX_sess_number.pod b/doc/ssl/SSL_CTX_sess_number.pod index 049c04c4..9e6f45f3 100644 --- a/doc/ssl/SSL_CTX_sess_number.pod +++ b/doc/ssl/SSL_CTX_sess_number.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_sess_number, SSL_CTX_sess_connect, SSL_CTX_sess_connect_good, SSL_CTX_sess_connect_renegotiate, SSL_CTX_sess_accept, SSL_CTX_sess_accept_good, SSL_CTX_sess_accept_renegotiate, SSL_CTX_sess_hits, SSL_CTX_sess_cb_hits, SSL_CTX_sess_misses, SSL_CTX_sess_timeouts, SSL_CTX_sess_cache_full - obtain session cache statistics diff --git a/doc/ssl/SSL_CTX_sess_set_cache_size.pod b/doc/ssl/SSL_CTX_sess_set_cache_size.pod index 5aef10bd..3028d86b 100644 --- a/doc/ssl/SSL_CTX_sess_set_cache_size.pod +++ b/doc/ssl/SSL_CTX_sess_set_cache_size.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_sess_set_cache_size, SSL_CTX_sess_get_cache_size - manipulate session cache size diff --git a/doc/ssl/SSL_CTX_sess_set_get_cb.pod b/doc/ssl/SSL_CTX_sess_set_get_cb.pod index d2b0e047..405a4ffd 100644 --- a/doc/ssl/SSL_CTX_sess_set_get_cb.pod +++ b/doc/ssl/SSL_CTX_sess_set_get_cb.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_sess_set_new_cb, SSL_CTX_sess_set_remove_cb, SSL_CTX_sess_set_get_cb, SSL_CTX_sess_get_new_cb, SSL_CTX_sess_get_remove_cb, SSL_CTX_sess_get_get_cb - provide callback functions for server side external session caching diff --git a/doc/ssl/SSL_CTX_sessions.pod b/doc/ssl/SSL_CTX_sessions.pod index bc4a55e1..d08e6932 100644 --- a/doc/ssl/SSL_CTX_sessions.pod +++ b/doc/ssl/SSL_CTX_sessions.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_sessions - access internal session cache diff --git a/doc/ssl/SSL_CTX_set1_curves.pod b/doc/ssl/SSL_CTX_set1_curves.pod index b0276c80..7d5d7f1f 100644 --- a/doc/ssl/SSL_CTX_set1_curves.pod +++ b/doc/ssl/SSL_CTX_set1_curves.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set1_curves, SSL_CTX_set1_curves_list, SSL_set1_curves, diff --git a/doc/ssl/SSL_CTX_set1_sigalgs.pod b/doc/ssl/SSL_CTX_set1_sigalgs.pod index e9073b99..09e58bdb 100644 --- a/doc/ssl/SSL_CTX_set1_sigalgs.pod +++ b/doc/ssl/SSL_CTX_set1_sigalgs.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set1_sigalgs, SSL_set1_sigalgs, SSL_CTX_set1_sigalgs_list, diff --git a/doc/ssl/SSL_CTX_set1_verify_cert_store.pod b/doc/ssl/SSL_CTX_set1_verify_cert_store.pod index bfe8b70a..f91ac892 100644 --- a/doc/ssl/SSL_CTX_set1_verify_cert_store.pod +++ b/doc/ssl/SSL_CTX_set1_verify_cert_store.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set0_verify_cert_store, SSL_CTX_set1_verify_cert_store, diff --git a/doc/ssl/SSL_CTX_set_alpn_select_cb.pod b/doc/ssl/SSL_CTX_set_alpn_select_cb.pod index 59acbad5..f740cc61 100644 --- a/doc/ssl/SSL_CTX_set_alpn_select_cb.pod +++ b/doc/ssl/SSL_CTX_set_alpn_select_cb.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_alpn_protos, SSL_set_alpn_protos, SSL_CTX_set_alpn_select_cb, diff --git a/doc/ssl/SSL_CTX_set_cert_cb.pod b/doc/ssl/SSL_CTX_set_cert_cb.pod index eaa7a4e3..62b65b7a 100644 --- a/doc/ssl/SSL_CTX_set_cert_cb.pod +++ b/doc/ssl/SSL_CTX_set_cert_cb.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_cert_cb, SSL_set_cert_cb - handle certificate callback function diff --git a/doc/ssl/SSL_CTX_set_cert_store.pod b/doc/ssl/SSL_CTX_set_cert_store.pod index 7f7a794b..77d70eab 100644 --- a/doc/ssl/SSL_CTX_set_cert_store.pod +++ b/doc/ssl/SSL_CTX_set_cert_store.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_cert_store, SSL_CTX_get_cert_store - manipulate X509 certificate verification storage diff --git a/doc/ssl/SSL_CTX_set_cert_verify_callback.pod b/doc/ssl/SSL_CTX_set_cert_verify_callback.pod index af303f25..39c024fa 100644 --- a/doc/ssl/SSL_CTX_set_cert_verify_callback.pod +++ b/doc/ssl/SSL_CTX_set_cert_verify_callback.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_cert_verify_callback - set peer certificate verification procedure diff --git a/doc/ssl/SSL_CTX_set_cipher_list.pod b/doc/ssl/SSL_CTX_set_cipher_list.pod index 4e66917b..9379b447 100644 --- a/doc/ssl/SSL_CTX_set_cipher_list.pod +++ b/doc/ssl/SSL_CTX_set_cipher_list.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_cipher_list, SSL_set_cipher_list - choose list of available SSL_CIPHERs diff --git a/doc/ssl/SSL_CTX_set_client_CA_list.pod b/doc/ssl/SSL_CTX_set_client_CA_list.pod index 0252e7b5..e491e522 100644 --- a/doc/ssl/SSL_CTX_set_client_CA_list.pod +++ b/doc/ssl/SSL_CTX_set_client_CA_list.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_client_CA_list, SSL_set_client_CA_list, SSL_CTX_add_client_CA, diff --git a/doc/ssl/SSL_CTX_set_client_cert_cb.pod b/doc/ssl/SSL_CTX_set_client_cert_cb.pod index aed7d4f0..7c821b01 100644 --- a/doc/ssl/SSL_CTX_set_client_cert_cb.pod +++ b/doc/ssl/SSL_CTX_set_client_cert_cb.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_client_cert_cb, SSL_CTX_get_client_cert_cb - handle client certificate callback function diff --git a/doc/ssl/SSL_CTX_set_ct_validation_callback.pod b/doc/ssl/SSL_CTX_set_ct_validation_callback.pod index c481ecbc..8b9db092 100644 --- a/doc/ssl/SSL_CTX_set_ct_validation_callback.pod +++ b/doc/ssl/SSL_CTX_set_ct_validation_callback.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_enable_ct, SSL_CTX_enable_ct, SSL_disable_ct, SSL_CTX_disable_ct, diff --git a/doc/ssl/SSL_CTX_set_ctlog_list_file.pod b/doc/ssl/SSL_CTX_set_ctlog_list_file.pod index 4a2fa946..25f3ba6b 100644 --- a/doc/ssl/SSL_CTX_set_ctlog_list_file.pod +++ b/doc/ssl/SSL_CTX_set_ctlog_list_file.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_default_ctlog_list_file, SSL_CTX_set_ctlog_list_file - diff --git a/doc/ssl/SSL_CTX_set_default_passwd_cb.pod b/doc/ssl/SSL_CTX_set_default_passwd_cb.pod index 21969061..4db51f59 100644 --- a/doc/ssl/SSL_CTX_set_default_passwd_cb.pod +++ b/doc/ssl/SSL_CTX_set_default_passwd_cb.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_default_passwd_cb, SSL_CTX_set_default_passwd_cb_userdata, diff --git a/doc/ssl/SSL_CTX_set_generate_session_id.pod b/doc/ssl/SSL_CTX_set_generate_session_id.pod index 1b1171fe..7b468e3a 100644 --- a/doc/ssl/SSL_CTX_set_generate_session_id.pod +++ b/doc/ssl/SSL_CTX_set_generate_session_id.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_generate_session_id, SSL_set_generate_session_id, diff --git a/doc/ssl/SSL_CTX_set_info_callback.pod b/doc/ssl/SSL_CTX_set_info_callback.pod index f36f217e..c2f17a3c 100644 --- a/doc/ssl/SSL_CTX_set_info_callback.pod +++ b/doc/ssl/SSL_CTX_set_info_callback.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_info_callback, SSL_CTX_get_info_callback, SSL_set_info_callback, SSL_get_info_callback - handle information callback for SSL connections diff --git a/doc/ssl/SSL_CTX_set_max_cert_list.pod b/doc/ssl/SSL_CTX_set_max_cert_list.pod index 482751e7..d8b042e6 100644 --- a/doc/ssl/SSL_CTX_set_max_cert_list.pod +++ b/doc/ssl/SSL_CTX_set_max_cert_list.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_max_cert_list, SSL_CTX_get_max_cert_list, SSL_set_max_cert_list, SSL_get_max_cert_list - manipulate allowed size for the peer's certificate chain diff --git a/doc/ssl/SSL_CTX_set_min_proto_version.pod b/doc/ssl/SSL_CTX_set_min_proto_version.pod index 3e9fe80b..b44f42fa 100644 --- a/doc/ssl/SSL_CTX_set_min_proto_version.pod +++ b/doc/ssl/SSL_CTX_set_min_proto_version.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_min_proto_version, SSL_CTX_set_max_proto_version, diff --git a/doc/ssl/SSL_CTX_set_mode.pod b/doc/ssl/SSL_CTX_set_mode.pod index 1b3e783a..c694a4a2 100644 --- a/doc/ssl/SSL_CTX_set_mode.pod +++ b/doc/ssl/SSL_CTX_set_mode.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_mode, SSL_set_mode, SSL_CTX_get_mode, SSL_get_mode - manipulate SSL engine mode diff --git a/doc/ssl/SSL_CTX_set_msg_callback.pod b/doc/ssl/SSL_CTX_set_msg_callback.pod index 9546e751..48922e19 100644 --- a/doc/ssl/SSL_CTX_set_msg_callback.pod +++ b/doc/ssl/SSL_CTX_set_msg_callback.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_msg_callback, SSL_CTX_set_msg_callback_arg, SSL_set_msg_callback, SSL_set_msg_callback_arg - install callback for observing protocol messages diff --git a/doc/ssl/SSL_CTX_set_options.pod b/doc/ssl/SSL_CTX_set_options.pod index 635b470e..fca67c60 100644 --- a/doc/ssl/SSL_CTX_set_options.pod +++ b/doc/ssl/SSL_CTX_set_options.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_options, SSL_set_options, SSL_CTX_clear_options, diff --git a/doc/ssl/SSL_CTX_set_psk_client_callback.pod b/doc/ssl/SSL_CTX_set_psk_client_callback.pod index a4175081..238714fe 100644 --- a/doc/ssl/SSL_CTX_set_psk_client_callback.pod +++ b/doc/ssl/SSL_CTX_set_psk_client_callback.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_psk_client_callback, SSL_set_psk_client_callback - set PSK client callback diff --git a/doc/ssl/SSL_CTX_set_quiet_shutdown.pod b/doc/ssl/SSL_CTX_set_quiet_shutdown.pod index d39d747c..1f9329a3 100644 --- a/doc/ssl/SSL_CTX_set_quiet_shutdown.pod +++ b/doc/ssl/SSL_CTX_set_quiet_shutdown.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_quiet_shutdown, SSL_CTX_get_quiet_shutdown, SSL_set_quiet_shutdown, SSL_get_quiet_shutdown - manipulate shutdown behaviour diff --git a/doc/ssl/SSL_CTX_set_read_ahead.pod b/doc/ssl/SSL_CTX_set_read_ahead.pod index bea83900..c06418c2 100644 --- a/doc/ssl/SSL_CTX_set_read_ahead.pod +++ b/doc/ssl/SSL_CTX_set_read_ahead.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_read_ahead, SSL_CTX_get_read_ahead, diff --git a/doc/ssl/SSL_CTX_set_security_level.pod b/doc/ssl/SSL_CTX_set_security_level.pod index 577b3937..0c2a1a64 100644 --- a/doc/ssl/SSL_CTX_set_security_level.pod +++ b/doc/ssl/SSL_CTX_set_security_level.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_security_level, SSL_set_security_level, SSL_CTX_get_security_level, SSL_get_security_level, SSL_CTX_set_security_callback, SSL_set_security_callback, SSL_CTX_get_security_callback, SSL_get_security_callback, SSL_CTX_set0_security_ex_data, SSL_set0_security_ex_data, SSL_CTX_get0_security_ex_data, SSL_get0_security_ex_data - SSL/TLS security framework diff --git a/doc/ssl/SSL_CTX_set_session_cache_mode.pod b/doc/ssl/SSL_CTX_set_session_cache_mode.pod index b2370768..2ce12512 100644 --- a/doc/ssl/SSL_CTX_set_session_cache_mode.pod +++ b/doc/ssl/SSL_CTX_set_session_cache_mode.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_session_cache_mode, SSL_CTX_get_session_cache_mode - enable/disable session caching diff --git a/doc/ssl/SSL_CTX_set_session_id_context.pod b/doc/ssl/SSL_CTX_set_session_id_context.pod index a873b038..83ee0ebb 100644 --- a/doc/ssl/SSL_CTX_set_session_id_context.pod +++ b/doc/ssl/SSL_CTX_set_session_id_context.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_session_id_context, SSL_set_session_id_context - set context within which session can be reused (server side only) diff --git a/doc/ssl/SSL_CTX_set_split_send_fragment.pod b/doc/ssl/SSL_CTX_set_split_send_fragment.pod index accf5af2..6f5a61c5 100644 --- a/doc/ssl/SSL_CTX_set_split_send_fragment.pod +++ b/doc/ssl/SSL_CTX_set_split_send_fragment.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_max_send_fragment, SSL_set_max_send_fragment, diff --git a/doc/ssl/SSL_CTX_set_ssl_version.pod b/doc/ssl/SSL_CTX_set_ssl_version.pod index 22c0370b..87eed2ad 100644 --- a/doc/ssl/SSL_CTX_set_ssl_version.pod +++ b/doc/ssl/SSL_CTX_set_ssl_version.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_ssl_version, SSL_set_ssl_method, SSL_get_ssl_method diff --git a/doc/ssl/SSL_CTX_set_timeout.pod b/doc/ssl/SSL_CTX_set_timeout.pod index 470efdfc..32692278 100644 --- a/doc/ssl/SSL_CTX_set_timeout.pod +++ b/doc/ssl/SSL_CTX_set_timeout.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_timeout, SSL_CTX_get_timeout - manipulate timeout values for session caching diff --git a/doc/ssl/SSL_CTX_set_tlsext_status_cb.pod b/doc/ssl/SSL_CTX_set_tlsext_status_cb.pod index c12ff0e5..01817e20 100644 --- a/doc/ssl/SSL_CTX_set_tlsext_status_cb.pod +++ b/doc/ssl/SSL_CTX_set_tlsext_status_cb.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_tlsext_status_cb, diff --git a/doc/ssl/SSL_CTX_set_tlsext_ticket_key_cb.pod b/doc/ssl/SSL_CTX_set_tlsext_ticket_key_cb.pod index 34d8ce9a..4bce1276 100644 --- a/doc/ssl/SSL_CTX_set_tlsext_ticket_key_cb.pod +++ b/doc/ssl/SSL_CTX_set_tlsext_ticket_key_cb.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_tlsext_ticket_key_cb - set a callback for session ticket processing diff --git a/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod b/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod index fbfb8cba..11c0147c 100644 --- a/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod +++ b/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_tmp_dh_callback, SSL_CTX_set_tmp_dh, SSL_set_tmp_dh_callback, SSL_set_tmp_dh - handle DH keys for ephemeral key exchange diff --git a/doc/ssl/SSL_CTX_set_verify.pod b/doc/ssl/SSL_CTX_set_verify.pod index ccfe94cd..b203adca 100644 --- a/doc/ssl/SSL_CTX_set_verify.pod +++ b/doc/ssl/SSL_CTX_set_verify.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_set_verify, SSL_set_verify, diff --git a/doc/ssl/SSL_CTX_use_certificate.pod b/doc/ssl/SSL_CTX_use_certificate.pod index c645f580..e53baffd 100644 --- a/doc/ssl/SSL_CTX_use_certificate.pod +++ b/doc/ssl/SSL_CTX_use_certificate.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_use_certificate, SSL_CTX_use_certificate_ASN1, diff --git a/doc/ssl/SSL_CTX_use_psk_identity_hint.pod b/doc/ssl/SSL_CTX_use_psk_identity_hint.pod index 753074a7..747866cf 100644 --- a/doc/ssl/SSL_CTX_use_psk_identity_hint.pod +++ b/doc/ssl/SSL_CTX_use_psk_identity_hint.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_use_psk_identity_hint, SSL_use_psk_identity_hint, diff --git a/doc/ssl/SSL_CTX_use_serverinfo.pod b/doc/ssl/SSL_CTX_use_serverinfo.pod index bd496ff8..954fa52c 100644 --- a/doc/ssl/SSL_CTX_use_serverinfo.pod +++ b/doc/ssl/SSL_CTX_use_serverinfo.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_CTX_use_serverinfo, SSL_CTX_use_serverinfo_file - use serverinfo extension diff --git a/doc/ssl/SSL_SESSION_free.pod b/doc/ssl/SSL_SESSION_free.pod index 1906510e..5759dcdd 100644 --- a/doc/ssl/SSL_SESSION_free.pod +++ b/doc/ssl/SSL_SESSION_free.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_SESSION_free - free an allocated SSL_SESSION structure diff --git a/doc/ssl/SSL_SESSION_get0_cipher.pod b/doc/ssl/SSL_SESSION_get0_cipher.pod index fdd36edc..df408500 100644 --- a/doc/ssl/SSL_SESSION_get0_cipher.pod +++ b/doc/ssl/SSL_SESSION_get0_cipher.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_SESSION_get0_cipher - retrieve the SSL cipher associated with a session diff --git a/doc/ssl/SSL_SESSION_get0_hostname.pod b/doc/ssl/SSL_SESSION_get0_hostname.pod index 6fb12bec..e36bf772 100644 --- a/doc/ssl/SSL_SESSION_get0_hostname.pod +++ b/doc/ssl/SSL_SESSION_get0_hostname.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_SESSION_get0_hostname - retrieve the SNI hostname associated with a session diff --git a/doc/ssl/SSL_SESSION_get0_id_context.pod b/doc/ssl/SSL_SESSION_get0_id_context.pod index 2ac3fc4d..a69221a2 100644 --- a/doc/ssl/SSL_SESSION_get0_id_context.pod +++ b/doc/ssl/SSL_SESSION_get0_id_context.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_SESSION_get0_id_context - get the SSL ID context associated with a session diff --git a/doc/ssl/SSL_SESSION_get_protocol_version.pod b/doc/ssl/SSL_SESSION_get_protocol_version.pod index a033fdd9..9a139398 100644 --- a/doc/ssl/SSL_SESSION_get_protocol_version.pod +++ b/doc/ssl/SSL_SESSION_get_protocol_version.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_SESSION_get_protocol_version - retrieve session protocol version diff --git a/doc/ssl/SSL_SESSION_get_time.pod b/doc/ssl/SSL_SESSION_get_time.pod index d92a8efb..a0eb5d79 100644 --- a/doc/ssl/SSL_SESSION_get_time.pod +++ b/doc/ssl/SSL_SESSION_get_time.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_SESSION_get_time, SSL_SESSION_set_time, SSL_SESSION_get_timeout, diff --git a/doc/ssl/SSL_SESSION_has_ticket.pod b/doc/ssl/SSL_SESSION_has_ticket.pod index 9e372552..07803c81 100644 --- a/doc/ssl/SSL_SESSION_has_ticket.pod +++ b/doc/ssl/SSL_SESSION_has_ticket.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_SESSION_get0_ticket, diff --git a/doc/ssl/SSL_SESSION_set1_id.pod b/doc/ssl/SSL_SESSION_set1_id.pod index fe8a1c48..6918f40b 100644 --- a/doc/ssl/SSL_SESSION_set1_id.pod +++ b/doc/ssl/SSL_SESSION_set1_id.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_SESSION_set1_id - set the SSL session ID diff --git a/doc/ssl/SSL_accept.pod b/doc/ssl/SSL_accept.pod index 3248cacf..c94e88b8 100644 --- a/doc/ssl/SSL_accept.pod +++ b/doc/ssl/SSL_accept.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_accept - wait for a TLS/SSL client to initiate a TLS/SSL handshake diff --git a/doc/ssl/SSL_alert_type_string.pod b/doc/ssl/SSL_alert_type_string.pod index 6e2768e8..948dbf70 100644 --- a/doc/ssl/SSL_alert_type_string.pod +++ b/doc/ssl/SSL_alert_type_string.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_alert_type_string, SSL_alert_type_string_long, SSL_alert_desc_string, SSL_alert_desc_string_long - get textual description of alert information diff --git a/doc/ssl/SSL_check_chain.pod b/doc/ssl/SSL_check_chain.pod index 86919942..aa2cf474 100644 --- a/doc/ssl/SSL_check_chain.pod +++ b/doc/ssl/SSL_check_chain.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_check_chain - check certificate chain suitability diff --git a/doc/ssl/SSL_clear.pod b/doc/ssl/SSL_clear.pod index ed0ad60c..d6b1e04c 100644 --- a/doc/ssl/SSL_clear.pod +++ b/doc/ssl/SSL_clear.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_clear - reset SSL object to allow another connection diff --git a/doc/ssl/SSL_connect.pod b/doc/ssl/SSL_connect.pod index df198f9b..64c6a40c 100644 --- a/doc/ssl/SSL_connect.pod +++ b/doc/ssl/SSL_connect.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_connect - initiate the TLS/SSL handshake with an TLS/SSL server diff --git a/doc/ssl/SSL_do_handshake.pod b/doc/ssl/SSL_do_handshake.pod index ffb71cc0..038c2d74 100644 --- a/doc/ssl/SSL_do_handshake.pod +++ b/doc/ssl/SSL_do_handshake.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_do_handshake - perform a TLS/SSL handshake diff --git a/doc/ssl/SSL_extension_supported.pod b/doc/ssl/SSL_extension_supported.pod index 166c35a6..933fe36c 100644 --- a/doc/ssl/SSL_extension_supported.pod +++ b/doc/ssl/SSL_extension_supported.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_extension_supported, diff --git a/doc/ssl/SSL_free.pod b/doc/ssl/SSL_free.pod index eb69a162..c8a17a5e 100644 --- a/doc/ssl/SSL_free.pod +++ b/doc/ssl/SSL_free.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_free - free an allocated SSL structure diff --git a/doc/ssl/SSL_get0_peer_scts.pod b/doc/ssl/SSL_get0_peer_scts.pod index 05d39fee..e897ced5 100644 --- a/doc/ssl/SSL_get0_peer_scts.pod +++ b/doc/ssl/SSL_get0_peer_scts.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get0_peer_scts - get SCTs received diff --git a/doc/ssl/SSL_get_SSL_CTX.pod b/doc/ssl/SSL_get_SSL_CTX.pod index 98b9bc67..5d69ec9e 100644 --- a/doc/ssl/SSL_get_SSL_CTX.pod +++ b/doc/ssl/SSL_get_SSL_CTX.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_SSL_CTX - get the SSL_CTX from which an SSL is created diff --git a/doc/ssl/SSL_get_all_async_fds.pod b/doc/ssl/SSL_get_all_async_fds.pod index b4fa4ee0..a92ad100 100644 --- a/doc/ssl/SSL_get_all_async_fds.pod +++ b/doc/ssl/SSL_get_all_async_fds.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_waiting_for_async, diff --git a/doc/ssl/SSL_get_ciphers.pod b/doc/ssl/SSL_get_ciphers.pod index cc55095d..dec1fadd 100644 --- a/doc/ssl/SSL_get_ciphers.pod +++ b/doc/ssl/SSL_get_ciphers.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get1_supported_ciphers, SSL_get_client_ciphers, diff --git a/doc/ssl/SSL_get_client_CA_list.pod b/doc/ssl/SSL_get_client_CA_list.pod index b6092fe3..19582502 100644 --- a/doc/ssl/SSL_get_client_CA_list.pod +++ b/doc/ssl/SSL_get_client_CA_list.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_client_CA_list, SSL_CTX_get_client_CA_list - get list of client CAs diff --git a/doc/ssl/SSL_get_client_random.pod b/doc/ssl/SSL_get_client_random.pod index 46a2aa35..ebbb05c7 100644 --- a/doc/ssl/SSL_get_client_random.pod +++ b/doc/ssl/SSL_get_client_random.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_client_random, SSL_get_server_random, SSL_SESSION_get_master_key - retrieve internal TLS/SSL random values and master key diff --git a/doc/ssl/SSL_get_current_cipher.pod b/doc/ssl/SSL_get_current_cipher.pod index 87cecb0c..8cdf604d 100644 --- a/doc/ssl/SSL_get_current_cipher.pod +++ b/doc/ssl/SSL_get_current_cipher.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_current_cipher, SSL_get_cipher_name, SSL_get_cipher, diff --git a/doc/ssl/SSL_get_default_timeout.pod b/doc/ssl/SSL_get_default_timeout.pod index 875d38a9..6e729af4 100644 --- a/doc/ssl/SSL_get_default_timeout.pod +++ b/doc/ssl/SSL_get_default_timeout.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_default_timeout - get default session timeout value diff --git a/doc/ssl/SSL_get_error.pod b/doc/ssl/SSL_get_error.pod index 47d23589..8f738099 100644 --- a/doc/ssl/SSL_get_error.pod +++ b/doc/ssl/SSL_get_error.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_error - obtain result code for TLS/SSL I/O operation diff --git a/doc/ssl/SSL_get_extms_support.pod b/doc/ssl/SSL_get_extms_support.pod index ba4de3a5..e517aee0 100644 --- a/doc/ssl/SSL_get_extms_support.pod +++ b/doc/ssl/SSL_get_extms_support.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_extms_support - extended master secret support diff --git a/doc/ssl/SSL_get_fd.pod b/doc/ssl/SSL_get_fd.pod index cd5b6ecf..ab9fde6b 100644 --- a/doc/ssl/SSL_get_fd.pod +++ b/doc/ssl/SSL_get_fd.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_fd, SSL_get_rfd, SSL_get_wfd - get file descriptor linked to an SSL object diff --git a/doc/ssl/SSL_get_peer_cert_chain.pod b/doc/ssl/SSL_get_peer_cert_chain.pod index f1221244..1ccac274 100644 --- a/doc/ssl/SSL_get_peer_cert_chain.pod +++ b/doc/ssl/SSL_get_peer_cert_chain.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_peer_cert_chain, SSL_get0_verified_chain - get the X509 certificate diff --git a/doc/ssl/SSL_get_peer_certificate.pod b/doc/ssl/SSL_get_peer_certificate.pod index 57ed2723..cfa382d4 100644 --- a/doc/ssl/SSL_get_peer_certificate.pod +++ b/doc/ssl/SSL_get_peer_certificate.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_peer_certificate - get the X509 certificate of the peer diff --git a/doc/ssl/SSL_get_psk_identity.pod b/doc/ssl/SSL_get_psk_identity.pod index d330eee5..8e4eb7aa 100644 --- a/doc/ssl/SSL_get_psk_identity.pod +++ b/doc/ssl/SSL_get_psk_identity.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_psk_identity, SSL_get_psk_identity_hint - get PSK client identity and hint diff --git a/doc/ssl/SSL_get_rbio.pod b/doc/ssl/SSL_get_rbio.pod index 5ac4ca27..408c4e60 100644 --- a/doc/ssl/SSL_get_rbio.pod +++ b/doc/ssl/SSL_get_rbio.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_rbio, SSL_get_wbio - get BIO linked to an SSL object diff --git a/doc/ssl/SSL_get_session.pod b/doc/ssl/SSL_get_session.pod index 99936ad7..2c9868cc 100644 --- a/doc/ssl/SSL_get_session.pod +++ b/doc/ssl/SSL_get_session.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_session, SSL_get0_session, SSL_get1_session - retrieve TLS/SSL session data diff --git a/doc/ssl/SSL_get_shared_sigalgs.pod b/doc/ssl/SSL_get_shared_sigalgs.pod index 6a70e902..1aa6db05 100644 --- a/doc/ssl/SSL_get_shared_sigalgs.pod +++ b/doc/ssl/SSL_get_shared_sigalgs.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_shared_sigalgs, SSL_get_sigalgs - get supported signature algorithms diff --git a/doc/ssl/SSL_get_verify_result.pod b/doc/ssl/SSL_get_verify_result.pod index 3b8b6578..cba6eaf4 100644 --- a/doc/ssl/SSL_get_verify_result.pod +++ b/doc/ssl/SSL_get_verify_result.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_verify_result - get result of peer certificate verification diff --git a/doc/ssl/SSL_get_version.pod b/doc/ssl/SSL_get_version.pod index 23b6497d..ee8e54d7 100644 --- a/doc/ssl/SSL_get_version.pod +++ b/doc/ssl/SSL_get_version.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_get_version, SSL_is_dtls - get the protocol information of a connection diff --git a/doc/ssl/SSL_library_init.pod b/doc/ssl/SSL_library_init.pod index 6b921f66..0d0ec4ea 100644 --- a/doc/ssl/SSL_library_init.pod +++ b/doc/ssl/SSL_library_init.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_library_init, OpenSSL_add_ssl_algorithms, diff --git a/doc/ssl/SSL_load_client_CA_file.pod b/doc/ssl/SSL_load_client_CA_file.pod index cc6a19cd..34fd8b74 100644 --- a/doc/ssl/SSL_load_client_CA_file.pod +++ b/doc/ssl/SSL_load_client_CA_file.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_load_client_CA_file - load certificate names from file diff --git a/doc/ssl/SSL_new.pod b/doc/ssl/SSL_new.pod index a5a3ff98..e56c3765 100644 --- a/doc/ssl/SSL_new.pod +++ b/doc/ssl/SSL_new.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_new, SSL_up_ref - create a new SSL structure for a connection diff --git a/doc/ssl/SSL_pending.pod b/doc/ssl/SSL_pending.pod index f6ed5652..17e6f728 100644 --- a/doc/ssl/SSL_pending.pod +++ b/doc/ssl/SSL_pending.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_pending, SSL_has_pending - check for readable bytes buffered in an diff --git a/doc/ssl/SSL_read.pod b/doc/ssl/SSL_read.pod index 20ccf40d..0c2340f8 100644 --- a/doc/ssl/SSL_read.pod +++ b/doc/ssl/SSL_read.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_read - read bytes from a TLS/SSL connection diff --git a/doc/ssl/SSL_rstate_string.pod b/doc/ssl/SSL_rstate_string.pod index 7775913b..4f592e33 100644 --- a/doc/ssl/SSL_rstate_string.pod +++ b/doc/ssl/SSL_rstate_string.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_rstate_string, SSL_rstate_string_long - get textual description of state of an SSL object during read operation diff --git a/doc/ssl/SSL_session_reused.pod b/doc/ssl/SSL_session_reused.pod index eda66b2b..912df73b 100644 --- a/doc/ssl/SSL_session_reused.pod +++ b/doc/ssl/SSL_session_reused.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_session_reused - query whether a reused session was negotiated during handshake diff --git a/doc/ssl/SSL_set1_host.pod b/doc/ssl/SSL_set1_host.pod index 3339a0e8..661e25d3 100644 --- a/doc/ssl/SSL_set1_host.pod +++ b/doc/ssl/SSL_set1_host.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_set1_host, SSL_add1_host, SSL_set_hostflags, SSL_get0_peername - diff --git a/doc/ssl/SSL_set_bio.pod b/doc/ssl/SSL_set_bio.pod index e8e55f46..5d181e69 100644 --- a/doc/ssl/SSL_set_bio.pod +++ b/doc/ssl/SSL_set_bio.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_set_bio, SSL_set0_rbio, SSL_set0_wbio - connect the SSL object with a BIO diff --git a/doc/ssl/SSL_set_connect_state.pod b/doc/ssl/SSL_set_connect_state.pod index 60c18a45..31e078dd 100644 --- a/doc/ssl/SSL_set_connect_state.pod +++ b/doc/ssl/SSL_set_connect_state.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_set_connect_state, SSL_set_accept_state - prepare SSL object to work in client or server mode diff --git a/doc/ssl/SSL_set_fd.pod b/doc/ssl/SSL_set_fd.pod index e1f9988d..8eca7a32 100644 --- a/doc/ssl/SSL_set_fd.pod +++ b/doc/ssl/SSL_set_fd.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_set_fd, SSL_set_rfd, SSL_set_wfd - connect the SSL object with a file descriptor diff --git a/doc/ssl/SSL_set_session.pod b/doc/ssl/SSL_set_session.pod index 1de533f4..f9736e9c 100644 --- a/doc/ssl/SSL_set_session.pod +++ b/doc/ssl/SSL_set_session.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_set_session - set a TLS/SSL session to be used during TLS/SSL connect diff --git a/doc/ssl/SSL_set_shutdown.pod b/doc/ssl/SSL_set_shutdown.pod index ecdf60cf..549fe13a 100644 --- a/doc/ssl/SSL_set_shutdown.pod +++ b/doc/ssl/SSL_set_shutdown.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_set_shutdown, SSL_get_shutdown - manipulate shutdown state of an SSL connection diff --git a/doc/ssl/SSL_set_verify_result.pod b/doc/ssl/SSL_set_verify_result.pod index 8738d782..c9f995a8 100644 --- a/doc/ssl/SSL_set_verify_result.pod +++ b/doc/ssl/SSL_set_verify_result.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_set_verify_result - override result of peer certificate verification diff --git a/doc/ssl/SSL_shutdown.pod b/doc/ssl/SSL_shutdown.pod index e8ec4546..a5cbcc6d 100644 --- a/doc/ssl/SSL_shutdown.pod +++ b/doc/ssl/SSL_shutdown.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_shutdown - shut down a TLS/SSL connection diff --git a/doc/ssl/SSL_state_string.pod b/doc/ssl/SSL_state_string.pod index a2f59e84..fabdd99b 100644 --- a/doc/ssl/SSL_state_string.pod +++ b/doc/ssl/SSL_state_string.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_state_string, SSL_state_string_long - get textual description of state of an SSL object diff --git a/doc/ssl/SSL_want.pod b/doc/ssl/SSL_want.pod index e179d6be..ce400810 100644 --- a/doc/ssl/SSL_want.pod +++ b/doc/ssl/SSL_want.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_want, SSL_want_nothing, SSL_want_read, SSL_want_write, SSL_want_x509_lookup, diff --git a/doc/ssl/SSL_write.pod b/doc/ssl/SSL_write.pod index ef3b92ad..62695ad3 100644 --- a/doc/ssl/SSL_write.pod +++ b/doc/ssl/SSL_write.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME SSL_write - write bytes to a TLS/SSL connection diff --git a/doc/ssl/d2i_SSL_SESSION.pod b/doc/ssl/d2i_SSL_SESSION.pod index d6b17071..a8a29216 100644 --- a/doc/ssl/d2i_SSL_SESSION.pod +++ b/doc/ssl/d2i_SSL_SESSION.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =head1 NAME d2i_SSL_SESSION, i2d_SSL_SESSION - convert SSL_SESSION object from/to ASN1 representation diff --git a/doc/ssl/ssl.pod b/doc/ssl/ssl.pod index 960f0690..83085999 100644 --- a/doc/ssl/ssl.pod +++ b/doc/ssl/ssl.pod @@ -1,5 +1,7 @@ =pod +=encoding utf8 + =for comment openssl_manual_section:7 =head1 NAME diff --git a/engines/sm_standard/sm2/README.md b/engines/sm_standard/sm2/README.md new file mode 100644 index 00000000..7b2bbab9 --- /dev/null +++ b/engines/sm_standard/sm2/README.md @@ -0,0 +1,9 @@ +# About SM standard implementation + +This is only a standard implementation of the SM. + +In the standard implementation, it uses the **MIRACL** library. **MIRACL** (Multiprecision Integer and Rational Arithmetic Crytographic Library) is a C software library. See also [About the MIRACL Crypto SDK](https://libraries.docs.miracl.com/miracl-user-manual/about). + +Also, you can download the source code in the Github. Here is a reference link. [Github MIRACL](https://github.com/miracl/MIRACL). + +What's more, when you want test it and compile locally, you need add *-lm* option to solve some math functions problems like *ceil* in the code. \ No newline at end of file diff --git a/engines/sm_standard/sm2/kdf_standard.h b/engines/sm_standard/sm2/kdf_standard.h new file mode 100644 index 00000000..508226fd --- /dev/null +++ b/engines/sm_standard/sm2/kdf_standard.h @@ -0,0 +1,406 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + +#ifndef HEADER_KDF_STANDARD_H +#define HEADER_KDF_STANDARD_H + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SM3_len 256 +#define SM3_T1 0x79CC4519 +#define SM3_T2 0x7A879D8A +#define SM3_IVA 0x7380166f +#define SM3_IVB 0x4914b2b9 +#define SM3_IVC 0x172442d7 +#define SM3_IVD 0xda8a0600 +#define SM3_IVE 0xa96f30bc +#define SM3_IVF 0x163138aa +#define SM3_IVG 0xe38dee4d +#define SM3_IVH 0xb0fb0e4e + +#define SM2_WORDSIZE 8 +#define SM2_NUMBITS 256 +#define SM2_NUMWORD (SM2_NUMBITS / SM2_WORDSIZE) //32 + +/* Various logical functions */ +#define SM3_p1(x) (x ^ SM3_rotl32(x, 15) ^ SM3_rotl32(x, 23)) +#define SM3_p0(x) (x ^ SM3_rotl32(x, 9) ^ SM3_rotl32(x, 17)) +#define SM3_ff0(a, b, c) (a ^ b ^ c) +#define SM3_ff1(a, b, c) ((a & b) | (a & c) | (b & c)) +#define SM3_gg0(e, f, g) (e ^ f ^ g) +#define SM3_gg1(e, f, g) ((e & f) | ((~e) & g)) +#define SM3_rotl32(x, n) (((x) << n) | ((x) >> (32 - n))) +#define SM3_rotr32(x, n) (((x) >> n) | ((x) << (32 - n))) + + +typedef struct { + unsigned long state[8]; + unsigned long length; + unsigned long curlen; + unsigned char buf[64]; +} SM3_STATE; + + +static void BiToW(unsigned long Bi[], unsigned long W[]); +static void WToW1(unsigned long W[], unsigned long W1[]); +static void CF(unsigned long W[], unsigned long W1[], unsigned long V[]); +static void BigEndian(unsigned char src[], unsigned int bytelen, unsigned char des[]); +static void SM3_init(SM3_STATE *md); +static void SM3_compress(SM3_STATE *md); +static void SM3_process(SM3_STATE *md, unsigned char *buf, int len); +static void SM3_done(SM3_STATE *md, unsigned char hash[]); +static void SM3_256(unsigned char buf[], int len, unsigned char hash[]); +static void SM3_kdf(unsigned char Z[], unsigned short zlen, unsigned short klen, unsigned char K[]); + + +/* calculate W from Bi */ +static void BiToW(unsigned long Bi[], unsigned long W[]) +{ + int i; + unsigned long tmp; + + for(i = 0; i <= 15; i++) + { + W[i] = Bi[i]; + } + for(i = 16;i <= 67; i++) + { + tmp = W[i - 16] ^ W[i - 9] ^ SM3_rotl32(W[i - 3], 15); + W[i] = SM3_p1(tmp) ^ (SM3_rotl32(W[i - 13], 7)) ^ W[i - 6]; + } +} + + +/* calculate W1 from W */ +static void WToW1(unsigned long W[], unsigned long W1[]) +{ + int i; + for(i = 0; i <= 63; i++) + { + W1[i] = W[i] ^ W[i + 4]; + } +} + + +/* calculate the CF compress function and update V */ +static void CF(unsigned long W[], unsigned long W1[], unsigned long V[]) +{ + unsigned long SS1; + unsigned long SS2; + unsigned long TT1; + unsigned long TT2; + unsigned long A, B, C, D, E, F, G, H; + unsigned long T = SM3_T1; + unsigned long FF; + unsigned long GG; + int j; + + //reg init, set ABCDEFGH = V0 + A = V[0]; + B = V[1]; + C = V[2]; + D = V[3]; + E = V[4]; + F = V[5]; + G = V[6]; + H = V[7]; + + for (j = 0; j <= 63; j++) + { + //SS1 + if (j == 0) + { + T = SM3_T1; + } + else if (j == 16) + { + T = SM3_rotl32(SM3_T2, 16); + } + else + { + T = SM3_rotl32(T, 1); + } + SS1 = SM3_rotl32((SM3_rotl32(A, 12) + E + T), 7); + + //SS2 + SS2 = SS1 ^ SM3_rotl32(A, 12); + + //TT1 + if (j <= 15) + { + FF = SM3_ff0(A, B, C); + } + else + { + FF = SM3_ff1(A, B, C); + } + TT1 = FF + D + SS2 + *W1; + W1++; + + //TT2 + if (j <= 15) + { + GG = SM3_gg0(E, F, G); + } + else + { + GG = SM3_gg1(E, F, G); + } + TT2 = GG + H + SS1 + *W; + W++; + + //D + D = C; + + //C + C = SM3_rotl32(B, 9); + + //B + B = A; + + //A + A = TT1; + + //H + H = G; + + //G + G = SM3_rotl32(F, 19); + + //F + F = E; + + //E + E = SM3_p0(TT2); + } + + //update V + V[0] = A ^ V[0]; + V[1] = B ^ V[1]; + V[2] = C ^ V[2]; + V[3] = D ^ V[3]; + V[4] = E ^ V[4]; + V[5] = F ^ V[5]; + V[6] = G ^ V[6]; + V[7] = H ^ V[7]; +} + + +/* unsigned int endian converse. GM/T 0004-2012 requires to use big-endian. + * if CPu uses little-endian, BigEndian function is a necessary + * call to change the little-endian format into big-endian format. + */ +static void BigEndian(unsigned char src[], unsigned int bytelen, unsigned char des[]) +{ + unsigned char tmp = 0; + unsigned long i = 0; + for (i = 0; i < bytelen / 4; i++) + { + tmp = des[4 * i]; + des[4 * i] = src[4 * i + 3]; + src[4 * i + 3] = tmp; + + tmp = des[4 * i + 1]; + des[4 * i + 1] = src[4 * i + 2]; + des[4 * i + 2] = tmp; + } +} + + +/* initiate SM3 state */ +static void SM3_init(SM3_STATE *md) +{ + md->curlen = md->length = 0; + md->state[0] = SM3_IVA; + md->state[1] = SM3_IVB; + md->state[2] = SM3_IVC; + md->state[3] = SM3_IVD; + md->state[4] = SM3_IVE; + md->state[5] = SM3_IVF; + md->state[6] = SM3_IVG; + md->state[7] = SM3_IVH; +} + + +/* compress a single a block of message */ +static void SM3_compress(SM3_STATE *md) +{ + unsigned long W[68]; + unsigned long W1[64]; + + //if CPU uses little-endian, BigEndian function is a necessary call + BigEndian(md->buf, 64, md->buf); + BiToW((unsigned long *)md->buf, W); + WToW1(W, W1); + CF(W, W1, md->state); +} + + +/* compress the first(len/64) blocks of message */ +static void SM3_process(SM3_STATE *md, unsigned char *buf, int len) +{ + while (len--) + { + /* copy byte */ + md->buf[md->curlen] = *buf++; + md->curlen++; + + /* is 64 bytes full? */ + if (md->curlen == 64) + { + SM3_compress(md); + md->length += 512; + md->curlen = 0; + } + } +} + + +/* compress the rest message that the SM3_process has left behind */ +static void SM3_done(SM3_STATE *md, unsigned char hash[]) +{ + int i; + unsigned char tmp = 0; + + /* increase the bit length of the message */ + md->length += md->curlen << 3; + + /* append the '1' bit */ + md->buf[md->curlen] = 0x80; + md->curlen++; + + /* if the length is currently above 56 bytes, appends zeros till + it reaches 64 bytes, compress the current block, creat a new + block by appending zeros and length,and then compress it + */ + if (md->curlen > 56) + { + for (; md->curlen < 64;) + { + md->buf[md->curlen] = 0; + md->curlen++; + } + SM3_compress(md); + md->curlen = 0; + } + + /* if the length is less than 56 bytes, pad upto 56 bytes of zeroes */ + for (; md->curlen < 56;) + { + md->buf[md->curlen] = 0; + md->curlen++; + } + + /* since all messages are under 2^32 bits we mark the top bits zero */ + for (i = 56; i < 60; i++) + { + md->buf[i] = 0; + } + + /* append length */ + md->buf[63] = md->length & 0xff; + md->buf[62] = (md->length >> 8) & 0xff; + md->buf[61] = (md->length >> 16) & 0xff; + md->buf[60] = (md->length >> 24) & 0xff; + + SM3_compress(md); + + /* copy output */ + memcpy(hash, md->state, SM3_len / 8); + BigEndian(hash, SM3_len / 8, hash); //if CPU uses little-endian, BigEndian function is a necessary call +} + + +/* calculate a hash value from a given message */ +static void SM3_256(unsigned char buf[], int len, unsigned char hash[]) +{ + SM3_STATE md; + SM3_init(&md); + SM3_process(&md, buf, len); + SM3_done(&md, hash); +} + + +/* key derivation function */ +static void SM3_kdf(unsigned char Z[], unsigned short zlen, unsigned short klen, unsigned char K[]) +{ + unsigned short i, j, t; + unsigned int bitklen; + SM3_STATE md; + unsigned char Ha[SM2_NUMWORD]; + unsigned char ct[4] = {0, 0, 0, 1}; + + bitklen = klen * 8; + + if (bitklen % SM2_NUMBITS) + t = bitklen / SM2_NUMBITS + 1; + else + t = bitklen / SM2_NUMBITS; + + //s4: K = Ha1 || Ha2 || ... + for (i = 1; i < t; i++) + { + //s2: Hai = Hv(Z || ct) + SM3_init(&md); + SM3_process(&md, Z, zlen); + SM3_process(&md, ct, 4); + SM3_done(&md, Ha); + memcpy((K + SM2_NUMWORD * (i - 1)), Ha, SM2_NUMWORD); + + if (ct[3] == 0xff) + { + ct[3] = 0; + if (ct[2] == 0xff) + { + ct[2] = 0; + if (ct[1] == 0xff) + { + ct[1] = 0; + ct[0]++; + } + else + ct[1]++; + } + else + ct[2]++; + } + else + ct[3]++; + } + + //s3 + SM3_init(&md); + SM3_process(&md, Z, zlen); + SM3_process(&md, ct, 4); + SM3_done(&md, Ha); + + if(bitklen % SM2_NUMBITS) + { + i = (SM2_NUMBITS - bitklen + SM2_NUMBITS * (bitklen / SM2_NUMBITS)) / 8; + j = (bitklen - SM2_NUMBITS * (bitklen / SM2_NUMBITS)) / 8; + memcpy((K + SM2_NUMWORD * (t - 1)), Ha, j); + } + else + { + memcpy((K + SM2_NUMWORD * (t - 1)), Ha, SM2_NUMWORD); + } +} + + +#ifdef __cplusplus +} +# endif +#endif diff --git a/engines/sm_standard/sm2/sm2_standard.h b/engines/sm_standard/sm2/sm2_standard.h new file mode 100644 index 00000000..3ce7f9b9 --- /dev/null +++ b/engines/sm_standard/sm2/sm2_standard.h @@ -0,0 +1,278 @@ +/* ==================================================================== + * 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_SM2_STANDARD_H +#define HEADER_SM2_STANDARD_H + + +#include +#include +#include + + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "miracl.h" +#include "mirdef.h" +#include "kdf_standard.h" + +#define ERR_INFINITY_POINT 0x00000001 +#define ERR_NOT_VALID_ELEMENT 0x00000002 +#define ERR_NOT_VALID_POINT 0x00000003 +#define ERR_ORDER 0x00000004 +#define ERR_ECURVE_INIT 0x00000005 +#define ERR_KEYEX_RA 0x00000006 +#define ERR_KEYEX_RB 0x00000007 +#define ERR_EQUAL_S1SB 0x00000008 +#define ERR_EQUAL_S2SA 0x00000009 +#define ERR_SELFTEST_Z 0x0000000A +#define ERR_SELFTEST_INI_I 0x0000000B +#define ERR_SELFTEST_RES_I 0x0000000C +#define ERR_SELFTEST_INI_II 0x0000000D +#define ERR_GENERATE_R 0x0000000E +#define ERR_GENERATE_S 0x0000000F +#define ERR_OUTRANGE_R 0x00000010 +#define ERR_OUTRANGE_S 0x00000011 +#define ERR_GENERATE_T 0x00000012 +#define ERR_PUBKEY_INIT 0x00000013 +#define ERR_DATA_MEMCMP 0x00000014 +#define ERR_ARRAY_NULL 0x00000015 +#define ERR_C3_MATCH 0x00000016 +#define ERR_SELFTEST_KG 0x00000017 +#define ERR_SELFTEST_ENC 0x00000018 +#define ERR_SELFTEST_DEC 0x00000019 + + +static unsigned char SM2_p[32] = {0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +static unsigned char SM2_a[32] = {0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC}; +static unsigned char SM2_b[32] = {0x28, 0xE9, 0xFA, 0x9E, 0x9D, 0x9F, 0x5E, 0x34, 0x4D, 0x5A, 0x9E, 0x4B, 0xCF, 0x65, 0x09, 0xA7, + 0xF3, 0x97, 0x89, 0xF5, 0x15, 0xAB, 0x8F, 0x92, 0xDD, 0xBC, 0xBD, 0x41, 0x4D, 0x94, 0x0E, 0x93}; +static unsigned char SM2_n[32] = {0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x72, 0x03, 0xDF, 0x6B, 0x21, 0xC6, 0x05, 0x2B, 0x53, 0xBB, 0xF4, 0x09, 0x39, 0xD5, 0x41, 0x23}; +static unsigned char SM2_Gx[32] = {0x32, 0xC4, 0xAE, 0x2C, 0x1F, 0x19, 0x81, 0x19, 0x5F, 0x99, 0x04, 0x46, 0x6A, 0x39, 0xC9, 0x94, + 0x8F, 0xE3, 0x0B, 0xBF, 0xF2, 0x66, 0x0B, 0xE1, 0x71, 0x5A, 0x45, 0x89, 0x33, 0x4C, 0x74, 0xC7}; +static unsigned char SM2_Gy[32] = {0xBC, 0x37, 0x36, 0xA2, 0xF4, 0xF6, 0x77, 0x9C, 0x59, 0xBD, 0xCE, 0xE3, 0x6B, 0x69, 0x21, 0x53, + 0xD0, 0xA9, 0x87, 0x7C, 0xC6, 0x2A, 0x47, 0x40, 0x02, 0xDF, 0x32, 0xE5, 0x21, 0x39, 0xF0, 0xA0}; +static unsigned char SM2_h[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; + +big para_p, para_a, para_b, para_n, para_Gx, para_Gy, para_h; +epoint *G; +miracl *mip; + + +int SM2_w(big n); +void SM3_z(unsigned char ID[], unsigned short int ELAN, epoint* pubKey, unsigned char hash[]); +static int Test_Point(epoint* point); +static int Test_PubKey(epoint *pubKey); +int Test_Null(unsigned char array[], int len); +int Test_Zero(big x); +int Test_n(big x); +static int Test_Range(big x); +static int SM2_standard_init(); +static int SM2_standard_keygeneration(big priKey, epoint *pubKey); +int SM2_standard_sign_keygeneration(unsigned char PriKey[], unsigned char Px[], unsigned char Py[]); +int SM2_standard_keyex_init_i(big ra, epoint* RA); +int SM2_standard_keyex_re_i(big rb, big dB, epoint* RA, epoint* PA, unsigned char ZA[], unsigned char ZB[], unsigned char K[], int klen, epoint* RB, epoint* V, unsigned char hash[]); +int SM2_standard_keyex_init_ii(big ra, big dA, epoint* RA, epoint* RB, epoint* PB, unsigned char ZA[], unsigned char ZB[], unsigned char SB[], unsigned char K[], int klen, unsigned char SA[]); +int SM2_standard_keyex_re_ii(epoint *V, epoint *RA, epoint *RB, unsigned char ZA[], unsigned char ZB[], unsigned char SA[]); +int SM2_standard_keyex_selftest(); +int SM2_standard_encrypt(unsigned char* randK, epoint *pubKey, unsigned char M[], int klen, unsigned char C[]); +int SM2_standard_decrypt(big dB, unsigned char C[], int Clen, unsigned char M[]); +int SM2_standard_enc_selftest(); +int SM2_standard_sign(unsigned char *message, int len, unsigned char ZA[], unsigned char rand[], unsigned char d[], unsigned char R[], unsigned char S[]); +int SM2_standard_verify(unsigned char *message, int len, unsigned char ZA[], unsigned char Px[], unsigned char Py[], unsigned char R[], unsigned char S[]); +int SM2_standard_selfcheck(); + + +/* Initiate SM2 curve */ +static int SM2_standard_init() +{ + epoint *nG; + para_p = mirvar(0); + para_a = mirvar(0); + para_b = mirvar(0); + para_n = mirvar(0); + para_Gx = mirvar(0); + para_Gy = mirvar(0); + para_h = mirvar(0); + + G = epoint_init(); + nG = epoint_init(); + + bytes_to_big(SM2_NUMWORD, SM2_p, para_p); + bytes_to_big(SM2_NUMWORD, SM2_a, para_a); + bytes_to_big(SM2_NUMWORD, SM2_b, para_b); + bytes_to_big(SM2_NUMWORD, SM2_n, para_n); + bytes_to_big(SM2_NUMWORD, SM2_Gx, para_Gx); + bytes_to_big(SM2_NUMWORD, SM2_Gy, para_Gy); + bytes_to_big(SM2_NUMWORD, SM2_h, para_h); + + ecurve_init(para_a, para_b, para_p, MR_PROJECTIVE); //Initialises GF(p) elliptic curve. + //MR_PROJECTIVE specifying projective coordinates + if (!epoint_set(para_Gx, para_Gy, 0, G)) //initialise point G + { + return ERR_ECURVE_INIT; + } + ecurve_mult(para_n, G, nG); + if (!point_at_infinity(nG)) //test if the order of the point is n + { + return ERR_ORDER; + } + return 0; +} + + +/* test if the given point is on SM2 curve */ +static int Test_Point(epoint* point) +{ + big x, y, x_3, tmp; + x = mirvar(0); + y = mirvar(0); + x_3 = mirvar(0); + tmp = mirvar(0); + + //test if y^2 = x^3 + ax + b + epoint_get(point, x, y); + power(x, 3, para_p, x_3); //x_3 = x^3 mod p + multiply(x, para_a, x); //x = a * x + divide(x, para_p, tmp); //x = a * x mod p, tmp = a * x / p + add(x_3, x, x); //x = x^3 + ax + add(x, para_b, x); //x = x^3 + ax + b + divide(x, para_p, tmp); //x = x^3 + ax + b mod p + power(y, 2, para_p, y); //y = y^2 mod p + if (mr_compare(x, y) != 0) + return ERR_NOT_VALID_POINT; + else + return 0; +} + + +/* test if the given public key is valid */ +static int Test_PubKey(epoint *pubKey) +{ + big x, y, x_3, tmp; + epoint *nP; + x = mirvar(0); + y = mirvar(0); + x_3 = mirvar(0); + tmp = mirvar(0); + + nP = epoint_init(); + + //test if the pubKey is the point at infinity + if (point_at_infinity(pubKey)) //if pubKey is point at infinity, return error; + return ERR_INFINITY_POINT; + + //test if x < p and y

0)) + return 1; + return 0; +} + + +/* calculate a pubKey out of a given priKey */ +static int SM2_standard_keygeneration(big priKey, epoint *pubKey) +{ + int i = 0; + big x, y; + x = mirvar(0); + y = mirvar(0); + + //mip = mirsys(1000, 16); + //mip->IOBASE = 16; + + ecurve_mult(priKey, G, pubKey); + epoint_get(pubKey, x, y); + + i = Test_PubKey(pubKey); + if (i) + return i; + else + return 0; +} + +#ifdef __cplusplus +} +# endif +#endif + + diff --git a/engines/sm_standard/sm2/sm2_standard_enc.c b/engines/sm_standard/sm2/sm2_standard_enc.c new file mode 100644 index 00000000..37ffebda --- /dev/null +++ b/engines/sm_standard/sm2/sm2_standard_enc.c @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2015 - 2017 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 "miracl.h" +#include "mirdef.h" +#include "sm2_standard.h" + + +/* test if the given array is all zero */ +int Test_Null(unsigned char array[], int len) +{ + int i; + i = 0; + for (i = 0; i < len; i++) + { + if (array[i] != 0x00) + return 0; + } + return 1; +} + + +/* sm2 encryption */ +int SM2_standard_encrypt(unsigned char* randK, epoint *pubKey, unsigned char M[], int klen, unsigned char C[]) +{ + big C1x, C1y, x2, y2, rand; + epoint *C1, *kP, *S; + int i; + i = 0; + unsigned char x2y2[SM2_NUMWORD * 2] = {0}; + SM3_STATE md; + C1x = mirvar(0); + C1y = mirvar(0); + x2 = mirvar(0); + y2 = mirvar(0); + rand = mirvar(0); + C1 = epoint_init(); + kP = epoint_init(); + S = epoint_init(); + + //step2. calculate C1 = [k]G = (rGx, rGy) + bytes_to_big(SM2_NUMWORD, randK, rand); + ecurve_mult(rand, G, C1); //C1 = [k]G + epoint_get(C1, C1x, C1y); + big_to_bytes(SM2_NUMWORD, C1x, C, 1); + big_to_bytes(SM2_NUMWORD, C1y, C + SM2_NUMWORD, 1); + + //step3. test if S = [h]pubKey if the point at infinity + ecurve_mult(para_h, pubKey, S); + if (point_at_infinity(S)) //if S is point at infinity, return error; + return ERR_INFINITY_POINT; + + //step4. calculate [k]PB = (x2, y2) + ecurve_mult(rand, pubKey, kP); //kP = [k]P + epoint_get(kP, x2, y2); + + //step5. KDF(x2 || y2, klen) + big_to_bytes(SM2_NUMWORD, x2, x2y2, 1); + big_to_bytes(SM2_NUMWORD, y2, x2y2 + SM2_NUMWORD, 1); + SM3_kdf(x2y2, SM2_NUMWORD * 2, klen, C + SM2_NUMWORD * 3); + if (Test_Null(C + SM2_NUMWORD * 3, klen) != 0) + return ERR_ARRAY_NULL; + + //step6. C2 = M^t + for (i = 0; i < klen; i++) + { + C[SM2_NUMWORD * 3 + i] = M[i] ^ C[SM2_NUMWORD * 3 + i]; + } + + //step7. C3 = hash(x2, M, y2) + SM3_init(&md); + SM3_process(&md, x2y2, SM2_NUMWORD); + SM3_process(&md, M, klen); + SM3_process(&md, x2y2 + SM2_NUMWORD, SM2_NUMWORD); + SM3_done(&md, C + SM2_NUMWORD * 2); + return 0; +} + + +/* sm2 decryption */ +int SM2_standard_decrypt(big dB, unsigned char C[], int Clen, unsigned char M[]) +{ + SM3_STATE md; + int i; + i = 0; + unsigned char x2y2[SM2_NUMWORD * 2] = {0}; + unsigned char hash[SM2_NUMWORD] = {0}; + big C1x, C1y, x2, y2; + epoint *C1, *S, *dBC1; + C1x = mirvar(0); + C1y = mirvar(0); + x2 = mirvar(0); + y2 = mirvar(0); + C1 = epoint_init(); + S = epoint_init(); + dBC1 = epoint_init(); + + //step1. test if C1 fits the curve + bytes_to_big(SM2_NUMWORD, C, C1x); + bytes_to_big(SM2_NUMWORD, C + SM2_NUMWORD, C1y); + epoint_set(C1x, C1y, 0, C1); + i = Test_Point(C1); + if (i != 0) + return i; + + //step2. S = [h]C1 and test if S is the point at infinity + ecurve_mult(para_h, C1, S); + if (point_at_infinity(S)) // if S is point at infinity, return error; + return ERR_INFINITY_POINT; + + //step3. [dB]C1 = (x2, y2) + ecurve_mult(dB, C1, dBC1); + epoint_get(dBC1, x2, y2); + big_to_bytes(SM2_NUMWORD, x2, x2y2, 1); + big_to_bytes(SM2_NUMWORD, y2, x2y2 + SM2_NUMWORD, 1); + + //step4. t = KDF(x2 || y2, klen) + SM3_kdf(x2y2, SM2_NUMWORD * 2, Clen - SM2_NUMWORD * 3, M); + if (Test_Null(M, Clen - SM2_NUMWORD * 3) != 0) + return ERR_ARRAY_NULL; + + //step5. M = C2^t + for (i = 0; i < Clen - SM2_NUMWORD * 3; i++) + M[i] = M[i] ^ C[SM2_NUMWORD * 3 + i]; + + //step6. hash(x2, m, y2) + SM3_init(&md); + SM3_process(&md, x2y2, SM2_NUMWORD); + SM3_process(&md, M, Clen - SM2_NUMWORD * 3); + SM3_process(&md, x2y2 + SM2_NUMWORD, SM2_NUMWORD); + SM3_done(&md, hash); + if (memcmp(hash, C + SM2_NUMWORD * 2, SM2_NUMWORD) != 0) + return ERR_C3_MATCH; + else + return 0; +} + + +/* test whether the SM2 calculation is correct by comparing the result with the standard data */ +int SM2_standard_enc_selftest() +{ + int tmp, i; + tmp = 0; + i = 0; + unsigned char Cipher[115] = {0}; + unsigned char M[19] = {0}; + unsigned char kGxy[SM2_NUMWORD * 2] = {0}; + big ks, x, y; + epoint *kG; + + + //standard data + unsigned char std_priKey[32] = {0x39, 0x45, 0x20, 0x8F, 0x7B, 0x21, 0x44, 0xB1, 0x3F, 0x36, 0xE3, 0x8A, 0xC6, 0xD3, 0x9F, 0x95, + 0x88, 0x93, 0x93, 0x69, 0x28, 0x60, 0xB5, 0x1A, 0x42, 0xFB, 0x81, 0xEF, 0x4D, 0xF7, 0xC5, 0xB8}; + unsigned char std_pubKey[64] = {0x09, 0xF9, 0xDF, 0x31, 0x1E, 0x54, 0x21, 0xA1, 0x50, 0xDD, 0x7D, 0x16, 0x1E, 0x4B, 0xC5, 0xC6, + 0x72, 0x17, 0x9F, 0xAD, 0x18, 0x33, 0xFC, 0x07, 0x6B, 0xB0, 0x8F, 0xF3, 0x56, 0xF3, 0x50, 0x20, + 0xCC, 0xEA, 0x49, 0x0C, 0xE2, 0x67, 0x75, 0xA5, 0x2D, 0xC6, 0xEA, 0x71, 0x8C, 0xC1, 0xAA, 0x60, + 0x0A, 0xED, 0x05, 0xFB, 0xF3, 0x5E, 0x08, 0x4A, 0x66, 0x32, 0xF6, 0x07, 0x2D, 0xA9, 0xAD, 0x13}; + unsigned char std_rand[32] = {0x59, 0x27, 0x6E, 0x27, 0xD5, 0x06, 0x86, 0x1A, 0x16, 0x68, 0x0F, 0x3A, 0xD9, 0xC0, 0x2D, 0xCC, + 0xEF, 0x3C, 0xC1, 0xFA, 0x3C, 0xDB, 0xE4, 0xCE, 0x6D, 0x54, 0xB8, 0x0D, 0xEA, 0xC1, 0xBC, 0x21}; + unsigned char std_Message[19] = {0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x64, + 0x61, 0x72, 0x64}; + unsigned char std_Cipher[115] = {0x04, 0xEB, 0xFC, 0x71, 0x8E, 0x8D, 0x17, 0x98, 0x62, 0x04, 0x32, 0x26, 0x8E, 0x77, 0xFE, 0xB6, + 0x41, 0x5E, 0x2E, 0xDE, 0x0E, 0x07, 0x3C, 0x0F, 0x4F, 0x64, 0x0E, 0xCD, 0x2E, 0x14, 0x9A, 0x73, + 0xE8, 0x58, 0xF9, 0xD8, 0x1E, 0x54, 0x30, 0xA5, 0x7B, 0x36, 0xDA, 0xAB, 0x8F, 0x95, 0x0A, 0x3C, + 0x64, 0xE6, 0xEE, 0x6A, 0x63, 0x09, 0x4D, 0x99, 0x28, 0x3A, 0xFF, 0x76, 0x7E, 0x12, 0x4D, 0xF0, + 0x59, 0x98, 0x3C, 0x18, 0xF8, 0x09, 0xE2, 0x62, 0x92, 0x3C, 0x53, 0xAE, 0xC2, 0x95, 0xD3, 0x03, + 0x83, 0xB5, 0x4E, 0x39, 0xD6, 0x09, 0xD1, 0x60, 0xAF, 0xCB, 0x19, 0x08, 0xD0, 0xBD, 0x87, 0x66, + 0x21, 0x88, 0x6C, 0xA9, 0x89, 0xCA, 0x9C, 0x7D, 0x58, 0x08, 0x73, 0x07, 0xCA, 0x93, 0x09, 0x2D, + 0x65, 0x1E, 0xFA}; + mip= mirsys(1000, 16); + mip->IOBASE = 16; + x = mirvar(0); + y = mirvar(0); + ks = mirvar(0); + kG = epoint_init(); + bytes_to_big(32, std_priKey, ks); //ks is the standard private key + + + //initiate SM2 curve + SM2_standard_init(); + + //generate key pair + tmp = SM2_standard_keygeneration(ks, kG); + if (tmp != 0) + return tmp; + epoint_get(kG, x, y); + big_to_bytes(SM2_NUMWORD, x, kGxy, 1); + big_to_bytes(SM2_NUMWORD, y, kGxy + SM2_NUMWORD, 1); + if (memcmp(kGxy, std_pubKey, SM2_NUMWORD * 2) != 0) + return ERR_SELFTEST_KG; + + //encrypt data and compare the result with the standard data + tmp = SM2_standard_encrypt(std_rand, kG, std_Message, 19, Cipher); + if (tmp != 0) + return tmp; + if (memcmp(Cipher, std_Cipher, 19 + SM2_NUMWORD * 3) != 0) + return ERR_SELFTEST_ENC; + + //decrypt cipher and compare the result with the standard data + tmp = SM2_standard_decrypt(ks, Cipher, 115, M); + if (tmp != 0) + return tmp; + if (memcmp(M, std_Message, 19) != 0) + return ERR_SELFTEST_DEC; + return 0; +} diff --git a/engines/sm_standard/sm2/sm2_standard_exch.c b/engines/sm_standard/sm2/sm2_standard_exch.c new file mode 100644 index 00000000..d3adcc5d --- /dev/null +++ b/engines/sm_standard/sm2/sm2_standard_exch.c @@ -0,0 +1,491 @@ +/* ==================================================================== + * 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 "mirdef.h" +#include "miracl.h" +#include "sm2_standard.h" + + +/* calculation of w */ +int SM2_w(big n) +{ + big n1; + int w = 0; + n1 = mirvar(0); + w = logb2(para_n); //approximate integer log to the base 2 of para_n + expb2(w, n1); //n1 = 2^w + if (mr_compare(para_n, n1) == 1) + w++; + if ((w % 2) == 0) + w = w / 2 - 1; + else + w = (w + 1) / 2 - 1; + return w; +} + + +/* calculation of ZA or ZB */ +void SM3_z(unsigned char ID[], unsigned short int ELAN, epoint* pubKey, unsigned char hash[]) +{ + unsigned char Px[SM2_NUMWORD] = {0}, Py[SM2_NUMWORD] = {0}; + unsigned char IDlen[2] = {0}; + big x, y; + SM3_STATE md; + + x = mirvar(0); + y = mirvar(0); + + epoint_get(pubKey, x, y); + big_to_bytes(SM2_NUMWORD, x, Px, 1); + big_to_bytes(SM2_NUMWORD, y, Py, 1); + memcpy(IDlen, &ELAN + 1, 1); + memcpy(IDlen + 1, &ELAN, 1); + SM3_init(&md); + SM3_process(&md, IDlen, 2); + SM3_process(&md, ID, ELAN / 8); + SM3_process(&md, SM2_a, SM2_NUMWORD); + SM3_process(&md, SM2_b, SM2_NUMWORD); + SM3_process(&md, SM2_Gx, SM2_NUMWORD); + SM3_process(&md, SM2_Gy, SM2_NUMWORD); + SM3_process(&md, Px, SM2_NUMWORD); + SM3_process(&md, Py, SM2_NUMWORD); + SM3_done(&md, hash); + + return; +} + + +/* calculate RA */ +int SM2_standard_keyex_init_i(big ra, epoint* RA) +{ + return SM2_standard_keygeneration(ra, RA); +} + + +/* calculate RB and a secret key */ +int SM2_standard_keyex_re_i(big rb, big dB, epoint* RA, epoint* PA, unsigned char ZA[], unsigned char ZB[], unsigned char K[], int klen, epoint* RB, epoint* V, unsigned char hash[]) +{ + SM3_STATE md; + int i = 0, w = 0; + unsigned char Z[SM2_NUMWORD * 2 + SM3_len / 4] = {0}; + unsigned char x1y1[SM2_NUMWORD * 2] = {0}; + unsigned char x2y2[SM2_NUMWORD * 2] = {0}; + unsigned char temp = 0x02; + big x1, y1, x1_, x2, y2, x2_, tmp, Vx, Vy, temp_x, temp_y; + + //mip = mirsys(1000, 16); + //mip->IOBASE = 16; + x1 = mirvar(0); + y1 = mirvar(0); + x1_ = mirvar(0); + x2 = mirvar(0); + y2 = mirvar(0); + x2_ = mirvar(0); + tmp = mirvar(0); + Vx = mirvar(0); + Vy = mirvar(0); + temp_x = mirvar(0); + temp_y = mirvar(0); + + w = SM2_w(para_n); + + //--------B2: RB = [rb]G = (x2, y2)-------- + SM2_standard_keygeneration(rb, RB); + epoint_get(RB, x2, y2); + big_to_bytes(SM2_NUMWORD, x2, x2y2, 1); + big_to_bytes(SM2_NUMWORD, y2, x2y2 + SM2_NUMWORD, 1); + + //--------B3: x2_ = 2^w + x2 & (2^w - 1)-------- + expb2(w, x2_); //x2_ = 2^w + divide(x2, x2_, tmp); //x2 = x2 mod x2_ = x2 & (2^w - 1) + add(x2_, x2, x2_); + divide(x2_, para_n, tmp); //x2_ = n mod q + + //--------B4: tB = (dB + x2_ * rB) mod n-------- + multiply(x2_, rb, x2_); + add(dB, x2_, x2_); + divide(x2_, para_n, tmp); + + //--------B5: x1_ = 2^w + x1 & (2^w - 1)-------- + if (Test_Point(RA) != 0) + return ERR_KEYEX_RA; + epoint_get(RA, x1, y1); + big_to_bytes(SM2_NUMWORD, x1, x1y1, 1); + big_to_bytes(SM2_NUMWORD, y1, x1y1 + SM2_NUMWORD, 1); + expb2(w, x1_); //x1_ = 2^w + divide(x1, x1_, tmp); //x1 = x1 mod x1_ = x1 & (2^w - 1) + add(x1_,x1, x1_); + divide(x1_, para_n, tmp); //x1_ = n mod q + + //--------B6: V = [h * tB](PA + [x1_]RA)-------- + ecurve_mult(x1_, RA, V); //v = [x1_]RA + epoint_get(V, temp_x, temp_y); + + ecurve_add(PA, V); //V = PA + V + epoint_get(V, temp_x, temp_y); + + multiply(para_h, x2_, x2_); //tB = tB * h + + ecurve_mult(x2_, V, V); + if (point_at_infinity(V) == 1) + return ERR_INFINITY_POINT; + epoint_get(V, Vx, Vy); + big_to_bytes(SM2_NUMWORD, Vx, Z, 1); + big_to_bytes(SM2_NUMWORD, Vy, Z + SM2_NUMWORD, 1); + + //------------B7:KB = KDF(VX, VY, ZA, ZB, KLEN)---------- + memcpy(Z + SM2_NUMWORD * 2, ZA, SM3_len / 8); + memcpy(Z + SM2_NUMWORD * 2 + SM3_len / 8, ZB, SM3_len / 8); + SM3_kdf(Z, SM2_NUMWORD * 2 + SM3_len / 4, klen / 8, K); + + //---------------B8:(optional)SB = hash(0x02 || Vy || HASH(Vx || ZA || ZB || x1 || y1 || x2 || y2)------------- + SM3_init(&md); + SM3_process(&md, Z, SM2_NUMWORD); + SM3_process(&md, ZA, SM3_len / 8); + SM3_process(&md, ZB, SM3_len / 8); + SM3_process(&md, x1y1, SM2_NUMWORD * 2); + SM3_process(&md, x2y2, SM2_NUMWORD * 2); + SM3_done(&md, hash); + + SM3_init(&md); + SM3_process(&md, &temp, 1); + SM3_process(&md, Z + SM2_NUMWORD, SM2_NUMWORD); + SM3_process(&md, hash, SM3_len / 8); + SM3_done(&md, hash); + + return 0; +} + + +/* initiator A calculates the secret key out of RA and RB, and calculates a hash */ +int SM2_standard_keyex_init_ii(big ra, big dA, epoint* RA, epoint* RB, epoint* PB, unsigned char ZA[], unsigned char ZB[], unsigned char SB[], unsigned char K[], int klen, unsigned char SA[]) +{ + SM3_STATE md; + int i = 0, w = 0; + unsigned char Z[SM2_NUMWORD * 2 + SM3_len / 4] = {0}; + unsigned char x1y1[SM2_NUMWORD * 2] = {0}; + unsigned char x2y2[SM2_NUMWORD * 2] = {0}; + unsigned char hash[SM2_NUMWORD], S1[SM2_NUMWORD]; + unsigned char temp[2] = {0x02, 0x03}; + big x1, y1, x1_, x2, y2, x2_, tmp, Ux, Uy, temp_x, temp_y, tA; + epoint* U; + //mip = mirsys(1000, 16); + //mip->IOBASE = 16; + + U = epoint_init(); + x1 = mirvar(0); + y1 = mirvar(0); + x1_ = mirvar(0); + x2 = mirvar(0); + y2 = mirvar(0); + x2_ = mirvar(0); + tmp = mirvar(0); + Ux = mirvar(0); + Uy = mirvar(0); + temp_x = mirvar(0); + temp_y = mirvar(0); + tA=mirvar(0); + + w = SM2_w(para_n); + epoint_get(RA, x1, y1); + big_to_bytes(SM2_NUMWORD, x1, x1y1, TRUE); + big_to_bytes(SM2_NUMWORD, y1, x1y1 + SM2_NUMWORD, TRUE); + + //--------A4: x1_ = 2^w + x2 & (2^w - 1)-------- + expb2(w, x1_); //x1_ = 2^w + divide(x1, x1_, tmp); //x1 = x1 mod x1_ = x1 & (2^w - 1) + add(x1_, x1, x1_); + divide(x1_, para_n, tmp); + + //-------- A5:tA = (dA + x1_ * rA) mod n-------- + multiply(x1_, ra, tA); + divide(tA, para_n, tmp); + add(tA, dA, tA); + divide(tA, para_n, tmp); + + //-------- A6:x2_ = 2^w + x2 & (2^w - 1)----------------- + if (Test_Point(RB) != 0) + return ERR_KEYEX_RB;////////////////////////////////// + epoint_get(RB, x2, y2); + big_to_bytes(SM2_NUMWORD, x2, x2y2, TRUE); + big_to_bytes(SM2_NUMWORD, y2, x2y2 + SM2_NUMWORD, TRUE); + expb2(w, x2_); //x2_ = 2^w + divide(x2, x2_, tmp); //x2 = x2 mod x2_ = x2 & (2^w - 1) + add(x2_, x2, x2_); + divide(x2_, para_n, tmp); + + //--------A7:U = [h * tA](PB + [x2_]RB)----------------- + ecurve_mult(x2_, RB, U); //U = [x2_]RB + epoint_get(U, temp_x, temp_y); + + ecurve_add(PB, U); //U = PB + U + epoint_get(U, temp_x, temp_y); + + multiply(para_h, tA, tA); //tA = tA * h + divide(tA, para_n, tmp); + + ecurve_mult(tA, U, U); + if (point_at_infinity(U) == 1) + return ERR_INFINITY_POINT; + epoint_get(U, Ux, Uy); + big_to_bytes(SM2_NUMWORD, Ux, Z, 1); + big_to_bytes(SM2_NUMWORD, Uy, Z + SM2_NUMWORD, 1); + + //------------A8:KA = KDF(UX, UY, ZA, ZB, KLEN)---------- + memcpy(Z + SM2_NUMWORD * 2, ZA, SM3_len / 8); + memcpy(Z + SM2_NUMWORD * 2 + SM3_len / 8, ZB, SM3_len / 8); + SM3_kdf(Z, SM2_NUMWORD * 2 + SM3_len / 4, klen / 8, K); + + //---------------A9:(optional) S1 = Hash(0x02 || Uy || Hash(Ux || ZA || ZB || x1 || y1 || x2 || y2))----------- + SM3_init (&md); + SM3_process(&md, Z, SM2_NUMWORD); + SM3_process(&md, ZA, SM3_len / 8); + SM3_process(&md, ZB, SM3_len / 8); + SM3_process(&md, x1y1, SM2_NUMWORD * 2); + SM3_process(&md, x2y2, SM2_NUMWORD * 2); + SM3_done(&md, hash); + + SM3_init(&md); + SM3_process(&md, temp, 1); + SM3_process(&md, Z + SM2_NUMWORD, SM2_NUMWORD); + SM3_process(&md, hash, SM3_len / 8); + SM3_done(&md, S1); + + //test S1 = SB? + if (memcmp(S1, SB, SM2_NUMWORD) != 0) + return ERR_EQUAL_S1SB; + + //---------------A10 SA = Hash(0x03 || yU || Hash(xU || ZA || ZB || x1 || y1 || x2 || y2))------------- + SM3_init(&md); + SM3_process(&md, &temp[1], 1); + SM3_process(&md, Z + SM2_NUMWORD, SM2_NUMWORD); + SM3_process(&md, hash, SM3_len / 8); + SM3_done(&md, SA); + + return 0; +} + + +/* (optional)Step B10: verifies the hash value received from initiator A */ +int SM2_standard_keyex_re_ii(epoint *V, epoint *RA, epoint *RB, unsigned char ZA[], unsigned char ZB[], unsigned char SA[]) +{ + big x1, y1, x2, y2, Vx, Vy; + unsigned char hash[SM2_NUMWORD], S2[SM2_NUMWORD]; + unsigned char temp = 0x03; + unsigned char xV[SM2_NUMWORD], yV[SM2_NUMWORD]; + unsigned char x1y1[SM2_NUMWORD * 2] = {0}; + unsigned char x2y2[SM2_NUMWORD * 2] = {0}; + SM3_STATE md; + + x1 = mirvar(0); + y1 = mirvar(0); + x2 = mirvar(0); + y2 = mirvar(0); + Vx = mirvar(0); + Vy = mirvar(0); + + epoint_get(RA, x1, y1); + epoint_get(RB, x2, y2); + epoint_get(V, Vx, Vy); + + big_to_bytes(SM2_NUMWORD, Vx, xV, TRUE); + big_to_bytes(SM2_NUMWORD, Vy, yV, TRUE); + big_to_bytes(SM2_NUMWORD, x1, x1y1, TRUE); + big_to_bytes(SM2_NUMWORD, y1, x1y1 + SM2_NUMWORD, TRUE); + big_to_bytes(SM2_NUMWORD, x2, x2y2, TRUE); + big_to_bytes(SM2_NUMWORD, y2, x2y2 + SM2_NUMWORD, TRUE); + + //---------------B10:(optional) S2 = Hash(0x03 || Vy || Hash(Vx || ZA || ZB || x1 || y1 || x2 || y2)) + SM3_init(&md); + SM3_process(&md, xV, SM2_NUMWORD); + SM3_process(&md, ZA, SM3_len / 8); + SM3_process(&md, ZB, SM3_len / 8); + SM3_process(&md, x1y1, SM2_NUMWORD * 2); + SM3_process(&md, x2y2, SM2_NUMWORD * 2); + SM3_done(&md, hash); + + SM3_init(&md); + SM3_process(&md, &temp, 1); + SM3_process(&md, yV, SM2_NUMWORD); + SM3_process(&md, hash, SM3_len / 8); + SM3_done(&md, S2); + + if (memcmp(S2, SA, SM3_len / 8) != 0) + return ERR_EQUAL_S2SA; + + return 0; +} + + +/* self check of SM2 key exchange */ +int SM2_standard_keyex_selftest() +{ + //standard data + unsigned char std_priKeyA[SM2_NUMWORD] = {0x81, 0xEB, 0x26, 0xE9, 0x41, 0xBB, 0x5A, 0xF1, 0x6D, 0xF1, 0x16, 0x49, 0x5F, 0x90, 0x69, 0x52, + 0x72, 0xAE, 0x2C, 0xD6, 0x3D, 0x6C, 0x4A, 0xE1, 0x67, 0x84, 0x18, 0xBE, 0x48, 0x23, 0x00, 0x29}; + unsigned char std_pubKeyA[SM2_NUMWORD * 2] = {0x16, 0x0E, 0x12, 0x89, 0x7D, 0xF4, 0xED, 0xB6, 0x1D, 0xD8, 0x12, 0xFE, 0xB9, 0x67, 0x48, + 0xFB, 0xD3, 0xCC, 0xF4, 0xFF, 0xE2, 0x6A, 0xA6, 0xF6, 0xDB, 0x95, 0x40, 0xAF, 0x49, 0xC9, + 0x42, 0x32, 0x4A, 0x7D, 0xAD, 0x08, 0xBB, 0x9A, 0x45, 0x95, 0x31, 0x69, 0x4B, 0xEB, 0x20, + 0xAA, 0x48, 0x9D, 0x66, 0x49, 0x97, 0x5E, 0x1B, 0xFC, 0xF8, 0xC4, 0x74, 0x1B, 0x78, 0xB4, + 0xB2, 0x23, 0x00, 0x7F}; + unsigned char std_randA[SM2_NUMWORD] = {0xD4, 0xDE, 0x15, 0x47, 0x4D, 0xB7, 0x4D, 0x06, 0x49, 0x1C, 0x44, 0x0D, 0x30, 0x5E, 0x01, 0x24, + 0x00, 0x99, 0x0F, 0x3E, 0x39, 0x0C, 0x7E, 0x87, 0x15, 0x3C, 0x12, 0xDB, 0x2E, 0xA6, 0x0B, 0xB3}; + unsigned char std_priKeyB[SM2_NUMWORD] = {0x78, 0x51, 0x29, 0x91, 0x7D, 0x45, 0xA9, 0xEA, 0x54, 0x37, 0xA5, 0x93, 0x56, 0xB8, 0x23, 0x38, + 0xEA, 0xAD, 0xDA, 0x6C, 0xEB, 0x19, 0x90, 0x88, 0xF1, 0x4A, 0xE1, 0x0D, 0xEF, 0xA2, 0x29, 0xB5}; + unsigned char std_pubKeyB[SM2_NUMWORD * 2] = {0x6A, 0xE8, 0x48, 0xC5, 0x7C, 0x53, 0xC7, 0xB1, 0xB5, 0xFA, 0x99, 0xEB, 0x22, 0x86, 0xAF, + 0x07, 0x8B, 0xA6, 0x4C, 0x64, 0x59, 0x1B, 0x8B, 0x56, 0x6F, 0x73, 0x57, 0xD5, 0x76, 0xF1, + 0x6D, 0xFB, 0xEE, 0x48, 0x9D, 0x77, 0x16, 0x21, 0xA2, 0x7B, 0x36, 0xC5, 0xC7, 0x99, 0x20, + 0x62, 0xE9, 0xCD, 0x09, 0xA9, 0x26, 0x43, 0x86, 0xF3, 0xFB, 0xEA, 0x54, 0xDF, 0xF6, 0x93, + 0x05, 0x62, 0x1C, 0x4D}; + unsigned char std_randB[SM2_NUMWORD] = {0x7E, 0x07, 0x12, 0x48, 0x14, 0xB3, 0x09, 0x48, 0x91, 0x25, 0xEA, 0xED, 0x10, 0x11, 0x13, 0x16, + 0x4E, 0xBF, 0x0F, 0x34, 0x58, 0xC5, 0xBD, 0x88, 0x33, 0x5C, 0x1F, 0x9D, 0x59, 0x62, 0x43, 0xD6}; + unsigned char std_IDA[16] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}; + unsigned char std_IDB[16] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}; + unsigned short int std_ENTLA = 0x0080; + unsigned short int std_ENTLB = 0x0080; + unsigned char std_ZA[SM3_len] = {0x3B, 0x85, 0xA5, 0x71, 0x79, 0xE1, 0x1E, 0x7E, 0x51, 0x3A, 0xA6, 0x22, 0x99, 0x1F, 0x2C, + 0xA7, 0x4D, 0x18, 0x07, 0xA0, 0xBD, 0x4D, 0x4B, 0x38, 0xF9, 0x09, 0x87, 0xA1, 0x7A, 0xC2, + 0x45, 0xB1}; + unsigned char std_ZB[SM3_len] = {0x79, 0xC9, 0x88, 0xD6, 0x32, 0x29, 0xD9, 0x7E, 0xF1, 0x9F, 0xE0, 0x2C, 0xA1, 0x05, 0x6E, + 0x01, 0xE6, 0xA7, 0x41, 0x1E, 0xD2, 0x46, 0x94, 0xAA, 0x8F, 0x83, 0x4F, 0x4A, 0x4A, 0xB0, + 0x22, 0xF7}; + unsigned char std_RA[SM2_NUMWORD * 2] = {0x64, 0xCE, 0xD1, 0xBD, 0xBC, 0x99, 0xD5, 0x90, 0x04, 0x9B, 0x43, 0x4D, 0x0F, 0xD7, 0x34, 0x28, + 0xCF, 0x60, 0x8A, 0x5D, 0xB8, 0xFE, 0x5C, 0xE0, 0x7F, 0x15, 0x02, 0x69, 0x40, 0xBA, 0xE4, 0x0E, + 0x37, 0x66, 0x29, 0xC7, 0xAB, 0x21, 0xE7, 0xDB, 0x26, 0x09, 0x22, 0x49, 0x9D, 0xDB, 0x11, 0x8F, + 0x07, 0xCE, 0x8E, 0xAA, 0xE3, 0xE7, 0x72, 0x0A, 0xFE, 0xF6, 0xA5, 0xCC, 0x06, 0x20, 0x70, 0xC0}; + unsigned char std_K[16] = {0x6C, 0x89, 0x34, 0x73, 0x54, 0xDE, 0x24, 0x84, 0xC6, 0x0B, 0x4A, 0xB1, 0xFD, 0xE4, 0xC6, 0xE5}; + unsigned char std_RB[SM2_NUMWORD * 2] = {0xAC, 0xC2, 0x76, 0x88, 0xA6, 0xF7, 0xB7, 0x06, 0x09, 0x8B, 0xC9, 0x1F, 0xF3, 0xAD, 0x1B, 0xFF, + 0x7D, 0xC2, 0x80, 0x2C, 0xDB, 0x14, 0xCC, 0xCC, 0xDB, 0x0A, 0x90, 0x47, 0x1F, 0x9B, 0xD7, 0x07, + 0x2F, 0xED, 0xAC, 0x04, 0x94, 0xB2, 0xFF, 0xC4, 0xD6, 0x85, 0x38, 0x76, 0xC7, 0x9B, 0x8F, 0x30, + 0x1C, 0x65, 0x73, 0xAD, 0x0A, 0xA5, 0x0F, 0x39, 0xFC, 0x87, 0x18, 0x1E, 0x1A, 0x1B, 0x46, 0xFE}; + unsigned char std_SB[SM3_len] = {0xD3, 0xA0, 0xFE, 0x15, 0xDE, 0xE1, 0x85, 0xCE, 0xAE, 0x90, 0x7A, 0x6B, 0x59, 0x5C, 0xC3, + 0x2A, 0x26, 0x6E, 0xD7, 0xB3, 0x36, 0x7E, 0x99, 0x83, 0xA8, 0x96, 0xDC, 0x32, 0xFA, 0x20, + 0xF8, 0xEB}; + int std_Klen = 128; //bit len + int temp; + + big x, y, dA, dB, rA, rB; + epoint* pubKeyA, *pubKeyB, *RA, *RB, *V; + + unsigned char hash[SM3_len / 8] = {0}; + unsigned char ZA[SM3_len / 8] = {0}; + unsigned char ZB[SM3_len / 8] = {0}; + unsigned char xy[SM2_NUMWORD * 2] = {0}; + unsigned char *KA, *KB; + unsigned char SA[SM3_len / 8]; + + KA = malloc(std_Klen / 8); + KB = malloc(std_Klen / 8); + + mip = mirsys(1000, 16); + mip->IOBASE = 16; + + x = mirvar(0); + y = mirvar(0); + dA = mirvar(0); + dB = mirvar(0); + rA = mirvar(0); + rB = mirvar(0); + pubKeyA = epoint_init(); + pubKeyB = epoint_init(); + RA = epoint_init(); + RB = epoint_init(); + V = epoint_init(); + + SM2_standard_init(); + + bytes_to_big(SM2_NUMWORD, std_priKeyA, dA); + bytes_to_big(SM2_NUMWORD, std_priKeyB, dB); + bytes_to_big(SM2_NUMWORD, std_randA, rA); + bytes_to_big(SM2_NUMWORD, std_randB, rB); + bytes_to_big(SM2_NUMWORD, std_pubKeyA, x); + bytes_to_big(SM2_NUMWORD, std_pubKeyA + SM2_NUMWORD, y); + epoint_set(x, y, 0, pubKeyA); + bytes_to_big(SM2_NUMWORD, std_pubKeyB, x); + bytes_to_big(SM2_NUMWORD, std_pubKeyB + SM2_NUMWORD, y); + epoint_set(x, y, 0, pubKeyB); + + SM3_z(std_IDA, std_ENTLA, pubKeyA, ZA); + if (memcmp(ZA, std_ZA, SM3_len / 8) != 0) + return ERR_SELFTEST_Z; + SM3_z(std_IDB, std_ENTLB, pubKeyB, ZB); + if (memcmp(ZB, std_ZB, SM3_len / 8) != 0) + return ERR_SELFTEST_Z; + + temp = SM2_standard_keyex_init_i(rA, RA); + if (temp) + return temp; + + epoint_get(RA, x, y); + big_to_bytes(SM2_NUMWORD, x, xy, 1); + big_to_bytes(SM2_NUMWORD, y, xy + SM2_NUMWORD, 1); + if (memcmp(xy, std_RA, SM2_NUMWORD * 2) != 0) + return ERR_SELFTEST_INI_I; + + temp = SM2_standard_keyex_re_i(rB, dB, RA, pubKeyA, ZA, ZB, KA, std_Klen, RB, V, hash); + if (temp) + return temp; + if (memcmp(KA, std_K, std_Klen / 8) != 0) + return ERR_SELFTEST_RES_I; + + temp = SM2_standard_keyex_init_ii(rA, dA, RA, RB, pubKeyB, ZA, ZB, hash, KB, std_Klen, SA); + if (temp) + return temp; + if (memcmp(KB, std_K, std_Klen / 8) != 0) + return ERR_SELFTEST_INI_II; + + if (SM2_standard_keyex_re_ii(V, RA, RB, ZA, ZB, SA) != 0) + return ERR_EQUAL_S2SA; + + free(KA); + free(KB); + return 0; +} diff --git a/engines/sm_standard/sm2/sm2_standard_sign.c b/engines/sm_standard/sm2/sm2_standard_sign.c new file mode 100644 index 00000000..8c9dd134 --- /dev/null +++ b/engines/sm_standard/sm2/sm2_standard_sign.c @@ -0,0 +1,333 @@ +/* ==================================================================== + * 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 "mirdef.h" +#include "miracl.h" +#include "sm2_standard.h" + + + +/* test if the big x is zero */ +int Test_Zero(big x) +{ + big zero; + zero = mirvar(0); + if (mr_compare(x, zero) == 0) + return 1; + else + return 0; +} + + +/* test if the big x is order n */ +int Test_n(big x) +{ + //bytes_to_big(32, SM2_n, n); + if (mr_compare(x, para_n) == 0) + return 1; + else + return 0; +} + + + +/* calculate a pubKey out of a given priKey */ +int SM2_standard_sign_keygeneration(unsigned char PriKey[], unsigned char Px[], unsigned char Py[]) +{ + int i = 0; + big d, PAx, PAy; + epoint *PA; + + SM2_standard_init(); + PA = epoint_init(); + + d = mirvar(0); + PAx = mirvar(0); + PAy = mirvar(0); + + bytes_to_big(SM2_NUMWORD, PriKey, d); + + ecurve_mult(d, G, PA); + epoint_get(PA, PAx, PAy); + + big_to_bytes(SM2_NUMWORD, PAx, Px, TRUE); + big_to_bytes(SM2_NUMWORD, PAy, Py, TRUE); + i = Test_PubKey(PA); + if (i) + return i; + else + return 0; +} + + +/* SM2 signature algorithm */ +int SM2_standard_sign(unsigned char *message, int len, unsigned char ZA[], unsigned char rand[], unsigned char d[], unsigned char R[], unsigned char S[]) +{ + unsigned char hash[SM3_len / 8]; + int M_len = len + SM3_len / 8; + unsigned char *M = NULL; + int i; + + big dA, r, s, e, k, KGx, KGy; + big rem, rk, z1, z2; + epoint *KG; + + i = SM2_standard_init(); + if (i) + return i; + //initiate + dA = mirvar(0); + e = mirvar(0); + k = mirvar(0); + KGx = mirvar(0); + KGy = mirvar(0); + r = mirvar(0); + s = mirvar(0); + rem = mirvar(0); + rk = mirvar(0); + z1 = mirvar(0); + z2 = mirvar(0); + + bytes_to_big(SM2_NUMWORD, d, dA); //cinstr(dA, d); + + KG = epoint_init(); + + //step1, set M = ZA || M + M = (char *)malloc(sizeof(char)*(M_len + 1)); + memcpy(M, ZA, SM3_len / 8); + memcpy(M + SM3_len / 8, message, len); + + //step2, generate e = H(M) + SM3_256(M, M_len, hash); + bytes_to_big(SM3_len / 8, hash, e); + + //step3:generate k + bytes_to_big(SM3_len / 8, rand, k); + + //step4:calculate kG + ecurve_mult(k, G, KG); + + //step5:calculate r + epoint_get(KG, KGx, KGy); + add(e, KGx, r); + divide(r, para_n, rem); + + //judge r = 0 or n + k = n? + add(r, k, rk); + if (Test_Zero(r) | Test_n(rk)) + return ERR_GENERATE_R; + + //step6:generate s + incr(dA, 1, z1); + xgcd(z1, para_n, z1, z1, z1); + multiply(r, dA, z2); + divide(z2, para_n, rem); + subtract(k, z2, z2); + add(z2, para_n, z2); + multiply(z1, z2, s); + divide(s, para_n, rem); + + //judge s = 0? + if (Test_Zero(s)) + return ERR_GENERATE_S ; + + big_to_bytes(SM2_NUMWORD, r, R, TRUE); + big_to_bytes(SM2_NUMWORD, s, S, TRUE); + + free(M); + return 0; +} + + +/* SM2 verification algorithm */ +int SM2_standard_verify(unsigned char *message, int len, unsigned char ZA[], unsigned char Px[], unsigned char Py[], unsigned char R[], unsigned char S[]) +{ + unsigned char hash[SM3_len / 8]; + int M_len = len + SM3_len / 8; + unsigned char *M = NULL; + int i; + + big PAx, PAy, r, s, e, t, rem, x1, y1; + big RR; + epoint *PA, *sG, *tPA; + + i = SM2_standard_init(); + if (i) + return i; + + PAx = mirvar(0); + PAy = mirvar(0); + r = mirvar(0); + s = mirvar(0); + e = mirvar(0); + t = mirvar(0); + x1 = mirvar(0); + y1 = mirvar(0); + rem = mirvar(0); + RR = mirvar(0); + + PA = epoint_init(); + sG = epoint_init(); + tPA = epoint_init(); + + bytes_to_big(SM2_NUMWORD, Px, PAx); + bytes_to_big(SM2_NUMWORD, Py, PAy); + + bytes_to_big(SM2_NUMWORD, R, r); + bytes_to_big(SM2_NUMWORD, S, s); + + if (!epoint_set(PAx, PAy, 0, PA)) //initialise public key + { + return ERR_PUBKEY_INIT; + } + + //step1: test if r belong to [1, n-1] + if (Test_Range(r)) + return ERR_OUTRANGE_R; + + //step2: test if s belong to [1, n-1] + if (Test_Range(s)) + return ERR_OUTRANGE_S; + + //step3, generate M + M = (char *)malloc(sizeof(char)*(M_len + 1)); + memcpy(M, ZA, SM3_len / 8); + memcpy(M + SM3_len / 8, message, len); + + //step4, generate e = H(M) + SM3_256(M, M_len, hash); + bytes_to_big(SM3_len / 8, hash, e); + + //step5:generate t + add(r, s, t); + divide(t, para_n, rem); + + if (Test_Zero(t)) + return ERR_GENERATE_T; + + //step 6: generate(x1, y1) + ecurve_mult(s, G, sG); + ecurve_mult(t, PA, tPA); + ecurve_add(sG, tPA); + epoint_get(tPA, x1, y1); + + //step7:generate RR + add(e, x1, RR); + divide(RR, para_n, rem); + + free(M); + if (mr_compare(RR, r) == 0) + return 0; + else + return ERR_DATA_MEMCMP; +} + + +/* SM2 self check */ +int SM2_standard_selfcheck() +{ + //the private key + unsigned char dA[32] = {0x39, 0x45, 0x20, 0x8f, 0x7b, 0x21, 0x44, 0xb1, 0x3f, 0x36, 0xe3, 0x8a, 0xc6, 0xd3, 0x9f, + 0x95, 0x88, 0x93, 0x93, 0x69, 0x28, 0x60, 0xb5, 0x1a, 0x42, 0xfb, 0x81, 0xef, 0x4d, 0xf7, + 0xc5, 0xb8}; + unsigned char rand[32] = {0x59, 0x27, 0x6E, 0x27, 0xD5, 0x06, 0x86, 0x1A, 0x16, 0x68, 0x0F, 0x3A, 0xD9, 0xC0, 0x2D, + 0xCC, 0xEF, 0x3C, 0xC1, 0xFA, 0x3C, 0xDB, 0xE4, 0xCE, 0x6D, 0x54, 0xB8, 0x0D, 0xEA, 0xC1, + 0xBC, 0x21}; + //the public key + /* unsigned char xA[32] = {0x09, 0xf9, 0xdf, 0x31, 0x1e, 0x54, 0x21, 0xa1, 0x50, 0xdd, 0x7d, 0x16, 0x1e, 0x4b, 0xc5, + 0xc6, 0x72, 0x17, 0x9f, 0xad, 0x18, 0x33, 0xfc, 0x07, 0x6b, 0xb0, 0x8f, 0xf3, 0x56, 0xf3, + 0x50, 0x20}; + unsigned char yA[32] = {0xcc, 0xea, 0x49, 0x0c, 0xe2, 0x67, 0x75, 0xa5, 0x2d, 0xc6, 0xea, 0x71, 0x8c, 0xc1, 0xaa, + 0x60, 0x0a, 0xed, 0x05, 0xfb, 0xf3, 0x5e, 0x08, 0x4a, 0x66, 0x32, 0xf6, 0x07, 0x2d, 0xa9, + 0xad, 0x13};*/ + + unsigned char xA[32], yA[32]; + unsigned char r[32], s[32]; // Signature + + unsigned char IDA[16] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38}; //ASCII code of userA's identification + int IDA_len = 16; + unsigned char ENTLA[2] = {0x00, 0x80}; //the length of userA's identification, presentation in ASCII code + + unsigned char *message = "message digest"; //the message to be signed + int len = strlen(message); //the length of message + unsigned char ZA[SM3_len / 8]; //ZA = Hash(ENTLA || IDA || a || b || Gx || Gy || xA|| yA) + unsigned char Msg[210]; //210 = IDA_len + 2 + SM2_NUMWORD * 6 + + int temp; + + mip = mirsys(10000, 16); + mip->IOBASE = 16; + + temp = SM2_standard_sign_keygeneration(dA, xA, yA); + if (temp) + return temp; + + //ENTLA || IDA || a || b || Gx || Gy || xA || yA + memcpy(Msg, ENTLA, 2); + memcpy(Msg + 2, IDA, IDA_len); + memcpy(Msg + 2 + IDA_len, SM2_a, SM2_NUMWORD); + memcpy(Msg + 2 + IDA_len + SM2_NUMWORD, SM2_b, SM2_NUMWORD); + memcpy(Msg + 2 + IDA_len + SM2_NUMWORD * 2, SM2_Gx, SM2_NUMWORD); + memcpy(Msg + 2 + IDA_len + SM2_NUMWORD * 3, SM2_Gy, SM2_NUMWORD); + memcpy(Msg + 2 + IDA_len + SM2_NUMWORD * 4, xA, SM2_NUMWORD); + memcpy(Msg + 2 + IDA_len + SM2_NUMWORD * 5, yA, SM2_NUMWORD); + SM3_256(Msg, 210, ZA); + + temp = SM2_standard_sign(message, len, ZA, rand, dA, r, s); + if (temp) + return temp; + + temp = SM2_standard_verify(message, len, ZA, xA, yA, r, s); + if (temp) + return temp; + + return 0; +} diff --git a/engines/sm_standard/sm3/sm3_standard.c b/engines/sm_standard/sm3/sm3_standard.c new file mode 100644 index 00000000..85dc063e --- /dev/null +++ b/engines/sm_standard/sm3/sm3_standard.c @@ -0,0 +1,368 @@ +#include "sm3_standard.h" + + +/**************************************************************** +Function: BiToW +Description: calculate W from Bi +Calls: +Called By: SM3_compress +Input: Bi[16] //a block of a message +Output: W[64] +Return: null +Others: +****************************************************************/ +void BiToW(unsigned int Bi[], unsigned int W[]) +{ + int i; + unsigned int tmp; + + for (i = 0; i <= 15; i++) + { + W[i] = Bi[i]; + } + for (i = 16; i <= 67; i++) + { + tmp = W[i - 16] + ^ W[i - 9] + ^ SM3_rotl32(W[i - 3], 15); + W[i] = SM3_p1(tmp) + ^ (SM3_rotl32(W[i - 13], 7)) + ^ W[i - 6]; + } +} + + +/***************************************************************** +Function: WToW1 +Description: calculate W1 from W +Calls: +Called By: SM3_compress +Input: W[64] +Output: W1[64] +Return: null +Others: +*****************************************************************/ +void WToW1(unsigned int W[], unsigned int W1[]) +{ + int i; + for (i = 0; i <= 63; i++) + { + W1[i] = W[i] ^ W[i + 4]; + } +} + + +/****************************************************************** +Function: CF +Description: calculate the CF compress function and update V +Calls: +Called By: SM3_compress +Input: W[64] +W1[64] +V[8] +Output: V[8] +Return: null +Others: +********************************************************************/ +void CF(unsigned int W[], unsigned int W1[], unsigned int V[]) +{ + unsigned int SS1; + unsigned int SS2; + unsigned int TT1; + unsigned int TT2; + unsigned int A, B, C, D, E, F, G, H; + unsigned int T = SM3_T1; + unsigned int FF; + unsigned int GG; + int j; + + //reg init,set ABCDEFGH=V0 + A = V[0]; + B = V[1]; + C = V[2]; + D = V[3]; + E = V[4]; + F = V[5]; + G = V[6]; + H = V[7]; + + for (j = 0; j <= 63; j++) + { + //SS1 + if (j == 0) + { + T = SM3_T1; + } + else if (j == 16) + { + T = SM3_rotl32(SM3_T2, 16); + } + else + { + T = SM3_rotl32(T, 1); + } + SS1 = SM3_rotl32((SM3_rotl32(A, 12) + E + T), 7); + + //SS2 + SS2 = SS1^SM3_rotl32(A, 12); + + //TT1 + if (j <= 15) + { + FF = SM3_ff0(A, B, C); + } + + else + { + FF = SM3_ff1(A, B, C); + } + TT1 = FF + D + SS2 + *W1; + W1++; + + //TT2 + if (j <= 15) + { + GG = SM3_gg0(E, F, G); + } + else + { + GG = SM3_gg1(E, F, G); + } + TT2 = GG + H + SS1 + *W; + W++; + + //D + D = C; + + //C + C = SM3_rotl32(B, 9); + + //B + B = A; + + //A + A = TT1; + + //H + H = G; + + + //G + G = SM3_rotl32(F, 19); + + //F + F = E; + + //E + E = SM3_p0(TT2); + } + + //update V + V[0] = A^V[0]; + V[1] = B^V[1]; + V[2] = C^V[2]; + V[3] = D^V[3]; + V[4] = E^V[4]; + V[5] = F^V[5]; + V[6] = G^V[6]; + V[7] = H^V[7]; +} + + +/****************************************************************************** +Function: BigEndian +Description: U32 endian converse.GM/T 0004-2012 requires to use big-endian. +if CPU uses little-endian, BigEndian function is a necessary +call to change the little-endian format into big-endian format. +Calls: +Called By: SM3_compress, SM3_done +Input: src[bytelen] +bytelen +Output: des[bytelen] +Return: null +Others: src and des could implies the same address +*******************************************************************************/ +void BigEndian(unsigned char src[], unsigned int bytelen, unsigned char des[]) +{ + unsigned char tmp = 0; + unsigned int i = 0; + + for (i = 0; icurlen = md->length = 0; + md->state[0] = SM3_IVA; + md->state[1] = SM3_IVB; + md->state[2] = SM3_IVC; + md->state[3] = SM3_IVD; + md->state[4] = SM3_IVE; + md->state[5] = SM3_IVF; + md->state[6] = SM3_IVG; + md->state[7] = SM3_IVH; +} + + +/****************************************************************************** +Function: SM3_compress +Description: compress a single block of message +Calls: BigEndian +BiToW +WToW1 +CF +Called By: SM3_256 +Input: SM3_STATE *md +Output: SM3_STATE *md +Return: null +Others: +*******************************************************************************/ +void SM3_compress(SM3_STATE * md) +{ + unsigned int W[68]; + unsigned int W1[64]; + + //if CPU uses little-endian, BigEndian function is a necessary call + BigEndian(md->buf, 64, md->buf); + + BiToW((unsigned int *)md->buf, W); + WToW1(W, W1); + CF(W, W1, md->state); +} + + +/****************************************************************************** +Function: SM3_process +Description: compress the first (len/64) blocks of message +Calls: SM3_compress +Called By: SM3_256 +Input: SM3_STATE *md +unsigned char buf[len] //the input message +int len //bytelen of message +Output: SM3_STATE *md +Return: null +Others: +*******************************************************************************/ +void SM3_process(SM3_STATE * md, unsigned char *buf, int len) +{ + while (len--) + { + /* copy byte */ + md->buf[md->curlen] = *buf++; + md->curlen++; + + /* is 64 bytes full? */ + if (md->curlen == 64) + { + SM3_compress(md); + md->length += 512; + md->curlen = 0; + } + } +} + + +/****************************************************************************** +Function: SM3_done +Description: compress the rest message that the SM3_process has left behind +Calls: SM3_compress +Called By: SM3_256 +Input: SM3_STATE *md +Output: unsigned char *hash +Return: null +Others: +*******************************************************************************/ +void SM3_done(SM3_STATE *md, unsigned char hash[]) +{ + int i; + unsigned char tmp = 0; + + /* increase the bit length of the message */ + md->length += md->curlen << 3; + + /* append the '1' bit */ + md->buf[md->curlen] = 0x80; + md->curlen++; + + /* if the length is currently above 56 bytes, appends zeros till + it reaches 64 bytes, compress the current block, creat a new + block by appending zeros and length,and then compress it + */ + if (md->curlen >56) + { + for (; md->curlen < 64;) + { + md->buf[md->curlen] = 0; + md->curlen++; + } + SM3_compress(md); + md->curlen = 0; + } + + /* if the length is less than 56 bytes, pad upto 56 bytes of zeroes */ + for (; md->curlen < 56;) + { + md->buf[md->curlen] = 0; + md->curlen++; + } + + /* since all messages are under 2^32 bits we mark the top bits zero */ + for (i = 56; i < 60; i++) + { + md->buf[i] = 0; + } + + /* append length */ + md->buf[63] = md->length & 0xff; + md->buf[62] = (md->length >> 8) & 0xff; + md->buf[61] = (md->length >> 16) & 0xff; + md->buf[60] = (md->length >> 24) & 0xff; + + SM3_compress(md); + + /* copy output */ + memcpy(hash, md->state, SM3_len / 8); + BigEndian(hash, SM3_len / 8, hash);//if CPU uses little-endian, BigEndian function is a necessary call +} + + +/****************************************************************************** +Function: SM3_256 +Description: calculate a hash value from a given message +Calls: SM3_init +SM3_process +SM3_done +Called By: +Input: unsigned char buf[len] //the input message +int len //bytelen of the message +Output: unsigned char hash[32] +Return: null +Others: +*******************************************************************************/ +void SM3_256(unsigned char buf[], int len, unsigned char hash[]) +{ + SM3_STATE md; + SM3_init(&md); + SM3_process(&md, buf, len); + SM3_done(&md, hash); +} diff --git a/engines/sm_standard/sm3/sm3_standard.h b/engines/sm_standard/sm3/sm3_standard.h new file mode 100644 index 00000000..737b028e --- /dev/null +++ b/engines/sm_standard/sm3/sm3_standard.h @@ -0,0 +1,42 @@ +#include + +#define SM3_len 256 +#define SM3_T1 0x79CC4519 +#define SM3_T2 0x7A879D8A +#define SM3_IVA 0x7380166f +#define SM3_IVB 0x4914b2b9 +#define SM3_IVC 0x172442d7 +#define SM3_IVD 0xda8a0600 +#define SM3_IVE 0xa96f30bc +#define SM3_IVF 0x163138aa +#define SM3_IVG 0xe38dee4d +#define SM3_IVH 0xb0fb0e4e + +/* Various logical functions */ +#define SM3_p1(x) (x^SM3_rotl32(x,15)^SM3_rotl32(x,23)) +#define SM3_p0(x) (x^SM3_rotl32(x,9)^SM3_rotl32(x,17)) +#define SM3_ff0(a,b,c) (a^b^c) +#define SM3_ff1(a,b,c) ((a&b)|(a&c)|(b&c)) +#define SM3_gg0(e,f,g) (e^f^g) +#define SM3_gg1(e,f,g) ((e&f)|((~e)&g)) +#define SM3_rotl32(x,n) ((((unsigned int) x) << n) | (((unsigned int) x) >> (32 - n))) +#define SM3_rotr32(x,n) ((((unsigned int) x) >> n) | (((unsigned int) x) << (32 - n))) + + +typedef struct { + unsigned int state[8]; + unsigned int length; + unsigned int curlen; + unsigned char buf[64]; +} SM3_STATE; + + +void BiToWj(unsigned int Bi[], unsigned int Wj[]); +void WjToWj1(unsigned int Wj[], unsigned int Wj1[]); +void CF(unsigned int Wj[], unsigned int Wj1[], unsigned int V[]); +void BigEndian(unsigned char src[], unsigned int bytelen, unsigned char des[]); +void SM3_init(SM3_STATE *md); +void SM3_compress(SM3_STATE * md); +void SM3_process(SM3_STATE * md, unsigned char buf[], int len); +void SM3_done(SM3_STATE *md, unsigned char *hash); +void SM3_256(unsigned char buf[], int len, unsigned char hash[]); diff --git a/engines/sm_standard/sm9/README.md b/engines/sm_standard/sm9/README.md new file mode 100644 index 00000000..7b2bbab9 --- /dev/null +++ b/engines/sm_standard/sm9/README.md @@ -0,0 +1,9 @@ +# About SM standard implementation + +This is only a standard implementation of the SM. + +In the standard implementation, it uses the **MIRACL** library. **MIRACL** (Multiprecision Integer and Rational Arithmetic Crytographic Library) is a C software library. See also [About the MIRACL Crypto SDK](https://libraries.docs.miracl.com/miracl-user-manual/about). + +Also, you can download the source code in the Github. Here is a reference link. [Github MIRACL](https://github.com/miracl/MIRACL). + +What's more, when you want test it and compile locally, you need add *-lm* option to solve some math functions problems like *ceil* in the code. \ No newline at end of file diff --git a/engines/sm_standard/sm9/kdf_standard.h b/engines/sm_standard/sm9/kdf_standard.h new file mode 100644 index 00000000..508226fd --- /dev/null +++ b/engines/sm_standard/sm9/kdf_standard.h @@ -0,0 +1,406 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + +#ifndef HEADER_KDF_STANDARD_H +#define HEADER_KDF_STANDARD_H + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SM3_len 256 +#define SM3_T1 0x79CC4519 +#define SM3_T2 0x7A879D8A +#define SM3_IVA 0x7380166f +#define SM3_IVB 0x4914b2b9 +#define SM3_IVC 0x172442d7 +#define SM3_IVD 0xda8a0600 +#define SM3_IVE 0xa96f30bc +#define SM3_IVF 0x163138aa +#define SM3_IVG 0xe38dee4d +#define SM3_IVH 0xb0fb0e4e + +#define SM2_WORDSIZE 8 +#define SM2_NUMBITS 256 +#define SM2_NUMWORD (SM2_NUMBITS / SM2_WORDSIZE) //32 + +/* Various logical functions */ +#define SM3_p1(x) (x ^ SM3_rotl32(x, 15) ^ SM3_rotl32(x, 23)) +#define SM3_p0(x) (x ^ SM3_rotl32(x, 9) ^ SM3_rotl32(x, 17)) +#define SM3_ff0(a, b, c) (a ^ b ^ c) +#define SM3_ff1(a, b, c) ((a & b) | (a & c) | (b & c)) +#define SM3_gg0(e, f, g) (e ^ f ^ g) +#define SM3_gg1(e, f, g) ((e & f) | ((~e) & g)) +#define SM3_rotl32(x, n) (((x) << n) | ((x) >> (32 - n))) +#define SM3_rotr32(x, n) (((x) >> n) | ((x) << (32 - n))) + + +typedef struct { + unsigned long state[8]; + unsigned long length; + unsigned long curlen; + unsigned char buf[64]; +} SM3_STATE; + + +static void BiToW(unsigned long Bi[], unsigned long W[]); +static void WToW1(unsigned long W[], unsigned long W1[]); +static void CF(unsigned long W[], unsigned long W1[], unsigned long V[]); +static void BigEndian(unsigned char src[], unsigned int bytelen, unsigned char des[]); +static void SM3_init(SM3_STATE *md); +static void SM3_compress(SM3_STATE *md); +static void SM3_process(SM3_STATE *md, unsigned char *buf, int len); +static void SM3_done(SM3_STATE *md, unsigned char hash[]); +static void SM3_256(unsigned char buf[], int len, unsigned char hash[]); +static void SM3_kdf(unsigned char Z[], unsigned short zlen, unsigned short klen, unsigned char K[]); + + +/* calculate W from Bi */ +static void BiToW(unsigned long Bi[], unsigned long W[]) +{ + int i; + unsigned long tmp; + + for(i = 0; i <= 15; i++) + { + W[i] = Bi[i]; + } + for(i = 16;i <= 67; i++) + { + tmp = W[i - 16] ^ W[i - 9] ^ SM3_rotl32(W[i - 3], 15); + W[i] = SM3_p1(tmp) ^ (SM3_rotl32(W[i - 13], 7)) ^ W[i - 6]; + } +} + + +/* calculate W1 from W */ +static void WToW1(unsigned long W[], unsigned long W1[]) +{ + int i; + for(i = 0; i <= 63; i++) + { + W1[i] = W[i] ^ W[i + 4]; + } +} + + +/* calculate the CF compress function and update V */ +static void CF(unsigned long W[], unsigned long W1[], unsigned long V[]) +{ + unsigned long SS1; + unsigned long SS2; + unsigned long TT1; + unsigned long TT2; + unsigned long A, B, C, D, E, F, G, H; + unsigned long T = SM3_T1; + unsigned long FF; + unsigned long GG; + int j; + + //reg init, set ABCDEFGH = V0 + A = V[0]; + B = V[1]; + C = V[2]; + D = V[3]; + E = V[4]; + F = V[5]; + G = V[6]; + H = V[7]; + + for (j = 0; j <= 63; j++) + { + //SS1 + if (j == 0) + { + T = SM3_T1; + } + else if (j == 16) + { + T = SM3_rotl32(SM3_T2, 16); + } + else + { + T = SM3_rotl32(T, 1); + } + SS1 = SM3_rotl32((SM3_rotl32(A, 12) + E + T), 7); + + //SS2 + SS2 = SS1 ^ SM3_rotl32(A, 12); + + //TT1 + if (j <= 15) + { + FF = SM3_ff0(A, B, C); + } + else + { + FF = SM3_ff1(A, B, C); + } + TT1 = FF + D + SS2 + *W1; + W1++; + + //TT2 + if (j <= 15) + { + GG = SM3_gg0(E, F, G); + } + else + { + GG = SM3_gg1(E, F, G); + } + TT2 = GG + H + SS1 + *W; + W++; + + //D + D = C; + + //C + C = SM3_rotl32(B, 9); + + //B + B = A; + + //A + A = TT1; + + //H + H = G; + + //G + G = SM3_rotl32(F, 19); + + //F + F = E; + + //E + E = SM3_p0(TT2); + } + + //update V + V[0] = A ^ V[0]; + V[1] = B ^ V[1]; + V[2] = C ^ V[2]; + V[3] = D ^ V[3]; + V[4] = E ^ V[4]; + V[5] = F ^ V[5]; + V[6] = G ^ V[6]; + V[7] = H ^ V[7]; +} + + +/* unsigned int endian converse. GM/T 0004-2012 requires to use big-endian. + * if CPu uses little-endian, BigEndian function is a necessary + * call to change the little-endian format into big-endian format. + */ +static void BigEndian(unsigned char src[], unsigned int bytelen, unsigned char des[]) +{ + unsigned char tmp = 0; + unsigned long i = 0; + for (i = 0; i < bytelen / 4; i++) + { + tmp = des[4 * i]; + des[4 * i] = src[4 * i + 3]; + src[4 * i + 3] = tmp; + + tmp = des[4 * i + 1]; + des[4 * i + 1] = src[4 * i + 2]; + des[4 * i + 2] = tmp; + } +} + + +/* initiate SM3 state */ +static void SM3_init(SM3_STATE *md) +{ + md->curlen = md->length = 0; + md->state[0] = SM3_IVA; + md->state[1] = SM3_IVB; + md->state[2] = SM3_IVC; + md->state[3] = SM3_IVD; + md->state[4] = SM3_IVE; + md->state[5] = SM3_IVF; + md->state[6] = SM3_IVG; + md->state[7] = SM3_IVH; +} + + +/* compress a single a block of message */ +static void SM3_compress(SM3_STATE *md) +{ + unsigned long W[68]; + unsigned long W1[64]; + + //if CPU uses little-endian, BigEndian function is a necessary call + BigEndian(md->buf, 64, md->buf); + BiToW((unsigned long *)md->buf, W); + WToW1(W, W1); + CF(W, W1, md->state); +} + + +/* compress the first(len/64) blocks of message */ +static void SM3_process(SM3_STATE *md, unsigned char *buf, int len) +{ + while (len--) + { + /* copy byte */ + md->buf[md->curlen] = *buf++; + md->curlen++; + + /* is 64 bytes full? */ + if (md->curlen == 64) + { + SM3_compress(md); + md->length += 512; + md->curlen = 0; + } + } +} + + +/* compress the rest message that the SM3_process has left behind */ +static void SM3_done(SM3_STATE *md, unsigned char hash[]) +{ + int i; + unsigned char tmp = 0; + + /* increase the bit length of the message */ + md->length += md->curlen << 3; + + /* append the '1' bit */ + md->buf[md->curlen] = 0x80; + md->curlen++; + + /* if the length is currently above 56 bytes, appends zeros till + it reaches 64 bytes, compress the current block, creat a new + block by appending zeros and length,and then compress it + */ + if (md->curlen > 56) + { + for (; md->curlen < 64;) + { + md->buf[md->curlen] = 0; + md->curlen++; + } + SM3_compress(md); + md->curlen = 0; + } + + /* if the length is less than 56 bytes, pad upto 56 bytes of zeroes */ + for (; md->curlen < 56;) + { + md->buf[md->curlen] = 0; + md->curlen++; + } + + /* since all messages are under 2^32 bits we mark the top bits zero */ + for (i = 56; i < 60; i++) + { + md->buf[i] = 0; + } + + /* append length */ + md->buf[63] = md->length & 0xff; + md->buf[62] = (md->length >> 8) & 0xff; + md->buf[61] = (md->length >> 16) & 0xff; + md->buf[60] = (md->length >> 24) & 0xff; + + SM3_compress(md); + + /* copy output */ + memcpy(hash, md->state, SM3_len / 8); + BigEndian(hash, SM3_len / 8, hash); //if CPU uses little-endian, BigEndian function is a necessary call +} + + +/* calculate a hash value from a given message */ +static void SM3_256(unsigned char buf[], int len, unsigned char hash[]) +{ + SM3_STATE md; + SM3_init(&md); + SM3_process(&md, buf, len); + SM3_done(&md, hash); +} + + +/* key derivation function */ +static void SM3_kdf(unsigned char Z[], unsigned short zlen, unsigned short klen, unsigned char K[]) +{ + unsigned short i, j, t; + unsigned int bitklen; + SM3_STATE md; + unsigned char Ha[SM2_NUMWORD]; + unsigned char ct[4] = {0, 0, 0, 1}; + + bitklen = klen * 8; + + if (bitklen % SM2_NUMBITS) + t = bitklen / SM2_NUMBITS + 1; + else + t = bitklen / SM2_NUMBITS; + + //s4: K = Ha1 || Ha2 || ... + for (i = 1; i < t; i++) + { + //s2: Hai = Hv(Z || ct) + SM3_init(&md); + SM3_process(&md, Z, zlen); + SM3_process(&md, ct, 4); + SM3_done(&md, Ha); + memcpy((K + SM2_NUMWORD * (i - 1)), Ha, SM2_NUMWORD); + + if (ct[3] == 0xff) + { + ct[3] = 0; + if (ct[2] == 0xff) + { + ct[2] = 0; + if (ct[1] == 0xff) + { + ct[1] = 0; + ct[0]++; + } + else + ct[1]++; + } + else + ct[2]++; + } + else + ct[3]++; + } + + //s3 + SM3_init(&md); + SM3_process(&md, Z, zlen); + SM3_process(&md, ct, 4); + SM3_done(&md, Ha); + + if(bitklen % SM2_NUMBITS) + { + i = (SM2_NUMBITS - bitklen + SM2_NUMBITS * (bitklen / SM2_NUMBITS)) / 8; + j = (bitklen - SM2_NUMBITS * (bitklen / SM2_NUMBITS)) / 8; + memcpy((K + SM2_NUMWORD * (t - 1)), Ha, j); + } + else + { + memcpy((K + SM2_NUMWORD * (t - 1)), Ha, SM2_NUMWORD); + } +} + + +#ifdef __cplusplus +} +# endif +#endif diff --git a/engines/sm_standard/sm9/r-ate.h b/engines/sm_standard/sm9/r-ate.h new file mode 100644 index 00000000..06c06e18 --- /dev/null +++ b/engines/sm_standard/sm9/r-ate.h @@ -0,0 +1,517 @@ +/* ==================================================================== + * Copyright (c) 2007 - 2017 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_R_ATE_H +#define HEADER_R_ATE_H + + +#include "zzn12_operation.h" + + +#ifdef __cplusplus +extern "C"{ +#endif + + +static zzn2 zzn2_pow(zzn2 x, big k) +{ + int i, j, nb, n, nbw, nzs; + big zero; + zzn2 res, u2, t[16]; + + zero = mirvar(0); + + res.a = mirvar(0); + res.b = mirvar(0); + + u2.a = mirvar(0); + u2.b = mirvar(0); + + if(zzn2_iszero(&x)) + { + zzn2_zero(&res); + return res; + } + if(size(k) == 0) + { + zzn2_from_int(1, &res); + return res; + } + if(size(k) == 1) + return x; + + // Prepare table for windowing + zzn2_mul(&x, &x, &u2); + t[0].a = mirvar(0); + t[0].b = mirvar(0); + zzn2_copy(&x, &t[0]); + for(i = 1; i < 16; i++) + { + t[i].a = mirvar(0); + t[i].b = mirvar(0); + zzn2_mul(&t[i - 1], &u2, &t[i]); + } + + // Left to right method - with windows + zzn2_copy(&x, &res); + nb = logb2(k); + if(nb > 1) + for(i = nb - 2; i >= 0;) + { + //Note new parameter of window_size=5. Default to 5, but reduce to 4 (or even 3) to save RAM + n = mr_window(k, i, &nbw, &nzs, 5); + for(j = 0; j < nbw; j++) + zzn2_mul(&res, &res, &res); + if(n > 0) + zzn2_mul(&res, &t[n / 2], &res); + i -= nbw; + if(nzs) + { + for(j = 0; j < nzs; j++) + zzn2_mul(&res, &res, &res); + i -= nzs; + } + } + return res; +} + + +static void set_frobenius_constant(zzn2 *X) +{ + big p, zero, one, two; + p = mirvar(0); + zero = mirvar(0); + one = mirvar(0); + two = mirvar(0); + + convert(0, zero); + convert(1, one); + convert(2, two); + + mip = get_mip(); + copy(mip->modulus, p); + + switch(get_mip()->pmod8) + { + case 5: + zzn2_from_bigs(zero, one, X);// = (sqrt(-2)^(p-1)/2 + break; + case 3: + // = (1+sqrt(-1))^(p-1)/2 + zzn2_from_bigs(one, one, X); + break; + case 7: + zzn2_from_bigs(two, one, X);// = (2+sqrt(-1))^(p-1)/2 + default: + break; + } + + decr(p, 1, p); + subdiv(p, 6, p); + + *X = zzn2_pow(*X, p); +} + + +static void q_power_frobenius(ecn2 A, zzn2 F) +{ + // Fast multiplication of A by q (for Trace-Zero group members only) + zzn2 x, y, z, w, r; + x.a = mirvar(0); + x.b = mirvar(0); + + y.a = mirvar(0); + y.b = mirvar(0); + + z.a = mirvar(0); + z.b = mirvar(0); + + w.a = mirvar(0); + w.b = mirvar(0); + + r.a = mirvar(0); + r.b = mirvar(0); + + ecn2_get(&A, &x, &y, &z); + zzn2_copy(&F, &r);//r=F + if(get_mip()->TWIST == MR_SEXTIC_M) + zzn2_inv(&r); // could be precalculated + zzn2_mul(&r, &r, &w);//w=r*r + zzn2_conj(&x, &x); + zzn2_mul(&w, &x, &x); + zzn2_conj(&y, &y); + zzn2_mul(&w, &r, &w); + zzn2_mul(&w, &y, &y); + zzn2_conj(&z, &z); + ecn2_setxyz(&x, &y, &z, &A); +} + + +static zzn12 line(ecn2 A, ecn2 *C, ecn2 *B, zzn2 slope, zzn2 extra, BOOL Doubling, big Qx, big Qy) +{ + zzn12 res; + zzn2 X, Y, Z, Z2, U, QY, CZ; + big QX; + + QX = mirvar(0); + X.a = mirvar(0); + X.b = mirvar(0); + + Y.a = mirvar(0); + Y.b = mirvar(0); + + Z.a = mirvar(0); + Z.b = mirvar(0); + + Z2.a = mirvar(0); + Z2.b = mirvar(0); + + U.a = mirvar(0); + U.b = mirvar(0); + + QY.a = mirvar(0); + QY.b = mirvar(0); + + CZ.a = mirvar(0); + CZ.b = mirvar(0); + zzn12_init(&res); + + ecn2_getz(C, &CZ); + // Thanks to A. Menezes for pointing out this optimization... + if(Doubling) + { + ecn2_get(&A, &X, &Y, &Z); + zzn2_mul(&Z, &Z, &Z2); //Z2=Z*Z + + //X=slope*X-extra + zzn2_mul(&slope, &X, &X); + zzn2_sub(&X, &extra, &X); + + zzn2_mul(&CZ, &Z2, &U); + + //(-(Z*Z*slope)*Qx); + nres(Qx, QX); + zzn2_mul(&Z2, &slope, &Y); + zzn2_smul(&Y, QX, &Y); + zzn2_negate(&Y, &Y); + + if(get_mip()->TWIST == MR_SEXTIC_M) + { + // "multiplied across" by i to simplify + zzn2_from_big(Qy, &QY); + zzn2_txx(&QY); + zzn2_mul(&U, &QY, &QY); + zzn4_from_zzn2s(&QY, &X, &res.a); + zzn2_copy(&Y, &(res.c.b)); + } + if(get_mip()->TWIST == MR_SEXTIC_D) + { + zzn2_smul(&U, Qy, &QY); + zzn4_from_zzn2s(&QY, &X, &res.a); + zzn2_copy(&Y, &(res.b.b)); + } + } + else + { + //slope*X-Y*Z + ecn2_getxy(B, &X, &Y); + zzn2_mul(&slope, &X, &X); + zzn2_mul(&Y, &CZ, &Y); + zzn2_sub(&X, &Y, &X); + + //(-slope*Qx) + nres(Qx, QX); + zzn2_smul(&slope, QX, &Z); + zzn2_negate(&Z, &Z); + + if(get_mip()->TWIST == MR_SEXTIC_M) + { + zzn2_from_big(Qy, &QY); + zzn2_txx(&QY); + zzn2_mul(&CZ, &QY, &QY); + + zzn4_from_zzn2s(&QY, &X, &res.a); + zzn2_copy(&Z, &(res.c.b)); + } + if(get_mip()->TWIST == MR_SEXTIC_D) + { + zzn2_smul(&CZ, Qy, &QY); + zzn4_from_zzn2s(&QY, &X, &res.a); + zzn2_copy(&Z, &(res.b.b)); + } + } + return res; +} + + +static zzn12 g(ecn2 *A, ecn2 *B, big Qx, big Qy) +{ + zzn2 lam, extra; + BOOL Doubling; + ecn2 P; + zzn12 res; + + lam.a = mirvar(0); + lam.b = mirvar(0); + + extra.a = mirvar(0); + extra.b = mirvar(0); + + P.x.a = mirvar(0); + P.x.b = mirvar(0); + + P.y.a = mirvar(0); + P.y.b = mirvar(0); + + P.z.a = mirvar(0); + P.z.b = mirvar(0); + + P.marker = MR_EPOINT_INFINITY; + + zzn12_init(&res); + ecn2_copy(A, &P); + Doubling = ecn2_add2(B, A, &lam, &extra); + if(A->marker == MR_EPOINT_INFINITY) + { + zzn4_from_int(1, &res.a); + res.miller = FALSE; + res.unitary = TRUE; + } + else + res = line(P, A, B, lam, extra, Doubling, Qx, Qy); + return res; +} + + +static BOOL fast_pairing(ecn2 P, big Qx, big Qy, big x, zzn2 X, zzn12 *r) +{ + int i, nb; + big n, zero, negify_x; + ecn2 A, KA; + zzn12 t0, x0, x1, x2, x3, x4, x5, res; + + zero = mirvar(0); + n = mirvar(0); + negify_x = mirvar(0); + + A.x.a = mirvar(0); + A.x.b = mirvar(0); + + A.y.a = mirvar(0); + A.y.b = mirvar(0); + + A.z.a = mirvar(0); + A.z.b = mirvar(0); + A.marker = MR_EPOINT_INFINITY; + + KA.x.a = mirvar(0); + KA.x.b = mirvar(0); + + KA.y.a = mirvar(0); + KA.y.b = mirvar(0); + + KA.z.a = mirvar(0); + KA.z.b = mirvar(0); + KA.marker = MR_EPOINT_INFINITY; + zzn12_init(&t0); + zzn12_init(&x0); + zzn12_init(&x1); + zzn12_init(&x2); + zzn12_init(&x3); + zzn12_init(&x4); + zzn12_init(&x5); + zzn12_init(&res); + + premult(x, 6, n); + incr(n, 2, n);//n=(6*x+2); + if(mr_compare(x, zero) < 0) //x<0 + negify(n, n); //n=-(6*x+2); + + ecn2_copy(&P, &A); + nb = logb2(n); + zzn4_from_int(1, &res.a); + res.unitary = TRUE; //res=1 + // Short Miller loop + res.miller = TRUE; + + for(i = nb - 2; i >= 0; i--) + { + zzn12_mul(res, res, &res); + zzn12_mul(res, g(&A, &A, Qx, Qy), &res); + if(mr_testbit(n, i)) + zzn12_mul(res, g(&A, &P, Qx, Qy), &res); + } + // Combining ideas due to Longa, Aranha et al. and Naehrig + ecn2_copy(&P, &KA); + q_power_frobenius(KA, X); + if(mr_compare(x, zero) < 0) + { + ecn2_negate(&A, &A); + zzn12_conj(&res, &res); + } + zzn12_mul(res, g(&A, &KA, Qx, Qy), &res); + q_power_frobenius(KA, X); + ecn2_negate(&KA, &KA); + zzn12_mul(res, g(&A, &KA, Qx, Qy), &res); + + if(zzn4_iszero(&res.a) && zzn4_iszero(&res.b) && zzn4_iszero(&res.c)) + return FALSE; + + // The final exponentiation + zzn12_copy(&res, &t0);//t0=r; + zzn12_conj(&res, &res); + zzn12_div(res, t0, &res); + + res.miller = FALSE; + res.unitary = FALSE; + + zzn12_copy(&res, &t0);//t0=r; + zzn12_powq(X, &res); + zzn12_powq(X, &res); + zzn12_mul(res, t0, &res);// r^[(p^6-1)*(p^2+1)] + res.miller = FALSE; + res.unitary = TRUE; + + // Newer new idea... + // See "On the final exponentiation for calculating pairings on ordinary elliptic curves" + // Michael Scott and Naomi Benger and Manuel Charlemagne and Luis J. Dominguez Perez and Ezekiel J. Kachisa + zzn12_copy(&res, &t0); + zzn12_powq(X, &t0); + zzn12_copy(&t0, &x0); + zzn12_powq(X, &x0); //x0=t0 + + zzn12_mul(res, t0, &x1); + zzn12_mul(x0, x1, &x0);// x0*=(res*t0); + zzn12_powq(X, &x0); + + x1 = zzn12_inverse(res);// just a conjugation! + negify(x, negify_x); + x4 = zzn12_pow(res, negify_x);//negify_x=-x x is sparse. + zzn12_copy(&x4, &x3); + zzn12_powq(X, &x3); + + x2 = zzn12_pow(x4, negify_x); + x5 = zzn12_inverse(x2); + t0 = zzn12_pow(x2, negify_x); + + zzn12_powq(X, &x2); + zzn12_div(x4, x2, &x4); + + zzn12_powq(X, &x2); + zzn12_copy(&t0, &res);// res=t0 + zzn12_powq(X, &res); + zzn12_mul(t0, res, &t0); + + zzn12_mul(t0, t0, &t0); + zzn12_mul(t0, x4, &t0); + zzn12_mul(t0, x5, &t0);//t0*=t0;t0*=x4;t0*=x5; + + zzn12_mul(x3, x5, &res); + zzn12_mul(res, t0, &res);//res=x3*x5;res*=t0; + + zzn12_mul(t0, x2, &t0);//t0*=x2; + + zzn12_mul(res, res, &res); + zzn12_mul(res, t0, &res); + zzn12_mul(res, res, &res);//res*=res; res*=t0;res*=res; + + zzn12_mul(res, x1, &t0);// t0=res*x1; + zzn12_mul(res, x0, &res);//res*=x0; + + zzn12_mul(t0, t0, &t0); + zzn12_mul(t0, res, &t0);//t0*=t0;t0*=res; + + zzn12_copy(&t0, r);//r= t0; + + return TRUE; +} + + +static BOOL ecap(ecn2 P, epoint *Q, big x, zzn2 X, zzn12 *r) +{ + BOOL Ok; + big Qx, Qy; + Qx = mirvar(0); + Qy = mirvar(0); + + ecn2_norm(&P); + epoint_get(Q, Qx, Qy); + + Ok = fast_pairing(P, Qx, Qy, x, X, r); + + if(Ok) + return TRUE; + return FALSE; +} + + +static BOOL member(zzn12 r, big x, zzn2 F) +{ + zzn12 w; + big six; + six = mirvar(0); + zzn12_init(&w); + + convert(6, six); + zzn12_copy(&r, &w);//w=r + zzn12_powq(F, &w); + r = zzn12_pow(r, x); + r = zzn12_pow(r, x); + r = zzn12_pow(r, six); // t-1=6x^2 + if(zzn4_compare(&w.a, &r.a) && zzn4_compare(&w.a, &r.a) && zzn4_compare(&w.a, &r.a)) + return TRUE; + return FALSE; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/engines/sm_standard/sm9/sm4_standard.h b/engines/sm_standard/sm9/sm4_standard.h new file mode 100644 index 00000000..3f47a337 --- /dev/null +++ b/engines/sm_standard/sm9/sm4_standard.h @@ -0,0 +1,188 @@ +/* ==================================================================== + * Copyright (c) 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_SM4_STANDARD_H +#define HEADER_SM4_STANDARD_H + + +#include + +#ifdef __cplusplus +extern "C"{ +#endif + + +//rotate n bits to the left in a 32bit buffer +#define SM4_rotl32(buf, n) (((buf) << n) | ((buf) >> (32 - n))) + + +static unsigned int SM4_CK[32] = {0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, + 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, + 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, + 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, + 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, + 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279}; +unsigned char SM4_Sbox[256] = {0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, + 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, + 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, + 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, + 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, + 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, + 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, + 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, + 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, + 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, + 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, + 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, + 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, + 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, + 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, + 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48}; +static unsigned int SM4_FK[4] = {0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC}; + + +void SM4_keyschedule(unsigned char MK[], unsigned int rk[]) +{ + unsigned int tmp, buf, K[36]; + int i; + for(i = 0; i < 4; i++) + { + K[i] = SM4_FK[i] ^ ((MK[4 * i] << 24) | (MK[4 * i + 1] << 16) + | (MK[4 * i + 2] << 8) | (MK[4 * i + 3])); + } + for(i = 0; i < 32; i++) + { + tmp = K[i + 1] ^ K[i + 2] ^ K[i + 3] ^ SM4_CK[i]; + + //nonlinear operation + buf = (SM4_Sbox[(tmp >> 24) & 0xFF]) << 24 + | (SM4_Sbox[(tmp >> 16) & 0xFF]) << 16 + | (SM4_Sbox[(tmp >> 8) & 0xFF]) << 8 + | (SM4_Sbox[tmp & 0xFF]); + + //linear operation + K[i + 4] = K[i] ^ ((buf) ^ (SM4_rotl32((buf), 13)) ^ (SM4_rotl32((buf), 23))); + rk[i] = K[i + 4]; + } +} + + +void SM4_encrypt(unsigned char MK[], unsigned char PlainText[], unsigned char CipherText[]) +{ + unsigned int rk[32], X[36], tmp, buf; + int i, j; + SM4_keyschedule(MK, rk); + for(j = 0; j < 4; j++) + { + X[j] = (PlainText[j * 4] << 24) | (PlainText[j * 4 + 1] << 16) + | (PlainText[j * 4 + 2] << 8) | (PlainText[j * 4 + 3]); + } + for(i = 0; i < 32; i++) + { + tmp = X[i + 1] ^ X[i + 2] ^ X[i + 3] ^ rk[i]; + + //nonlinear operation + buf = (SM4_Sbox[(tmp >> 24) & 0xFF]) << 24 + | (SM4_Sbox[(tmp >> 16) & 0xFF]) << 16 + | (SM4_Sbox[(tmp >> 8) & 0xFF]) << 8 + | (SM4_Sbox[tmp & 0xFF]); + + //linear operation + X[i + 4] = X[i] ^ (buf ^ SM4_rotl32((buf), 2) ^ SM4_rotl32((buf), 10) + ^ SM4_rotl32((buf), 18) ^ SM4_rotl32((buf), 24)); + } + for(j = 0; j < 4; j++) + { + CipherText[4 * j] = (X[35 - j] >> 24) & 0xFF; + CipherText[4 * j + 1] = (X[35 - j] >> 16) & 0xFF; + CipherText[4 * j + 2]= (X[35 - j] >> 8) & 0xFF; + CipherText[4 * j + 3] = (X[35 - j]) & 0xFF; + } +} + + +void SM4_decrypt(unsigned char MK[], unsigned char CipherText[], unsigned char PlainText[]) +{ + unsigned int rk[32], X[36], tmp, buf; + int i, j; + SM4_keyschedule(MK, rk); + for(j = 0; j < 4; j++) + { + X[j] = (CipherText[j * 4] << 24) | (CipherText[j * 4 + 1] << 16) | + (CipherText[j * 4 + 2] << 8) | (CipherText[j * 4 + 3]); + } + for(i = 0; i < 32; i++) + { + tmp = X[i + 1] ^ X[i + 2] ^ X[i + 3] ^ rk[31 - i]; + //nonlinear operation + buf = (SM4_Sbox[(tmp >> 24) & 0xFF]) << 24 + | (SM4_Sbox[(tmp >> 16) & 0xFF]) << 16 + | (SM4_Sbox[(tmp >> 8) & 0xFF]) << 8 + | (SM4_Sbox[tmp & 0xFF]); + //linear operation + X[i + 4] = X[i] ^ (buf ^ SM4_rotl32((buf), 2) ^ SM4_rotl32((buf), 10) + ^ SM4_rotl32((buf), 18) ^ SM4_rotl32((buf), 24)); + } + for(j = 0; j < 4; j++) + { + PlainText[4 * j] = (X[35 - j] >> 24) & 0xFF; + PlainText[4 * j + 1] = (X[35 - j] >> 16) & 0xFF; + PlainText[4 * j + 2] = (X[35 - j] >> 8) & 0xFF; + PlainText[4 * j + 3] = (X[35 - j]) & 0xFF; + } +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/engines/sm_standard/sm9/sm9_standard.h b/engines/sm_standard/sm9/sm9_standard.h new file mode 100644 index 00000000..5b9f3c37 --- /dev/null +++ b/engines/sm_standard/sm9/sm9_standard.h @@ -0,0 +1,482 @@ +/* ==================================================================== + * Copyright (c) 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_SM9_STANDARD_H +#define HEADER_SM9_STANDARD_H + + +#include +#include +#include + + +#ifdef __cplusplus +extern "C"{ +#endif + +#include "miracl.h" +#include "r-ate.h" +#include "kdf_standard.h" + + +#define BNLEN 32 //BN curve with 256bit is used in SM9 algorithm +#define SM9_ASK_MEMORY_ERR 0x00000001 //ask for memory fail(申请内存失败) +#define SM9_MEMBER_ERR 0x00000002 //the order of group G error(群的阶错误) +#define SM9_MY_ECAP_12A_ERR 0x00000003 //R-ate pairing generated error(R-ate对计算出现错误) +#define SM9_NOT_VALID_G1 0x00000004 //not valid element of G1 +#define SM9_G1BASEPOINT_SET_ERR 0x00000005 //base point of G1 seted error(G1基点设置错误) +#define SM9_G2BASEPOINT_SET_ERR 0x00000006 //base point of G2 seted error(G2基点设置错误) +#define SM9_GEPUB_ERR 0x00000007 //pubkey error(生成公钥错误) +#define SM9_GEPRI_ERR 0x00000008 //privare key error(生成私钥错误) +#define SM9_ERR_CMP_S1SB 0x00000009 //S1!=SB +#define SM9_ERR_CMP_S2SA 0x0000000A //S2!=SA +#define SM9_ERR_RA 0x0000000B //RA error +#define SM9_ERR_RB 0x0000000C //RB error +#define SM9_ERR_SA 0x0000000D //SA error +#define SM9_ERR_SB 0x0000000E //SB error +#define SM9_C1_NOT_VALID_G1 0x0000000F //C1不属于群G1 +#define SM9_ENCRYPT_ERR 0x00000010 //加密错误 +#define SM9_ERR_K1_ZERO 0x00000011 //K1 equals 0(K1全0) +#define SM9_C3_MEMCMP_ERR 0x00000012 //C3对比不一致 +#define SM9_DECRYPT_ERR 0x00000013 //解密错误 +#define SM9_ERR_Encap_C 0x00000014 //cipher error in key encapsulation +#define SM9_ERR_Encap_K 0x00000015 //key to be encapsulated +#define SM9_ERR_Decap_K 0x00000016 //key generated by decapsulation +#define SM9_H_OUTRANGE 0x00000017 //签名H不属于[1,N-1] +#define SM9_DATA_MEMCMP_ERR 0x00000018 //数据对比不一致 +#define SM9_S_NOT_VALID_G1 0x00000019 //S不属于群G1 +#define SM9_L_error 0x0000001A //参数L错误 +#define SM9_SIGN_ERR 0x0000001B //签名错误 + + +static unsigned char SM9_q[32] = {0xB6, 0x40, 0x00, 0x00, 0x02, 0xA3, 0xA6, 0xF1, 0xD6, 0x03, 0xAB, 0x4F, 0xF5, 0x8E, 0xC7, 0x45, + 0x21, 0xF2, 0x93, 0x4B, 0x1A, 0x7A, 0xEE, 0xDB, 0xE5, 0x6F, 0x9B, 0x27, 0xE3, 0x51, 0x45, 0x7D}; +static unsigned char SM9_N[32] = {0xB6, 0x40, 0x00, 0x00, 0x02, 0xA3, 0xA6, 0xF1, 0xD6, 0x03, 0xAB, 0x4F, 0xF5, 0x8E, 0xC7, 0x44, + 0x49, 0xF2, 0x93, 0x4B, 0x18, 0xEA, 0x8B, 0xEE, 0xE5, 0x6E, 0xE1, 0x9C, 0xD6, 0x9E, 0xCF, 0x25}; +static unsigned char SM9_P1x[32] = {0x93, 0xDE, 0x05, 0x1D, 0x62, 0xBF, 0x71, 0x8F, 0xF5, 0xED, 0x07, 0x04, 0x48, 0x7D, 0x01, 0xD6, + 0xE1, 0xE4, 0x08, 0x69, 0x09, 0xDC, 0x32, 0x80, 0xE8, 0xC4, 0xE4, 0x81, 0x7C, 0x66, 0xDD, 0xDD}; +static unsigned char SM9_P1y[32] = {0x21, 0xFE, 0x8D, 0xDA, 0x4F, 0x21, 0xE6, 0x07, 0x63, 0x10, 0x65, 0x12, 0x5C, 0x39, 0x5B, 0xBC, + 0x1C, 0x1C, 0x00, 0xCB, 0xFA, 0x60, 0x24, 0x35, 0x0C, 0x46, 0x4C, 0xD7, 0x0A, 0x3E, 0xA6, 0x16}; +static unsigned char SM9_P2[128] = {0x85, 0xAE, 0xF3, 0xD0, 0x78, 0x64, 0x0C, 0x98, 0x59, 0x7B, 0x60, 0x27, 0xB4, 0x41, 0xA0, 0x1F, + 0xF1, 0xDD, 0x2C, 0x19, 0x0F, 0x5E, 0x93, 0xC4, 0x54, 0x80, 0x6C, 0x11, 0xD8, 0x80, 0x61, 0x41, + 0x37, 0x22, 0x75, 0x52, 0x92, 0x13, 0x0B, 0x08, 0xD2, 0xAA, 0xB9, 0x7F, 0xD3, 0x4E, 0xC1, 0x20, + 0xEE, 0x26, 0x59, 0x48, 0xD1, 0x9C, 0x17, 0xAB, 0xF9, 0xB7, 0x21, 0x3B, 0xAF, 0x82, 0xD6, 0x5B, + 0x17, 0x50, 0x9B, 0x09, 0x2E, 0x84, 0x5C, 0x12, 0x66, 0xBA, 0x0D, 0x26, 0x2C, 0xBE, 0xE6, 0xED, + 0x07, 0x36, 0xA9, 0x6F, 0xA3, 0x47, 0xC8, 0xBD, 0x85, 0x6D, 0xC7, 0x6B, 0x84, 0xEB, 0xEB, 0x96, + 0xA7, 0xCF, 0x28, 0xD5, 0x19, 0xBE, 0x3D, 0xA6, 0x5F, 0x31, 0x70, 0x15, 0x3D, 0x27, 0x8F, 0xF2, + 0x47, 0xEF, 0xBA, 0x98, 0xA7, 0x1A, 0x08, 0x11, 0x62, 0x15, 0xBB, 0xA5, 0xC9, 0x99, 0xA7, 0xC7}; +static unsigned char SM9_t[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00,0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x58, 0xF9, 0x8A}; +static unsigned char SM9_a[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static unsigned char SM9_b[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05}; +epoint *P1; +ecn2 P2; +big N; //order of group, N(t) +big para_a, para_b, para_t, para_q; + + +static BOOL bytes128_to_ecn2(unsigned char Ppubs[], ecn2 *res); +static void zzn12_ElementPrint(zzn12 x); +static void ecn2_Bytes128_Print(ecn2 x); +static void LinkCharZzn12(unsigned char *message, int len, zzn12 w, unsigned char *Z, int Zlen); +static int Test_Point(epoint* point); +void SM4_standard_block_encrypt(unsigned char key[], unsigned char * message, int mlen, unsigned char *cipher, int * cipher_len); +void SM4_standard_block_decrypt(unsigned char key[], unsigned char *cipher, int len, unsigned char *plain, int *plain_len); +int SM9_standard_keyex_kdf(unsigned char *IDA, unsigned char *IDB, epoint *RA, epoint *RB, zzn12 g1, zzn12 g2, zzn12 g3, int klen, unsigned char K[]); +int SM9_standard_keyex_hash(unsigned char hashid[], unsigned char *IDA, unsigned char *IDB, epoint *RA, epoint *RB, zzn12 g1, zzn12 g2, zzn12 g3, unsigned char hash[]); +static int SM9_standard_h1(unsigned char Z[], int Zlen, big n, big h1); +int SM9_standard_enc_mac(unsigned char *K, int Klen, unsigned char *M, int Mlen, unsigned char C[]); +static int SM9_standard_init(); +static int SM9_standard_generateencryptkey(unsigned char hid[], unsigned char *ID, int IDlen, big ke, unsigned char Ppubs[], unsigned char deB[]); +int SM9_standard_keyex_inita_i(unsigned char hid[], unsigned char *IDB, unsigned char randA[], + unsigned char Ppub[], unsigned char deA[], epoint *RA); +int SM9_standard_keyex_reb_i(unsigned char hid[], unsigned char *IDA, unsigned char *IDB, unsigned char randB[], unsigned char Ppub[], unsigned char deB[], epoint *RA, epoint *RB, unsigned char SB[], zzn12 *g1, zzn12 *g2, zzn12 *g3); +int SM9_standard_keyex_inita_ii(unsigned char *IDA, unsigned char *IDB, unsigned char randA[], unsigned char Ppub[], unsigned char deA[], epoint *RA, epoint *RB, unsigned char SB[], unsigned char SA[]); +int SM9_standard_keyex_reb_ii(unsigned char *IDA, unsigned char *IDB, zzn12 g1, zzn12 g2, zzn12 g3, epoint *RA, epoint *RB, unsigned char SA[]); +int SM9_standard_exch_selfcheck(); +int SM9_standard_enc_selfcheck(); +int SM9_standard_encrypt(unsigned char hid[], unsigned char *IDB, unsigned char *message, int mlen, unsigned char rand[], + int EncID, int k1_len, int k2_len, unsigned char Ppub[], unsigned char C[], int *C_len); +int SM9_standard_decrypt(unsigned char C[], int C_len, unsigned char deB[], unsigned char *IDB, int EncID, + int k1_len, int k2_len, unsigned char M[], int * Mlen); +int SM9_standard_key_encap(unsigned char hid[], unsigned char *IDB, unsigned char rand[], unsigned char Ppub[], unsigned char C[], unsigned char K[], int Klen); +int SM9_standard_key_decap(unsigned char *IDB, unsigned char deB[], unsigned char C[], int Klen, unsigned char K[]); +int SM9_standard_encap_selfcheck(); +static int Test_Range(big x); +int SM9_standard_h2(unsigned char Z[], int Zlen, big n, big h2); +int SM9_standard_generatesignkey(unsigned char hid[], unsigned char *ID, int IDlen, big ks, unsigned char Ppubs[], unsigned char dsa[]); +int SM9_standard_sign(unsigned char hid[], unsigned char *IDA, unsigned char *message, int len, unsigned char rand[], unsigned char dsa[], unsigned char Ppub[], unsigned char H[], unsigned char S[]); +int SM9_standard_verify(unsigned char H[], unsigned char S[], unsigned char hid[], unsigned char *IDA, unsigned char *message, int len, unsigned char Ppub[]); +int SM9_standard_sv_selfcheck(); + + + +static BOOL bytes128_to_ecn2(unsigned char Ppubs[], ecn2 *res) +{ + zzn2 x, y; + big a, b; + ecn2 r; + r.x.a = mirvar(0); + r.x.b = mirvar(0); + + r.y.a = mirvar(0); + r.y.b = mirvar(0); + + r.z.a = mirvar(0); + r.z.b = mirvar(0); + r.marker = MR_EPOINT_INFINITY; + + x.a = mirvar(0); + x.b = mirvar(0); + + y.a = mirvar(0); + y.b = mirvar(0); + a = mirvar(0); + b = mirvar(0); + + bytes_to_big(BNLEN, Ppubs, b); + bytes_to_big(BNLEN, Ppubs + BNLEN, a); + zzn2_from_bigs(a, b, &x); + bytes_to_big(BNLEN, Ppubs + BNLEN * 2, b); + bytes_to_big(BNLEN, Ppubs + BNLEN * 3, a); + zzn2_from_bigs(a, b, &y); + + return ecn2_set(&x, &y, res); +} + + +static void ecn2_Bytes128_Print(ecn2 x) +{ + big tmp; + tmp = mirvar(0); + redc(x.x.b, tmp); + cotnum(tmp, stdout); + redc(x.x.a, tmp); + cotnum(tmp, stdout); + redc(x.y.b, tmp); + cotnum(tmp, stdout); + redc(x.y.a, tmp); + cotnum(tmp, stdout); +} + + +static void zzn12_ElementPrint(zzn12 x) +{ + big tmp; + tmp = mirvar(0); + redc(x.c.b.b, tmp); + cotnum(tmp, stdout); + redc(x.c.b.a, tmp); + cotnum(tmp, stdout); + redc(x.c.a.b, tmp); + cotnum(tmp, stdout); + redc(x.c.a.a, tmp); + cotnum(tmp,stdout); + redc(x.b.b.b, tmp); + cotnum(tmp, stdout); + redc(x.b.b.a, tmp); + cotnum(tmp, stdout); + redc(x.b.a.b, tmp); + cotnum(tmp, stdout); + redc(x.b.a.a, tmp); + cotnum(tmp, stdout); + redc(x.a.b.b, tmp); + cotnum(tmp, stdout); + redc(x.a.b.a, tmp); + cotnum(tmp, stdout); + redc(x.a.a.b, tmp); + cotnum(tmp, stdout); + redc(x.a.a.a, tmp); + cotnum(tmp, stdout); +} + + +static void LinkCharZzn12(unsigned char *message, int len, zzn12 w, unsigned char *Z, int Zlen) +{ + big tmp; + + tmp = mirvar(0); + + memcpy(Z, message, len); + redc(w.c.b.b, tmp); + big_to_bytes(BNLEN, tmp, Z + len, 1); + redc(w.c.b.a, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN, 1); + redc(w.c.a.b, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 2, 1); + redc(w.c.a.a, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 3, 1); + redc(w.b.b.b, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 4, 1); + redc(w.b.b.a, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 5, 1); + redc(w.b.a.b, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 6, 1); + redc(w.b.a.a, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 7, 1); + redc(w.a.b.b, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 8, 1); + redc(w.a.b.a, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 9, 1); + redc(w.a.a.b, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 10, 1); + redc(w.a.a.a, tmp); + big_to_bytes(BNLEN, tmp, Z + len + BNLEN * 11, 1); +} + + +static int Test_Point(epoint* point) +{ + big x, y, x_3, tmp; + epoint *buf; + + x = mirvar(0); + y = mirvar(0); + x_3 = mirvar(0); + tmp = mirvar(0); + buf = epoint_init(); + + //test if y^2=x^3+b + epoint_get(point, x, y); + power(x, 3, para_q, x_3); //x_3=x^3 mod p + multiply(x, para_a, x); + divide(x, para_q, tmp); + add(x_3, x, x); //x=x^3+ax+b + add(x, para_b, x); + divide(x, para_q, tmp); //x=x^3+ax+b mod p + power(y, 2, para_q, y); //y=y^2 mod p + if(mr_compare(x, y) != 0) + return 1; + + //test infinity + ecurve_mult(N, point, buf); + if(point_at_infinity(buf) == FALSE) + return 1; + + return 0; +} + + +static int SM9_standard_h1(unsigned char Z[], int Zlen, big n, big h1) +{ + int hlen, i, ZHlen; + big hh, i256, tmp, n1; + unsigned char *ZH = NULL,*ha = NULL; + + hh = mirvar(0); + i256 = mirvar(0); + tmp = mirvar(0); + n1 = mirvar(0); + convert(1, i256); + ZHlen = Zlen + 1; + + hlen = (int)ceil((5.0 * logb2(n)) / 32.0); + decr(n, 1, n1); + ZH = (char *)malloc(sizeof(char)*(ZHlen + 1)); + if(ZH == NULL) + return SM9_ASK_MEMORY_ERR; + memcpy(ZH + 1, Z, Zlen); + ZH[0] = 0x01; + ha = (char *)malloc(sizeof(char)*(hlen + 1)); + if(ha == NULL) + return SM9_ASK_MEMORY_ERR; + SM3_kdf(ZH, ZHlen, hlen, ha); + + for(i = hlen - 1; i >= 0; i--)//key[从大到小] + { + premult(i256, ha[i], tmp); + add(hh, tmp, hh); + premult(i256, 256, i256); + divide(i256, n1, tmp); + divide(hh, n1, tmp); + } + incr(hh, 1, h1); + free(ZH); + free(ha); + return 0; +} + + +static int SM9_standard_init() +{ + big P1_x, P1_y; + + para_q = mirvar(0); + N = mirvar(0); + P1_x = mirvar(0); + P1_y = mirvar(0); + para_a = mirvar(0); + para_b = mirvar(0); + para_t = mirvar(0); + X.a = mirvar(0); + X.b = mirvar(0); + P2.x.a = mirvar(0); + P2.x.b = mirvar(0); + P2.y.a = mirvar(0); + P2.y.b = mirvar(0); + P2.z.a = mirvar(0); + P2.z.b = mirvar(0); + P2.marker = MR_EPOINT_INFINITY; + + P1 = epoint_init(); + bytes_to_big(BNLEN, SM9_q, para_q); + bytes_to_big(BNLEN, SM9_P1x, P1_x); + bytes_to_big(BNLEN, SM9_P1y, P1_y); + bytes_to_big(BNLEN, SM9_a, para_a); + bytes_to_big(BNLEN, SM9_b, para_b); + bytes_to_big(BNLEN, SM9_N, N); + bytes_to_big(BNLEN, SM9_t, para_t); + + mip->TWIST = MR_SEXTIC_M; + ecurve_init(para_a, para_b, para_q, MR_PROJECTIVE); //Initialises GF(q) elliptic curve + //MR_PROJECTIVE specifying projective coordinates + if(!epoint_set(P1_x, P1_y, 0, P1)) + return SM9_G1BASEPOINT_SET_ERR; + + if(!(bytes128_to_ecn2(SM9_P2, &P2))) + return SM9_G2BASEPOINT_SET_ERR; + set_frobenius_constant(&X); + + return 0; +} + + +static int SM9_standard_generateencryptkey(unsigned char hid[], unsigned char *ID, int IDlen, big ke, unsigned char Ppubs[], unsigned char deB[]) +{ + big h1, t1, t2, rem, xPpub, yPpub, tmp; + unsigned char *Z = NULL; + int Zlen = IDlen + 1, buf; + ecn2 dEB; + epoint *Ppub; + + h1 = mirvar(0); + t1 = mirvar(0); + t2 = mirvar(0); + rem = mirvar(0); + tmp = mirvar(0); + xPpub = mirvar(0); + yPpub = mirvar(0); + Ppub = epoint_init(); + dEB.x.a = mirvar(0); + dEB.x.b = mirvar(0); + dEB.y.a = mirvar(0); + dEB.y.b = mirvar(0); + dEB.z.a = mirvar(0); + dEB.z.b = mirvar(0); + dEB.marker = MR_EPOINT_INFINITY; + + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + memcpy(Z, ID, IDlen); + memcpy(Z + IDlen, hid, 1); + + buf = SM9_standard_h1(Z, Zlen, N, h1); + if(buf != 0) + return buf; + add(h1, ke, t1);//t1=H1(IDA||hid,N)+ks + xgcd(t1, N, t1, t1, t1);//t1=t1(-1) + multiply(ke, t1, t2); + divide(t2, N, rem);//t2=ks*t1(-1) + + //Ppub=[ke]P2 + ecurve_mult(ke, P1, Ppub); + + //deB=[t2]P2 + ecn2_copy(&P2, &dEB); + ecn2_mul(t2, &dEB); + + printf("\n**************The private key deB = (xdeB, ydeB):*********************\n"); + ecn2_Bytes128_Print(dEB); + printf("\n**********************PublicKey Ppubs=[ke]P1:*************************\n"); + epoint_get(Ppub, xPpub, yPpub); + cotnum(xPpub, stdout); + cotnum(yPpub, stdout); + + epoint_get(Ppub, xPpub, yPpub); + big_to_bytes(BNLEN, xPpub, Ppubs, 1); + big_to_bytes(BNLEN, yPpub, Ppubs + BNLEN, 1); + + redc(dEB.x.b, tmp); + big_to_bytes(BNLEN, tmp, deB, 1); + redc(dEB.x.a, tmp); + big_to_bytes(BNLEN, tmp, deB + BNLEN, 1); + redc(dEB.y.b, tmp); + big_to_bytes(BNLEN, tmp, deB + BNLEN * 2, 1); + redc(dEB.y.a, tmp); + big_to_bytes(BNLEN, tmp, deB + BNLEN * 3, 1); + + free(Z); + return 0; +} + + +static int Test_Range(big x) +{ + big one, decr_n; + + one = mirvar(0); + decr_n = mirvar(0); + + convert(1, one); + decr(N, 1, decr_n); + + if((mr_compare(x, one) < 0) | (mr_compare(x, decr_n) > 0)) + return 1; + + return 0; +} + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/engines/sm_standard/sm9/sm9_standard_enc.c b/engines/sm_standard/sm9/sm9_standard_enc.c new file mode 100644 index 00000000..474fcc49 --- /dev/null +++ b/engines/sm_standard/sm9/sm9_standard_enc.c @@ -0,0 +1,477 @@ +/* ==================================================================== + * Copyright (c) 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 "sm9_standard.h" +#include "sm4_standard.h" +#include "miracl.h" +#include "mirdef.h" + + +void SM4_standard_block_encrypt(unsigned char key[], unsigned char * message, int mlen, unsigned char *cipher, int * cipher_len) +{ + unsigned char mess[16]; + int i, rem = mlen % 16; + + for(i = 0; i < mlen / 16; i++) + SM4_encrypt(key, &message[i * 16], &cipher[i * 16]); + //encrypt the last block + memset(mess, 16 - rem, 16); + if(rem) + memcpy(mess, &message[i * 16], rem); + SM4_encrypt(key, mess, &cipher[i*16]); +} + + +void SM4_standard_block_decrypt(unsigned char key[], unsigned char *cipher, int len, unsigned char *plain, int *plain_len) +{ + int i; + for(i = 0; i < len / 16; i++) + SM4_decrypt(key, cipher + i * 16, plain + i * 16); + *plain_len = len - plain[len - 1]; +} + + +int SM9_standard_enc_mac(unsigned char *K, int Klen, unsigned char *M, int Mlen, unsigned char C[]) +{ + unsigned char *Z = NULL; + int len = Klen + Mlen; + Z = (char *)malloc(sizeof(char)*(len + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + memcpy(Z, M, Mlen); + memcpy(Z + Mlen, K, Klen); + SM3_256(Z, len, C); + + free(Z); + return 0; +} + + +int SM9_standard_encrypt(unsigned char hid[], unsigned char *IDB, unsigned char *message, int mlen, unsigned char rand[], + int EncID, int k1_len, int k2_len, unsigned char Ppub[], unsigned char C[], int *C_len) +{ + big h, x, y, r; + zzn12 g, w; + epoint *Ppube, *QB, *C1; + unsigned char *Z = NULL, *K = NULL, *C2 = NULL, C3[SM3_len / 8]; + int i = 0, j = 0, Zlen, buf, klen, C2_len; + + //initiate + h = mirvar(0); + r = mirvar(0); + x = mirvar(0); + y = mirvar(0); + QB = epoint_init(); + Ppube = epoint_init(); + C1 = epoint_init(); + zzn12_init(&g); + zzn12_init(&w); + + bytes_to_big(BNLEN, Ppub, x); + bytes_to_big(BNLEN, Ppub + BNLEN, y); + epoint_set(x, y, 0, Ppube); + + //Step1:calculate QB=[H1(IDB||hid,N)]P1+Ppube + Zlen = strlen(IDB) + 1; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + memcpy(Z, IDB, strlen(IDB)); + memcpy(Z + strlen(IDB), hid, 1); + buf = SM9_standard_h1(Z, Zlen, N, h); + if(buf) + return buf; + ecurve_mult(h, P1, QB); + ecurve_add(Ppube, QB); + + printf("\n*******************QB:=[H1(IDB||hid,N)]P1+Ppube*****************\n"); + epoint_get(QB, x, y); + cotnum(x, stdout); + cotnum(y, stdout); + + //Step2:randnom + bytes_to_big(BNLEN, rand, r); + printf("\n***********************randnum r:********************************\n"); + cotnum(r, stdout); + + //Step3:C1=[r]QB + ecurve_mult(r, QB, C1); + printf("\n*************************:C1=[r]QB*******************************\n"); + epoint_get(C1, x, y); + cotnum(x, stdout); + cotnum(y, stdout); + big_to_bytes(BNLEN, x, C, 1); + big_to_bytes(BNLEN, y, C + BNLEN, 1); + + //Step4:g = e(P2, Ppub-e) + if(!ecap(P2, Ppube, para_t, X, &g)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if(!member(g, para_t, X)) + return SM9_MEMBER_ERR; + printf("\n***********************g=e(P2,Ppube):****************************\n"); + zzn12_ElementPrint(g); + + //Step5:calculate w=g^r + w = zzn12_pow(g, r); + printf("\n***************************w=g^r:**********************************\n"); + zzn12_ElementPrint(w); + + free(Z); + //Step6:calculate C2 + if(EncID == 0) + { + C2_len = mlen; + *C_len = BNLEN * 2 + SM3_len / 8 + C2_len; + + //Step:6-1: calculate K=KDF(C1||w||IDB,klen) + klen = mlen + k2_len; + Zlen = strlen(IDB) + BNLEN * 14; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + K = (char *)malloc(sizeof(char)*(klen + 1)); + C2 = (char *)malloc(sizeof(char)*(mlen + 1)); + if(Z == NULL || K == NULL || C2 == NULL) + return SM9_ASK_MEMORY_ERR; + + LinkCharZzn12( C, BNLEN * 2, w, Z, (Zlen - strlen(IDB))); + memcpy(Z + BNLEN * 14, IDB, strlen(IDB)); + SM3_kdf(Z, Zlen, klen, K); + printf("\n*****************K=KDF(C1||w||IDB,klen):***********************\n"); + for(i = 0; i < klen; i++) + printf("%02x", K[i]); + + //Step:6-2: calculate C2=M^K1,and test if K1==0? + for(i = 0; i < mlen; i++) + { + if(K[i] == 0) + j = j + 1; + C2[i] = message[i] ^ K[i]; + } + if(j == mlen) + return SM9_ERR_K1_ZERO; + printf("\n************************* C2=M^K1 :***************************\n"); + for(i = 0; i < C2_len; i++) + printf("%02x", C2[i]); + + //Step7:calculate C3=MAC(K2,C2) + SM9_standard_enc_mac(K + mlen, k2_len, C2, mlen, C3); + printf("\n********************** C3=MAC(K2,C2):*************************\n"); + for(i = 0; i < 32; i++) + printf("%02x", C3[i]); + + memcpy(C + BNLEN * 2, C3, SM3_len / 8); + memcpy(C + BNLEN * 2 + SM3_len / 8, C2, C2_len); + free(Z); + free(K); + free(C2); + } + else + { + C2_len = (mlen / 16 + 1) * 16; + *C_len = BNLEN * 2 + SM3_len / 8 + C2_len; + + //Step:6-1: calculate K=KDF(C1||w||IDB,klen) + klen = k1_len + k2_len; + Zlen = strlen(IDB) + BNLEN * 14; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + K = (char *)malloc(sizeof(char)*(klen + 1)); + C2 = (char *)malloc(sizeof(char)*(C2_len + 1)); + if(Z == NULL || K == NULL || C2 == NULL) + return SM9_ASK_MEMORY_ERR; + + LinkCharZzn12(C, BNLEN * 2, w, Z, Zlen - strlen(IDB)); + memcpy(Z + BNLEN * 14, IDB, strlen(IDB)); + SM3_kdf(Z, Zlen, klen, K); + printf("\n*****************K=KDF(C1||w||IDB,klen):***********************\n"); + for(i = 0; i < klen; i++) + printf("%02x", K[i]); + + //Step:6-2: calculate C2=Enc(K1,M),and also test if K1==0? + for(i = 0; i < k1_len; i++) + { + if(K[i] == 0) + j = j + 1; + } + if(j == k1_len) + return SM9_ERR_K1_ZERO; + + SM4_standard_block_encrypt(K, message, mlen, C2, &C2_len); + printf("\n*********************** C2=Enc(K1,M) :*************************\n"); + for(i = 0; i < C2_len; i++) + printf("%02x", C2[i]); + + //Step7:calculate C3=MAC(K2,C2) + SM9_standard_enc_mac(K + k1_len, k2_len, C2, C2_len, C3); + printf("\n********************** C3=MAC(K2,C2):*************************\n"); + for(i = 0; i < 32; i++) + printf("%02x", C3[i]); + + memcpy(C + BNLEN * 2, C3, SM3_len / 8); + memcpy(C + BNLEN * 2 + SM3_len / 8, C2, C2_len); + free(Z); + free(K); + free(C2); + } + return 0; +} + + +int SM9_standard_decrypt (unsigned char C[], int C_len, unsigned char deB[], unsigned char *IDB, int EncID, + int k1_len, int k2_len, unsigned char M[], int * Mlen) +{ + big x, y; + epoint *C1; + zzn12 w; + ecn2 dEB; + int mlen, klen, Zlen, i, number = 0; + unsigned char *Z = NULL, *K = NULL, *K1 = NULL, u[SM3_len / 8]; + + x = mirvar(0); + y = mirvar(0); + dEB.x.a = mirvar(0); + dEB.x.b = mirvar(0); + dEB.y.a = mirvar(0); + dEB.y.b = mirvar(0); + dEB.z.a = mirvar(0); + dEB.z.b = mirvar(0); + dEB.marker = MR_EPOINT_INFINITY; + C1 = epoint_init(); + zzn12_init(&w); + + bytes_to_big(BNLEN, C, x); + bytes_to_big(BNLEN, C + BNLEN, y); + bytes128_to_ecn2(deB, &dEB); + + //Step1:get C1,and test if C1 is on G1 + epoint_set(x, y, 1, C1); + if(Test_Point(C1)) + return SM9_C1_NOT_VALID_G1; + + //Step2:w = e(C1, deB) + if(!ecap(dEB, C1, para_t, X, &w)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if(!member(w, para_t, X)) return + SM9_MEMBER_ERR; + printf("\n*********************** w = e(C1, deB):****************************\n"); + zzn12_ElementPrint(w); + + //Step3:Calculate plaintext + mlen = C_len - BNLEN * 2 - SM3_len / 8; + if(EncID == 0) + { + //Step3-1:calculate K=KDF(C1||w||IDB,klen) + klen = mlen + k2_len; + Zlen = strlen(IDB) + BNLEN * 14; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + K = (char *)malloc(sizeof(char)*(klen + 1)); + if(Z == NULL || K == NULL) + return SM9_ASK_MEMORY_ERR; + + LinkCharZzn12(C, BNLEN * 2, w, Z, Zlen - strlen(IDB)); + memcpy(Z + BNLEN * 14, IDB, strlen(IDB)); + SM3_kdf(Z, Zlen, klen, K); + printf("\n*****************K=KDF(C1||w||IDB,klen):***********************\n"); + for(i = 0; i < klen; i++) + printf("%02x", K[i]); + + //Step:3-2: calculate M=C2^K1,and test if K1==0? + for(i = 0; i < mlen; i++) + { + if(K[i] == 0) + number += 1; + M[i] = C[i + C_len - mlen] ^ K[i]; + } + if(number == mlen) + return SM9_ERR_K1_ZERO; + *Mlen = mlen; + + //Step4:calculate u=MAC(K2,C2) + SM9_standard_enc_mac(K + mlen, k2_len, &C[C_len - mlen], mlen, u); + if(memcmp(u, &C[BNLEN * 2], SM3_len / 8)) + return SM9_C3_MEMCMP_ERR; + + printf("\n****************************** M:******************************\n"); + for(i = 0; i < mlen; i++) + printf("%02x", M[i]); + free(Z); + free(K); + } + else + { + //Step:3-1: calculate K=KDF(C1||w||IDB,klen) + klen = k1_len + k2_len; + Zlen = strlen(IDB) + BNLEN * 14; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + K = (char *)malloc(sizeof(char)*(klen + 1)); + K1 = (char *)malloc(sizeof(char)*(k1_len + 1)); + if(Z == NULL || K == NULL || K1 == NULL) + return SM9_ASK_MEMORY_ERR; + + LinkCharZzn12(C, BNLEN * 2, w, Z, Zlen - strlen(IDB)); + memcpy(Z + BNLEN * 14, IDB, strlen(IDB)); + SM3_kdf(Z, Zlen, klen, K); + printf("\n*****************K=KDF(C1||w||IDB,klen):***********************\n"); + for(i = 0; i < klen; i++) + printf("%02x", K[i]); + + //Step:3-2: calculate M=dec(K1,C2),and test if K1==0? + for(i = 0; i < k1_len; i++) + { + if(K[i] == 0) + number += 1; + K1[i] = K[i]; + } + if(number == k1_len) + return SM9_ERR_K1_ZERO; + SM4_standard_block_decrypt(K1, &C[C_len - mlen], mlen, M, Mlen); + + //Step4:calculate u=MAC(K2,C2) + SM9_standard_enc_mac(K + k1_len, k2_len, &C[C_len - mlen], mlen, u); + if(memcmp(u, &C[BNLEN * 2], SM3_len / 8)) + return SM9_C3_MEMCMP_ERR; + free(Z); + free(K); + free(K1); + } + return 0; +} + + +int SM9_standard_enc_selfcheck() +{ + //the master private key + unsigned char KE[32] = {0x00, 0x01, 0xED, 0xEE, 0x37, 0x78, 0xF4, 0x41, 0xF8, 0xDE, 0xA3, 0xD9, 0xFA, 0x0A, 0xCC, 0x4E, + 0x07, 0xEE, 0x36, 0xC9, 0x3F, 0x9A, 0x08, 0x61, 0x8A, 0xF4, 0xAD, 0x85, 0xCE, 0xDE, 0x1C, 0x22}; + unsigned char rand[32] = {0x00, 0x00, 0xAA, 0xC0, 0x54, 0x17, 0x79, 0xC8, 0xFC, 0x45, 0xE3, 0xE2, 0xCB, 0x25, 0xC1, 0x2B, + 0x5D, 0x25, 0x76, 0xB2, 0x12, 0x9A, 0xE8, 0xBB, 0x5E, 0xE2, 0xCB, 0xE5, 0xEC, 0x9E, 0x78, 0x5C}; + //standard datas + unsigned char std_Ppub[64] = {0x78, 0x7E, 0xD7, 0xB8, 0xA5, 0x1F, 0x3A, 0xB8, 0x4E, 0x0A, 0x66, 0x00, 0x3F, 0x32, 0xDA, 0x5C, + 0x72, 0x0B, 0x17, 0xEC, 0xA7, 0x13, 0x7D, 0x39, 0xAB, 0xC6, 0x6E, 0x3C, 0x80, 0xA8, 0x92, 0xFF, + 0x76, 0x9D, 0xE6, 0x17, 0x91, 0xE5, 0xAD, 0xC4, 0xB9, 0xFF, 0x85, 0xA3, 0x13, 0x54, 0x90, 0x0B, + 0x20, 0x28, 0x71, 0x27, 0x9A, 0x8C, 0x49, 0xDC, 0x3F, 0x22, 0x0F, 0x64, 0x4C, 0x57, 0xA7, 0xB1}; + unsigned char std_deB[128] = {0x94, 0x73, 0x6A, 0xCD, 0x2C, 0x8C, 0x87, 0x96, 0xCC, 0x47, 0x85, 0xE9, 0x38, 0x30, 0x1A, 0x13, + 0x9A, 0x05, 0x9D, 0x35, 0x37, 0xB6, 0x41, 0x41, 0x40, 0xB2, 0xD3, 0x1E, 0xEC, 0xF4, 0x16, 0x83, + 0x11, 0x5B, 0xAE, 0x85, 0xF5, 0xD8, 0xBC, 0x6C, 0x3D, 0xBD, 0x9E, 0x53, 0x42, 0x97, 0x9A, 0xCC, + 0xCF, 0x3C, 0x2F, 0x4F, 0x28, 0x42, 0x0B, 0x1C, 0xB4, 0xF8, 0xC0, 0xB5, 0x9A, 0x19, 0xB1, 0x58, + 0x7A, 0xA5, 0xE4, 0x75, 0x70, 0xDA, 0x76, 0x00, 0xCD, 0x76, 0x0A, 0x0C, 0xF7, 0xBE, 0xAF, 0x71, + 0xC4, 0x47, 0xF3, 0x84, 0x47, 0x53, 0xFE, 0x74, 0xFA, 0x7B, 0xA9, 0x2C, 0xA7, 0xD3, 0xB5, 0x5F, + 0x27, 0x53, 0x8A, 0x62, 0xE7, 0xF7, 0xBF, 0xB5, 0x1D, 0xCE, 0x08, 0x70, 0x47, 0x96, 0xD9, 0x4C, + 0x9D, 0x56, 0x73, 0x4F, 0x11, 0x9E, 0xA4, 0x47, 0x32, 0xB5, 0x0E, 0x31, 0xCD, 0xEB, 0x75, 0xC1}; + unsigned char std_C_stream[116] = {0x24, 0x45, 0x47, 0x11, 0x64, 0x49, 0x06, 0x18, 0xE1, 0xEE, 0x20, 0x52, 0x8F, 0xF1, 0xD5, 0x45, + 0xB0, 0xF1, 0x4C, 0x8B, 0xCA, 0xA4, 0x45, 0x44, 0xF0, 0x3D, 0xAB, 0x5D, 0xAC, 0x07, 0xD8, 0xFF, + 0x42, 0xFF, 0xCA, 0x97, 0xD5, 0x7C, 0xDD, 0xC0, 0x5E, 0xA4, 0x05, 0xF2, 0xE5, 0x86, 0xFE, 0xB3, + 0xA6, 0x93, 0x07, 0x15, 0x53, 0x2B, 0x80, 0x00, 0x75, 0x9F, 0x13, 0x05, 0x9E, 0xD5, 0x9A, 0xC0, + 0xBA, 0x67, 0x23, 0x87, 0xBC, 0xD6, 0xDE, 0x50, 0x16, 0xA1, 0x58, 0xA5, 0x2B, 0xB2, 0xE7, 0xFC, + 0x42, 0x91, 0x97, 0xBC, 0xAB, 0x70, 0xB2, 0x5A, 0xFE, 0xE3, 0x7A, 0x2B, 0x9D, 0xB9, 0xF3, 0x67, + 0x1B, 0x5F, 0x5B, 0x0E, 0x95, 0x14, 0x89, 0x68, 0x2F, 0x3E, 0x64, 0xE1, 0x37, 0x8C, 0xDD, 0x5D, + 0xA9, 0x51, 0x3B, 0x1C}; + unsigned char std_C_cipher[128] = {0x24, 0x45, 0x47, 0x11, 0x64, 0x49, 0x06, 0x18, 0xE1, 0xEE, 0x20, 0x52, 0x8F, 0xF1, 0xD5, 0x45, + 0xB0, 0xF1, 0x4C, 0x8B, 0xCA, 0xA4, 0x45, 0x44, 0xF0, 0x3D, 0xAB, 0x5D, 0xAC, 0x07, 0xD8, 0xFF, + 0x42, 0xFF, 0xCA, 0x97, 0xD5, 0x7C, 0xDD, 0xC0, 0x5E, 0xA4, 0x05, 0xF2, 0xE5, 0x86, 0xFE, 0xB3, + 0xA6, 0x93, 0x07, 0x15, 0x53, 0x2B, 0x80, 0x00, 0x75, 0x9F, 0x13, 0x05, 0x9E, 0xD5, 0x9A, 0xC0, + 0xFD, 0x3C, 0x98, 0xDD, 0x92, 0xC4, 0x4C, 0x68, 0x33, 0x26, 0x75, 0xA3, 0x70, 0xCC, 0xEE, 0xDE, + 0x31, 0xE0, 0xC5, 0xCD, 0x20, 0x9C, 0x25, 0x76, 0x01, 0x14, 0x9D, 0x12, 0xB3, 0x94, 0xA2, 0xBE, + 0xE0, 0x5B, 0x6F, 0xAC, 0x6F, 0x11, 0xB9, 0x65, 0x26, 0x8C, 0x99, 0x4F, 0x00, 0xDB, 0xA7, 0xA8, + 0xBB, 0x00, 0xFD, 0x60, 0x58, 0x35, 0x46, 0xCB, 0xDF, 0x46, 0x49, 0x25, 0x08, 0x63, 0xF1, 0x0A}; + unsigned char *std_message = "Chinese IBE standard"; + unsigned char hid[] = {0x03}; + unsigned char *IDB = "Bob"; + + unsigned char Ppub[64], deB[128]; + unsigned char message[1000], C[1000]; + int M_len, C_len;//M_len the length of message //C_len the length of C + int k1_len = 16, k2_len = 32; + int EncID = 0;//0,stream //1 block + int tmp, i; + big ke; + + tmp = SM9_standard_init(); + if(tmp != 0) + return tmp; + + ke = mirvar(0); + bytes_to_big(32, KE, ke); + + printf("\n*********************** SM9 key Generation ***************************\n"); + tmp = SM9_standard_generateencryptkey(hid, IDB, strlen(IDB), ke, Ppub, deB); + if(tmp != 0) + return tmp; + if(memcmp(Ppub, std_Ppub, 64) != 0) + return SM9_GEPUB_ERR; + if(memcmp(deB, std_deB, 128) !=0) + return SM9_GEPRI_ERR; + + printf("\n*********************** SM9 encrypt algorithm **************************\n"); + tmp = SM9_standard_encrypt(hid, IDB, std_message, strlen(std_message), rand, EncID, k1_len, k2_len, Ppub, C, &C_len); + if(tmp != 0) + return tmp; + printf("\n******************************Cipher:************************************\n"); + for(i = 0; i < C_len; i++) + printf("%02x", C[i]); + if(EncID == 0) + tmp = memcmp(C, std_C_stream, C_len); + else + tmp = memcmp(C, std_C_cipher, C_len); + if(tmp) + return SM9_ENCRYPT_ERR; + + printf("\n********************** SM9 Decrypt algorithm **************************\n"); + tmp = SM9_standard_decrypt(std_C_cipher, 128, deB, IDB, 2, k1_len, k2_len, message, &M_len); + printf("\n**************************** Message:***********************************\n"); + for(i = 0; i < M_len; i++) + printf("%02x", message[i]); + if(tmp != 0) + return tmp; + if(memcmp(message, std_message, M_len) != 0) + return SM9_DECRYPT_ERR; + + return 0; +} diff --git a/engines/sm_standard/sm9/sm9_standard_encap.c b/engines/sm_standard/sm9/sm9_standard_encap.c new file mode 100644 index 00000000..a1c8128b --- /dev/null +++ b/engines/sm_standard/sm9/sm9_standard_encap.c @@ -0,0 +1,307 @@ +/* ==================================================================== + * Copyright (c) 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 "sm9_standard.h" +#include "miracl.h" +#include "mirdef.h" + + +int SM9_standard_key_encap(unsigned char hid[], unsigned char *IDB, unsigned char rand[], + unsigned char Ppub[], unsigned char C[], unsigned char K[], int Klen) +{ + big h, x, y, r; + epoint *Ppube, *QB, *Cipher; + unsigned char *Z = NULL; + int Zlen, buf, i, num = 0; + zzn12 g, w; + + //initiate + h = mirvar(0); + r = mirvar(0); + x = mirvar(0); + y = mirvar(0); + QB = epoint_init(); + Ppube = epoint_init(); + Cipher = epoint_init(); + zzn12_init(&g); + zzn12_init(&w); + + bytes_to_big(BNLEN, Ppub, x); + bytes_to_big(BNLEN, Ppub + BNLEN, y); + epoint_set(x, y, 0, Ppube); + + //----------Step1:calculate QB=[H1(IDB||hid,N)]P1+Ppube---------- + Zlen = strlen(IDB) + 1; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + memcpy(Z, IDB, strlen(IDB)); + memcpy(Z + strlen(IDB), hid, 1); + buf = SM9_standard_h1(Z, Zlen, N, h); + free(Z); + if(buf) + return buf; + printf("\n************************ H1(IDB||hid,N) ************************\n"); + cotnum(h, stdout); + + ecurve_mult(h, P1, QB); + ecurve_add(Ppube, QB); + printf("\n*******************QB:=[H1(IDB||hid,N)]P1+Ppube*****************\n"); + epoint_get(QB, x, y); + cotnum(x, stdout); + cotnum(y, stdout); + + //-------------------- Step2:randnom ------------------- + bytes_to_big(BNLEN, rand, r); + printf("\n***********************randnum r: ******************************\n"); + cotnum(r, stdout); + + //----------------Step3:C=[r]QB------------------------ + ecurve_mult(r, QB, Cipher); + epoint_get(Cipher, x, y); + printf("\n*********************** C=[r]QB: ******************************\n"); + cotnum(x, stdout); + cotnum(y, stdout); + big_to_bytes(BNLEN, x, C, 1); + big_to_bytes(BNLEN, y, C + BNLEN, 1); + + //----------------Step4:g=e(Ppube,P2)------------------------ + if(!ecap(P2, Ppube, para_t, X, &g)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if(!member(g, para_t, X)) + return SM9_MEMBER_ERR; + + printf("\n***********************g=e(Ppube,P2):****************************\n"); + zzn12_ElementPrint(g); + + //----------------Step5:w=g^r------------------------ + w = zzn12_pow(g, r); + printf("\n************************* w=g^r:*********************************\n"); + zzn12_ElementPrint(w); + + //----------------Step6:K=KDF(C||w||IDB,klen)------------------------ + Zlen = strlen(IDB) + BNLEN * 14; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + LinkCharZzn12(C, BNLEN * 2, w, Z, BNLEN * 14); + memcpy(Z + BNLEN * 14, IDB, strlen(IDB)); + + SM3_kdf(Z, Zlen, Klen, K); + free(Z); + //----------------test if K equals 0------------------------ + printf("\n******************* K=KDF(C||w||IDB,klen):***********************\n"); + for(i = 0; i < Klen; i++) + { + if(K[i] == 0) + num += 1; + printf("%02x", K[i]); + } + if(num == Klen) + return SM9_ERR_K1_ZERO; + + return 0; +} + + +int SM9_standard_key_decap(unsigned char *IDB, unsigned char deB[], unsigned char C[], int Klen, unsigned char K[]) +{ + big h, x, y; + epoint *Cipher; + unsigned char *Z = NULL; + int Zlen, i, num = 0; + zzn12 w; + ecn2 dEB; + + //initiate + h = mirvar(0); + x = mirvar(0); + y = mirvar(0); + Cipher = epoint_init(); + zzn12_init(&w); + dEB.x.a = mirvar(0); + dEB.x.b = mirvar(0); + dEB.y.a = mirvar(0); + dEB.y.b = mirvar(0); + dEB.z.a = mirvar(0); + dEB.z.b = mirvar(0); + dEB.marker = MR_EPOINT_INFINITY; + + bytes_to_big(BNLEN, C, x); + bytes_to_big(BNLEN, C + BNLEN, y); + epoint_set(x, y, 0, Cipher); + bytes128_to_ecn2(deB, &dEB); + + //----------Step1:test if C is on G1----------------- + if(Test_Point(Cipher)) + return SM9_NOT_VALID_G1; + + //----------Step2:calculate w=e(C,deB)----------------- + if(!ecap(dEB, Cipher, para_t, X, &w)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if(!member(w, para_t, X)) + return SM9_MEMBER_ERR; + + printf("\n***********************w=e(C,deB):****************************\n"); + zzn12_ElementPrint(w); + + //----------Step3:K=KDF(C||w'||IDB,klen)------------------------ + Zlen = strlen(IDB) + BNLEN * 14; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + LinkCharZzn12(C, BNLEN * 2, w, Z, BNLEN * 14); + memcpy(Z + BNLEN * 14, IDB, strlen(IDB)); + SM3_kdf(Z, Zlen, Klen, K); + + //----------------test if K equals 0------------------------ + printf("\n******************* K=KDF(C||w||IDB,klen):***********************\n"); + for(i = 0; i < Klen; i++) + { + if(K[i] == 0) + num += 1; + printf("%02x", K[i]); + } + if(num == Klen) + return SM9_ERR_K1_ZERO; + + free(Z); + return 0; +} + + +int SM9_standard_encap_selfcheck() +{ + //the master private key + unsigned char KE[32] = {0x00, 0x01, 0xED, 0xEE, 0x37, 0x78, 0xF4, 0x41, 0xF8, 0xDE, 0xA3, 0xD9, 0xFA, 0x0A, 0xCC, 0x4E, + 0x07, 0xEE, 0x36, 0xC9, 0x3F, 0x9A, 0x08, 0x61, 0x8A, 0xF4, 0xAD, 0x85, 0xCE, 0xDE, 0x1C, 0x22}; + unsigned char rand[32] = {0x00, 0x00, 0x74, 0x01, 0x5F, 0x84, 0x89, 0xC0, 0x1E, 0xF4, 0x27, 0x04, 0x56, 0xF9, 0xE6, 0x47, + 0x5B, 0xFB, 0x60, 0x2B, 0xDE, 0x7F, 0x33, 0xFD, 0x48, 0x2A, 0xB4, 0xE3, 0x68, 0x4A, 0x67, 0x22}; + //standard datas + unsigned char std_Ppub[64] = {0x78, 0x7E, 0xD7, 0xB8, 0xA5, 0x1F, 0x3A, 0xB8, 0x4E, 0x0A, 0x66, 0x00, 0x3F, 0x32, 0xDA, 0x5C, + 0x72, 0x0B, 0x17, 0xEC, 0xA7, 0x13, 0x7D, 0x39, 0xAB, 0xC6, 0x6E, 0x3C, 0x80, 0xA8, 0x92, 0xFF, + 0x76, 0x9D, 0xE6, 0x17, 0x91, 0xE5, 0xAD, 0xC4, 0xB9, 0xFF, 0x85, 0xA3, 0x13, 0x54, 0x90, 0x0B, + 0x20, 0x28, 0x71, 0x27, 0x9A, 0x8C, 0x49, 0xDC, 0x3F, 0x22, 0x0F, 0x64, 0x4C, 0x57, 0xA7, 0xB1}; + unsigned char std_deB[128] = {0x94, 0x73, 0x6A, 0xCD, 0x2C, 0x8C, 0x87, 0x96, 0xCC, 0x47, 0x85, 0xE9, 0x38, 0x30, 0x1A, 0x13, + 0x9A, 0x05, 0x9D, 0x35, 0x37, 0xB6, 0x41, 0x41, 0x40, 0xB2, 0xD3, 0x1E, 0xEC, 0xF4, 0x16, 0x83, + 0x11, 0x5B, 0xAE, 0x85, 0xF5, 0xD8, 0xBC, 0x6C, 0x3D, 0xBD, 0x9E, 0x53, 0x42, 0x97, 0x9A, 0xCC, + 0xCF, 0x3C, 0x2F, 0x4F, 0x28, 0x42, 0x0B, 0x1C, 0xB4, 0xF8, 0xC0, 0xB5, 0x9A, 0x19, 0xB1, 0x58, + 0x7A, 0xA5, 0xE4, 0x75, 0x70, 0xDA, 0x76, 0x00, 0xCD, 0x76, 0x0A, 0x0C, 0xF7, 0xBE, 0xAF, 0x71, + 0xC4, 0x47, 0xF3, 0x84, 0x47, 0x53, 0xFE, 0x74, 0xFA, 0x7B, 0xA9, 0x2C, 0xA7, 0xD3, 0xB5, 0x5F, + 0x27, 0x53, 0x8A, 0x62, 0xE7, 0xF7, 0xBF, 0xB5, 0x1D, 0xCE, 0x08, 0x70, 0x47, 0x96, 0xD9, 0x4C, + 0x9D, 0x56, 0x73, 0x4F, 0x11, 0x9E, 0xA4, 0x47, 0x32, 0xB5, 0x0E, 0x31, 0xCD, 0xEB, 0x75, 0xC1}; + unsigned char std_K[64] = {0x4F, 0xF5, 0xCF, 0x86, 0xD2, 0xAD, 0x40, 0xC8, 0xF4, 0xBA, 0xC9, 0x8D, 0x76, 0xAB, 0xDB, 0xDE, + 0x0C, 0x0E, 0x2F, 0x0A, 0x82, 0x9D, 0x3F, 0x91, 0x1E, 0xF5, 0xB2, 0xBC, 0xE0, 0x69, 0x54, 0x80}; + unsigned char std_C[64] = {0x1E, 0xDE, 0xE2, 0xC3, 0xF4, 0x65, 0x91, 0x44, 0x91, 0xDE, 0x44, 0xCE, 0xFB, 0x2C, 0xB4, 0x34, + 0xAB, 0x02, 0xC3, 0x08, 0xD9, 0xDC, 0x5E, 0x20, 0x67, 0xB4, 0xFE, 0xD5, 0xAA, 0xAC, 0x8A, 0x0F, + 0x1C, 0x9B, 0x4C, 0x43, 0x5E, 0xCA, 0x35, 0xAB, 0x83, 0xBB, 0x73, 0x41, 0x74, 0xC0, 0xF7, 0x8F, + 0xDE, 0x81, 0xA5, 0x33, 0x74, 0xAF, 0xF3, 0xB3, 0x60, 0x2B, 0xBC, 0x5E, 0x37, 0xBE, 0x9A, 0x4C}; + + unsigned char hid[] = {0x03}, *IDB = "Bob"; + unsigned char Ppub[64], deB[128], C[64], K[32], K_decap[32]; + big ke; + int tmp, i; + int Klen = 32; + + mip = mirsys(1000, 16); + mip->IOBASE = 16; + ke = mirvar(0); + bytes_to_big(32, KE, ke); + + tmp = SM9_standard_init(); + if(tmp != 0) + return tmp; + + printf("\n*********************** SM9 key Generation ***************************\n"); + tmp = SM9_standard_generateencryptkey(hid, IDB, strlen(IDB), ke, Ppub, deB); + if(tmp != 0) + return tmp; + if(memcmp(Ppub, std_Ppub, 64) != 0) + return SM9_GEPUB_ERR; + if(memcmp(deB, std_deB, 128) != 0) + return SM9_GEPRI_ERR; + + printf("\n**********************PublicKey Ppubs=[ke]P1:*************************\n"); + for(i = 0; i < 64; i++) + { + if(i == 32) + printf("\n"); + printf("%02x", Ppub[i]); + } + printf("\n**************The private key deB = (xdeB, ydeB):*********************\n"); + for(i = 0; i < 128; i++) + { + if(i == 64) + printf("\n"); + printf("%02x", deB[i]); + } + + printf("\n///////////////////SM9 Key encapsulation mechanism//////////////////////\n"); + tmp = SM9_standard_key_encap(hid, IDB, rand, Ppub, C, K, Klen); + if(tmp != 0) + return tmp; + + if(memcmp(C, std_C, 64) != 0) + return SM9_ERR_Encap_C; + if(memcmp(K, std_K, Klen) != 0) + return SM9_ERR_Encap_K; + + printf("\n///////////////////SM9 Key decapsulation mechanism//////////////////////\n"); + tmp = SM9_standard_key_decap(IDB, deB, C, Klen, K_decap); + if(tmp != 0) + return tmp; + + if(memcmp(K_decap, std_K, 32) != 0) + return SM9_ERR_Decap_K; + + return 0; +} diff --git a/engines/sm_standard/sm9/sm9_standard_exch.c b/engines/sm_standard/sm9/sm9_standard_exch.c new file mode 100644 index 00000000..be986dfc --- /dev/null +++ b/engines/sm_standard/sm9/sm9_standard_exch.c @@ -0,0 +1,525 @@ +/* ==================================================================== + * Copyright (c) 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 "sm9_standard.h" +#include "miracl.h" +#include "mirdef.h" + + +int SM9_standard_keyex_kdf(unsigned char *IDA, unsigned char *IDB, epoint *RA, epoint *RB, zzn12 g1, zzn12 g2, zzn12 g3, int klen, unsigned char K[]) +{ + unsigned char *Z = NULL; + int Zlen; + int IDALen = strlen(IDA), IDBLen = strlen(IDB); + big x1, y1, x2, y2; + + x1 = mirvar(0); + y1 = mirvar(0); + x2 = mirvar(0); + y2 = mirvar(0); + epoint_get(RA, x1, y1); + epoint_get(RB, x2, y2); + + Zlen = IDALen + IDBLen + BNLEN * 40; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + + memcpy(Z, IDA, IDALen); + memcpy(Z + IDALen, IDB, IDBLen); + big_to_bytes(BNLEN, x1, Z + IDALen + IDBLen, 1); + big_to_bytes(BNLEN, y1, Z + IDALen + IDBLen + BNLEN, 1); + big_to_bytes(BNLEN, x2, Z + IDALen + IDBLen + BNLEN * 2, 1); + big_to_bytes(BNLEN, y2, Z + IDALen + IDBLen + BNLEN * 3, 1); + LinkCharZzn12(Z, 0, g1, Z + IDALen + IDBLen + BNLEN * 4, BNLEN * 12); + LinkCharZzn12(Z, 0, g2, Z + IDALen + IDBLen + BNLEN * 16, BNLEN * 12); + LinkCharZzn12(Z, 0, g3, Z + IDALen + IDBLen + BNLEN * 28, BNLEN * 12); + + SM3_kdf(Z, Zlen, klen, K); + free(Z); + return 0; +} + + +int SM9_standard_keyex_hash(unsigned char hashid[], unsigned char *IDA, unsigned char *IDB, epoint *RA, epoint *RB, zzn12 g1, zzn12 g2, zzn12 g3, unsigned char hash[]) +{ + int Zlen; + int IDALen = strlen(IDA), IDBLen = strlen(IDB); + unsigned char *Z = NULL; + big x1, y1, x2, y2; + + x1 = mirvar(0); + y1 = mirvar(0); + x2 = mirvar(0); + y2 = mirvar(0); + epoint_get(RA, x1, y1); + epoint_get(RB, x2, y2); + + Zlen = IDALen + IDBLen + BNLEN * 28; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + + LinkCharZzn12(Z, 0, g2, Z, BNLEN * 12); + LinkCharZzn12(Z, 0, g3, Z + BNLEN * 12, BNLEN * 12); + memcpy(Z + BNLEN * 24, IDA, IDALen); + memcpy(Z + BNLEN * 24 + IDALen, IDB, IDBLen); + big_to_bytes(BNLEN, x1, Z + BNLEN * 24 + IDALen + IDBLen, 1); + big_to_bytes(BNLEN, y1, Z + BNLEN * 25 + IDALen + IDBLen, 1); + big_to_bytes(BNLEN, x2, Z + BNLEN * 26 + IDALen + IDBLen, 1); + big_to_bytes(BNLEN, y2, Z + BNLEN * 27 + IDALen + IDBLen, 1); + + SM3_256(Z, Zlen, hash); + + Zlen = 1 + BNLEN * 12 + SM3_len / 8; + memcpy(Z, hashid, 1); + LinkCharZzn12(Z, 1, g1, Z, 1 + BNLEN * 12); + memcpy(Z + 1 + BNLEN * 12, hash, SM3_len / 8); + + SM3_256(Z, Zlen, hash); + free(Z); + return 0; +} + + +int SM9_standard_keyex_inita_i(unsigned char hid[], unsigned char *IDB, unsigned char randA[], + unsigned char Ppub[], unsigned char deA[], epoint *RA) +{ + big h, x, y, rA; + epoint *Ppube, *QB; + unsigned char *Z = NULL; + int Zlen, buf; + + //initiate + h = mirvar(0); + rA = mirvar(0); + x = mirvar(0); + y = mirvar(0); + QB = epoint_init(); + Ppube = epoint_init(); + + bytes_to_big(BNLEN, Ppub, x); + bytes_to_big(BNLEN, Ppub + BNLEN, y); + epoint_set(x, y, 0, Ppube); + + //----------A1:calculate QB=[H1(IDB||hid,N)]P1+Ppube---------- + Zlen = strlen(IDB) + 1; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + memcpy(Z, IDB, strlen(IDB)); + memcpy(Z + strlen(IDB), hid, 1); + buf = SM9_standard_h1(Z, Zlen, N, h); + if(buf) + return buf; + ecurve_mult(h, P1, QB); + ecurve_add(Ppube, QB); + printf("\n*******************QB:=[H1(IDB||hid,N)]P1+Ppube*****************\n"); + epoint_get(QB, x, y); + cotnum(x, stdout); + cotnum(y, stdout); + + //--------------- Step A2:randnom ------------------- + bytes_to_big(BNLEN, randA, rA); + printf("\n***********************randnum rA:******************************\n"); + cotnum(rA, stdout); + + //----------------Step A3:RA=[r]QB + ecurve_mult(rA, QB, RA); + + free(Z); + return 0; +} + + + +int SM9_standard_keyex_reb_i(unsigned char hid[], unsigned char *IDA, unsigned char *IDB, unsigned char randB[], unsigned char Ppub[], + unsigned char deB[], epoint *RA, epoint *RB, unsigned char SB[], zzn12 *g1, zzn12 *g2, zzn12 *g3) +{ + big h, x, y, rB; + epoint *Ppube, *QA; + unsigned char *Z = NULL, hashid[] = {0x82}; + unsigned char SKB[16]; + ecn2 dEB; + int Zlen, buf, i; + + //initiate + h = mirvar(0); + rB = mirvar(0); + x = mirvar(0); + y = mirvar(0); + QA = epoint_init(); + Ppube = epoint_init(); + dEB.x.a = mirvar(0); + dEB.x.b = mirvar(0); + dEB.y.a = mirvar(0); + dEB.y.b = mirvar(0); + dEB.z.a = mirvar(0); + dEB.z.b = mirvar(0); + dEB.marker = MR_EPOINT_INFINITY; + + bytes_to_big(BNLEN, Ppub, x); + bytes_to_big(BNLEN, Ppub + BNLEN, y); + bytes128_to_ecn2(deB, &dEB); + epoint_set(x, y, 0, Ppube); + + //----------B1:calculate QA=[H1(IDA||hid,N)]P1+Ppube---------- + Zlen = strlen(IDA) + 1; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + memcpy(Z, IDA, strlen(IDA)); + memcpy(Z + strlen(IDA), hid, 1); + + buf = SM9_standard_h1(Z, Zlen, N, h); + if(buf) + return buf; + ecurve_mult(h, P1, QA); + ecurve_add(Ppube, QA); + printf("\n*******************QA:=[H1(IDA||hid,N)]P1+Ppube*****************\n"); + epoint_get(QA, x, y); + cotnum(x, stdout); + cotnum(y, stdout); + + //--------------- Step B2:randnom ------------------- + bytes_to_big(BNLEN, randB, rB); + printf("\n***********************randnum rB:********************************\n"); + cotnum(rB, stdout); + + //----------------Step B3:RB=[rB]QA------------------ + ecurve_mult(rB, QA, RB); + printf("\n*************************:RB=[rB]QA*******************************\n"); + epoint_get(RB, x, y); + cotnum(x, stdout); + cotnum(y, stdout); + + //test if RA is on G1 + if(Test_Point(RA)) + return SM9_NOT_VALID_G1; + + //----------------Step B4:g1=e(deB,RA),g2=(e(P2,Ppube))^rB,g3=g1^rB + if(!ecap(dEB, RA, para_t, X, g1)) + return SM9_MY_ECAP_12A_ERR; + if(!ecap(P2, Ppube, para_t, X, g2)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if((!member(*g1, para_t, X)) || (!member(*g2, para_t, X))) + return SM9_MEMBER_ERR; + + *g2 = zzn12_pow(*g2, rB); + *g3 = zzn12_pow(*g1, rB); + + printf("\n***********************g1=e(RA,deB):****************************\n"); + zzn12_ElementPrint(*g1); + printf("\n*******************g2=(e(P2,Ppub3))^rB:*************************\n"); + zzn12_ElementPrint(*g2); + printf("\n***********************g3=g1^rB:********************************\n"); + zzn12_ElementPrint(*g3); + + //---------------- B5:SKB=KDF(IDA||IDB||RA||RB||g1||g2||g3,klen)---------- + buf = SM9_standard_keyex_kdf(IDA, IDB, RA, RB, *g1, *g2, *g3, 16, SKB); + if(buf) + return buf; + printf("\n***********SKB=KDF(IDA||IDB||RA||RB||g1||g2||g3,klen):***********\n"); + for(i = 0; i < 16; i++) + printf("%02x", SKB[i]); + + //---------------- B6(optional):SB=Hash(0x82||g1||Hash(g2||g3||IDA||IDB||RA||RB))---------- + buf = SM9_standard_keyex_hash(hashid, IDA, IDB, RA, RB, *g1, *g2, *g3, SB); + if(buf) + return buf; + printf("\n********SB=Hash(0x82||g1||Hash(g2||g3||IDA||IDB||RA||RB))********\n"); + for(i = 0; i < SM3_len / 8; i++) + printf("%02x", SB[i]); + + free(Z); + return 0; +} + + +int SM9_standard_keyex_inita_ii(unsigned char *IDA, unsigned char *IDB, unsigned char randA[], unsigned char Ppub[], + unsigned char deA[], epoint *RA, epoint *RB, unsigned char SB[], unsigned char SA[]) +{ + big h, x, y, rA; + epoint *Ppube; + unsigned char hashid[] = {0x82}; + unsigned char S1[SM3_len / 8], SKA[16]; + zzn12 g1, g2, g3; + ecn2 dEA; + int buf, i; + + //initiate + h = mirvar(0); + rA = mirvar(0); + x = mirvar(0); + y = mirvar(0); + Ppube = epoint_init(); + dEA.x.a = mirvar(0); + dEA.x.b = mirvar(0); + dEA.y.a = mirvar(0); + dEA.y.b = mirvar(0); + dEA.z.a = mirvar(0); + dEA.z.b = mirvar(0); + dEA.marker = MR_EPOINT_INFINITY; + zzn12_init(&g1); + zzn12_init(&g2); + zzn12_init(&g3); + + bytes_to_big(BNLEN, Ppub, x); + bytes_to_big(BNLEN, Ppub + BNLEN, y); + bytes_to_big(BNLEN, randA, rA); + bytes128_to_ecn2(deA, &dEA); + epoint_set(x, y, 0, Ppube); + + //test if RB is on G1 + if(Test_Point(RB)) + return SM9_NOT_VALID_G1; + + //----------------Step A5:g1=(e(P2,Ppube))^rA,g2=e(deA,RB),g3=g2^rA--------- + if(!ecap(P2, Ppube, para_t, X, &g1)) + return SM9_MY_ECAP_12A_ERR; + if(!ecap(dEA, RB, para_t, X, &g2)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if((!member(g1, para_t, X)) || (!member(g2, para_t, X))) + return SM9_MEMBER_ERR; + + g1 = zzn12_pow(g1, rA); + g3 = zzn12_pow(g2, rA); + printf("\n***********************g1=e(Ppub,P2):****************************\n"); + zzn12_ElementPrint(g1); + printf("\n*******************g2=(e(RB,deA))^rB:*************************\n"); + zzn12_ElementPrint(g2); + printf("\n***********************g3=g2^rB:********************************\n"); + zzn12_ElementPrint(g3); + + //------------------ A6:S1=Hash(0x82||g1||Hash(g2||g3||IDA||IDB||RA||RB))---------- + buf = SM9_standard_keyex_hash(hashid, IDA, IDB, RA, RB, g1, g2, g3, S1); + if(buf) + return buf; + printf("\n*********S1=Hash(0x82||g1||Hash(g2||g3||IDA||IDB||RA||RB))********\n"); + for(i = 0; i < SM3_len / 8; i++) + printf("%02x", S1[i]); + + if(memcmp(S1, SB, SM3_len / 8)) + return SM9_ERR_CMP_S1SB; + + //---------- A7: SKA=KDF(IDA||IDB||RA||RB||g1||g2||g3,klen)---------- + buf = SM9_standard_keyex_kdf(IDA, IDB, RA, RB, g1, g2, g3, 16, SKA); + if(buf) + return buf; + printf("\n************SKA=KDF(IDA||IDB||RA||RB||g1||g2||g3,klen)************\n"); + for(i = 0; i < 16; i++) + printf("%02x", SKA[i]); + + //--------- A8(optional):SA=Hash(0x83||g1||Hash(g2||g3||IDA||IDB||RA||RB))---------- + hashid[0] = (unsigned char)0x83; + buf = SM9_standard_keyex_hash(hashid, IDA, IDB, RA, RB, g1, g2, g3, SA); + if(buf) + return buf; + printf("\n*********SA=Hash(0x83||g1||Hash(g2||g3||IDA||IDB||RA||RB))********\n"); + for(i = 0; i < SM3_len / 8; i++) + printf("%02x", SA[i]); + + return 0; +} + + +int SM9_standard_keyex_reb_ii(unsigned char *IDA, unsigned char *IDB, zzn12 g1, zzn12 g2, zzn12 g3, epoint *RA, epoint *RB, unsigned char SA[]) +{ + unsigned char hashid[] = {0x83}; + unsigned char S2[SM3_len / 8]; + int buf, i; + + //---------------- B8(optional):S2=Hash(0x83||g1||Hash(g2||g3||IDA||IDB||RA||RB))---------- + buf = SM9_standard_keyex_hash(hashid, IDA, IDB, RA, RB, g1, g2, g3, S2); + if(buf) + return buf; + printf("\n*************** S2=Hash(0x83||g1||Hash(g2||g3||IDA||IDB||RA||RB))****************\n"); + for(i = 0; i < SM3_len / 8; i++) + printf("%02x", S2[i]); + + if(memcmp(S2, SA, SM3_len / 8)) + return SM9_ERR_CMP_S2SA; + return 0; +} + + +int SM9_standard_exch_selfcheck() +{ + //the master private key + unsigned char KE[32] = {0x00, 0x02, 0xE6, 0x5B, 0x07, 0x62, 0xD0, 0x42, 0xF5, 0x1F, 0x0D, 0x23, 0x54, 0x2B, 0x13, 0xED, + 0x8C, 0xFA, 0x2E, 0x9A, 0x0E, 0x72, 0x06, 0x36, 0x1E, 0x01, 0x3A, 0x28, 0x39, 0x05, 0xE3, 0x1F}; + unsigned char randA[32] = {0x00, 0x00, 0x58, 0x79, 0xDD, 0x1D, 0x51, 0xE1, 0x75, 0x94, 0x6F, 0x23, 0xB1, 0xB4, 0x1E, 0x93, + 0xBA, 0x31, 0xC5, 0x84, 0xAE, 0x59, 0xA4, 0x26, 0xEC, 0x10, 0x46, 0xA4, 0xD0, 0x3B, 0x06, 0xC8}; + unsigned char randB[32] = {0x00, 0x01, 0x8B, 0x98, 0xC4, 0x4B, 0xEF, 0x9F, 0x85, 0x37, 0xFB, 0x7D, 0x07, 0x1B, 0x2C, 0x92, + 0x8B, 0x3B, 0xC6, 0x5B, 0xD3, 0xD6, 0x9E, 0x1E, 0xEE, 0x21, 0x35, 0x64, 0x90, 0x56, 0x34, 0xFE}; + //standard datas + unsigned char std_Ppub[64] = {0x91, 0x74, 0x54, 0x26, 0x68, 0xE8, 0xF1, 0x4A, 0xB2, 0x73, 0xC0, 0x94, 0x5C, 0x36, 0x90, 0xC6, + 0x6E, 0x5D, 0xD0, 0x96, 0x78, 0xB8, 0x6F, 0x73, 0x4C, 0x43, 0x50, 0x56, 0x7E, 0xD0, 0x62, 0x83, + 0x54, 0xE5, 0x98, 0xC6, 0xBF, 0x74, 0x9A, 0x3D, 0xAC, 0xC9, 0xFF, 0xFE, 0xDD, 0x9D, 0xB6, 0x86, + 0x6C, 0x50, 0x45, 0x7C, 0xFC, 0x7A, 0xA2, 0xA4, 0xAD, 0x65, 0xC3, 0x16, 0x8F, 0xF7, 0x42, 0x10}; + unsigned char std_deA[128] = {0x0F, 0xE8, 0xEA, 0xB3, 0x95, 0x19, 0x9B, 0x56, 0xBF, 0x1D, 0x75, 0xBD, 0x2C, 0xD6, 0x10, 0xB6, + 0x42, 0x4F, 0x08, 0xD1, 0x09, 0x29, 0x22, 0xC5, 0x88, 0x2B, 0x52, 0xDC, 0xD6, 0xCA, 0x83, 0x2A, + 0x7D, 0xA5, 0x7B, 0xC5, 0x02, 0x41, 0xF9, 0xE5, 0xBF, 0xDD, 0xC0, 0x75, 0xDD, 0x9D, 0x32, 0xC7, + 0x77, 0x71, 0x00, 0xD7, 0x36, 0x91, 0x6C, 0xFC, 0x16, 0x5D, 0x8D, 0x36, 0xE0, 0x63, 0x4C, 0xD7, + 0x83, 0xA4, 0x57, 0xDA, 0xF5, 0x2C, 0xAD, 0x46, 0x4C, 0x90, 0x3B, 0x26, 0x06, 0x2C, 0xAF, 0x93, + 0x7B, 0xB4, 0x0E, 0x37, 0xDA, 0xDE, 0xD9, 0xED, 0xA4, 0x01, 0x05, 0x0E, 0x49, 0xC8, 0xAD, 0x0C, + 0x69, 0x70, 0x87, 0x6B, 0x9A, 0xAD, 0x1B, 0x7A, 0x50, 0xBB, 0x48, 0x63, 0xA1, 0x1E, 0x57, 0x4A, + 0xF1, 0xFE, 0x3C, 0x59, 0x75, 0x16, 0x1D, 0x73, 0xDE, 0x4C, 0x3A, 0xF6, 0x21, 0xFB, 0x1E, 0xFB}; + unsigned char std_deB[128] = {0x74, 0xCC, 0xC3, 0xAC, 0x9C, 0x38, 0x3C, 0x60, 0xAF, 0x08, 0x39, 0x72, 0xB9, 0x6D, 0x05, 0xC7, + 0x5F, 0x12, 0xC8, 0x90, 0x7D, 0x12, 0x8A, 0x17, 0xAD, 0xAF, 0xBA, 0xB8, 0xC5, 0xA4, 0xAC, 0xF7, + 0x01, 0x09, 0x2F, 0xF4, 0xDE, 0x89, 0x36, 0x26, 0x70, 0xC2, 0x17, 0x11, 0xB6, 0xDB, 0xE5, 0x2D, + 0xCD, 0x5F, 0x8E, 0x40, 0xC6, 0x65, 0x4B, 0x3D, 0xEC, 0xE5, 0x73, 0xC2, 0xAB, 0x3D, 0x29, 0xB2, + 0x44, 0xB0, 0x29, 0x4A, 0xA0, 0x42, 0x90, 0xE1, 0x52, 0x4F, 0xF3, 0xE3, 0xDA, 0x8C, 0xFD, 0x43, + 0x2B, 0xB6, 0x4D, 0xE3, 0xA8, 0x04, 0x0B, 0x5B, 0x88, 0xD1, 0xB5, 0xFC, 0x86, 0xA4, 0xEB, 0xC1, + 0x8C, 0xFC, 0x48, 0xFB, 0x4F, 0xF3, 0x7F, 0x1E, 0x27, 0x72, 0x74, 0x64, 0xF3, 0xC3, 0x4E, 0x21, + 0x53, 0x86, 0x1A, 0xD0, 0x8E, 0x97, 0x2D, 0x16, 0x25, 0xFC, 0x1A, 0x7B, 0xD1, 0x8D, 0x55, 0x39}; + unsigned char std_RA[64] = {0x7C, 0xBA, 0x5B, 0x19, 0x06, 0x9E, 0xE6, 0x6A, 0xA7, 0x9D, 0x49, 0x04, 0x13, 0xD1, 0x18, 0x46, + 0xB9, 0xBA, 0x76, 0xDD, 0x22, 0x56, 0x7F, 0x80, 0x9C, 0xF2, 0x3B, 0x6D, 0x96, 0x4B, 0xB2, 0x65, + 0xA9, 0x76, 0x0C, 0x99, 0xCB, 0x6F, 0x70, 0x63, 0x43, 0xFE, 0xD0, 0x56, 0x37, 0x08, 0x58, 0x64, + 0x95, 0x8D, 0x6C, 0x90, 0x90, 0x2A, 0xBA, 0x7D, 0x40, 0x5F, 0xBE, 0xDF, 0x7B, 0x78, 0x15, 0x99}; + unsigned char std_RB[64] = {0x86, 0x1E, 0x91, 0x48, 0x5F, 0xB7, 0x62, 0x3D, 0x27, 0x94, 0xF4, 0x95, 0x03, 0x1A, 0x35, 0x59, + 0x8B, 0x49, 0x3B, 0xD4, 0x5B, 0xE3, 0x78, 0x13, 0xAB, 0xC7, 0x10, 0xFC, 0xC1, 0xF3, 0x44, 0x82, + 0x32, 0xD9, 0x06, 0xA4, 0x69, 0xEB, 0xC1, 0x21, 0x6A, 0x80, 0x2A, 0x70, 0x52, 0xD5, 0x61, 0x7C, + 0xD4, 0x30, 0xFB, 0x56, 0xFB, 0xA7, 0x29, 0xD4, 0x1D, 0x9B, 0xD6, 0x68, 0xE9, 0xEB, 0x96, 0x00}; + unsigned char std_SA[32] = {0x19, 0x5D, 0x1B, 0x72, 0x56, 0xBA, 0x7E, 0x0E, 0x67, 0xC7, 0x12, 0x02, 0xA2, 0x5F, 0x8C, 0x94, + 0xFF, 0x82, 0x41, 0x70, 0x2C, 0x2F, 0x55, 0xD6, 0x13, 0xAE, 0x1C, 0x6B, 0x98, 0x21, 0x51, 0x72}; + unsigned char std_SB[32] = {0x3B, 0xB4, 0xBC, 0xEE, 0x81, 0x39, 0xC9, 0x60, 0xB4, 0xD6, 0x56, 0x6D, 0xB1, 0xE0, 0xD5, 0xF0, + 0xB2, 0x76, 0x76, 0x80, 0xE5, 0xE1, 0xBF, 0x93, 0x41, 0x03, 0xE6, 0xC6, 0x6E, 0x40, 0xFF, 0xEE}; + + unsigned char hid[] = {0x02}, *IDA = "Alice", *IDB = "Bob"; + unsigned char Ppub[64], deA[128], deB[128]; + unsigned char xy[64], SA[SM3_len / 8], SB[SM3_len / 8]; + epoint *RA, *RB; + big ke, x, y; + zzn12 g1, g2, g3; + int tmp, i; + + mip = mirsys(1000, 16); + mip->IOBASE = 16; + x = mirvar(0); + y = mirvar(0); + ke = mirvar(0); + bytes_to_big(32, KE, ke); + RA = epoint_init(); + RB = epoint_init(); + zzn12_init(&g1); + zzn12_init(&g2); + zzn12_init(&g3); + + tmp = SM9_standard_init(); + if(tmp != 0) + return tmp; + + printf("\n*********************** SM9 key Generation ***************************\n"); + tmp = SM9_standard_generateencryptkey(hid, IDA, strlen(IDA), ke, Ppub, deA); + if(tmp != 0) + return tmp; + tmp = SM9_standard_generateencryptkey(hid, IDB, strlen(IDB), ke, Ppub, deB); + if(tmp != 0) + return tmp; + if(memcmp(Ppub, std_Ppub, 64) != 0) + return SM9_GEPUB_ERR; + if(memcmp(deA, std_deA, 128) != 0) + return SM9_GEPRI_ERR; + if(memcmp(deB, std_deB, 128) != 0) + return SM9_GEPRI_ERR; + + printf("\n**********************PublicKey Ppubs=[ke]P1:*************************\n"); + for(i = 0; i < 64; i++) + printf("%02x", Ppub[i]); + printf("\n**************The private key deA = (xdeA, ydeA):*********************\n"); + for(i = 0; i < 128; i++) + printf("%02x", deA[i]); + printf("\n**************The private key deB = (xdeB, ydeB):*********************\n"); + for(i = 0; i < 128; i++) + printf("%02x", deB[i]); + + printf("\n//////////////////// SM9 Key exchange A1-A4://////////////////////////\n"); + tmp = SM9_standard_keyex_inita_i(hid, IDB, randA, Ppub, deA, RA); + if(tmp != 0) + return tmp; + printf("\n ////////////////////////////:RA=[r]QB //////////////////////////////\n"); + epoint_get(RA, x, y); + cotnum(x, stdout); + cotnum(y, stdout); + big_to_bytes(BNLEN, x, xy, 1); + big_to_bytes(BNLEN, y, xy + BNLEN, 1); + if(memcmp(xy, std_RA, BNLEN * 2) != 0) + return SM9_ERR_RA; + + printf("\n//////////////////////// SM9 Key exchange B1-B7:///////////////////////\n"); + tmp = SM9_standard_keyex_reb_i(hid, IDA, IDB, randB, Ppub, deB, RA, RB, SB, &g1, &g2, &g3); + if(tmp != 0) + return tmp; + epoint_get(RB, x, y); + big_to_bytes(BNLEN, x, xy, 1); + big_to_bytes(BNLEN, y, xy + BNLEN, 1); + + if(memcmp(xy, std_RB, BNLEN * 2) != 0) + return SM9_ERR_RB; + if(memcmp(SB, std_SB, SM3_len / 8) != 0) + return SM9_ERR_SB; + + printf("\n//////////////////////// SM9 Key exchange A5-A8:///////////////////////\n"); + tmp = SM9_standard_keyex_inita_ii(IDA, IDB, randA, Ppub, deA, RA, RB, SB, SA); + if(tmp!=0) + return tmp; + if(memcmp(SA, std_SA, SM3_len / 8) != 0) + return SM9_ERR_SA; + + printf("\n//////////////////////// SM9 Key exchange B8:///////////////////////\n"); + tmp = SM9_standard_keyex_reb_ii(IDA, IDB, g1, g2, g3, RA, RB, SA); + if(tmp != 0) + return tmp; + + return 0; +} diff --git a/engines/sm_standard/sm9/sm9_standard_sv.c b/engines/sm_standard/sm9/sm9_standard_sv.c new file mode 100644 index 00000000..f27fc534 --- /dev/null +++ b/engines/sm_standard/sm9/sm9_standard_sv.c @@ -0,0 +1,446 @@ +/* ==================================================================== + * Copyright (c) 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 "sm9_standard.h" +#include "miracl.h" +#include "mirdef.h" +#include + + +int SM9_standard_h2(unsigned char Z[], int Zlen, big n, big h2) +{ + int hlen, ZHlen, i; + big hh, i256, tmp, n1; + unsigned char *ZH = NULL, *ha = NULL; + + hh = mirvar(0); + i256 = mirvar(0); + tmp = mirvar(0); + n1 = mirvar(0); + convert(1, i256); + ZHlen = Zlen + 1; + + hlen = (int)ceil((5.0 * logb2(n)) / 32.0); + decr(n, 1, n1); + ZH = (char *)malloc(sizeof(char)*(ZHlen + 1)); + if(ZH == NULL) + return SM9_ASK_MEMORY_ERR; + memcpy(ZH + 1, Z, Zlen); + ZH[0] = 0x02; + ha = (char *)malloc(sizeof(char)*(hlen + 1)); + if(ha == NULL) + return SM9_ASK_MEMORY_ERR; + SM3_kdf(ZH, ZHlen, hlen, ha); + + for(i = hlen - 1; i >= 0; i--)//key[从大到小] + { + premult(i256, ha[i], tmp); + add(hh, tmp, hh); + premult(i256, 256, i256); + divide(i256, n1, tmp); + divide(hh, n1, tmp); + } + incr(hh, 1, h2); + free(ZH); + free(ha); + return 0; +} + + + +int SM9_standard_generatesignkey(unsigned char hid[], unsigned char *ID, int IDlen, big ks, unsigned char Ppubs[], unsigned char dsa[]) +{ + big h1, t1, t2, rem, xdSA, ydSA, tmp; + unsigned char *Z = NULL; + int Zlen = IDlen + 1, buf; + ecn2 Ppub; + epoint *dSA; + + h1 = mirvar(0); + t1 = mirvar(0); + t2 = mirvar(0); + rem = mirvar(0); + tmp = mirvar(0); + xdSA = mirvar(0); + ydSA = mirvar(0); + dSA = epoint_init(); + Ppub.x.a = mirvar(0); + Ppub.x.b = mirvar(0); + Ppub.y.a = mirvar(0); + Ppub.y.b = mirvar(0); + Ppub.z.a = mirvar(0); + Ppub.z.b = mirvar(0); + Ppub.marker = MR_EPOINT_INFINITY; + + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + memcpy(Z, ID, IDlen); + memcpy(Z + IDlen, hid, 1); + + buf = SM9_standard_h1(Z, Zlen, N, h1); + if(buf != 0) + return buf; + add(h1, ks, t1);//t1=H1(IDA||hid,N)+ks + xgcd(t1, N, t1, t1, t1);//t1=t1(-1) + multiply(ks, t1, t2); + divide(t2, N, rem);//t2=ks*t1(-1) + + //dSA=[t2]P1 + ecurve_mult(t2, P1, dSA); + + //Ppub=[ks]P2 + ecn2_copy(&P2, &Ppub); + ecn2_mul(ks, &Ppub); + + printf("\n*********************The signed key = (xdA, ydA):*********************\n"); + epoint_get(dSA, xdSA, ydSA); + cotnum(xdSA, stdout); + cotnum(ydSA, stdout); + printf("\n**********************PublicKey Ppubs=[ks]P2:*************************\n"); + ecn2_Bytes128_Print(Ppub); + + epoint_get(dSA, xdSA, ydSA); + big_to_bytes(BNLEN, xdSA, dsa, 1); + big_to_bytes(BNLEN, ydSA, dsa + BNLEN, 1); + + redc(Ppub.x.b, tmp); + big_to_bytes(BNLEN, tmp, Ppubs, 1); + redc(Ppub.x.a, tmp); + big_to_bytes(BNLEN, tmp, Ppubs + BNLEN, 1); + redc(Ppub.y.b, tmp); + big_to_bytes(BNLEN, tmp, Ppubs + BNLEN * 2, 1); + redc(Ppub.y.a, tmp); + big_to_bytes(BNLEN, tmp, Ppubs + BNLEN * 3, 1); + + free(Z); + return 0; +} + + +int SM9_standard_sign(unsigned char hid[], unsigned char *IDA, unsigned char *message, int len, unsigned char rand[], unsigned char dsa[], unsigned char Ppub[], unsigned char H[], unsigned char S[]) +{ + big h1, r, h, l, xdSA, ydSA; + big xS, yS, tmp, zero; + zzn12 g, w; + epoint *s, *dSA; + ecn2 Ppubs; + int Zlen, buf; + unsigned char *Z = NULL; + + //initiate + h1 = mirvar(0); + r = mirvar(0); + h = mirvar(0); + l = mirvar(0); + tmp = mirvar(0); + zero = mirvar(0); + xS = mirvar(0); + yS = mirvar(0); + xdSA = mirvar(0); + ydSA = mirvar(0); + s = epoint_init(); + dSA = epoint_init(); + Ppubs.x.a = mirvar(0); + Ppubs.x.b = mirvar(0); + Ppubs.y.a = mirvar(0); + Ppubs.y.b = mirvar(0); + Ppubs.z.a = mirvar(0); + Ppubs.z.b = mirvar(0); + Ppubs.marker = MR_EPOINT_INFINITY; + zzn12_init(&g); + zzn12_init(&w); + + bytes_to_big(BNLEN, rand, r); + bytes_to_big(BNLEN, dsa, xdSA); + bytes_to_big(BNLEN, dsa + BNLEN, ydSA); + epoint_set(xdSA, ydSA, 0, dSA); + bytes128_to_ecn2(Ppub, &Ppubs); + + //Step1:g = e(P1, Ppub-s) + if(!ecap(Ppubs, P1, para_t, X, &g)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if(!member(g, para_t, X)) + return SM9_MEMBER_ERR; + + printf("\n***********************g=e(P1,Ppubs):****************************\n"); + zzn12_ElementPrint(g); + + //Step2:calculate w=g(r) + printf("\n***********************randnum r:********************************\n"); + cotnum(r, stdout); + w = zzn12_pow(g, r); + printf("\n***************************w=gr:**********************************\n"); + zzn12_ElementPrint(w); + + //Step3:calculate h=H2(M||w,N) + Zlen = len + 32 * 12; + Z = (char *)malloc(sizeof(char)*(Zlen + 1)); + if(Z == NULL) + return SM9_ASK_MEMORY_ERR; + + LinkCharZzn12(message, len, w, Z, Zlen); + buf = SM9_standard_h2(Z, Zlen, N, h); + if(buf != 0) + return buf; + printf("\n****************************h:*************************************\n"); + cotnum(h, stdout); + + //Step4:l=(r-h)mod N + subtract(r, h, l); + divide(l, N, tmp); + while(mr_compare(l, zero) < 0) + add(l, N, l); + if(mr_compare(l, zero) == 0) + return SM9_L_error; + printf("\n**************************l=(r-h)mod N:****************************\n"); + cotnum(l, stdout); + + //Step5:S=[l]dSA=(xS,yS) + ecurve_mult(l, dSA, s); + epoint_get(s, xS, yS); + printf("\n**************************S=[l]dSA=(xS,yS):*************************\n"); + cotnum(xS, stdout); + cotnum(yS, stdout); + + big_to_bytes(32, h, H, 1); + big_to_bytes(32, xS, S, 1); + big_to_bytes(32, yS, S + 32, 1); + + free(Z); + return 0; +} + + +int SM9_standard_verify(unsigned char H[], unsigned char S[], unsigned char hid[], unsigned char *IDA, unsigned char *message, int len, unsigned char Ppub[]) +{ + big h, xS, yS, h1, h2; + epoint *S1; + zzn12 g, t, u, w; + ecn2 P, Ppubs; + int Zlen1, Zlen2, buf; + unsigned char * Z1 = NULL, *Z2 = NULL; + + h = mirvar(0); + h1 = mirvar(0); + h2 = mirvar(0); + xS = mirvar(0); + yS = mirvar(0); + P.x.a = mirvar(0); + P.x.b = mirvar(0); + P.y.a = mirvar(0); + P.y.b = mirvar(0); + P.z.a = mirvar(0); + P.z.b = mirvar(0); + P.marker = MR_EPOINT_INFINITY; + Ppubs.x.a = mirvar(0); + Ppubs.x.b = mirvar(0); + Ppubs.y.a = mirvar(0); + Ppubs.y.b = mirvar(0); + Ppubs.z.a = mirvar(0); + Ppubs.z.b = mirvar(0); + Ppubs.marker = MR_EPOINT_INFINITY; + S1 = epoint_init(); + zzn12_init(&g); + zzn12_init(&t); + zzn12_init(&u); + zzn12_init(&w); + + bytes_to_big(BNLEN, H, h); + bytes_to_big(BNLEN, S, xS); + bytes_to_big(BNLEN, S + BNLEN, yS); + bytes128_to_ecn2(Ppub, &Ppubs); + + //Step 1:test if h in the rangge [1,N-1] + if(Test_Range(h)) + return SM9_H_OUTRANGE; + + //Step 2:test if S is on G1 + epoint_set(xS, yS, 0, S1); + if(Test_Point(S1)) + return SM9_S_NOT_VALID_G1; + + //Step3:g = e(P1, Ppub-s) + if(!ecap(Ppubs, P1, para_t, X, &g)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if(!member(g, para_t, X)) + return SM9_MEMBER_ERR; + + printf("\n***********************g=e(P1,Ppubs):****************************\n"); + zzn12_ElementPrint(g); + + //Step4:calculate t=g(h) + t = zzn12_pow(g, h); + printf("\n***************************w=gh:**********************************\n"); + zzn12_ElementPrint(t); + + //Step5:calculate h1=H1(IDA||hid,N) + Zlen1 = strlen(IDA) + 1; + Z1 = (char *)malloc(sizeof(char)*(Zlen1 + 1)); + if(Z1 == NULL) + return SM9_ASK_MEMORY_ERR; + + memcpy(Z1, IDA, strlen(IDA)); + memcpy(Z1 + strlen(IDA), hid, 1); + buf = SM9_standard_h1(Z1, Zlen1, N, h1); + if(buf != 0) + return buf; + printf("\n****************************h1:**********************************\n"); + cotnum(h1, stdout); + + //Step6:P=[h1]P2+Ppubs + ecn2_copy(&P2, &P); + ecn2_mul(h1, &P); + ecn2_add(&Ppubs, &P); + + //Step7:u=e(S1,P) + if(!ecap(P, S1, para_t, X, &u)) + return SM9_MY_ECAP_12A_ERR; + //test if a ZZn12 element is of order q + if(!member(u, para_t, X)) + return SM9_MEMBER_ERR; + printf("\n************************** u=e(S1,P):*****************************\n"); + zzn12_ElementPrint(u); + + //Step8:w=u*t + zzn12_mul(u, t, &w); + printf("\n************************* w=u*t: **********************************\n"); + zzn12_ElementPrint(w); + + //Step9:h2=H2(M||w,N) + Zlen2 = len + 32 * 12; + Z2 = (char *)malloc(sizeof(char)*(Zlen2 + 1)); + if(Z2 == NULL) + return SM9_ASK_MEMORY_ERR; + + LinkCharZzn12(message, len, w, Z2, Zlen2); + buf = SM9_standard_h2(Z2, Zlen2, N, h2); + if(buf != 0) + return buf; + printf("\n**************************** h2:***********************************\n"); + cotnum(h2, stdout); + + free(Z1); + free(Z2); + if(mr_compare(h2, h) != 0) + return SM9_DATA_MEMCMP_ERR; + + return 0; +} + + +int SM9_standard_sv_selfcheck() +{ + //the master private key + unsigned char dA[32] = {0x00, 0x01, 0x30, 0xE7, 0x84, 0x59, 0xD7, 0x85, 0x45, 0xCB, 0x54, 0xC5, 0x87, 0xE0, 0x2C, 0xF4, + 0x80, 0xCE, 0x0B, 0x66, 0x34, 0x0F, 0x31, 0x9F, 0x34, 0x8A, 0x1D, 0x5B, 0x1F, 0x2D, 0xC5, 0xF4}; + unsigned char rand[32] = {0x00, 0x03, 0x3C, 0x86, 0x16, 0xB0, 0x67, 0x04, 0x81, 0x32, 0x03, 0xDF, 0xD0, 0x09, 0x65, 0x02, + 0x2E, 0xD1, 0x59, 0x75, 0xC6, 0x62, 0x33, 0x7A, 0xED, 0x64, 0x88, 0x35, 0xDC, 0x4B, 0x1C, 0xBE}; + + unsigned char h[32], S[64];// Signature + unsigned char Ppub[128], dSA[64]; + + unsigned char std_h[32] = {0x82, 0x3C, 0x4B, 0x21, 0xE4, 0xBD, 0x2D, 0xFE, 0x1E, 0xD9, 0x2C, 0x60, 0x66, 0x53, 0xE9, 0x96, + 0x66, 0x85, 0x63, 0x15, 0x2F, 0xC3, 0x3F, 0x55, 0xD7, 0xBF, 0xBB, 0x9B, 0xD9, 0x70, 0x5A, 0xDB}; + unsigned char std_S[64] = {0x73, 0xBF, 0x96, 0x92, 0x3C, 0xE5, 0x8B, 0x6A, 0xD0, 0xE1, 0x3E, 0x96, 0x43, 0xA4, 0x06, 0xD8, + 0xEB, 0x98, 0x41, 0x7C, 0x50, 0xEF, 0x1B, 0x29, 0xCE, 0xF9, 0xAD, 0xB4, 0x8B, 0x6D, 0x59, 0x8C, + 0x85, 0x67, 0x12, 0xF1, 0xC2, 0xE0, 0x96, 0x8A, 0xB7, 0x76, 0x9F, 0x42, 0xA9, 0x95, 0x86, 0xAE, + 0xD1, 0x39, 0xD5, 0xB8, 0xB3, 0xE1, 0x58, 0x91, 0x82, 0x7C, 0xC2, 0xAC, 0xED, 0x9B, 0xAA, 0x05}; + unsigned char std_Ppub[128] = {0x9F, 0x64, 0x08, 0x0B, 0x30, 0x84, 0xF7, 0x33, 0xE4, 0x8A, 0xFF, 0x4B, 0x41, 0xB5, 0x65, 0x01, + 0x1C, 0xE0, 0x71, 0x1C, 0x5E, 0x39, 0x2C, 0xFB, 0x0A, 0xB1, 0xB6, 0x79, 0x1B, 0x94, 0xC4, 0x08, + 0x29, 0xDB, 0xA1, 0x16, 0x15, 0x2D, 0x1F, 0x78, 0x6C, 0xE8, 0x43, 0xED, 0x24, 0xA3, 0xB5, 0x73, + 0x41, 0x4D, 0x21, 0x77, 0x38, 0x6A, 0x92, 0xDD, 0x8F, 0x14, 0xD6, 0x56, 0x96, 0xEA, 0x5E, 0x32, + 0x69, 0x85, 0x09, 0x38, 0xAB, 0xEA, 0x01, 0x12, 0xB5, 0x73, 0x29, 0xF4, 0x47, 0xE3, 0xA0, 0xCB, + 0xAD, 0x3E, 0x2F, 0xDB, 0x1A, 0x77, 0xF3, 0x35, 0xE8, 0x9E, 0x14, 0x08, 0xD0, 0xEF, 0x1C, 0x25, + 0x41, 0xE0, 0x0A, 0x53, 0xDD, 0xA5, 0x32, 0xDA, 0x1A, 0x7C, 0xE0, 0x27, 0xB7, 0xA4, 0x6F, 0x74, + 0x10, 0x06, 0xE8,0x5F,0x5C,0xDF,0xF0,0x73,0x0E,0x75,0xC0,0x5F,0xB4,0xE3,0x21, 0x6D}; + unsigned char std_dSA[64] = {0xA5, 0x70, 0x2F, 0x05, 0xCF, 0x13, 0x15, 0x30, 0x5E, 0x2D, 0x6E, 0xB6, 0x4B, 0x0D, 0xEB, 0x92, + 0x3D, 0xB1, 0xA0, 0xBC, 0xF0, 0xCA, 0xFF, 0x90, 0x52, 0x3A, 0xC8, 0x75, 0x4A, 0xA6, 0x98, 0x20, + 0x78, 0x55, 0x9A, 0x84, 0x44, 0x11, 0xF9, 0x82, 0x5C, 0x10, 0x9F, 0x5E, 0xE3, 0xF5, 0x2D, 0x72, + 0x0D, 0xD0, 0x17, 0x85, 0x39, 0x2A, 0x72, 0x7B, 0xB1, 0x55, 0x69, 0x52, 0xB2, 0xB0, 0x13, 0xD3}; + + unsigned char hid[] = {0x01}; + unsigned char *IDA = "Alice"; + unsigned char *message = "Chinese IBS standard";//the message to be signed + int mlen = strlen(message), tmp;//the length of message + big ks; + + tmp = SM9_standard_init(); + + if(tmp != 0) + return tmp; + ks = mirvar(0); + + bytes_to_big(32, dA, ks); + + printf("\n*********************** SM9 key Generation ***************************\n"); + tmp = SM9_standard_generatesignkey(hid, IDA, strlen(IDA), ks, Ppub, dSA); + if(tmp != 0) + return tmp; + if(memcmp(Ppub, std_Ppub, 128) != 0) + return SM9_GEPUB_ERR; + if(memcmp(dSA, std_dSA, 64) != 0) + return SM9_GEPRI_ERR; + + printf("\n********************** SM9 signature algorithm***************************\n"); + tmp = SM9_standard_sign(hid, IDA, message, mlen, rand, dSA, Ppub, h, S); + if(tmp != 0) + return tmp; + if(memcmp(h, std_h, 32) != 0) + return SM9_SIGN_ERR; + if(memcmp(S, std_S, 64) != 0) + return SM9_SIGN_ERR; + printf("\n******************* SM9 verification algorithm *************************\n"); + tmp = SM9_standard_verify(h, S, hid, IDA, message, mlen, Ppub); + if(tmp != 0) + return tmp; + + return 0; +} diff --git a/engines/sm_standard/sm9/zzn12_operation.h b/engines/sm_standard/sm9/zzn12_operation.h new file mode 100644 index 00000000..3f535113 --- /dev/null +++ b/engines/sm_standard/sm9/zzn12_operation.h @@ -0,0 +1,462 @@ +/* ==================================================================== + * Copyright (c) 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_ZZN12_OPERATION_H +#define HEADER_ZZN12_OPERATION_H + + +#include "miracl.h" + + +#ifdef __cplusplus +extern "C"{ +#endif + +miracl* mip; +zzn2 X; //Frobniues constant +typedef struct +{ + zzn4 a, b, c; + BOOL unitary; // "unitary property means that fast squaring can be used, and inversions are just conjugates + BOOL miller; // "miller" property means that arithmetic on this instance can ignore multiplications + // or divisions by constants - as instance will eventually be raised to (p-1). +} zzn12; + + +static void zzn12_init(zzn12 *x) +{ + x->a.a.a = mirvar(0); + x->a.a.b = mirvar(0); + + x->a.b.a = mirvar(0); + x->a.b.b = mirvar(0); + + x->a.unitary = FALSE; + + + x->b.a.a = mirvar(0); + x->b.a.b = mirvar(0); + + x->b.b.a = mirvar(0); + x->b.b.b = mirvar(0); + + x->b.unitary = FALSE; + + + x->c.a.a = mirvar(0); + x->c.a.b = mirvar(0); + + x->c.b.a = mirvar(0); + x->c.b.b = mirvar(0); + + x->c.unitary = FALSE; + + + x->miller = FALSE; + x->unitary = FALSE; +} + + +static void zzn12_copy(zzn12 *x, zzn12 *y) +{ + zzn4_copy(&x->a, &y->a); + zzn4_copy(&x->b, &y->b); + zzn4_copy(&x->c, &y->c); + + y->miller = x->miller; + y->unitary = x->unitary; +} + + +static void zzn12_mul(zzn12 x, zzn12 y, zzn12 *z) +{ + // Karatsuba + zzn4 Z0, Z1, Z2, Z3, T0, T1; + BOOL zero_c, zero_b; + + Z0.a.a = mirvar(0); + Z0.a.b = mirvar(0); + + Z0.b.a = mirvar(0); + Z0.b.b = mirvar(0); + + Z0.unitary = FALSE; + + + Z1.a.a = mirvar(0); + Z1.a.b = mirvar(0); + + Z1.b.a = mirvar(0); + Z1.b.b = mirvar(0); + + Z1.unitary = FALSE; + + + Z2.a.a = mirvar(0); + Z2.a.b = mirvar(0); + + Z2.b.a = mirvar(0); + Z2.b.b = mirvar(0); + + Z2.unitary = FALSE; + + + Z3.a.a = mirvar(0); + Z3.a.b = mirvar(0); + + Z3.b.a = mirvar(0); + Z3.b.b = mirvar(0); + + Z3.unitary = FALSE; + + + T0.a.a = mirvar(0); + T0.a.b = mirvar(0); + + T0.b.a = mirvar(0); + T0.b.b = mirvar(0); + + T0.unitary = FALSE; + + + T1.a.a = mirvar(0); + T1.a.b = mirvar(0); + + T1.b.a = mirvar(0); + T1.b.b = mirvar(0); + + T1.unitary = FALSE; + + + zzn12_copy(&x, z); + if(zzn4_compare(&x.a, &y.a) && zzn4_compare(&x.a, &y.a) && zzn4_compare(&x.a, &y.a)) + { + if(x.unitary == TRUE) + { + zzn4_copy(&x.a, &Z0); + zzn4_mul(&x.a, &x.a, &z->a); + zzn4_copy(&z->a, &Z3); + zzn4_add(&z->a, &z->a, &z->a); + zzn4_add(&z->a, &Z3, &z->a); + zzn4_conj(&Z0, &Z0); + zzn4_add(&Z0, &Z0, &Z0); + zzn4_sub(&z->a, &Z0, &z->a); + zzn4_copy(&x.c, &Z1); + zzn4_mul(&Z1, &Z1, &Z1); + zzn4_tx(&Z1); + zzn4_copy(&Z1, &Z3); + zzn4_add(&Z1, &Z1, &Z1); + zzn4_add(&Z1, &Z3, &Z1); + zzn4_copy(&x.b, &Z2); + zzn4_mul(&Z2, &Z2, &Z2); + zzn4_copy(&Z2, &Z3); + zzn4_add(&Z2, &Z2, &Z2); + zzn4_add(&Z2, &Z3, &Z2); + zzn4_conj(&x.b, &z->b); + zzn4_add(&z->b, &z->b, &z->b); + zzn4_conj(&x.c, &z->c); + zzn4_add(&z->c, &z->c, &z->c); + zzn4_negate(&z->c, &z->c); + zzn4_add(&z->b, &Z1, &z->b); + zzn4_add(&z->c, &Z2, &z->c); + } + else + { + if(!x.miller) + { // Chung-Hasan SQR2 + zzn4_copy(&x.a, &Z0); + zzn4_mul(&Z0, &Z0, &Z0); + zzn4_mul(&x.b, &x.c, &Z1); + zzn4_add(&Z1, &Z1, &Z1); + zzn4_copy(&x.c, &Z2); + zzn4_mul(&Z2, &Z2, &Z2); + zzn4_mul(&x.a, &x.b, &Z3); + zzn4_add(&Z3, &Z3, &Z3); + zzn4_add(&x.a, &x.b, &z->c); + zzn4_add(&z->c, &x.c, &z->c); + zzn4_mul(&z->c, &z->c, &z->c); + zzn4_tx(&Z1); + zzn4_add(&Z0, &Z1, &z->a); + zzn4_tx(&Z2); + zzn4_add(&Z3, &Z2, &z->b); + zzn4_add(&Z0, &Z1, &T0); + zzn4_add(&T0, &Z2, &T0); + zzn4_add(&T0, &Z3, &T0); + zzn4_sub(&z->c, &T0, &z->c); + } + else + { // Chung-Hasan SQR3 - actually calculate 2x^2 ! + // Slightly dangerous - but works as will be raised to p^{k/2}-1 + // which wipes out the 2. + zzn4_copy(&x.a, &Z0); + zzn4_mul(&Z0, &Z0, &Z0); // a0^2 = S0 + zzn4_copy(&x.c, &Z2); + zzn4_mul(&Z2, &x.b, &Z2); + zzn4_add(&Z2, &Z2, &Z2); // 2a1.a2 = S3 + zzn4_copy(&x.c, &Z3); + zzn4_mul(&Z3, &Z3, &Z3); // a2^2 = S4 + zzn4_add(&x.c, &x.a, &z->c); // a0+a2 + zzn4_copy(&x.b, &Z1); + zzn4_add(&Z1, &z->c, &Z1); + zzn4_mul(&Z1, &Z1, &Z1); // (a0+a1+a2)^2 =S1 + zzn4_sub(&z->c, &x.b, &z->c); + zzn4_mul(&z->c, &z->c, &z->c); // (a0-a1+a2)^2 =S2 + zzn4_add(&Z2, &Z2, &Z2); + zzn4_add(&Z0, &Z0, &Z0); + zzn4_add(&Z3, &Z3, &Z3); + zzn4_sub(&Z1, &z->c, &T0); + zzn4_sub(&T0, &Z2, &T0); + zzn4_sub(&Z1, &Z0, &T1); + zzn4_sub(&T1, &Z3, &T1); + zzn4_add(&z->c, &T1, &z->c); + zzn4_tx(&Z3); + zzn4_add(&T0, &Z3, &z->b); + zzn4_tx(&Z2); + zzn4_add(&Z0, &Z2, &z->a); + } + } + } + else + { + // Karatsuba + zero_b = zzn4_iszero(&y.b); + zero_c = zzn4_iszero(&y.c); + + zzn4_mul(&x.a, &y.a, &Z0); //9 + if(!zero_b) + zzn4_mul(&x.b, &y.b, &Z2); //+6 + + zzn4_add(&x.a, &x.b, &T0); + zzn4_add(&y.a, &y.b, &T1); + zzn4_mul(&T0, &T1, &Z1); //+9 + zzn4_sub(&Z1, &Z0, &Z1); + if(!zero_b) + zzn4_sub(&Z1, &Z2, &Z1); + + zzn4_add(&x.b, &x.c, &T0); + zzn4_add(&y.b, &y.c, &T1); + zzn4_mul(&T0, &T1, &Z3);//+6 + if(!zero_b) + zzn4_sub(&Z3, &Z2, &Z3); + + zzn4_add(&x.a, &x.c, &T0); + zzn4_add(&y.a, &y.c, &T1); + zzn4_mul(&T0, &T1, &T0);//+9=39 for "special case" + if(!zero_b) + zzn4_add(&Z2, &T0, &Z2); + else + zzn4_copy(&T0, &Z2); + + zzn4_sub(&Z2, &Z0, &Z2); + zzn4_copy(&Z1, &z->b); + if(!zero_c) + { + // exploit special form of BN curve line function + zzn4_mul(&x.c, &y.c, &T0); + zzn4_sub(&Z2, &T0, &Z2); + zzn4_sub(&Z3, &T0, &Z3); + zzn4_tx(&T0); + zzn4_add(&z->b, &T0, &z->b); + } + + zzn4_tx(&Z3); + zzn4_add(&Z0, &Z3, &z->a); + zzn4_copy(&Z2, &z->c); + if(!y.unitary) + z->unitary = FALSE; + } +} + + +static void zzn12_conj(zzn12 *x, zzn12 *y) +{ + zzn4_conj(&x->a, &y->a); + zzn4_conj(&x->b, &y->b); + zzn4_negate(&y->b, &y->b); + zzn4_conj(&x->c, &y->c); + y->miller = x->miller; + y->unitary = x->unitary; +} + + +static zzn12 zzn12_inverse(zzn12 w) +{ + zzn4 tmp1, tmp2; + zzn12 res; + + tmp1.a.a = mirvar(0); + tmp1.a.b = mirvar(0); + + tmp1.b.a = mirvar(0); + tmp1.b.b = mirvar(0); + + tmp1.unitary = FALSE; + + + tmp2.a.a = mirvar(0); + tmp2.a.b = mirvar(0); + + tmp2.b.a = mirvar(0); + tmp2.b.b = mirvar(0); + + tmp2.unitary = FALSE; + + + zzn12_init(&res); + + if(w.unitary) + { + zzn12_conj(&w, &res); + return res; + } + //res.a=w.a*w.a-tx(w.b*w.c); + zzn4_mul(&w.a, &w.a, &res.a); + zzn4_mul(&w.b, &w.c, &res.b); + zzn4_tx(&res.b); + zzn4_sub(&res.a, &res.b, &res.a); + + //res.b=tx(w.c*w.c)-w.a*w.b; + zzn4_mul(&w.c, &w.c, &res.c); + zzn4_tx(&res.c); + zzn4_mul(&w.a, &w.b, &res.b); + zzn4_sub(&res.c, &res.b, &res.b); + + //res.c=w.b*w.b-w.a*w.c; + zzn4_mul(&w.b, &w.b, &res.c); + zzn4_mul(&w.a, &w.c, &tmp1); + zzn4_sub(&res.c, &tmp1, &res.c); + + //tmp1=tx(w.b*res.c)+w.a*res.a+tx(w.c*res.b); + zzn4_mul(&w.b, &res.c, &tmp1); + zzn4_tx(&tmp1); + zzn4_mul(&w.a, &res.a, &tmp2); + zzn4_add(&tmp1, &tmp2, &tmp1); + zzn4_mul(&w.c, &res.b, &tmp2); + zzn4_tx(&tmp2); + zzn4_add(&tmp1, &tmp2, &tmp1); + + zzn4_inv(&tmp1); + zzn4_mul(&res.a, &tmp1, &res.a); + zzn4_mul(&res.b, &tmp1, &res.b); + zzn4_mul(&res.c, &tmp1, &res.c); + return res; +} + + +static void zzn12_powq(zzn2 F, zzn12 *y) +{ + zzn2 X2, X3; + X2.a = mirvar(0); + X2.b = mirvar(0); + + X3.a = mirvar(0); + X3.b = mirvar(0); + zzn2_mul(&F, &F, &X2); + zzn2_mul(&X2, &F, &X3); + + zzn4_powq(&X3, &y->a); + zzn4_powq(&X3, &y->b); + zzn4_powq(&X3, &y->c); + zzn4_smul(&y->b, &X, &y->b); + zzn4_smul(&y->c, &X2, &y->c); +} + + +static void zzn12_div(zzn12 x, zzn12 y, zzn12 *z) +{ + y=zzn12_inverse(y); + zzn12_mul(x, y, z); +} + + +static zzn12 zzn12_pow(zzn12 x, big k) +{ + big zero, tmp, tmp1; + int nb, i; + BOOL invert_it; + zzn12 res; + + zero = mirvar(0); + tmp = mirvar(0); + tmp1 = mirvar(0); + + zzn12_init(&res); + copy(k, tmp1); + invert_it = FALSE; + + if(mr_compare(tmp1, zero) == 0) + { + tmp = get_mip()->one; + zzn4_from_big(tmp, &res.a); + return res; + } + if(mr_compare(tmp1, zero) < 0) + { + negify(tmp1, tmp1); + invert_it = TRUE; + } + nb = logb2(k); + zzn12_copy(&x, &res); + if(nb > 1) + for(i = nb - 2; i >= 0; i--) + { + zzn12_mul(res, res, &res); + if(mr_testbit(k, i)) + zzn12_mul(res, x, &res); + } + if(invert_it) + res = zzn12_inverse(res); + return res; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/engines/vendor_defns/miracl.h b/engines/vendor_defns/miracl.h new file mode 100644 index 00000000..1b8a5b16 --- /dev/null +++ b/engines/vendor_defns/miracl.h @@ -0,0 +1,1569 @@ +/*************************************************************************** + * +Copyright 2013 CertiVox IOM Ltd. * + * +This file is part of CertiVox MIRACL Crypto SDK. * + * +The CertiVox MIRACL Crypto SDK provides developers with an * +extensive and efficient set of cryptographic functions. * +For further information about its features and functionalities please * +refer to http://www.certivox.com * + * +* The CertiVox MIRACL Crypto SDK is free software: you can * + redistribute it and/or modify it under the terms of the * + GNU Affero General Public License as published by the * + Free Software Foundation, either version 3 of the License, * + or (at your option) any later version. * + * +* The CertiVox MIRACL Crypto SDK is distributed in the hope * + that it will be useful, but WITHOUT ANY WARRANTY; without even the * + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + See the GNU Affero General Public License for more details. * + * +* You should have received a copy of the GNU Affero General Public * + License along with CertiVox MIRACL Crypto SDK. * + If not, see . * + * +You can be released from the requirements of the license by purchasing * +a commercial license. Buying such a license is mandatory as soon as you * +develop commercial activities involving the CertiVox MIRACL Crypto SDK * +without disclosing the source code of your own applications, or shipping * +the CertiVox MIRACL Crypto SDK with a closed source product. * + * +***************************************************************************/ + +#ifndef HEADER_MIRACL_H +#define HEADER_MIRACL_H + +/* + * main MIRACL header - miracl.h. + */ + +#include "mirdef.h" + +/* Some modifiable defaults... */ + +/* Use a smaller buffer if space is limited, don't be so wasteful! */ + +#ifdef __cplusplus +extern "C"{ +#endif + +#ifdef MR_STATIC +#define MR_DEFAULT_BUFFER_SIZE 260 +#else +#define MR_DEFAULT_BUFFER_SIZE 1024 +#endif + +/* see mrgf2m.c */ + +#ifndef MR_KARATSUBA +#define MR_KARATSUBA 2 +#endif + +#ifndef MR_DOUBLE_BIG + +#ifdef MR_KCM + #ifdef MR_FLASH + #define MR_SPACES 32 + #else + #define MR_SPACES 31 + #endif +#else + #ifdef MR_FLASH + #define MR_SPACES 28 + #else + #define MR_SPACES 27 + #endif +#endif + +#else + +#ifdef MR_KCM + #ifdef MR_FLASH + #define MR_SPACES 44 + #else + #define MR_SPACES 43 + #endif +#else + #ifdef MR_FLASH + #define MR_SPACES 40 + #else + #define MR_SPACES 39 + #endif +#endif + +#endif + +/* To avoid name clashes - undefine this */ + +/* #define compare mr_compare */ + +#ifdef MR_AVR +#include +#endif + +/* size of bigs and elliptic curve points for memory allocation from stack or heap */ + +#define MR_ROUNDUP(a,b) ((a)-1)/(b)+1 + +#define MR_SL sizeof(long) + +#ifdef MR_STATIC + +#define MR_SIZE (((sizeof(struct bigtype)+(MR_STATIC+2)*sizeof(mr_utype))-1)/MR_SL+1)*MR_SL +#define MR_BIG_RESERVE(n) ((n)*MR_SIZE+MR_SL) + +#ifdef MR_AFFINE_ONLY +#define MR_ESIZE (((sizeof(epoint)+MR_BIG_RESERVE(2))-1)/MR_SL+1)*MR_SL +#else +#define MR_ESIZE (((sizeof(epoint)+MR_BIG_RESERVE(3))-1)/MR_SL+1)*MR_SL +#endif +#define MR_ECP_RESERVE(n) ((n)*MR_ESIZE+MR_SL) + +#define MR_ESIZE_A (((sizeof(epoint)+MR_BIG_RESERVE(2))-1)/MR_SL+1)*MR_SL +#define MR_ECP_RESERVE_A(n) ((n)*MR_ESIZE_A+MR_SL) + + +#endif + +/* useful macro to convert size of big in words, to size of required structure */ + +#define mr_size(n) (((sizeof(struct bigtype)+((n)+2)*sizeof(mr_utype))-1)/MR_SL+1)*MR_SL +#define mr_big_reserve(n,m) ((n)*mr_size(m)+MR_SL) + +#define mr_esize_a(n) (((sizeof(epoint)+mr_big_reserve(2,(n)))-1)/MR_SL+1)*MR_SL +#define mr_ecp_reserve_a(n,m) ((n)*mr_esize_a(m)+MR_SL) + +#ifdef MR_AFFINE_ONLY +#define mr_esize(n) (((sizeof(epoint)+mr_big_reserve(2,(n)))-1)/MR_SL+1)*MR_SL +#else +#define mr_esize(n) (((sizeof(epoint)+mr_big_reserve(3,(n)))-1)/MR_SL+1)*MR_SL +#endif +#define mr_ecp_reserve(n,m) ((n)*mr_esize(m)+MR_SL) + + +/* if basic library is static, make sure and use static C++ */ + +#ifdef MR_STATIC + #ifndef BIGS + #define BIGS MR_STATIC + #endif + #ifndef ZZNS + #define ZZNS MR_STATIC + #endif + #ifndef GF2MS + #define GF2MS MR_STATIC + #endif +#endif + +#ifdef __ia64__ +#if MIRACL==64 +#define MR_ITANIUM +#include +#endif +#endif + +#ifdef _M_X64 +#ifdef _WIN64 +#if MIRACL==64 +#define MR_WIN64 +#include +#endif +#endif +#endif + +#ifndef MR_NO_FILE_IO +#include +#endif + /* error returns */ + +#define MR_ERR_BASE_TOO_BIG 1 +#define MR_ERR_DIV_BY_ZERO 2 +#define MR_ERR_OVERFLOW 3 +#define MR_ERR_NEG_RESULT 4 +#define MR_ERR_BAD_FORMAT 5 +#define MR_ERR_BAD_BASE 6 +#define MR_ERR_BAD_PARAMETERS 7 +#define MR_ERR_OUT_OF_MEMORY 8 +#define MR_ERR_NEG_ROOT 9 +#define MR_ERR_NEG_POWER 10 +#define MR_ERR_BAD_ROOT 11 +#define MR_ERR_INT_OP 12 +#define MR_ERR_FLASH_OVERFLOW 13 +#define MR_ERR_TOO_BIG 14 +#define MR_ERR_NEG_LOG 15 +#define MR_ERR_DOUBLE_FAIL 16 +#define MR_ERR_IO_OVERFLOW 17 +#define MR_ERR_NO_MIRSYS 18 +#define MR_ERR_BAD_MODULUS 19 +#define MR_ERR_NO_MODULUS 20 +#define MR_ERR_EXP_TOO_BIG 21 +#define MR_ERR_NOT_SUPPORTED 22 +#define MR_ERR_NOT_DOUBLE_LEN 23 +#define MR_ERR_NOT_IRREDUC 24 +#define MR_ERR_NO_ROUNDING 25 +#define MR_ERR_NOT_BINARY 26 +#define MR_ERR_NO_BASIS 27 +#define MR_ERR_COMPOSITE_MODULUS 28 +#define MR_ERR_DEV_RANDOM 29 + + /* some useful definitions */ + +#define forever for(;;) + +#define mr_abs(x) ((x)<0? (-(x)) : (x)) + +#ifndef TRUE + #define TRUE 1 +#endif +#ifndef FALSE + #define FALSE 0 +#endif + +#define OFF 0 +#define ON 1 +#define PLUS 1 +#define MINUS (-1) + +#define M1 (MIRACL-1) +#define M2 (MIRACL-2) +#define M3 (MIRACL-3) +#define M4 (MIRACL-4) +#define TOPBIT ((mr_small)1<= MR_IBITS +#define MR_TOOBIG (1<<(MR_IBITS-2)) +#else +#define MR_TOOBIG (1<<(MIRACL-1)) +#endif + +#ifdef MR_FLASH +#define MR_EBITS (8*sizeof(double) - MR_FLASH) + /* no of Bits per double exponent */ +#define MR_BTS 16 +#define MR_MSK 0xFFFF + +#endif + +/* Default Hash function output size in bytes */ +#define MR_HASH_BYTES 32 + +/* Marsaglia & Zaman Random number generator */ +/* constants alternatives */ +#define NK 37 /* 21 */ +#define NJ 24 /* 6 */ +#define NV 14 /* 8 */ + +/* Use smaller values if memory is precious */ + +#ifdef mr_dltype + +#ifdef MR_LITTLE_ENDIAN +#define MR_BOT 0 +#define MR_TOP 1 +#endif +#ifdef MR_BIG_ENDIAN +#define MR_BOT 1 +#define MR_TOP 0 +#endif + +union doubleword +{ + mr_large d; + mr_small h[2]; +}; + +#endif + +/* chinese remainder theorem structures */ + +typedef struct { +big *C; +big *V; +big *M; +int NP; +} big_chinese; + +typedef struct { +mr_utype *C; +mr_utype *V; +mr_utype *M; +int NP; +} small_chinese; + +/* Cryptographically strong pseudo-random number generator */ + +typedef struct { +mr_unsign32 ira[NK]; /* random number... */ +int rndptr; /* ...array & pointer */ +mr_unsign32 borrow; +int pool_ptr; +char pool[MR_HASH_BYTES]; /* random pool */ +} csprng; + +/* secure hash Algorithm structure */ + +typedef struct { +mr_unsign32 length[2]; +mr_unsign32 h[8]; +mr_unsign32 w[80]; +} sha256; + +typedef sha256 sha; + +#ifdef mr_unsign64 + +typedef struct { +mr_unsign64 length[2]; +mr_unsign64 h[8]; +mr_unsign64 w[80]; +} sha512; + +typedef sha512 sha384; + +typedef struct { +mr_unsign64 length; +mr_unsign64 S[5][5]; +int rate,len; +} sha3; + +#endif + +/* Symmetric Encryption algorithm structure */ + +#define MR_ECB 0 +#define MR_CBC 1 +#define MR_CFB1 2 +#define MR_CFB2 3 +#define MR_CFB4 5 +#define MR_PCFB1 10 +#define MR_PCFB2 11 +#define MR_PCFB4 13 +#define MR_OFB1 14 +#define MR_OFB2 15 +#define MR_OFB4 17 +#define MR_OFB8 21 +#define MR_OFB16 29 + +typedef struct { +int Nk,Nr; +int mode; +mr_unsign32 fkey[60]; +mr_unsign32 rkey[60]; +char f[16]; +} aes; + +/* AES-GCM suppport. See mrgcm.c */ + +#define GCM_ACCEPTING_HEADER 0 +#define GCM_ACCEPTING_CIPHER 1 +#define GCM_NOT_ACCEPTING_MORE 2 +#define GCM_FINISHED 3 +#define GCM_ENCRYPTING 0 +#define GCM_DECRYPTING 1 + +typedef struct { +mr_unsign32 table[128][4]; /* 2k bytes */ +MR_BYTE stateX[16]; +MR_BYTE Y_0[16]; +mr_unsign32 counter; +mr_unsign32 lenA[2],lenC[2]; +int status; +aes a; +} gcm; + + /* Elliptic curve point status */ + +#define MR_EPOINT_GENERAL 0 +#define MR_EPOINT_NORMALIZED 1 +#define MR_EPOINT_INFINITY 2 + +#define MR_NOTSET 0 +#define MR_PROJECTIVE 0 +#define MR_AFFINE 1 +#define MR_BEST 2 +#define MR_TWIST 8 + +#define MR_OVER 0 +#define MR_ADD 1 +#define MR_DOUBLE 2 + +/* Twist type */ + +#define MR_QUADRATIC 2 +#define MR_CUBIC_M 0x3A +#define MR_CUBIC_D 0x3B +#define MR_QUARTIC_M 0x4A +#define MR_QUARTIC_D 0x4B +#define MR_SEXTIC_M 0x6A +#define MR_SEXTIC_D 0x6B + + +/* Fractional Sliding Windows for ECC - how much precomputation storage to use ? */ +/* Note that for variable point multiplication there is an optimal value + which can be reduced if space is short. For fixed points its a matter of + how much ROM is available to store precomputed points. + We are storing the k points (P,3P,5P,7P,...,[2k-1].P) */ + +/* These values can be manually tuned for optimal performance... */ + +#ifdef MR_SMALL_EWINDOW +#define MR_ECC_STORE_N 3 /* point store for ecn variable point multiplication */ +#define MR_ECC_STORE_2M 3 /* point store for ec2m variable point multiplication */ +#define MR_ECC_STORE_N2 3 /* point store for ecn2 variable point multiplication */ +#else +#define MR_ECC_STORE_N 8 /* 8/9 is close to optimal for 256 bit exponents */ +#define MR_ECC_STORE_2M 9 +#define MR_ECC_STORE_N2 8 +#endif + +/*#define MR_ECC_STORE_N2_PRECOMP MR_ECC_STORE_N2 */ + /* Might want to make this bigger.. */ + +/* If multi-addition is of m points, and s precomputed values are required, this is max of m*s (=4.10?) */ +#define MR_MAX_M_T_S 64 + +/* Elliptic Curve epoint structure. Uses projective (X,Y,Z) co-ordinates */ + +typedef struct { +int marker; +big X; +big Y; +#ifndef MR_AFFINE_ONLY +big Z; +#endif +} epoint; + + +/* Structure for Comb method for finite * + field exponentiation with precomputation */ + +typedef struct { +#ifdef MR_STATIC + const mr_small *table; +#else + mr_small *table; +#endif + big n; + int window; + int max; +} brick; + +/* Structure for Comb method for elliptic * + curve exponentiation with precomputation */ + +typedef struct { +#ifdef MR_STATIC + const mr_small *table; +#else + mr_small *table; +#endif + big a,b,n; + int window; + int max; +} ebrick; + +typedef struct { +#ifdef MR_STATIC + const mr_small *table; +#else + mr_small *table; +#endif + big a6,a2; + int m,a,b,c; + int window; + int max; +} ebrick2; + +typedef struct +{ + big a; + big b; +} zzn2; + +typedef struct +{ + zzn2 a; + zzn2 b; + BOOL unitary; +} zzn4; + +typedef struct +{ + int marker; + zzn2 x; + zzn2 y; +#ifndef MR_AFFINE_ONLY + zzn2 z; +#endif + +} ecn2; + +typedef struct +{ + big a; + big b; + big c; +} zzn3; + +typedef struct +{ + zzn2 a; + zzn2 b; + zzn2 c; +} zzn6_3x2; + +/* main MIRACL instance structure */ + +/* ------------------------------------------------------------------------*/ + +typedef struct { +mr_small base; /* number base */ +mr_small apbase; /* apparent base */ +int pack; /* packing density */ +int lg2b; /* bits in base */ +mr_small base2; /* 2^mr_lg2b */ +BOOL (*user)(void); /* pointer to user supplied function */ + +int nib; /* length of bigs */ +#ifndef MR_STRIPPED_DOWN +int depth; /* error tracing ..*/ +int trace[MR_MAXDEPTH]; /* .. mechanism */ +#endif +BOOL check; /* overflow check */ +BOOL fout; /* Output to file */ +BOOL fin; /* Input from file */ +BOOL active; + +#ifndef MR_NO_FILE_IO + +FILE *infile; /* Input file */ +FILE *otfile; /* Output file */ + +#endif + + +#ifndef MR_NO_RAND +mr_unsign32 ira[NK]; /* random number... */ +int rndptr; /* ...array & pointer */ +mr_unsign32 borrow; +#endif + + /* Montgomery constants */ +mr_small ndash; +big modulus; +big pR; +BOOL ACTIVE; +BOOL MONTY; + + /* Elliptic Curve details */ +#ifndef MR_NO_SS +BOOL SS; /* True for Super-Singular */ +#endif +#ifndef MR_NOKOBLITZ +BOOL KOBLITZ; /* True for a Koblitz curve */ +#endif +#ifndef MR_AFFINE_ONLY +int coord; +#endif +int Asize,Bsize; + +int M,AA,BB,CC; /* for GF(2^m) curves */ + +/* +mr_small pm,mask; +int e,k,Me,m; for GF(p^m) curves */ + + +#ifndef MR_STATIC + +int logN; /* constants for fast fourier fft multiplication */ +int nprimes,degree; +mr_utype *prime,*cr; +mr_utype *inverse,**roots; +small_chinese chin; +mr_utype const1,const2,const3; +mr_small msw,lsw; +mr_utype **s1,**s2; /* pre-computed tables for polynomial reduction */ +mr_utype **t; /* workspace */ +mr_utype *wa; +mr_utype *wb; +mr_utype *wc; + +#endif + +BOOL same; +BOOL first_one; +BOOL debug; + +big w0; /* workspace bigs */ +big w1,w2,w3,w4; +big w5,w6,w7; +big w8,w9,w10,w11; +big w12,w13,w14,w15; +big sru; +big one; + +#ifdef MR_KCM +big big_ndash; +big ws,wt; +#endif + +big A,B; + +/* User modifiables */ + +#ifndef MR_SIMPLE_IO +int IOBSIZ; /* size of i/o buffer */ +#endif +BOOL ERCON; /* error control */ +int ERNUM; /* last error code */ +int NTRY; /* no. of tries for probablistic primality testing */ +#ifndef MR_SIMPLE_IO +int INPLEN; /* input length */ +#ifndef MR_SIMPLE_BASE +int IOBASE; /* base for input and output */ + +#endif +#endif +#ifdef MR_FLASH +BOOL EXACT; /* exact flag */ +BOOL RPOINT; /* =ON for radix point, =OFF for fractions in output */ +#endif +#ifndef MR_STRIPPED_DOWN +BOOL TRACER; /* turns trace tracker on/off */ +#endif + +#ifdef MR_STATIC +const int *PRIMES; /* small primes array */ +#ifndef MR_SIMPLE_IO +char IOBUFF[MR_DEFAULT_BUFFER_SIZE]; /* i/o buffer */ +#endif +#else +int *PRIMES; /* small primes array */ +#ifndef MR_SIMPLE_IO +char *IOBUFF; /* i/o buffer */ +#endif +#endif + +#ifdef MR_FLASH +int workprec; +int stprec; /* start precision */ + +int RS,RD; +double D; + +double db,n,p; +int a,b,c,d,r,q,oldn,ndig; +mr_small u,v,ku,kv; + +BOOL last,carryon; +flash pi; + +#endif + +#ifdef MR_FP_ROUNDING +mr_large inverse_base; +#endif + +#ifndef MR_STATIC +char *workspace; +#else +char workspace[MR_BIG_RESERVE(MR_SPACES)]; +#endif + +int TWIST; /* set to twisted curve */ +int qnr; /* a QNR -1 for p=3 mod 4, -2 for p=5 mod 8, 0 otherwise */ +int cnr; /* a cubic non-residue */ +int pmod8; +int pmod9; +BOOL NO_CARRY; +} miracl; + +/* ------------------------------------------------------------------------*/ + + +#ifndef MR_GENERIC_MT + +#ifdef MR_WINDOWS_MT +#define MR_OS_THREADS +#endif + +#ifdef MR_UNIX_MT +#define MR_OS_THREADS +#endif + +#ifdef MR_OPENMP_MT +#define MR_OS_THREADS +#endif + + +#ifndef MR_OS_THREADS + +extern miracl *mr_mip; /* pointer to MIRACL's only global variable */ + +#endif + +#endif + +#ifdef MR_GENERIC_MT + +#ifdef MR_STATIC +#define MR_GENERIC_AND_STATIC +#endif + +#define _MIPT_ miracl *, +#define _MIPTO_ miracl * +#define _MIPD_ miracl *mr_mip, +#define _MIPDO_ miracl *mr_mip +#define _MIPP_ mr_mip, +#define _MIPPO_ mr_mip + +#else + +#define _MIPT_ +#define _MIPTO_ void +#define _MIPD_ +#define _MIPDO_ void +#define _MIPP_ +#define _MIPPO_ + +#endif + +/* Preamble and exit code for MIRACL routines. * + * Not used if MR_STRIPPED_DOWN is defined */ + +#ifdef MR_STRIPPED_DOWN +#define MR_OUT +#define MR_IN(N) +#else +#define MR_OUT mr_mip->depth--; +#define MR_IN(N) mr_mip->depth++; if (mr_mip->depthtrace[mr_mip->depth]=(N); if (mr_mip->TRACER) mr_track(_MIPPO_); } +#endif + +/* Function definitions */ + +/* Group 0 - Internal routines */ + +extern void mr_berror(_MIPT_ int); +extern mr_small mr_shiftbits(mr_small,int); +extern mr_small mr_setbase(_MIPT_ mr_small); +extern void mr_track(_MIPTO_ ); +extern void mr_lzero(big); +extern BOOL mr_notint(flash); +extern int mr_lent(flash); +extern void mr_padd(_MIPT_ big,big,big); +extern void mr_psub(_MIPT_ big,big,big); +extern void mr_pmul(_MIPT_ big,mr_small,big); +#ifdef MR_FP_ROUNDING +extern mr_large mr_invert(mr_small); +extern mr_small imuldiv(mr_small,mr_small,mr_small,mr_small,mr_large,mr_small *); +extern mr_small mr_sdiv(_MIPT_ big,mr_small,mr_large,big); +#else +extern mr_small mr_sdiv(_MIPT_ big,mr_small,big); +extern void mr_and(big,big,big); +extern void mr_xor(big,big,big); +#endif +extern void mr_shift(_MIPT_ big,int,big); +extern miracl *mr_first_alloc(void); +extern void *mr_alloc(_MIPT_ int,int); +extern void mr_free(void *); +extern void set_user_function(_MIPT_ BOOL (*)(void)); +extern void set_io_buffer_size(_MIPT_ int); +extern int mr_testbit(_MIPT_ big,int); +extern void mr_addbit(_MIPT_ big,int); +extern int recode(_MIPT_ big ,int ,int ,int ); +extern int mr_window(_MIPT_ big,int,int *,int *,int); +extern int mr_window2(_MIPT_ big,big,int,int *,int *); +extern int mr_naf_window(_MIPT_ big,big,int,int *,int *,int); + +extern int mr_fft_init(_MIPT_ int,big,big,BOOL); +extern void mr_dif_fft(_MIPT_ int,int,mr_utype *); +extern void mr_dit_fft(_MIPT_ int,int,mr_utype *); +extern void fft_reset(_MIPTO_); + +extern int mr_poly_mul(_MIPT_ int,big*,int,big*,big*); +extern int mr_poly_sqr(_MIPT_ int,big*,big*); +extern void mr_polymod_set(_MIPT_ int,big*,big*); +extern int mr_poly_rem(_MIPT_ int,big *,big *); + +extern int mr_ps_big_mul(_MIPT_ int,big *,big *,big *); +extern int mr_ps_zzn_mul(_MIPT_ int,big *,big *,big *); + +extern mr_small muldiv(mr_small,mr_small,mr_small,mr_small,mr_small *); +extern mr_small muldvm(mr_small,mr_small,mr_small,mr_small *); +extern mr_small muldvd(mr_small,mr_small,mr_small,mr_small *); +extern void muldvd2(mr_small,mr_small,mr_small *,mr_small *); + +extern flash mirvar_mem_variable(char *,int,int); +extern epoint* epoint_init_mem_variable(_MIPT_ char *,int,int); + +/* Group 1 - General purpose, I/O and basic arithmetic routines */ + +extern unsigned int igcd(unsigned int,unsigned int); +extern unsigned long lgcd(unsigned long,unsigned long); +extern mr_small sgcd(mr_small,mr_small); +extern unsigned int isqrt(unsigned int,unsigned int); +extern unsigned long mr_lsqrt(unsigned long,unsigned long); +extern void irand(_MIPT_ mr_unsign32); +extern mr_small brand(_MIPTO_ ); +extern void zero(flash); +extern void convert(_MIPT_ int,big); +extern void uconvert(_MIPT_ unsigned int,big); +extern void lgconv(_MIPT_ long,big); +extern void ulgconv(_MIPT_ unsigned long,big); +extern void tconvert(_MIPT_ mr_utype,big); + +#ifdef mr_dltype +extern void dlconv(_MIPT_ mr_dltype,big); +#endif + +extern flash mirvar(_MIPT_ int); +extern flash mirvar_mem(_MIPT_ char *,int); +extern void mirkill(big); +extern void *memalloc(_MIPT_ int); +extern void memkill(_MIPT_ char *,int); +extern void mr_init_threading(void); +extern void mr_end_threading(void); +extern miracl *get_mip(void ); +extern void set_mip(miracl *); +#ifdef MR_GENERIC_AND_STATIC +extern miracl *mirsys(miracl *,int,mr_small); +#else +extern miracl *mirsys(int,mr_small); +#endif +extern miracl *mirsys_basic(miracl *,int,mr_small); +extern void mirexit(_MIPTO_ ); +extern int exsign(flash); +extern void insign(int,flash); +extern int getdig(_MIPT_ big,int); +extern int numdig(_MIPT_ big); +extern void putdig(_MIPT_ int,big,int); +extern void copy(flash,flash); +extern void negify(flash,flash); +extern void absol(flash,flash); +extern int size(big); +extern int mr_compare(big,big); +extern void add(_MIPT_ big,big,big); +extern void subtract(_MIPT_ big,big,big); +extern void incr(_MIPT_ big,int,big); +extern void decr(_MIPT_ big,int,big); +extern void premult(_MIPT_ big,int,big); +extern int subdiv(_MIPT_ big,int,big); +extern BOOL subdivisible(_MIPT_ big,int); +extern int remain(_MIPT_ big,int); +extern void bytes_to_big(_MIPT_ int,const char *,big); +extern int big_to_bytes(_MIPT_ int,big,char *,BOOL); +extern mr_small normalise(_MIPT_ big,big); +extern void multiply(_MIPT_ big,big,big); +extern void fft_mult(_MIPT_ big,big,big); +extern BOOL fastmultop(_MIPT_ int,big,big,big); +extern void divide(_MIPT_ big,big,big); +extern BOOL divisible(_MIPT_ big,big); +extern void mad(_MIPT_ big,big,big,big,big,big); +extern int instr(_MIPT_ flash,char *); +extern int otstr(_MIPT_ flash,char *); +extern int cinstr(_MIPT_ flash,char *); +extern int cotstr(_MIPT_ flash,char *); +extern epoint* epoint_init(_MIPTO_ ); +extern epoint* epoint_init_mem(_MIPT_ char *,int); +extern void* ecp_memalloc(_MIPT_ int); +void ecp_memkill(_MIPT_ char *,int); +BOOL init_big_from_rom(big,int,const mr_small *,int ,int *); +BOOL init_point_from_rom(epoint *,int,const mr_small *,int,int *); + +#ifndef MR_NO_FILE_IO + +extern int innum(_MIPT_ flash,FILE *); +extern int otnum(_MIPT_ flash,FILE *); +extern int cinnum(_MIPT_ flash,FILE *); +extern int cotnum(_MIPT_ flash,FILE *); + +#endif + +/* Group 2 - Advanced arithmetic routines */ + +extern mr_small smul(mr_small,mr_small,mr_small); +extern mr_small spmd(mr_small,mr_small,mr_small); +extern mr_small invers(mr_small,mr_small); +extern mr_small sqrmp(mr_small,mr_small); +extern int jac(mr_small,mr_small); + +extern void gprime(_MIPT_ int); +extern int jack(_MIPT_ big,big); +extern int egcd(_MIPT_ big,big,big); +extern int xgcd(_MIPT_ big,big,big,big,big); +extern int invmodp(_MIPT_ big,big,big); +extern int logb2(_MIPT_ big); +extern int hamming(_MIPT_ big); +extern void expb2(_MIPT_ int,big); +extern void bigbits(_MIPT_ int,big); +extern void expint(_MIPT_ int,int,big); +extern void sftbit(_MIPT_ big,int,big); +extern void power(_MIPT_ big,long,big,big); +extern void powmod(_MIPT_ big,big,big,big); +extern void powmod2(_MIPT_ big,big,big,big,big,big); +extern void powmodn(_MIPT_ int,big *,big *,big,big); +extern int powltr(_MIPT_ int,big,big,big); +extern BOOL double_inverse(_MIPT_ big,big,big,big,big); +extern BOOL multi_inverse(_MIPT_ int,big*,big,big*); +extern void lucas(_MIPT_ big,big,big,big,big); +extern BOOL nroot(_MIPT_ big,int,big); +extern BOOL sqroot(_MIPT_ big,big,big); +extern void bigrand(_MIPT_ big,big); +extern void bigdig(_MIPT_ int,int,big); +extern int trial_division(_MIPT_ big,big); +extern BOOL isprime(_MIPT_ big); +extern BOOL nxprime(_MIPT_ big,big); +extern BOOL nxsafeprime(_MIPT_ int,int,big,big); +extern BOOL crt_init(_MIPT_ big_chinese *,int,big *); +extern void crt(_MIPT_ big_chinese *,big *,big); +extern void crt_end(big_chinese *); +extern BOOL scrt_init(_MIPT_ small_chinese *,int,mr_utype *); +extern void scrt(_MIPT_ small_chinese*,mr_utype *,big); +extern void scrt_end(small_chinese *); +#ifndef MR_STATIC +extern BOOL brick_init(_MIPT_ brick *,big,big,int,int); +extern void brick_end(brick *); +#else +extern void brick_init(brick *,const mr_small *,big,int,int); +#endif +extern void pow_brick(_MIPT_ brick *,big,big); +#ifndef MR_STATIC +extern BOOL ebrick_init(_MIPT_ ebrick *,big,big,big,big,big,int,int); +extern void ebrick_end(ebrick *); +#else +extern void ebrick_init(ebrick *,const mr_small *,big,big,big,int,int); +#endif +extern int mul_brick(_MIPT_ ebrick*,big,big,big); +#ifndef MR_STATIC +extern BOOL ebrick2_init(_MIPT_ ebrick2 *,big,big,big,big,int,int,int,int,int,int); +extern void ebrick2_end(ebrick2 *); +#else +extern void ebrick2_init(ebrick2 *,const mr_small *,big,big,int,int,int,int,int,int); +#endif +extern int mul2_brick(_MIPT_ ebrick2*,big,big,big); + +/* Montgomery stuff */ + +extern mr_small prepare_monty(_MIPT_ big); +extern void kill_monty(_MIPTO_ ); +extern void nres(_MIPT_ big,big); +extern void redc(_MIPT_ big,big); + +extern void nres_negate(_MIPT_ big,big); +extern void nres_modadd(_MIPT_ big,big,big); +extern void nres_modsub(_MIPT_ big,big,big); +extern void nres_lazy(_MIPT_ big,big,big,big,big,big); +extern void nres_complex(_MIPT_ big,big,big,big); +extern void nres_double_modadd(_MIPT_ big,big,big); +extern void nres_double_modsub(_MIPT_ big,big,big); +extern void nres_premult(_MIPT_ big,int,big); +extern void nres_modmult(_MIPT_ big,big,big); +extern int nres_moddiv(_MIPT_ big,big,big); +extern void nres_dotprod(_MIPT_ int,big *,big *,big); +extern void nres_powmod(_MIPT_ big,big,big); +extern void nres_powltr(_MIPT_ int,big,big); +extern void nres_powmod2(_MIPT_ big,big,big,big,big); +extern void nres_powmodn(_MIPT_ int,big *,big *,big); +extern BOOL nres_sqroot(_MIPT_ big,big); +extern void nres_lucas(_MIPT_ big,big,big,big); +extern BOOL nres_double_inverse(_MIPT_ big,big,big,big); +extern BOOL nres_multi_inverse(_MIPT_ int,big *,big *); +extern void nres_div2(_MIPT_ big,big); +extern void nres_div3(_MIPT_ big,big); +extern void nres_div5(_MIPT_ big,big); + +extern void shs_init(sha *); +extern void shs_process(sha *,int); +extern void shs_hash(sha *,char *); + +extern void shs256_init(sha256 *); +extern void shs256_process(sha256 *,int); +extern void shs256_hash(sha256 *,char *); + +#ifdef mr_unsign64 + +extern void shs512_init(sha512 *); +extern void shs512_process(sha512 *,int); +extern void shs512_hash(sha512 *,char *); + +extern void shs384_init(sha384 *); +extern void shs384_process(sha384 *,int); +extern void shs384_hash(sha384 *,char *); + +extern void sha3_init(sha3 *,int); +extern void sha3_process(sha3 *,int); +extern void sha3_hash(sha3 *,char *); + +#endif + +extern BOOL aes_init(aes *,int,int,char *,char *); +extern void aes_getreg(aes *,char *); +extern void aes_ecb_encrypt(aes *,MR_BYTE *); +extern void aes_ecb_decrypt(aes *,MR_BYTE *); +extern mr_unsign32 aes_encrypt(aes *,char *); +extern mr_unsign32 aes_decrypt(aes *,char *); +extern void aes_reset(aes *,int,char *); +extern void aes_end(aes *); + +extern void gcm_init(gcm *,int,char *,int,char *); +extern BOOL gcm_add_header(gcm *,char *,int); +extern BOOL gcm_add_cipher(gcm *,int,char *,int,char *); +extern void gcm_finish(gcm *,char *); + +extern void FPE_encrypt(int ,aes *,mr_unsign32 ,mr_unsign32 ,char *,int); +extern void FPE_decrypt(int ,aes *,mr_unsign32 ,mr_unsign32 ,char *,int); + +extern void strong_init(csprng *,int,char *,mr_unsign32); +extern int strong_rng(csprng *); +extern void strong_bigrand(_MIPT_ csprng *,big,big); +extern void strong_bigdig(_MIPT_ csprng *,int,int,big); +extern void strong_kill(csprng *); + +/* special modular multipliers */ + +extern void comba_mult(big,big,big); +extern void comba_square(big,big); +extern void comba_redc(_MIPT_ big,big); +extern void comba_modadd(_MIPT_ big,big,big); +extern void comba_modsub(_MIPT_ big,big,big); +extern void comba_double_modadd(_MIPT_ big,big,big); +extern void comba_double_modsub(_MIPT_ big,big,big); +extern void comba_negate(_MIPT_ big,big); +extern void comba_add(big,big,big); +extern void comba_sub(big,big,big); +extern void comba_double_add(big,big,big); +extern void comba_double_sub(big,big,big); + +extern void comba_mult2(_MIPT_ big,big,big); + +extern void fastmodmult(_MIPT_ big,big,big); +extern void fastmodsquare(_MIPT_ big,big); + +extern void kcm_mul(_MIPT_ big,big,big); +extern void kcm_sqr(_MIPT_ big,big); +extern void kcm_redc(_MIPT_ big,big); + +extern void kcm_multiply(_MIPT_ int,big,big,big); +extern void kcm_square(_MIPT_ int,big,big); +extern BOOL kcm_top(_MIPT_ int,big,big,big); + +/* elliptic curve stuff */ + +extern BOOL point_at_infinity(epoint *); + +extern void mr_jsf(_MIPT_ big,big,big,big,big,big); + +extern void ecurve_init(_MIPT_ big,big,big,int); +extern int ecurve_add(_MIPT_ epoint *,epoint *); +extern int ecurve_sub(_MIPT_ epoint *,epoint *); +extern void ecurve_double_add(_MIPT_ epoint *,epoint *,epoint *,epoint *,big *,big *); +extern void ecurve_multi_add(_MIPT_ int,epoint **,epoint **); +extern void ecurve_double(_MIPT_ epoint*); +extern int ecurve_mult(_MIPT_ big,epoint *,epoint *); +extern void ecurve_mult2(_MIPT_ big,epoint *,big,epoint *,epoint *); +extern void ecurve_multn(_MIPT_ int,big *,epoint**,epoint *); + +extern BOOL epoint_x(_MIPT_ big); +extern BOOL epoint_set(_MIPT_ big,big,int,epoint*); +extern int epoint_get(_MIPT_ epoint*,big,big); +extern void epoint_getxyz(_MIPT_ epoint *,big,big,big); +extern BOOL epoint_norm(_MIPT_ epoint *); +extern BOOL epoint_multi_norm(_MIPT_ int,big *,epoint **); +extern void epoint_free(epoint *); +extern void epoint_copy(epoint *,epoint *); +extern BOOL epoint_comp(_MIPT_ epoint *,epoint *); +extern void epoint_negate(_MIPT_ epoint *); + +extern BOOL ecurve2_init(_MIPT_ int,int,int,int,big,big,BOOL,int); +extern big ecurve2_add(_MIPT_ epoint *,epoint *); +extern big ecurve2_sub(_MIPT_ epoint *,epoint *); +extern void ecurve2_multi_add(_MIPT_ int,epoint **,epoint **); +extern void ecurve2_mult(_MIPT_ big,epoint *,epoint *); +extern void ecurve2_mult2(_MIPT_ big,epoint *,big,epoint *,epoint *); +extern void ecurve2_multn(_MIPT_ int,big *,epoint**,epoint *); + +extern epoint* epoint2_init(_MIPTO_ ); +extern BOOL epoint2_set(_MIPT_ big,big,int,epoint*); +extern int epoint2_get(_MIPT_ epoint*,big,big); +extern void epoint2_getxyz(_MIPT_ epoint *,big,big,big); +extern int epoint2_norm(_MIPT_ epoint *); +extern void epoint2_free(epoint *); +extern void epoint2_copy(epoint *,epoint *); +extern BOOL epoint2_comp(_MIPT_ epoint *,epoint *); +extern void epoint2_negate(_MIPT_ epoint *); + +/* GF(2) stuff */ + +extern BOOL prepare_basis(_MIPT_ int,int,int,int,BOOL); +extern int parity2(big); +extern BOOL multi_inverse2(_MIPT_ int,big *,big *); +extern void add2(big,big,big); +extern void incr2(big,int,big); +extern void reduce2(_MIPT_ big,big); +extern void multiply2(_MIPT_ big,big,big); +extern void modmult2(_MIPT_ big,big,big); +extern void modsquare2(_MIPT_ big,big); +extern void power2(_MIPT_ big,int,big); +extern void sqroot2(_MIPT_ big,big); +extern void halftrace2(_MIPT_ big,big); +extern BOOL quad2(_MIPT_ big,big); +extern BOOL inverse2(_MIPT_ big,big); +extern void karmul2(int,mr_small *,mr_small *,mr_small *,mr_small *); +extern void karmul2_poly(_MIPT_ int,big *,big *,big *,big *); +extern void karmul2_poly_upper(_MIPT_ int,big *,big *,big *,big *); +extern void gf2m_dotprod(_MIPT_ int,big *,big *,big); +extern int trace2(_MIPT_ big); +extern void rand2(_MIPT_ big); +extern void gcd2(_MIPT_ big,big,big); +extern int degree2(big); + +/* zzn2 stuff */ + +extern BOOL zzn2_iszero(zzn2 *); +extern BOOL zzn2_isunity(_MIPT_ zzn2 *); +extern void zzn2_from_int(_MIPT_ int,zzn2 *); +extern void zzn2_from_ints(_MIPT_ int,int,zzn2 *); +extern void zzn2_copy(zzn2 *,zzn2 *); +extern void zzn2_zero(zzn2 *); +extern void zzn2_negate(_MIPT_ zzn2 *,zzn2 *); +extern void zzn2_conj(_MIPT_ zzn2 *,zzn2 *); +extern void zzn2_add(_MIPT_ zzn2 *,zzn2 *,zzn2 *); +extern void zzn2_sub(_MIPT_ zzn2 *,zzn2 *,zzn2 *); +extern void zzn2_smul(_MIPT_ zzn2 *,big,zzn2 *); +extern void zzn2_mul(_MIPT_ zzn2 *,zzn2 *,zzn2 *); +extern void zzn2_sqr(_MIPT_ zzn2 *,zzn2 *); +extern void zzn2_inv(_MIPT_ zzn2 *); +extern void zzn2_timesi(_MIPT_ zzn2 *); +extern void zzn2_powl(_MIPT_ zzn2 *,big,zzn2 *); +extern void zzn2_from_zzns(big,big,zzn2 *); +extern void zzn2_from_bigs(_MIPT_ big,big,zzn2 *); +extern void zzn2_from_zzn(big,zzn2 *); +extern void zzn2_from_big(_MIPT_ big, zzn2 *); +extern void zzn2_sadd(_MIPT_ zzn2 *,big,zzn2 *); +extern void zzn2_ssub(_MIPT_ zzn2 *,big,zzn2 *); +extern void zzn2_div2(_MIPT_ zzn2 *); +extern void zzn2_div3(_MIPT_ zzn2 *); +extern void zzn2_div5(_MIPT_ zzn2 *); +extern void zzn2_imul(_MIPT_ zzn2 *,int,zzn2 *); +extern BOOL zzn2_compare(zzn2 *,zzn2 *); +extern void zzn2_txx(_MIPT_ zzn2 *); +extern void zzn2_txd(_MIPT_ zzn2 *); +extern BOOL zzn2_sqrt(_MIPT_ zzn2 *,zzn2 *); +extern BOOL zzn2_qr(_MIPT_ zzn2 *); +extern BOOL zzn2_multi_inverse(_MIPT_ int,zzn2 *,zzn2 *); + + +/* zzn3 stuff */ + +extern void zzn3_set(_MIPT_ int,big); +extern BOOL zzn3_iszero(zzn3 *); +extern BOOL zzn3_isunity(_MIPT_ zzn3 *); +extern void zzn3_from_int(_MIPT_ int,zzn3 *); +extern void zzn3_from_ints(_MIPT_ int,int,int,zzn3 *); +extern void zzn3_copy(zzn3 *,zzn3 *); +extern void zzn3_zero(zzn3 *); +extern void zzn3_negate(_MIPT_ zzn3 *,zzn3 *); +extern void zzn3_powq(_MIPT_ zzn3 *,zzn3 *); +extern void zzn3_add(_MIPT_ zzn3 *,zzn3 *,zzn3 *); +extern void zzn3_sub(_MIPT_ zzn3 *,zzn3 *,zzn3 *); +extern void zzn3_smul(_MIPT_ zzn3 *,big,zzn3 *); +extern void zzn3_mul(_MIPT_ zzn3 *,zzn3 *,zzn3 *); +extern void zzn3_inv(_MIPT_ zzn3 *); +extern void zzn3_timesi(_MIPT_ zzn3 *); +extern void zzn3_timesi2(_MIPT_ zzn3 *); +extern void zzn3_powl(_MIPT_ zzn3 *,big,zzn3 *); +extern void zzn3_from_zzns(big,big,big,zzn3 *); +extern void zzn3_from_bigs(_MIPT_ big,big,big,zzn3 *); +extern void zzn3_from_zzn(big,zzn3 *); +extern void zzn3_from_zzn_1(big,zzn3 *); +extern void zzn3_from_zzn_2(big,zzn3 *); +extern void zzn3_from_big(_MIPT_ big, zzn3 *); +extern void zzn3_sadd(_MIPT_ zzn3 *,big,zzn3 *); +extern void zzn3_ssub(_MIPT_ zzn3 *,big,zzn3 *); +extern void zzn3_div2(_MIPT_ zzn3 *); +extern void zzn3_imul(_MIPT_ zzn3 *,int,zzn3 *); +extern BOOL zzn3_compare(zzn3 *,zzn3 *); + +/* zzn4 stuff */ + +extern BOOL zzn4_iszero(zzn4 *); +extern BOOL zzn4_isunity(_MIPT_ zzn4 *); +extern void zzn4_from_int(_MIPT_ int,zzn4 *); +extern void zzn4_copy(zzn4 *,zzn4 *); +extern void zzn4_zero(zzn4 *); +extern void zzn4_negate(_MIPT_ zzn4 *,zzn4 *); +extern void zzn4_powq(_MIPT_ zzn2 *,zzn4 *); +extern void zzn4_add(_MIPT_ zzn4 *,zzn4 *,zzn4 *); +extern void zzn4_sub(_MIPT_ zzn4 *,zzn4 *,zzn4 *); +extern void zzn4_smul(_MIPT_ zzn4 *,zzn2 *,zzn4 *); +extern void zzn4_sqr(_MIPT_ zzn4 *,zzn4 *); +extern void zzn4_mul(_MIPT_ zzn4 *,zzn4 *,zzn4 *); +extern void zzn4_inv(_MIPT_ zzn4 *); +extern void zzn4_timesi(_MIPT_ zzn4 *); +extern void zzn4_tx(_MIPT_ zzn4 *); +extern void zzn4_from_zzn2s(zzn2 *,zzn2 *,zzn4 *); +extern void zzn4_from_zzn2(zzn2 *,zzn4 *); +extern void zzn4_from_zzn2h(zzn2 *,zzn4 *); +extern void zzn4_from_zzn(big,zzn4 *); +extern void zzn4_from_big(_MIPT_ big , zzn4 *); +extern void zzn4_sadd(_MIPT_ zzn4 *,zzn2 *,zzn4 *); +extern void zzn4_ssub(_MIPT_ zzn4 *,zzn2 *,zzn4 *); +extern void zzn4_div2(_MIPT_ zzn4 *); +extern void zzn4_conj(_MIPT_ zzn4 *,zzn4 *); +extern void zzn4_imul(_MIPT_ zzn4 *,int,zzn4 *); +extern void zzn4_lmul(_MIPT_ zzn4 *,big,zzn4 *); +extern BOOL zzn4_compare(zzn4 *,zzn4 *); + +/* ecn2 stuff */ + +extern BOOL ecn2_iszero(ecn2 *); +extern void ecn2_copy(ecn2 *,ecn2 *); +extern void ecn2_zero(ecn2 *); +extern BOOL ecn2_compare(_MIPT_ ecn2 *,ecn2 *); +extern void ecn2_norm(_MIPT_ ecn2 *); +extern void ecn2_get(_MIPT_ ecn2 *,zzn2 *,zzn2 *,zzn2 *); +extern void ecn2_getxy(ecn2 *,zzn2 *,zzn2 *); +extern void ecn2_getx(ecn2 *,zzn2 *); +extern void ecn2_getz(_MIPT_ ecn2 *,zzn2 *); +extern void ecn2_rhs(_MIPT_ zzn2 *,zzn2 *); +extern BOOL ecn2_set(_MIPT_ zzn2 *,zzn2 *,ecn2 *); +extern BOOL ecn2_setx(_MIPT_ zzn2 *,ecn2 *); +extern void ecn2_setxyz(_MIPT_ zzn2 *,zzn2 *,zzn2 *,ecn2 *); +extern void ecn2_negate(_MIPT_ ecn2 *,ecn2 *); +extern BOOL ecn2_add3(_MIPT_ ecn2 *,ecn2 *,zzn2 *,zzn2 *,zzn2 *); +extern BOOL ecn2_add2(_MIPT_ ecn2 *,ecn2 *,zzn2 *,zzn2 *); +extern BOOL ecn2_add1(_MIPT_ ecn2 *,ecn2 *,zzn2 *); +extern BOOL ecn2_add(_MIPT_ ecn2 *,ecn2 *); +extern BOOL ecn2_sub(_MIPT_ ecn2 *,ecn2 *); +extern BOOL ecn2_add_sub(_MIPT_ ecn2 *,ecn2 *,ecn2 *,ecn2 *); +extern int ecn2_mul2_jsf(_MIPT_ big,ecn2 *,big,ecn2 *,ecn2 *); +extern int ecn2_mul(_MIPT_ big,ecn2 *); +extern void ecn2_psi(_MIPT_ zzn2 *,ecn2 *); +extern BOOL ecn2_multi_norm(_MIPT_ int ,zzn2 *,ecn2 *); +extern int ecn2_mul4_gls_v(_MIPT_ big *,int,ecn2 *,big *,ecn2 *,zzn2 *,ecn2 *); +extern int ecn2_muln_engine(_MIPT_ int,int,int,int,big *,big *,big *,big *,ecn2 *,ecn2 *,ecn2 *); +extern void ecn2_precomp_gls(_MIPT_ int,BOOL,ecn2 *,zzn2 *,ecn2 *); +extern int ecn2_mul2_gls(_MIPT_ big *,ecn2 *,zzn2 *,ecn2 *); +extern void ecn2_precomp(_MIPT_ int,BOOL,ecn2 *,ecn2 *); +extern int ecn2_mul2(_MIPT_ big,int,ecn2 *,big,ecn2 *,ecn2 *); +#ifndef MR_STATIC +extern BOOL ecn2_brick_init(_MIPT_ ebrick *,zzn2 *,zzn2 *,big,big,big,int,int); +extern void ecn2_brick_end(ebrick *); +#else +extern void ebrick_init(ebrick *,const mr_small *,big,big,big,int,int); +#endif +extern void ecn2_mul_brick_gls(_MIPT_ ebrick *B,big *,zzn2 *,zzn2 *,zzn2 *); +extern void ecn2_multn(_MIPT_ int,big *,ecn2 *,ecn2 *); +extern void ecn2_mult4(_MIPT_ big *,ecn2 *,ecn2 *); +/* Group 3 - Floating-slash routines */ + +#ifdef MR_FLASH +extern void fpack(_MIPT_ big,big,flash); +extern void numer(_MIPT_ flash,big); +extern void denom(_MIPT_ flash,big); +extern BOOL fit(big,big,int); +extern void build(_MIPT_ flash,int (*)(_MIPT_ big,int)); +extern void mround(_MIPT_ big,big,flash); +extern void flop(_MIPT_ flash,flash,int *,flash); +extern void fmul(_MIPT_ flash,flash,flash); +extern void fdiv(_MIPT_ flash,flash,flash); +extern void fadd(_MIPT_ flash,flash,flash); +extern void fsub(_MIPT_ flash,flash,flash); +extern int fcomp(_MIPT_ flash,flash); +extern void fconv(_MIPT_ int,int,flash); +extern void frecip(_MIPT_ flash,flash); +extern void ftrunc(_MIPT_ flash,big,flash); +extern void fmodulo(_MIPT_ flash,flash,flash); +extern void fpmul(_MIPT_ flash,int,int,flash); +extern void fincr(_MIPT_ flash,int,int,flash); +extern void dconv(_MIPT_ double,flash); +extern double fdsize(_MIPT_ flash); +extern void frand(_MIPT_ flash); + +/* Group 4 - Advanced Flash routines */ + +extern void fpower(_MIPT_ flash,int,flash); +extern BOOL froot(_MIPT_ flash,int,flash); +extern void fpi(_MIPT_ flash); +extern void fexp(_MIPT_ flash,flash); +extern void flog(_MIPT_ flash,flash); +extern void fpowf(_MIPT_ flash,flash,flash); +extern void ftan(_MIPT_ flash,flash); +extern void fatan(_MIPT_ flash,flash); +extern void fsin(_MIPT_ flash,flash); +extern void fasin(_MIPT_ flash,flash); +extern void fcos(_MIPT_ flash,flash); +extern void facos(_MIPT_ flash,flash); +extern void ftanh(_MIPT_ flash,flash); +extern void fatanh(_MIPT_ flash,flash); +extern void fsinh(_MIPT_ flash,flash); +extern void fasinh(_MIPT_ flash,flash); +extern void fcosh(_MIPT_ flash,flash); +extern void facosh(_MIPT_ flash,flash); +#endif + + +/* Test predefined Macros to determine compiler type, and hopefully + selectively use fast in-line assembler (or other compiler specific + optimisations. Note I am unsure of Microsoft version numbers. So I + suspect are Microsoft. + + Note: It seems to be impossible to get the 16-bit Microsoft compiler + to allow inline 32-bit op-codes. So I suspect that INLINE_ASM == 2 will + never work with it. Pity. + +#define INLINE_ASM 1 -> generates 8086 inline assembly +#define INLINE_ASM 2 -> generates mixed 8086 & 80386 inline assembly, + so you can get some benefit while running in a + 16-bit environment on 32-bit hardware (DOS, Windows + 3.1...) +#define INLINE_ASM 3 -> generate true 80386 inline assembly - (Using DOS + extender, Windows '95/Windows NT) + Actually optimised for Pentium + +#define INLINE_ASM 4 -> 80386 code in the GNU style (for (DJGPP) + +Small, medium, compact and large memory models are supported for the +first two of the above. + +*/ + +/* To allow for inline assembly */ + +#ifdef __GNUC__ + #define ASM __asm__ __volatile__ +#endif + +#ifdef __TURBOC__ + #define ASM asm +#endif + +#ifdef _MSC_VER + #define ASM _asm +#endif + +#ifndef MR_NOASM + +/* Win64 - inline the time critical function */ +#ifndef MR_NO_INTRINSICS + #ifdef MR_WIN64 + #define muldvd(a,b,c,rp) (*(rp)=_umul128((a),(b),&(tm)),*(rp)+=(c),tm+=(*(rp)<(c)),tm) + #define muldvd2(a,b,c,rp) (tr=_umul128((a),(b),&(tm)),tr+=(*(c)),tm+=(tr<(*(c))),tr+=(*(rp)),tm+=(tr<(*(rp))),*(rp)=tr,*(c)=tm) + #endif + +/* Itanium - inline the time-critical functions */ + + #ifdef MR_ITANIUM + #define muldvd(a,b,c,rp) (tm=_m64_xmahu((a),(b),(c)),*(rp)=_m64_xmalu((a),(b),(c)),tm) + #define muldvd2(a,b,c,rp) (tm=_m64_xmalu((a),(b),(*(c))),*(c)=_m64_xmahu((a),(b),(*(c))),tm+=*(rp),*(c)+=(tm<*(rp)),*(rp)=tm) + #endif +#endif +/* + +SSE2 code. Works as for itanium - but in fact it is slower than the regular code so not recommended +Would require a call to emmintrin.h or xmmintrin.h, and an __m128i variable tm to be declared in effected +functions. But it works! + + #define muldvd(a,b,c,rp) (tm=_mm_add_epi64(_mm_mul_epu32(_mm_cvtsi32_si128((a)),_mm_cvtsi32_si128((b))),_mm_cvtsi32_si128((c))),*(rp)=_mm_cvtsi128_si32(tm),_mm_cvtsi128_si32(_mm_shuffle_epi32(tm,_MM_SHUFFLE(3,2,0,1))) ) + #define muldvd2(a,b,c,rp) (tm=_mm_add_epi64(_mm_add_epi64(_mm_mul_epu32(_mm_cvtsi32_si128((a)),_mm_cvtsi32_si128((b))),_mm_cvtsi32_si128(*(c))),_mm_cvtsi32_si128(*(rp))),*(rp)=_mm_cvtsi128_si32(tm),*(c)=_mm_cvtsi128_si32( _mm_shuffle_epi32(tm,_MM_SHUFFLE(3,2,0,1)) ) +*/ + +/* Borland C/Turbo C */ + + #ifdef __TURBOC__ + #ifndef __HUGE__ + #if defined(__COMPACT__) || defined(__LARGE__) + #define MR_LMM + #endif + + #if MIRACL==16 + #define INLINE_ASM 1 + #endif + + #if __TURBOC__>=0x410 + #if MIRACL==32 +#if defined(__SMALL__) || defined(__MEDIUM__) || defined(__LARGE__) || defined(__COMPACT__) + #define INLINE_ASM 2 + #else + #define INLINE_ASM 3 + #endif + #endif + #endif + #endif + #endif + +/* Microsoft C */ + + #ifdef _MSC_VER + #ifndef M_I86HM + #if defined(M_I86CM) || defined(M_I86LM) + #define MR_LMM + #endif + #if _MSC_VER>=600 + #if _MSC_VER<1200 + #if MIRACL==16 + #define INLINE_ASM 1 + #endif + #endif + #endif + #if _MSC_VER>=1000 + #if MIRACL==32 + #define INLINE_ASM 3 + #endif + #endif + #endif + #endif + +/* DJGPP GNU C */ + + #ifdef __GNUC__ + #ifdef i386 + #if MIRACL==32 + #define INLINE_ASM 4 + #endif + #endif + #endif + +#endif + +#ifdef __cplusplus +} +#endif + + + +/* + The following contribution is from Tielo Jongmans, Netherlands + These inline assembler routines are suitable for Watcom 10.0 and up + + Added into miracl.h. Notice the override of the original declarations + of these routines, which should be removed. + + The following pragma is optional, it is dangerous, but it saves a + calling sequence +*/ + +/* + +#pragma off (check_stack); + +extern unsigned int muldiv(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int *); +#pragma aux muldiv= \ + "mul edx" \ + "add eax,ebx" \ + "adc edx,0" \ + "div ecx" \ + "mov [esi],edx" \ + parm [eax] [edx] [ebx] [ecx] [esi] \ + value [eax] \ + modify [eax edx]; + +extern unsigned int muldvm(unsigned int, unsigned int, unsigned int, unsigned int *); +#pragma aux muldvm= \ + "div ebx" \ + "mov [ecx],edx" \ + parm [edx] [eax] [ebx] [ecx] \ + value [eax] \ + modify [eax edx]; + +extern unsigned int muldvd(unsigned int, unsigned int, unsigned int, unsigned int *); +#pragma aux muldvd= \ + "mul edx" \ + "add eax,ebx" \ + "adc edx,0" \ + "mov [ecx],eax" \ + "mov eax,edx" \ + parm [eax] [edx] [ebx] [ecx] \ + value [eax] \ + modify [eax edx]; + +*/ + + +#endif + + diff --git a/engines/vendor_defns/mirdef.h b/engines/vendor_defns/mirdef.h new file mode 100644 index 00000000..210c314f --- /dev/null +++ b/engines/vendor_defns/mirdef.h @@ -0,0 +1,30 @@ +/* + * MIRACL compiler/hardware definitions - mirdef.h + * For C++ build of library + */ + +#ifndef HEADER_MIRDEF_H +#define HEADER_MIRDEF_H + +#ifdef __cplusplus +extern "C"{ +#endif + +#define MR_LITTLE_ENDIAN +#define MIRACL 64 +#define mr_utype long +#define mr_dltype long long +#define mr_unsign64 unsigned long +#define MR_IBITS 32 +#define MR_LBITS 64 +#define mr_unsign32 unsigned int +#define MR_FLASH 52 +#define MAXBASE ((mr_small)1<<(MIRACL-1)) +#define MR_BITSINCHAR 8 +#define MR_CPP + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/test/serpenttest.c b/test/serpenttest.c index 180ec03d..f824ec2b 100644 --- a/test/serpenttest.c +++ b/test/serpenttest.c @@ -145,18 +145,18 @@ int main(void) } /* encrypt */ - memcpy(ct2.b, pt1, SERPENT_BLK_LEN); + memcpy(ct2.b, pt1, SERPENT_BLOCK_SIZE); printf("\n\n"); dump_hex("plaintext", ct2.b, 16); - serpent_encrypt(ct2.b, &skey); + serpent_encrypt(pt1,ct2.b, &skey); dump_hex("ciphertext", ct2.b, 16); if (memcmp(ct1, ct2.b, clen) == 0) { printf("\nEncryption OK"); - serpent_decrypt(ct2.b, &skey); + serpent_decrypt(ct2.b,pt1, &skey); if (memcmp(pt1, ct2.b, plen) == 0) { printf("\nDecryption OK"); dump_hex("plaintext", ct2.b, 16);