From 953de0828132409f92536acafda3d3d70703469c Mon Sep 17 00:00:00 2001 From: sureror Date: Mon, 15 Jan 2024 09:14:10 +0800 Subject: [PATCH 01/12] frontends --- frontends/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 frontends/README.md diff --git a/frontends/README.md b/frontends/README.md new file mode 100644 index 0000000..866b7e1 --- /dev/null +++ b/frontends/README.md @@ -0,0 +1 @@ +# web前端 \ No newline at end of file From 4adce253d4a79653d0d27c11ffed62786b21dc39 Mon Sep 17 00:00:00 2001 From: sureror Date: Mon, 15 Jan 2024 09:15:18 +0800 Subject: [PATCH 02/12] gmssl_engine --- gmssl_engine/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 gmssl_engine/README.md diff --git a/gmssl_engine/README.md b/gmssl_engine/README.md new file mode 100644 index 0000000..5494e8f --- /dev/null +++ b/gmssl_engine/README.md @@ -0,0 +1,9 @@ +# 提供基于gmssl的接口 + + +- GMSSL的动态库 + +- Python封装的加解密,签名验签接口 + + +> [GMSSL代码源地址](https://github.com/guanzhi/GmSSL) \ No newline at end of file From c6de61f20016ebabfb44f06fa29732084cbd3e58 Mon Sep 17 00:00:00 2001 From: sureror Date: Mon, 15 Jan 2024 14:16:06 +0800 Subject: [PATCH 03/12] gmssl_engine/GmSSL3.1.1 --- gmssl_engine/GmSSL3.1.1/bin/gmssl.dll | Bin 0 -> 1695744 bytes gmssl_engine/GmSSL3.1.1/bin/gmssl.exe | Bin 0 -> 308224 bytes gmssl_engine/GmSSL3.1.1/include/gmssl/aead.h | 108 +++ gmssl_engine/GmSSL3.1.1/include/gmssl/aes.h | 90 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/api.h | 23 + gmssl_engine/GmSSL3.1.1/include/gmssl/asn1.h | 301 ++++++ .../GmSSL3.1.1/include/gmssl/base64.h | 72 ++ .../GmSSL3.1.1/include/gmssl/block_cipher.h | 74 ++ .../GmSSL3.1.1/include/gmssl/chacha20.h | 57 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/cms.h | 552 +++++++++++ gmssl_engine/GmSSL3.1.1/include/gmssl/des.h | 58 ++ .../GmSSL3.1.1/include/gmssl/digest.h | 87 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/dylib.h | 54 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/ec.h | 64 ++ .../GmSSL3.1.1/include/gmssl/endian.h | 78 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/error.h | 67 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/file.h | 29 + gmssl_engine/GmSSL3.1.1/include/gmssl/gcm.h | 73 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/gf128.h | 53 ++ .../GmSSL3.1.1/include/gmssl/hash_drbg.h | 79 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/hex.h | 32 + gmssl_engine/GmSSL3.1.1/include/gmssl/hkdf.h | 45 + gmssl_engine/GmSSL3.1.1/include/gmssl/hmac.h | 47 + gmssl_engine/GmSSL3.1.1/include/gmssl/http.h | 29 + gmssl_engine/GmSSL3.1.1/include/gmssl/md5.h | 48 + gmssl_engine/GmSSL3.1.1/include/gmssl/mem.h | 27 + gmssl_engine/GmSSL3.1.1/include/gmssl/oid.h | 215 +++++ .../GmSSL3.1.1/include/gmssl/pbkdf2.h | 54 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/pem.h | 33 + gmssl_engine/GmSSL3.1.1/include/gmssl/pkcs8.h | 169 ++++ gmssl_engine/GmSSL3.1.1/include/gmssl/rand.h | 31 + gmssl_engine/GmSSL3.1.1/include/gmssl/rc4.h | 40 + .../GmSSL3.1.1/include/gmssl/rdrand.h | 33 + gmssl_engine/GmSSL3.1.1/include/gmssl/rsa.h | 56 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/sdf.h | 69 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/sha1.h | 45 + gmssl_engine/GmSSL3.1.1/include/gmssl/sha2.h | 102 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/sha3.h | 92 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/skf.h | 116 +++ gmssl_engine/GmSSL3.1.1/include/gmssl/sm2.h | 382 ++++++++ .../GmSSL3.1.1/include/gmssl/sm2_blind.h | 49 + .../GmSSL3.1.1/include/gmssl/sm2_commit.h | 40 + .../GmSSL3.1.1/include/gmssl/sm2_elgamal.h | 67 ++ .../GmSSL3.1.1/include/gmssl/sm2_key_share.h | 45 + .../GmSSL3.1.1/include/gmssl/sm2_recover.h | 31 + .../GmSSL3.1.1/include/gmssl/sm2_ring.h | 63 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/sm3.h | 89 ++ .../GmSSL3.1.1/include/gmssl/sm3_rng.h | 42 + .../GmSSL3.1.1/include/gmssl/sm3_x8_avx2.h | 33 + gmssl_engine/GmSSL3.1.1/include/gmssl/sm4.h | 142 +++ .../GmSSL3.1.1/include/gmssl/sm4_cbc_mac.h | 35 + .../GmSSL3.1.1/include/gmssl/sm4_cl.h | 55 ++ .../GmSSL3.1.1/include/gmssl/sm4_rng.h | 43 + gmssl_engine/GmSSL3.1.1/include/gmssl/sm9.h | 561 +++++++++++ .../GmSSL3.1.1/include/gmssl/socket.h | 73 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/tls.h | 875 ++++++++++++++++++ .../GmSSL3.1.1/include/gmssl/version.h | 32 + gmssl_engine/GmSSL3.1.1/include/gmssl/x509.h | 16 + .../GmSSL3.1.1/include/gmssl/x509_alg.h | 68 ++ .../GmSSL3.1.1/include/gmssl/x509_cer.h | 390 ++++++++ .../GmSSL3.1.1/include/gmssl/x509_crl.h | 309 +++++++ .../GmSSL3.1.1/include/gmssl/x509_ext.h | 641 +++++++++++++ .../GmSSL3.1.1/include/gmssl/x509_req.h | 81 ++ gmssl_engine/GmSSL3.1.1/include/gmssl/zuc.h | 147 +++ gmssl_engine/GmSSL3.1.1/lib/gmssl.lib | Bin 0 -> 342666 bytes 65 files changed, 7511 insertions(+) create mode 100644 gmssl_engine/GmSSL3.1.1/bin/gmssl.dll create mode 100644 gmssl_engine/GmSSL3.1.1/bin/gmssl.exe create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/aead.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/aes.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/api.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/asn1.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/base64.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/block_cipher.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/chacha20.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/cms.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/des.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/digest.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/dylib.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/ec.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/endian.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/error.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/file.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/gcm.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/gf128.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/hash_drbg.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/hex.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/hkdf.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/hmac.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/http.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/md5.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/mem.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/oid.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/pbkdf2.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/pem.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/pkcs8.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/rand.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/rc4.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/rdrand.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/rsa.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sdf.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sha1.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sha2.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sha3.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/skf.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm2.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_blind.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_commit.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_elgamal.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_key_share.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_recover.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_ring.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm3.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_rng.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_x8_avx2.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm4.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cbc_mac.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cl.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_rng.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/sm9.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/socket.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/tls.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/version.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/x509.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/x509_alg.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/x509_cer.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/x509_crl.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/x509_ext.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/x509_req.h create mode 100644 gmssl_engine/GmSSL3.1.1/include/gmssl/zuc.h create mode 100644 gmssl_engine/GmSSL3.1.1/lib/gmssl.lib diff --git a/gmssl_engine/GmSSL3.1.1/bin/gmssl.dll b/gmssl_engine/GmSSL3.1.1/bin/gmssl.dll new file mode 100644 index 0000000000000000000000000000000000000000..a1ec03db09eb755688a243098860808882c34745 GIT binary patch literal 1695744 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�i&&Q@kwT+DKad;4iHT2 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%0Dqb_6Id6 z<+7_PH)wy}V+(f)Ed5>qKL>+wWy*1}mG2LhW%kQrCzttaqEUQRU*>l13H=|J%Y096 z2{gs|MQr!4TqohAsi^TlaW+nle+>$R~mZUXURwNctQzGJWFemr+|e2rS8Z3~=} za&m2hVth|5*Ps3&Kq%>Y|34`5U43*vA&}paoU@q7t@S_LF0UVI3mjb$`NGleUwP&C ztB_y%RoE}C{EGRdk6&TR>u==BmKhjcF8ROD{%giU_g{WJufTa7#rog%_`=`md7J2Q zy)XXf(eq~c?!TutLHXui*e3c{=R5gSE|%dZ+MQz#%GMA5|K?wuXyTlCP}&2Ig}rD`4t$<(KJA91baKT=6jt#_{5qRy|U&nxxL#@lgS9B-9#6FSo3p>j5v%kj(P{vih_ zEmu1a>YwaLDz4A-*P@yaWjIMEPwUImE_Y*2vpX{z=PaGxoIBE6>*pC%z5Y*nKquD* zI2*jQv8IXe7W~s0oirPzxOg`S6O(xrtd~8Kn-L{tFgWP;+ zWAlZdgNHeI*o3Tw=?6&L$$N~0oJ}4@kN?oAs;A3-Q@$||URJE2{}g>{aaF8d{9*M) z8dllcm5{HLP*uM79BGhvP8Ur>tJE{C%03P#9ciWXDD6`eyQ-$F^i|)m!3s zi@MU^{I2}0^aS*q`HazIVOecnrQw0UDy+<|K2Gt zm8<{Ch6PjG^6QJ1M&Wr~;d1#M+apJ5&qL*^xBhxttW2X7(wl@g()x=(^mW`{ftuP{m-$U%AS!NWU67Aga^)>ou1DS9?PB&9|sr{t@}71k~pNMO$&D z^@Vcjx8m~EgHrjd>Xpr{Z0)U-pQEk3T=gm3z6ph=P4apE0_wMHQ~%%ggzBN+$}3j? zOHEVCRu9CyNhyu!v?*FHzhiqs)26cd$7?6WhQV^LQ$_vv^@J)~(9xEw{ukt{s;|@E z?G^r_Y`XM3F*-1dZlYY}R@je*rb&K#_3KfjL;ruXBUHbFjuEU@IzV?=%K{# zX^F6U-x!IT!P6!YFCIF1yxx7I5+}-C>}$mH9oeMw6MS+YE~nk%3(a~d)p_r^lKMn` zl<(i!YIIIAFK2#4R_fA|=C&uDmxNfapsvf9%pz49D2dW;Z zdZ6lo0uO}edEVPM3%9QC{M=%79vM7{UzmB<|AKrDoe}3VF4TIdD}JejT=)DBS(nOL zj_!Gn|K+)fgJKKvN2TS@NVfTBOqJ6wLaw`vENlG;&NVD=d;jmw16*+VEpBp^^`_sk zma|?gLiv8jT_O9c@(a$@4DAmrmi}?K;L1KuEN*hWzFRn=ob9I)a%Evv|M{Qwz`Txx zH;3_#e3!oHYP}Wd+cJ&GocqKedS0+9Up;`k67toFWVz)3w-qCv%*7H7iCBBQk<&|? z7kWM?(s$<9KZ5+`#KO;?yW$ri*Xt|0S`QW^_rI+NT}`*V%eZ>KKkYBh4*0Wso#@hQ z+;C6#>ODv4?S==s*GVq_4sLj)d!6jkC%EBV+-t6_uU0>{ua;|x*Vb|vM*YYky~K?O z_aESfxgp$lpc^l42>0((>%@zj##D1Mmv_1lA+xJ~chdQf8+k?*J|E1L>o@K4%I*62 zydXOxK9s&xd?-aDihRGUMgGcWzpURO*9h?yk{`IJGWG{9DyRJZ11jsEKz?QX6UeWKe`vE6^^YRI zBK}e2SHwT`Qx)}(BEKU3QRG+5Ka2~Wj{+TK?uSG^7;h@8M|Pgoe->L0w6w(&>VmJU z&uki->tk#)~_D8P+%F9&@a{qT|Ii&$}^S)P5hPn zyvt_JwQSS2;9uuYoN_rwo-Lc!I*4)3@b06z%S27xYmxSBJ$-U6naxcf(b4Jqz@(Fl z^Jsrx33=Y0O}XqVr##oqWxwRw`pJDlvHq1~sP`T-uLtDO*41_yPsSUI^+SJH`R-h! zV*aVLe0T0pG5aee-)&Uh+_CKT|54;us{VNXsmhl_YeE0EsQgpu_EnW1ly5#8tLXUn zN0eXA{-KzEDlNa9^}m??m6GrEKjoaisrLU-bx%FW!GHD*sfveO2ZA<*Tg4 zy=i$_){RxU;ycxTu|?qrx4SBPxm8N8+x*IIZ@J}0y1TO3Tb1jyi%R>UQuX0~Rc_fg zFslNq9;kX?vG;&@_Rxz>7B3^waC-v}G;28+q)9#Pxa-d++Giwk19?CZeU7vUY14Moli>Djt2wzZ5@u7SE?L>0z0Ubly2< zMMQA!&zNMoIp5-vsF>W5*!}bBm6LD(_?L2(f5A@xl*yk3NB{p`<$A7m{p{EsxVcPz z)-)+Nm2YWtOSfGVXp%~ia|*h0`jfd@c@kx~sDFETEE>5%OLzQKZo4ZZUzV=g{gt5} z34gnC6{E}JkMhg)+7t%_(Yn6-LN;oj?&jJ!M}k^&$ZRI^HIVq zj!2Y$G@-U+pFy=AL53BEaii)d)lBFmznc>Ya>;~9Kf_Be!hFz@^};ScBuBo8?_b*| z8V|{dPbTC~u{FjL9obn)|7Y2{+&?GfTkwVN!AIoEo>KW)wsOn&d;G5ULtV7HQgZ!~ zqYU=8XE@W-JF4`z%Jaqt-jmNUx$+m9?if2dIoGK-!TQ5lkT?fL6YVyPx?vN9SsL}g zO)7_H?icR-(Ng8)Sh4v3>-n2++&fx3a+>4Ex;gEcG(UsxyI;%Z;xQ-gzw;yMi@v|S zAP?@=dv|TOKA;x#1^qyOFaT@?27*DL4~+cn)(2*JC4sz>NM1=OuOyaN1js8w-E%@@idqwXVEcS6;0vuhx}U>&mNj<<+|K`nvM^I`V`L@z;B%^PPD=_d3wM zZtGrmaIeGN>qz%H#=TB(uan&CF790z>?_N)Lujjkh%iZhs z?)7%}dcS*p+`T^UUSD>vZ@bqI-Rqa`b-sJmvQEC^xpbdcKHlv0{9WxoM7m<{Sr2J% zZ%rlSYEAlgf-^VQhK?UUrf$eMZPd6)btCE~YC}g&s;Qqean!gGl1&>wY*L*{88>;% z7!fmm=uUORCe@4@UN>&is2xX<(&ca1E1Ad-Pv#QYRC_*?b;(-YF8nsrxFIs_#5(6H z;_Ajt9$PnY$fUaA4rkrip>@NDdm&AmJZZ;)^?7=yW+#4P-IyVhMop=UjUOdbjO%D) z8Jh4}$X7ZaZ)i=rlu5}}c4OxF@l#Tb$&5l6HKe~ECp1i+G;9(hzcwP7W@E24H80ud zgtPJX7DdmLR4x^0(L8=%*5q_bbk*@zmojYRkcmU^<;0M8HErnF34R)(zrJqg$($`- z=iE=iZxhCh8a8T@2#ddR*9%{sJEH#9dgjaXM^eY`vdfKS`Jy0`Zgt1KvdC|hJGRR1 zcGuUbrP`hJM}_68t}dq^s&bwBPU*Ah(6CA(;(%xGe1= z&r$jzsb%s*Mden&ztY|c$W1f3ZfnoajTJhiEakUo<%b+p0sG4@Kc047ABZlC-4&Ia z;ViAL|4wbETd}kNmuPpK~8X{#L)F zJ6c;se=g;UKqdA=q+G8B32kK>KNdH+nN(ve&Ee%v-EN5Il6`6imeC&-moFa%#dzeB z&ZnAE&I-fnz?@u^sa!MvZ+c`URde)P+m~!th57lT>2aPm1;cN7=5K|5`=jacIz``e zm8@@K58au)SFD}>(ejg=*-@VUxo1auMmjS)y$RyP*e*u&nx5P@ZUHutXZZLT+Ri1hglFMjOu6huXt5&lz^#hAq{%`loWT&`m+}9e4m8;n1E{}gY@=XIv zETqd)Zx*HeNDoqW`xi&~@@+ox5=>zsm&HGeTz;ew==Umib?OQ+@BqCt}hU!7`#O z^|0b{qqV!-{;0~2o)aM3qhGES@=tT{Qffu&*$1CP?%@eEgOZwlN$I0;`>Li5Rpw&N$$Ts!PAd_b%F^BzU%4FL(iUr&OE1(|#`hEge^lj1elJtjdrpQ(%qUMi zm-5{2D^j`Gyks^b1(&5>yK-B3A+p@^A#8@-R09oJOVc{Usvf9%pz48$2U?PIY8z7NF3->5kDj+t1C949YMAZU$l17w@2VY=tYWHS_zAEt>e% z$HDyDQ%gb1Ynvb=rOksQqcuSdQi(JPEv7Z1ClADXFyc?V1UZ1;s7@xtdy(F+2XuXX z=A@TZK+22m<5%Si|CaWTbQ=FGs``|cb>_dXF@LP`^nMkfeD&Qc&p*nwo&CJo9GfUV zW)=0ci@zgFy6Ctd``vQO>m~k%){Pi7jv+?|oJ}8jTQ_can5t=#9^!XOD$4JbpRiY) zjN*mMk^kSbyoJwSO^-(BXf)}f-xPp5XY1ahex)Kolf=9G}!Dj&xCurj50~W+5;@cYgFOW~j7JmzpC-mo9 z;__5SuC=wC|0u5g`QdA>@;pec{rl8Paels4f3&!I1V?B3JfC%iZ&ks>--6_A>adC5 znd+5jNNDk7j&D%pt&9=jLA9YUc?-gxO=^C=gIJ6{U!i;FfeQZ#UXNd;i!u;&@mDHd zt zy=HTwu=+b198p%3o=i06;x4zSzTvQ}#!_;GE~<4Ax_|6xM2=tWMVp(7X%p**)TI;I zx$WX76@(z#MxSC4q7BvdD~u8J{sW5AF`_6PBMRwWd8qYPoL5_{KB@IVq!WK$dawTy zVFB;lTFS#c(phk8;vC6P#tA2LBuaH2!<#5uXb4k0g@n9$L{$$s7ept}s(VnA(8 zlv*f1>gYNBdk=~=rkazvynC9ub1H0C$48l-L&v?9Lv&qLC||yG;2%9(IX%w1d#)S1 zJRe;6{46Rx%F7yLs&am-j2`b?)#&;3h4sUE8KSKDb6Xr;OQ?>Ex=~p@L0zw`o}do? zG4up=u(J7CeD#!SPpMg3*NA#8+f_lm4_-7Xt6#-TBA)NaCJUNZdD~Z1Ptd$7t0!n) ze+)fAwXbY`s(Pj`Xg*P@9Y@b|mvW-@KWNV7El1^G^MWqKow=2@|L9Dg(#A!ul>SNaQ)&jpr;+jmr|e#?2jcZhuj%iGZt zbP|=#PcRXv>Jhc9@ONgS^-d|Dh5C+tVf&k^p8u|&u9V+O^;2T{&^S!|wvqcgHU95r zI^p8=Cz$9|w%wIqkJC!3|5iOv^+44F|2rNK&nd(+F!7vByu+o21x*c$XN_ujvq)Hc z)27CYXLo8?JX=x2OGU!sO$#+%JX=%4;#ry+-XaoSA`%w)Qu&7v7Jo~FjreEtA2!q* zxfjoA)&Sy9+>12obD{rZ?|k6nI;wj=`mcmg1f*?%P?iuEr{s_9IKiX=q)2isBHKce z^9LMO>)k79@oIP3T{%_=RQxMxn^KjgZD@IYYDph?G_)#&Hh~mG2_=xUs1P762?!b> z@KR7AK!CKo@0po<_wGt-$@abL$hrD>{5vyu_MDkBXa3x|^GD)Kxc4yxx;RzP-f^xG z%I>DKBuxI&*>ow*8STcWl-aT?U&~%O#dSq;$ewOZf4z6 z7%b!trrC+>2CH0QJdsUbt1pW30^#TnPh_~=sAQg&(k0m*rBW;8v%#?7iQ|660?FpK zru`;?`Jyw$^*z((c2jEG!5%Nviw(a*-? z@4laBbEQk1v0OpFj?+Hi?;a~T1#|MGok#TS>?q%l*Rta*;~aDMlTf-T544=h{Iwx_ zLV|7&%W}L5A5uQT=I>SbK+~T}7q}!eSD4ll!|`&h3Ao*j z;#N<&gfo#%#TkuEId10>Xuh5da%|%iy54-YAOpIMDo@7AVtJAWZFoMEF!P;q75hAz z@9T%@pR4D^>LpjpDWtNY)VDDChGFND-mv(FSzjdG8=b$LUT0cIw5x!%KzF*=5rAMtNZyv%qtu9%F8~X7vPG7|*cCF` z{yjaHD_Ed<);1zJbl(aCuD=og!>`W~)jO$*SKC0#w@&=2OX;y`Qxn2S|B1n0j%!aQ zbi0hI!qZcTa&&z*rBNv*;QZ88j{j>{82JdBf4L8q8W^Zu>2e60Klx=elxB`dXHh zQ)1b(3|)h_Z<%)po4>qYnieSV^cQ7p?N!g<^;0y%M^{1!>6ZdH;(K>o`&iR1?Y%zo zwt6)8**rnzWD-SvO;H%-t;@se%WIIsD)&0eF|WybnS^;0k7v!+i@@_|KL|&BL->xS z`j6`^0!tz zIm1x?64~iKS%RH%Qd~*3x0o1baS(sq+3A@3AjXrJeZ<#kzVmcXmE@8;{ze9dV^>^p zMa+c95dSY$8#d z5J8D-ET>ng$4a?aA|^jkdwPZkS4)?K$2jzmV-SlDYiXvkQ$>eEBo8>#ayVikH<>Pq zMw8tYUX>UdOJ~wrOFa{b?6~|!{)$t1rvL}npX5A69c$0n9-g>rRr0CXF3H-N%cK;O z6$jH9XWWsi(NgSQu^TQERdP93Cf1|NB<5qGl!OoKvaJd~Z&&}WzREC3=N_$~b7Z-g zsIP*TJRfqjMWkY!Q574Tl1pY{XhzHF>0TLs*vMJ&s7lU?=ZCZNPSPRIF(FN9_;cc@7z#nFQo4H+mBzU@;|N0|MV*VGphX0tn&X#mH&BF{#cd&`BnZG zRQb=W@=JT?Prv`%RLP&*3Fv?Ri&g&9s{HaBiQj>fb5cdum)u#ta}jUN=k9%nhbtd> zCQkmU<4L`mB>p2LXhRxow4Vu8msZV?(<&v1TAkrxizdyxXv-zL*r2@aGt8W8c!+N z&*l#{a{VDXIf^#ABI!Lt1F{8A?^&lE)SKHxRDX6Ny+2)|SvQ=_ua(+C+cm)@g8WVg zfkRHB=zk`wIoVux$jMKoOp~hH-@a@zou6|$cYJW6eTBc;E?fAuIQNX> zTJ~EVPi$BIXe$f5b9AIulX_m7<(lzy%D>(C$mXT_eXaR^KYzU>vA>@p<&@?D8)k(IrV@|UDfVsxA_w`SP& zI8v|e*QUVBJ>vTkjB>;1mwR}*@ZQ*rd)AEDjn_VhRGvkBmU7Wyn=Z%82j4yz{_=XL zM`dyPS-P_FxGZS9H}X=>SYj%}4as$uYnP|5$Yof1ePYOy#y^~L6l zOX3^lhm()IysEI>)-Op~kFe}+zr4LvhzloQ(tww3AiVq}3mGm|FTXy;^Kv*y(Hqr- zrN<|j+|cYLZQerJ=Q53I#a5*(VpWEk?Z--OC=Fdr` z<6H#H1r@sC5AS`qQjTAjf!ak?e!`IBmX|23yC~Dj_TC{;<8Ct-AyvVQgDdmxmZ3Zk zG~ed3rp(GxJQ3vhOEI|o9KHT|?YSscN{q)|8ryWpJ(kFncSSjblWy1kw0%{`GuCzV z`MRiL9lCCMeD+)zOK#t~wH(m9dsur8ZR_mxU8lvor@ex~Mx{y)`m4s?p?)!c)j#O} zm8~x!=BMC{GhT8EPRh)1gss07{LPD=KZjZmL6z4NL|(ba(zy$+zShWJWs8r@ko8$M zBW498iy_LBfnk;*o7Q9`N2`Hz6D!-PRqUdkdK*g@%s~Qymd{in9Z$%?3k)te9yZIc zLLXDXEokm5Uik9d{>w<*sPby|m+p&@F{{Ap@ujBBypB@aXRT>H@9ikycBG~}w@f## zJhwcVW$}M5S6-IotElgbZ$&r@M=CB0rR)!1KIIX6VD`W5muBP}>#W5&i}M!mws^nA zhb=B!R2P`vyX&HK`n@S9-Bf6c4lKPFu>Y!l{I!8fduOX#q-M9MveMh7p|7>Bv?Px_g z*Go=$Y$Sb8p#4Hceog>6T;j@tuXw>3V?u?`@L`Q(SI8;rF3|Ehf#kU3WB&~!V$UXv zyY*phvOZCdhgRe}gz>J7A7znX+zPYRIneU+^Dmo-WINb;Tn9OB`5A2uIb%8(inUpJ zS>0P2p^cUxU4H)b*rE$mudkcp6n$BbEUP)SV!fexcyf%0@c4(=pH%3pUUDi8K2W{c zWg5P0u?X7N*auy|R+m?i!8+tG6nV+PVP^Gete0Lr-{rjR z^(u;2x($kZ?S|~@GLNKD&#nlvUekfbN_VuW!b%5pCK)jzs3cX?k9sBzrhEp zH)~&V2a(-6;gwO?a{PG`o7t%H-1=%%Suy3QtAYvl>XqG_XD(bXO+8t-s;QN4%Y33QCS!4qkg;H(izUYcv~_Jb(Khb@~>Nc_Db z-6;H}JlxxU_1Zhzg6i@q>&-KTpz`I~!RG8#Cd2J!mGa7_5R^P`Kc{VgwY(L}qC>Ke z<0mH^dt8~H6HQJy-)C0pZNtiO>u<8#?2yYRN)rQ4w!HD#Y>zVadS$)?Z%=f6b{CA$ z$(7hET&~RlkAJJ>c-Fu1Sy%V)V)3ND{^z09z&Sa)8U1pxltIzB@VDxW%kGSyfir)N8BR^ICp6_DfG_`H(dnRFUxb=eU)wuyOfURqR0Zgz9~3`ux-8!RjlLb9C!$D)m-j z2_f3Si6+PGI&?=Il-}I_L$}M7<>WT~fy)z_uH4hkGwXk27CS9=S-jHXgvA+)vlef$ zSh0S%;2g{yko7!rpjLb=lNk3F5(lL>t*=$&XruF16$IQL*nJc$cgnBaDH&)!YYFt# zunjG54ZZrZ8Ek)YyyVs@PhX7>syxS-4&Los|1MQy$jNZ-+(Bm~$EkOAZ-cH+bxfC* zXZ7!{MOx(uiWLlL(^DJ(+IB0RgqRt27Ph=R5NRON zK%{|41Ca(I4MZArq!=8J5 zT;x=I1_?1g;mC2ne;jlQMb@Rrr}Nn6O({-VF@Nlyf31@&DT{+s`#B@%GAP8F5)Djci+Lw0hnSnIl{w;~CpVcds^Y!6Q~DNoAdA7^JSlah1y z?KQFHhXrRcchK2^eD-n@pXTRaI^&ExS1=Yz6%yBE4gW+{y8P!L{~}TR{?n@ba#k|j zhxB%CJAUoYa=KwUl`c*9CQ6)k)x*)r_6XC8eQtifFR0@Cj4J=BRsQEx`A@I%pNn7a zzG}j?T3XI_7T0F|@?8G9-KCf^CQmt8Nv!NbGl}ialW)Q;1nl#mouf}lP`l;v#81J!N1e&%j&Qgv)E~Ir^PER<}J=x zoV7S-@pg-PyerqM+fDdKwaKFs(0|=cM#`c}7OouE%0jT?iu}||PT3kl)Ej$txWR)*e;(EpnQTaTn^+vmy?e8t`2y{DhH^l9~ zeD&BjiymCNWSa3F?vyl=>m|3`w9EUf$d=aDp3@@lIpz8hO1^#X`4#Wa^~(QBIpwoq zL=WM$({e9;X+!h(51_)-(}^ahKJN+cNj74|;o5N+`EkF4u2w(&4N*{b*LSGoWaSID zQI|QN#GJF3ic2F^F}e;|pR35xgT$cAtwN5!R)v|Lddo4I3(79E{jI9EjVZ^iS90a4 zZ|<7&+79NJ=cNKvjsqA1^vR5uS3msYg9^QvS{bO`b-gn}-0Bx7e}DQpDlMH&F>NeI zxY{bee>#qu(oF4S^@YCy)-S)+Q)TaO3 z#9TJR2iz>{Z?eU`wl65UFTJ!3{^vd2(royjn&-ngIa628x-N3hLyBu4lJecp$EA{w zcXyhPovycsu?Kgo7fL(fzU=#E?jt#--`P~WXjAHuIb(^bOv!h~OMT@_qs;gzK@!TJxkJpaG%jYCE!93ey_V&KU4E>fiHkJp z8{IWD;pMA#CmL=(Be@*csShy^SI=X1WtEsznC(uvy|ZUZu|h8_dF7eIaO%az;GBxdTFu!K~Ue+c7UR3~W|;2Hv* z?lt#cU7pBHu|C+;WBGoN;iuj;7s1-Sug(TqpTgwptD~aOz|$QPf7i}UxzbizTMIn> z$FiS}a$9q~UBqA4-@+iS%4C3@_=(exnp<{QujZWqGe|54Tq|AKF4*7fx_jB(0(zB&gdw|e~I zzFP)WZoYxKd~!BR3cOLX=_8{5BMn3vh%^vsAksjjfk*?91|kha8d#qO+;bSp^U7K0 znz)|q;lK^&$liEY)IW!^d*{wwlPtP*6^aYXMW>&Z_&)tsi0Ym+vp09ZeO|WGzrTiul*GBk%jp38Q~AM<1U3MEqB-mzDlg zPw1LOJAv2Vi2vH-mq`E8Bd-3PGd%kdnbBXQfm#}n^XcS_ym#Zi@WS#rcFi{2J-=?P zc)~;e)`}-*<;mY#@kGA-trbts+LOPv;>r1ZtZqu^$owbE3Y-*sENzIBJ?La|c`wL3 z@6M+BDjzu6WMMjA^5U@;ynDRhIFp>u;6E2SImr?}_Vo}PFHPqickT9i`+a_|o7C#| zVg+CQ%2{3*9youy264mib=OdL8bBlaTFU;^BUDj$OOUo4e?8OrJHqv4>n@KcI$zUxt1?pXnAkwxH@B1kz^uOWEW~XXy366N!S8>gO=p zEjp;^`L}xYZl9aA{8lw^lvEsZu?c<55Zs=e7WE@aDY>$u3leZL)9L zNqGl{6qSkJS8Lc;ZeM#fV>Okn#YwAEx4V9QxTY7heTa;p+Y5iX!{%?dVR+^ew0<@? ze{*DmuRx4-9eaIs>yxyXKKAai?PG2ahGjmo;EqDfIK-vzYe0e%n{$4$^d@HpdjQ#u5z0vr)`mcVk zF=g%b<93%0?TMLw@fsLeC1CGM(s4|iCXdZes`Vdaf1IAob2(|cWE)aGl#rOJ1}+Hu zInm_!?N#Vd#xb_OMf_LJd-?Sr+BnJTeX53*~+jD7=e->dQ;TKj&2%L%RBtIFIDp}Yz10tK4z72D>q5u z>XTfg^Ao=1kHOr?+);NN-tu3!t%2N+`!ToG(YLzjI{?hPJJTtGv5MC3WKO` zPd0w`B_}X@exmbBIpq`vVJ}ZMe$u|^RiAf3hvqW>ce zL>h=R5NRONK%{|41Ca(I4MZA@9XI)IAh+|26?|4-nBJ;S>ILbf4?fG z#`fXdW8qeudv=1#8D{DzQJN|^uF{74FWucevUjM@7Rh?wBiGU&&*Pa~BE@xf`wNMJ zUW+Osg5=L}SlM{WIhana|2*UMq+7oSTgLkHU%=@u$O?)5(4M@K=6d%~r-5Ve1 zzhtO;=&JaR?*0LM376kk1GJ!1bhV`1nsZ2qrqFmCs9^lCes=7GJU&Mn3B$r*=L$nt<~^h8S1nCQX5c zlh69dsh!W#U?F{woLHGM&}X?An*#y2x8+zWeH&@6hGd%6I>yv}0Jc*8Z@sw8I&n)LUMy zeD@tnP9(D9PH&p+5`FgE_Dgsp-;;Hl@lfjb@se9x4=ejI=5#}=@2mA=VahvvzAO4M zHyI(7yXd)o@@nPV*WT)WOfnrtKW5|)?;RZ6Gc?lIE8hv?-2<2IVLO7Jf2dbF>Lq6# z`gZ%bQ0>f@-@3?KXTGI>3pL->_SVxsxU+A_GdbO!$-GyUenL-Iz2(&^j}`r{R~mKd z=R=lPE8njEy^B}m8W*VESTrOwaPeD1Vcla=%}z9X?*^J6>{Ym6K~X);=%myDXgcc)jIPuk_SQPA$Dx^oLsO z$5-$5N>9Dy)Y5w|Cx;hu)0lfW`VO0at$g(zDmjI0BI8Yq^1+VpAbhS1cmC{n$*rY_ zes1nL9(p)la@W*@_mOC&L4?u&dU~j{+**2Y?elW35Ez>_?|@*v&1cwhYUR_lCuR=io*`YNVU*{3>rdF} zsBeB(u8VTZJM4T8#V^^rV+S)-BYXC+V!C@^z|4!*Lw?`T5bM&URb*M3osX@DT#>kz zoz*KH^^kM?^<3M&d+p_TG8u3@+7nm*VW#77`aconO8u&bUd#1(rG43UGqmrA)$K>k z`6bg|hL(={~w_9-{fiI4iT-RlwDptKcHP^5Y2WaO`-Z5ilm0Fpb~?i5e>nZ_&2ti;6OKJgzQW{x zxP0wMGw~KuJ(YZg$-h><*i}hc?MP=rDzC8l*UHzBlSr9dg=2@I^RKZU_=-Z>Ev``d zi?I3EDz9GFd%GD6qaO^DziHK@|04}V8i+IyX&}--q=85Skp?0SJh3%!q~q*Kr!*l4 z0eIX0+50blGEeK@hcABr{&n}cyDi##?gkh(cD??}{mT;HUB~6$?`y(q?^l)Q>)FpK z@mAX};%?9>KW8@9TX<7mZ)4K2a^GH6xVui?Wm~;JL9Z6}?+26LSFEGzuiQ6f(zW*f zA``Fn{+sgiiu`%&H|4pje->1E`#Gw@-Tc-1otwXk=PUB(J+0ioQL)}tbF!OvT>2YwFQUk)NM`9i@a<lW_k!F(YT~bxWF`yT0i#>udb{{Obn% zzxS`t@P}8&U+sIiKfe7Aq1OfY!~Ng4B;5bKLj3;ub@8t@|107C`AXOC&hxo`cYaLs z@y%O_-#;HCe*Zj%`2Fwywz+xILUD4-IZkrF5=`z-8XPnJ+}QptTeln4@N6=XJcnq; zUo4KDf4=^u-!B|0{BZL7%N$*P!bV~gCyU#B?2Nz6&iXxe#$RTqTz;_80F`qTJ}leme5&I!2nf(w-@6chS)pfy`L^+eLORUh*NI(GY}jwgQK=RO@K|1~ri za{fKPJR@YI_1|v&&DOtQ{q5F&xAk{e|NYkA&}jHQZ2gVa|CseRTYvk_Mqa!1pJx3X z*1y^M8=4Kj?bhFD{X4C{+4`@v{&wr1u>KC~KV6FE@8TvMEUbIGL64y&#ql^2$uXn zp6~1)>h=5g4EF8r?Yq3c2d?s5{KI|2!~J`9YyTke`*vUD$zz!(BKofEA0E-q*<BS>_*Ph8K8hOLje$Hg{Kfk~R@f6tC#%}}0`pOLEub#xsczbjt*`*!#Ac8_#>@rSxmmoNQ;LzfNt z{d~rDy`KEOD~J0>hE0A&zAY~OeD@x+F3l~U{@vX}ms$>zzCC+KynxM9*#p_!HQBSY zmZSf|*1+~#O}~+278BW` zBZCL&|8UZeij)3RoOA=?q`wp={iNRfiWOywV%JiHrq8uz&a2v4T@7OvjSBscb3s z(%2?D5C}{D@MZcu_Mok;l~)%m<@ z*q`t{rt^6t{)uetRTH)D!9~AowksQ5|M~^jHt<2Ui(;1>jqg#NkGu~12#as>Sk7Hu zBi-%`vTk3}MK09U2lu+KrGfP;8=b%CNu1<^cjBz8s3Sf%evR@l^BBV=7U=nAFL*bW zdd59@nZ$nQh}I*nAy4?~@scU`K+D_AuE!HorHKRXf$~AMJ1gv#@tzoMQ2af6eUkI- z&gZ%7TW>a(^S|wEmr}lPJ?GY)noMU0)7f2#Lqjq!c8%8yPiNh5JyISiOzEkp9f?d) z2pzB28B0uMO0aQ%uJ$tCu4HQl+HQCiTUE_h;;q6~*QccZo?zY-g0!2k_@?xF$zao~ z3nkW5^%i5=8@K-E^YMffZ#=B6>I z@?6o*1)OBPWLPM_NWi#mf7{r?N_=Dqy7fD$^%J%TAzn%OE?7kiTEFWUWiW?oRb-z{v-a! zSO2zuG%Z93^(##NEBcvaE?Y{ZSzu(knxOhKuN{r}AHJUnNk2VqvD&Vtx}O=D&R6t1 zQeJjE>7_^#9;7{l&EM9W(9$0^f7`FhG*>+76pm~k=^Eo--?$*+k6o`e?h9N0w%-m- z{}KP%;{x3XNB>0{h%^vsAkx4SP6O5JunGrdvBUO5?tF(+DC7zfWamJRa9rx$_h|Q* zRI{t84_T*hMIv3=kz;!IVBbL}tA}Mu!g~_gq?1|gDf2k8jv_lX$&WN|9Y2@NGN-45 z#NV4PGEDb^ym;pRJN<1&^BHzZ1NL)__M7MC5BwZgqkNW#YIA?t08GV-!)>0qmowH<#v9Voka^smkD zO*%|`_mS`+WSDmyxy?Y!!Ea2;%EfPzYWH%9IFo)6PC5xdSLTRfpFEQ|uJ^0)oc%oP zyWydm7%R`Dv+|La*V9vxPGVG~6MwCA%A<;9{WkrC`**LnXn1;ZlIS*_CWrdyBb`5Aj(vW2%Z-;0 zs~LCejTde;S+( zVdVb)825jf{bPoq?7i~uv+^}Z5`Ms$PK*~EXHv#;tL@$D-d}Wwd1|oWXwP1=O+an# zlY!`2it%d789PhS5vjf&CH__S5xD!eV)s|>-`Z^bb~}>lw0?L0)^_W6_iydAes}-Y zmDca>-v#8WU2pyF8uXj2-(7=#i}kx}(QmhYcTM`;*6*%Ozu)@ZHR=yr zzq{uAG3$5Np11#-$-k@`m%mf3U)G(=-)YwGu04-gzq@~Hv+K7C>va8A0bQ=&DqyGU zw+gt@`sqz&dles3Q|HQVrCo{a)L0@}VvJhwe}^@DwaOuS0ABX0VZG05x4X?t?MN3U zW&c(+f4i^hq8NFs-g71SF7MOg1Mezv?7pj2pULlK2ybM_oaV`8JLJVl-kq?^Oq#L3 zlQKJ8Msg*#rwu3a$%^TJRT=JmeqQnW9aNmya6aMwyu#1Vs^#tKzB0z3Cf1+LPnCT7 zs}6T1uJ(JAze*PJ`>Jrwg3WIIy*@dYq)P*i6t@+yE0>zeOckx(W!RS0b^U06$0$=S z(DoSNpLEy>s&T8uE#6}rUiSB}uZ_WZ+HG*E(|cu4E>}o#IG`TAD|JN*wt!x-6^8wJ90L+xMZEZu)$>)jy2>JFXg-_?l@~-90+$Q)d6usKq6V zU3Z)C1&gsy+x=1&uSuKjQtpNzcU#Z8_Dj)d>-|!o-Y*5}{ZgRbF9quTQs9y9m$JKz z+@I;aNy5h4x#T8P`UPy)1~agX3T?i%ua`7@t$Z93OIAGZeoqvs>b zMq@_xrbK9|^mb&O!V@9gX0FgE{OI*mx!&#Q`S|s{Kb=i^O4mKDPv7z|F#8WCy|Mz* zu@%>h4SeY}51&|eok%8~e5q2!)pl*-1e|Wm?nw(`7gKD**d8A%Mg!r^=V*5LUj3WdaUCELLCyL~n0SaVQ%-g4pU0)pbd zbz6A+GfsBAG!ai10LBV{%H7*px57O!QXDb=L_5knd`_aa)hwDi>HiwtQU`1;>|9O^j8> z9dm4CV0`n1u|VoWzTm_s6O6zM^bx#8mV8MKqCE?nzh1z}9mWs^nwUn=8-7ddZdg>gy+2agyQ)y#ro5a;*7^ z_z&zW7LxmF*_%&4<5a{j^&j!4QmytLXzf4J&+*ld9DCr|e>|CyZ!+--CzFv^qp;ec zNY1+3r>K0KedFoU#MJ(Mmrf23KWX(=(N2a~e3k!XG z5Xo8Z`^$+|K9%(+JUfWw1kqkc<+I*;8rfT9Z|?U&-}`pOHl+~Xw>P|;%K9S*MU=O9 z1*x}4P7w7pyz;3W@A%{}q5irlZtIXa{P5e zKardu-fP1vAF;PYhUQ32IpFu#jl@^%G>r5%AZWwrjdRZ$$oXt(f9?3U*4fVcN`D z23$Wlzh(XVPuKOHy8-z5*7ZKo^PkGe3UG5wqQ70P2oJEnRPgobsUkcqc@bZ!-DZD~ z?SI44yEdu-^&JSmE6n)A-5&=}CwS27$?D~3<*gWxBy*E&i7CptNAXFgG?7ac zS?FAhXQwimxbLBqOAz|AiW5_%RPGvm_gxVBd!qA`3p;a#bSdo=&FK%ahQVy3 z45WRG_#b}XpI<-eVsXkz>1$_vtBHbXrz1JF?*l*F`=(TfxSXI-jGME4nB5PeT?mb@ z*)nIhDVw9u0!eQL->EzkD1q(|wx4cox;Hw1Gch0JxTsP;!SZ+ao4e?yTi(mVlzT$( z*XMu4i!y)4se|0wn>3eGpu|AxUD*6fhr9z414(ZP{PZNgUk?F}ACsi_gy5g>j~jwH z2Se9SS3eQ|RnHCZ>}R9v$G7x^^FL&5PcZG5Yd;bH753xa&r(s(B0a6pQ$6)l$|Upd z=|2AD{I*W$hBc^uQu>`p-m#C9R;x#mUL(C8$vGWvKVC1p@eU;q=sh85e#|3#`vTqf z!DDUrTs{#-8i+IyX&}--q=85Skp?0SL>h=R5NRONK%{|41Ca(I4b(>iGOz9=#TfJ015=gOBXk(48t_mQ7_7w4^Z&i08ek4tfqEc15PO;l%B7i^IFjN}Dt zpT|p|_UMzk*~^J4uQ-*@=L%f493L;_rt+b;XOX;6>tD5c!)`w#d9lN;lU=iauWCQ* zrcc|RMe>fZ{N!Gx1UD)>Y~~u5jR6yrm2D^%;Eqm%9LGd*tMnY~xO>a_@l`dfm!Ve= z`GYLi>h@q2^9uC+B9d1;A@u3C=au$y#Oqqu-Cv!E^4Lrv`;Cjfea+Gicq3%@xhN@~ zFE9&WTJ`|z{|PN`Q!%!=^U$WwZHLZs?=7use$8$JUUh6i$}OG#6fwV3*YrH0SE84yw&c-TC4r7ZJ(j(vwDQEqB#t*|0I8rykP6!lSQBIh@@Wj8NNKbmyo+-}B5@^#$g zh#q|(iGr=)R_m2!;p+_oop1ED&((4xIZ3Gm{H^jG?*!DFZJp|Fchz#kvb#u*@4nV` zj7zJ=8J=B4<+Hwa;Y6{wid}%d({ie3O@p?J<04m&!Nv-?N&fjQ`B&9ieKn{E zm6^jJ^AX8e^}eOG+STf};n2&+j_M*g1$_?Hy36N8(3>8-M*l?`h%^vsAksjjfk*=z zQUg7lL@@63=o7$(?e!hq?&UP(XeWoWFoWz}Y}Z}Bh@m%8N~n>6or|5l6VE7fZw7~CrHgV}_xSvM zJ-s{oc)Bg#b4ibmrRBuS;qI^9aEaxQT^U}EZNmF68SdR#^$SUFIlTM}6TUkCex15< zUPNyae`vV7ihE^vnR{ip&h5_btruKa8Ls2|!n^y1<6E|FH#)2e=f`gN`P;V{K0Q0T z`M0$*KDcM#sx9YtUJxI)zcSBVe!2{*_=y||-|qX3o6o*ogCkePhx&H+UAkwazk8&A z&+d5t?j3vL!#%^7OCtMCCiL&@jEMim zeyWh+J4j)wC@Yqe2|0GFDE@4c^EFfPiOB?$EyWTm@`~jfX{QhvpG@TQa)}OqmaiP~ zdad|vdOW{gcL@~J*E-ye-0%dX);!Zk{Y4oz#zGJcnf-)@`(Tz90~W8ufe2IdQ% zIW|s_gUqzKVn-*XY;W$0BXpR{9Y|Y)B*~R`NlxZc4vhT;=sUky<n{}&*C&^ZX_DuDzdU#H6V9YlAn~aQnz`Y=q09SvEdz;vxaVvUD>>I*n~0}a ztLpo$lT1~lteg&>OvHQp28a53x<@=YCca78YB9#8JSAhg*WkOW>%U-&ZW_}2*|a7~ zG{vuWI+;vv$amkmKC4)V>YNQb1q`q3*VN@sAw4$j`;}6=ooj|o)fmw=&DCpPHnnH0 zPmEd*CtP`a1g-eF>ND+%lj@U(L@&M5EPBcfm@hq-In#ZI%$;FYkS|^ZV_*7v#_}6x=|Ki-$(9lslXLR`348qqK=;_YO`MdE z6H)sPl!&U-E|i)WcXql}#l0?LjKLY=bvvdnf1|TJ=+HUXj`T?8YpGsI$L>7zeXop7 zWe;RI&OfI4$25QLX3@*_=r?opU|Bk%F;Yo?mURv>yp)cYUPh8Ep-Syfq~vxaX^C}j zk)mIq|B&`zERoK5_kG$pIgD*Ale>oY*X!^vTq&OpRfw69iAIy{|`ej`(EsC204N9&StiV2Vd(P=X1 zS<;%LkS`5PeoOr7l0e{&b&jh55saoaek%{xf{&6cQDB zmjHK2CFMh#q?;s>;pgKIPwPIoG|lKor%%QW#_s9vl7+M}sS-&tDGlEKeR8M;MhbSI z->+jP zZQDg)`MLhRUS3lfuKBDIuK9W4#mTLbf`e|lr9aFcNEWxqD2YJZUus(TS3Kv35+;8( zp3zD{|5`t-j!&~Wo=8qt^3iWf)qHgNB^CN<1s_6Ip%hu}K zvw}ew6}IS7tzf$%9*lkQJTWWcA;=fc6RU=pzsOCVti~rx@u_V3P+Z<}VzNLD+tAO9 z{ss%qF8yXQtY1t_C&nYU-PAuJRL0{~uP~Z{tPbClGHcZ(fUN1a20c`fDs49a1kmp2 zv{kM~uaCTX=da%Ks`eX%T7F^Mhi^TlR^tIyf;zq-aUpSy?=4c+p;g*%_4D$u`=Z!p zxmeGddO6%w8B?Xbo}UK7n0`=pA2$D0@>8}0FE>ZF-l4|$Su3o<4npAXe}5B!B5y+8 z=@`DfZi>;OEuf&vr>FdWsPo55l#Bq)ir`JDbKN>^Uk3Yob?b>f%?z}@>O+3GTKi__ zq)hSywk!8Ni?r@CS4isQuc#NIzcAC`dmlYo{jIY48vT~<$TazLOT^Y=$(Nnm3q`+L zZ@w2Ww?_=h?!xBZQ%<|K*s$dpJMhgn7;{u6T)u1!>RB2atn^6V&fG|tuRQ%tKW7r9 zCLFg>CSFkbH}d7Jtu7Yc4efDhn=@hfpA++Z@ zKjvP-N_#%wmlj;Uy!rjA7jfHcC^N2H*&o(QXITB5@Qq)UH08aDe!`MlE1zMsFLr!e zS?+cQBhdQ3ivEJmkFQ>v?>TnBN(lM&zi+z;8eYmL$u6|ahCv17u`3+lM#J?z?(O3J>Y4vKo-D^S(FMAtzBRPn%VKS6KN?u{;0_DqTJLyJdM@ zsM{~f8@~P)VyBC%*Mrhd&`;X0_2q6Tuz7|dy;k64=Ck-foh?;&ORCm#bMDG%YFDcZb`7aFLB#<+<)v zzq)$+Ro6cslFZ8%2jBh%J*0dx%N;*XdXD6>L9+7eTPXJYWYF`l-k-MGcjIKhf&rk-TTG-hQx1-`x3On_u0Y)M&DTl&j^WWHYtiUwH)cudC-H;uKycJTW;0 zYJWyAkbl1SS=B8+IhP{O847{St1(WD_#NB(WTd|nQ-AJw$i?b$QB>|HX1Pc0Y%t@D zsD4ECWBy+5+s$ZpqTw?X$4wchW8vPZj~)15y!*SEhe zrfGYaZA?!6D{mL~=97;h9h}A{8!N=wbp%h~_l{ccjmMCGvcIXg`7Ab>@E5e*1kKO) z9@^)B5A|L|-3B_sNCS}uA`L_uh%~T)HQ?L-wDz(_eYk|l?E2?li(9s`uyN(OMsMHM z+RMNqx$F3zAL&^v(`V05Zo9HCJQZsT>rszRP`U2>jEioQFZ+_W#(fKp?1KQ>$B3_~ z&ygM?J^1DiqWUIHOw{hU^GT6CME2mHUySTQ>|yQiJ&~TGdJ}%VS@~Tjvb)Ic!neC< zd}PK)E5GM$torBs9#>;ssLhZ4KpEJ3cf@aveTL|L^?6i>(qF~;r^sF^`u(VW zMD-)8A1l5KuKT?;sy|WvSx5b;`TiM@{n*c4N3pK(n8&SE>k5yVU)4IjVENU24+*Fo zy!X8)C_mqOOth|0213zaq=85Skp?0SY)B1Ae|vs>JUJQX5bVOVY{}MtM>79*evSE~ zaQUXVU^|TTZX~|;AWL7-1ygR8uTK@h@GUyoRFL+?dM%QA5SGED?}^UOW;U?=2F-8c zKx#~`x#l7Q+mHlOE-|xC=KN}mr?_41pu_o#$%1199;>`F(5?KrXxc|PeX-*DO0(^Z zc*iQw@VC3z{1;?e2~T$Z?hCmt6#g^%vTy6==1S~M?wk&${7(%2`9dz~6sv9+7d-`J zuN#`bd+)j|sV+_=3QjRTR>)1p_fMC&fYts5Q19v`hw+=4m5F=x!O_RS72_!FJ!gyl?wW<%sWrTvd*r zqkCs~Qtmc9WO@MqbIxQdx%=Slc&B`8xjj5Qfc`I(e1?@?Upe(npTvfvl8k-<@ple5`hx$c*Q>TW(^~ z+@UJhhip5PT7`HiXNSSZsz<}$dr$DSFCr(Xek$Ux^}I^I zQy=}?aZt^1Nl@inXE~MQJX$vTBZ$%%Ovx7j-o%=C>iUj$Mr z8Jj4^_zp2PmgY7#?gy^&yYZL=RB1jSxk$}F7<>IHvqNw2kMkqD*=TkXrMJA#`ut-& z=OSuP*XjqO_F<#dw~>M2gImr$|3#PXdQp!a#Jp%&1~K-%KPu0SR-VOJBJc12lU4qW zmY=ZF8`=H9zT%qiHBtR{$Hy-E*1`Ms^Sbk-=<6uf?;mzt5%F7dpHQSfbh=R@C4GpSUSW0)%3NFP1AbUOUdt8_POHRt-^l8 zNb@Z?iBvq1$q;m`e1qn9q(x9jWK;efdh5-P{@pd{tmsPqs_!p~_?q{|u=HTG9{m3k zrBXhgPZWwye5#OMzkTc99mXEy`9)^n}D!<6gJ zk&(gkww${qwzab}w&${^y8C;4dS@eWo^7C}B@Rk%*!-V*vdK#La+q0RD{SeU0Vg|N znz$%t>hy^!SLaKwU^e*-${sH58;NZy#$0oJ>d8BE#ggnbl7gft!;*W&aQAR2Q7BF2 zV@{!vD{$zbt^#4n3ybg3mxDfLF_(9;G1JCaJ)rw3H1PyYFIzaXPO?;)R4|%dDn|prn-TkYA3ON&Yz$>YZOAY>;L)Bcp>Cj z^cQL1iL8OyT}r(Rcj&5TsyXnla5K;g;OV=Sx(&J${3z~D=tZ!5k5YF*4}y>4?uAx^ zN^N_kQujf3fvrPIJpkPSejfJ_bZkVa7vXMz?gS6wZiJo%Pu{E4%@PiN5O*u|68QAX zm3lXH4E*S|$b()4-|&}8Jq|s32VuDOSCNJfEA@N04(K`XZFeel8uTo<`(sLNh8_j~ zbU~@@(DUF|KB3f3=w)!*reKlvH-1HA}7d=L7O_~2{rRqA@^Jb2A# zm70Z~0pGc()J@QH;Isc#sX6Ev_?6Eqbqn+|_=)?JnulHlU-$*3ZkIR@DD~+dqeBS? zr=QuN9)KQveuH}U84c=Ti35J`1r2H$TAkUTUi88S^%!&)_dGMRK+o6}i>p$3_7NBRrpWN1<7NOOL8r1Xu zu0bt9cY-JVeS>-wx&!>5+Z)v5Lf_G#?!k5J!ydr5eYioL20aV@(nlIp3_1q>D{iyI z0k_>rexbX-7yJYHh3*8u{ZaA@y$n9|u?96FG}yn;piC@yFx&!=k+`PmA-}0FTbr*mnaYDJoqu(Ec7CH;ny0}P0(H7tzV~np%=ij|D!?OCgI>W zzR{rWgkAuAHtZ|P*&x5agyg{|c zi4Xqze>bSpp$EZ}{)fCkcYtU7oV-AHf-h%SaHYfn|E-}>WuTY9*~Ugyf}R6!ZEjT8 zK`(%VEj)uB1@Fb(B=Nze)n^WboMqnela;7d+!RJTKSf!92R-$Sc2 z8r31(_0*|3@FCnRw0c3Kx)yhngoEi#jcQ;Np5U1;Y*eGro#3-JlTPRu_$k~B^di`H z7CfOl!1v*1q36M6+|AJH*WiB+d4rw-f3~GjElB*Wjp|jn`=Cd`ui_qnUIs_Dkv<6r zGZ!?fN1$iG2QO??k4hYH_x48hxWobf^(Bp}BY}RvmtIV|p$EZFysS}ehh7Bl=x$WK z&KJ+Vbz>8kds8Y~fV8Z}9g6;r6y{l2(0KEu)cQ-nRR(l%N-GhzlHVFrRjJq3p za9^YPdc09R2E7b^C()=**$)jq$7xhC=uYr&#v0W&=mqehiAHs?!~x&&+D5e#dJa60 zX;k~5XTaUrMwN#i1z($QRBwgOgD<>>@`COJmkyy@=w6NJ9C`_S$xNeaP7)4Iyrof{3Y`Z(^qY-pGxP%ZoZlkN(4F9e zzl%Phm%*3KqEF~S@X$Mv2R#E`ej|S9QSiq%p-*V_F4FL)=o7jN{3qOP(2L*=|Ep2m z2|Wki_P-m|BJ=|IOLOQ8y5nyf)fQYV#c#m`ZZmWq{3~21^aA)Z+;-@W50FM&7xW-_ zEp8|D47mA&q#3#sdBH1b=nn8RxVxYi!Pk8R`-h$Z{|)yr^b+`?JE=d=3*fhL z%?>=lH~j;41w9M?J1z#j1m5vU@&mm9ej9hO#0R&3iu^-&fnUO1De=Mg-%TDRKG^qZ z@(4W$KL0c15xNunE!6V#zo6&AO%GA-(4F9U-$W(LENJf z4*vOnQSYGV!FzDcy_{yHmZNb4M=>j??>nadJufZkI@Nq4E#e}3VIIw?Vq3%=vna8 zpQ00q1Ky0g9(o@9lgFtG5+7{;AD%&XfN%UceGv34cxFSBx)-_={2knq#0Ov5*rXnY z9tA&#TZUc&-`~`v9)n&0U((#fq}4N37kCG*9eM%W+R~&tBpmzz?lcJpU((v7ViFGC zf!i$M;KglCsuOw;ycf3}dI{Xu-lV#q^WgV!JE7G{P3kXkgV6I}?&KzQCG-sVoToIY zQRq(a9^3@<68PRznp9rmga7o@CUppU5uEykCN%>+13vv}P3n5+7ZKpP=TcH=g#?zYA0(1x1`72H8K8X+h-t*8K^c;9*tVul%-3fjL*PMnA*mg#f zIt97|oWq?8Jr8br0Xl*11V?b4(4*ifXQC7682E>{F6cS%F5FJ&Mex>5=mdHJeCK9# zB5}ay|5}sEKzD*KJBR#24}#x1w@KXyy$o(SuSwkk-35-~=ArZ8k2;&w?a*pVlX?N} zUg%EnU$>H9=p|5HKz^Y+z}LK({6go!bABBgcr84^Ioz4h^Waq%H>tCsN5MC~l)OOC zf*-++Kre!4zKpVm?gSfN-lS5{9pJVu$_}~H%nVX_I<*A-@b=3n59kH( zvOUK*hT_*b~Ip%=i{Wk@IV z4ERIb#n5W9Nj)#yq;Nzw^!`*X?&x(oaSZXfg_`1QY_jG&jn ze}5152E7D+|K=uDf>wWtPX14mx(+%I?tL%mh8_h!dkcA&_~6p}$UF2h`1bdccj#I0 zzQ3ltBo27y-{Obv1mFDuY!7-KeCUJN9`rIedmCk+Md#pue+WH5cl;gg!|mt+x)c1p zJE&6<2mI8Bo74dGBDmutO^oT#8#wq6v?0)=;Ez8>`k`s~RPV=WDiSGBD7kV{`DtA`{U-13Xf>M`gpF!syM>Xg?}zTo?xg&%qW-2Cijb+&|qW4LY5dGPM% zG^>lD7s2hPH>*MDF7P1kO6VEzvFA3cQE2rm&1yE*tV+;x;5BD7tLr5Wc+#28>fO*C z;ND+tR`bxK;FhzR)m_kC;LO?0>VD{1@XyXA{m}E^?{^{tdU1QR`qduNSsSSkuY`mD^8RLZ zAM_IV_P=gc4@eyFSLVqhbSL<`f7`4ch3>emSzZ2j&8oS`Z^7={DKF?j@S=}UUeI0O zuYI&xbwYQ7@56OL&x4=B?Sx(gU$#Krp$EZ##$5@$1YZ4d@&KI&Z~tVont)ya+do6z zp*z5xxa*+@!6I%JdItO;?k0&3o^lU*hmL_I+$|CZ{3dQ5dKrAN*P7L-(0TB$zRqtX9Q^J#D0gV}P0IP(q!oG) zd@pVvbmxCItDoZX66d?k>Rj9*=q~UJxEbgr@SWcyU(j>lYnLfU=sfuH?>DPkp$EbK zA2zGoga#Xb)U57=?f}nxyjd+mFaNw*eP6YxWoXsVqRz!V2HgdI4X37v1O7#0i#ip0 z9{fO4i`opm0N&WrqB^1Hz`IUvQQM&x!8bppMRh^Xg7eR4Q6mx`{0?pcdKrB7Gh0+% z=wEJ8Z+cdXx?bXgjW24!mf>?=i~7>m7Ih2s5;%83i@Fnf9z6K#Eou>Z2K@3%Thv3) z%i!ByM*5*=!Kc2Q^dF>r!KUsO)eb$_*P>pH+YFrtUytjAo&_JmZHHb4dv}n2i4XoR zZYT5{_#kdj;(*V-v_)MB9Rpv18--p3zl_UE9PnqjL(m;NThw!KGtiyjuj8(V9t2;F zn}yDUugBd4Jq!LRZVq}LeCaFDgTx2t#X&ECqnEX)+oAK|$8ihLi{Lc_E$VLQ8SuTk z&=vGN`25}E6S@=pB<>N34-W5XQIA58g8zzp9C`_y8f;O`*T4sCdS#0`1-b)#6Yf;# zS#Z-(i#i>;6Z|0VOy~u0%W#W28@dbp0&W}h5||umQ5Qq!!LQ+Zp_jq8?QKy5(6it( zFUMw}W8m3Ww5Wa1UEsi#=oUJ^uSI<*j((sQz*|RK)NMk8d-h`|(4*jJ61$Z6;6J8X z)cw#)V=d~36XX|KrCZd8C$Wt~#K}PyT2u^r0sQO~X_oM7TGTm*kPY1hzGND{LW5t# zm7tfv_gqVvLeGP{-q51n4Lu6J<&BgV^ep)O8PWr--qfO=^%l|t9Ru6n+QM8Cx&^<0 zdlY&JjK7Vt5c>KS)jivyPMgLCz@NPny+C*T0XF-`*eY}v_|bQxH|Rz1kN%9h20aIk z&7n8w!T-~uT5f4kZ-wpvJO6Ksx&gWi{EhcfpP^^LzFSGZ#0P)+w=L>sXkPTx)wf}9 z(0Opv-(h3Wo#5c#V`I>x;Qzjzd_m8H&WFjD#0Q_f(4roOj)8CZNAd+d3%>WCu&Zl{ z4=#QR{X;K-%b%v6LaWb^e%yBGJov^%@(Vo+p7VL~3*80&F)jtY{1tTjRq_ZO19#(Y zfF1?!St5_nOW=FHP9CA>!5bc;jG*VhPkfU+LN9{D-==ot8{|7=nB z2@PKJJ@N%T1ICxh7jzyR{V(dy>!HC9<4%EI0I&T4bq9I|Joksx9q2Cbe||)Mp*w!u zqMr8?$_Ba<9Q_%2ht7j<{%`CMdKP@o&v^zt55A+JRZT$8fv;(5RVC<|Q(9H?Q(M)I z&>i3(;NC59z?**o2R#q|$Uu{(}i4R`Z?-U^)u|K-9~bp!Mg zIQ$ZH3q1;+^ip&S-2wKz4BbKxf*mw&`aQ*eK-jROFKw6^bGi#ovrF# z=sfsHf2+C=TD=0j4YaBUBo6qIUFaNo5&SZ48G0GKb2mDdaByM}J-z`x;N!1E=g=KP zt!mo{I*0B8mo7)=(97W1Rjul5i4VT`Rm77xVBf1L1L#5UdHX0Q=uYra+yJz?x>f!8 zYg*L^^gK8=+N$s^*~Qz@Ol5fmRdn#LWwxhUaT3Kj=L8`~$6O0lE`>aj{k14c!IqyA~Zv9PmBY zkv`~o@F%~4uHFcrnO1fFn_JbX&|TnfzO7ZA2|Wvb_3hXj^fI{bx3M?qJotg%K@ZRi z;5%+W572Yq)$bsl!~q|fr97b3@3*S`xRQi}v+u;lBtH1yjo20RGWaKdge^%pSo&jZ z33>+nH{7kz^MBu}ettXU3f*xBcKu=M`EOu{;Jvt0pqIcq?<6nKi{P{Wp;es@9RuHw zI}>^VeDy~ucj!FW^fAgEx&yojcQJGq_#Rv@^xVf=)jhZo=q2!-cacX42RDDRRi&Ui z!Esy$IuGvn40(Va1b_J+@(UdUi~mfWf}R2Y<+J1+dI>yfkvaw40X`4+Zs>*2x2jKk ziTpq>feA7jz69`Yw8d9tF=`#x|h4zLsNMzi z@UmyLsTlMq`1)tIsm;){;PfxHsZQt_@Qz<QJhx4aLN9^?&udc?(4*kJu{M>5UIH(8ew#W3-38u-o00h7 z@EL9DdWjFd;sxXldJr5rvrXM3;b8l(wy8Pj4)FRHwy9g7XTjH<)u!g5XTXtj+SKh5 z9~?Rl8A5}1Y#|-c3t;>CZR$Sg4)Dwi+SC$sCwTgc(YeszN!#1hqY?-F9PV-GCGam^ z(x#fmUvE>VLJxw^xENm0G4Mg$nb6DNdtctB&W4@`zuVQOwn3}z zHg)wSZR%p^JoufSHq|Tf!5ezfBlH~j2yR5;_mQt1ZE7F%D0psvn@T}g&(L}B zCzqjTi9dkN45DY~POyC#-9dMNZ@CgZL(hUUuWD2878<;5Uz@radI5~R27N+zf}c&I zL+B;&iz)ObH28pn-k_JkFO6ZV5)S@g99xA}6K(1b(%9--$P4(>*OCrsb)ZeXD}${{ zIOx0%y+P-}a}HvY&|P5PHRuO=5F9v!9YT+S`=-%}#0QhtVtYb^UwVC;%0MrHcVCAd zpcg^)M)C>W0saB*dgwXuk>5ZM&}ybl{r;PX_krWT+V!8864{XlnuJN^h8gB}Fmj(Y%l7W^XaA?PKr{awh0p1%`W|3JCFmH6Q2 zaRbmx;3*#?kI*sj%mwlc-3k87$0>J-1OEOe$S?F9c;)BXR0(<%{LJUcBlIG8&KD?O z=q~UFU!r`W)%|TM`)`yl^bGjPFOzA|0=)p9u}s~E?ga1rK6!y&1kZSsyhu3s;U7{K5+B_CW6A=0 z6iobtvVhKmn|_9^N__CX$FY^)L>Bm!{~^E7%izVVZ9Nrw5WJ(YU7ZfS04}z*t1~4& zcMQHFj&uUlm5+6MMx$Ww9p~2t5EkMtKiRZPe zyP@-7CPuoUXTZ&8kUohIz74koJqxy-*{&Xj?f}2Dsa-8YFN1f#uw6X{y$JsGS?#L% z?c^7neo?zR1$qX|oYSsO6B=wj7yUqYfPa8H8+s1>?ep5zHt1RK#?E$iv4n&FzNKCD zLN9?s=c701QSez8w5t*57+AOv9YW85{}(p_Jr8~bmxo>kzx3jEbqIP19C=B*nt>h# zKYtN=mT)kCF?xoc0pIm9^b9=*Hou&*gzf;7UG3^N=sfs8-R?uA|iUvMcpgzg02vlAUk9B|+j=n#4oObnny=sftdUFhw4cdVm~bRInSN^}U_1?FFc4xwkjhj4??%ityZ+SQfN zgWyN5Mu*Ug;7xIK2t5bBF~RSlXTe`cqC@By*yx}`=nn9`W9Sfi9^5vL4xziiyKpx_ zFM`7p*ediW_=+^P3OxvpycS!PaPYvxuIdXTfij&@=Qh_^N}fP5&+Ag2RWJjK!@OS>QT|Ejt z2gcspt{#W(1b-XX{M*CgnGgJTkYHnMxe6?Yr0n zbO-o1-=pj#9NheU*E+M$;Oe?%UjJHS`|m@Ld1pkUMj1GEsZU@V13EKH^| z88R>*VJ0o9R*i_eS*;jZR`c$HWWLkRN23%BQXyc`s3;KugI0)ul64D4D3V=4-`_bo zGo6CIFT3x0UGH@{T;BfvdGh3W&biNh-{+iXIujVRSmh>k9A0a+$~JWz+8eEME7}Ej z+pKaMx(HuwvdS=8>{dBskyR$p4!Gv+R>`4*@Y{>6vPYc{e|UsdO6W2??HH@{1)=i$I{R&k-T@WUrq#jVbP zeJ5JQgO0=8-&w`0&WA6YWR+EDIhkXpSjCTShPQd}8#)UQISs#|9dI4ig$}}Ju_(F< z?>-&Bq4Usj27W`k;Cs%rN($W!_j#@C(Ye=qt@1DLXPnS!`0jJ8vJ35jKWw&29$kiC zJkKfxbq-v%$|^;54veh9Z|FGeyoBqbBXItu_zmrV_h7G~^YB(be)~MvftP#;U!jAr zX)V4&yWq{2<12Lz{Nxo@S&2@<53k2R>U?Eg!ea^Pj*cH{<8q zX(zT0?f8mSp1Ff@M_1v41GEEOgwG8z?&>()Kg_tJ`Nu-?jtt|D_Q0oiSS6v(frsy; zU+Bo4R{1TKQRnZnN*v3glkkqah(&Z3e)(?39i4^`e4Rd`i}1boFz)DPc<(nDcXb>- zaXOO5?zJw{War`Ziat&0so*KFVe;;wF2#dH~!Wt52KT??`6gv9f#MwVwJs0 z!#jS*IH9xfi~oU7&}n$qYxo51hqwO`pQv--IfpffC8=s)gM7K6L6)G?(82H3deAO- zgrh;cO2ffL4bqIx!tXC`kTvKsywKSoL9`#vJDR^~jds9|$27=RbObIqwn1(}yWm6b zY>;i}BCNctL2gA?;aMj%NE+>jcfPwpcA@j|>606zpw59;pV}ZrbOiRC(I6#s9DeTX z26+yhhS#rdkeWIU!xuJ)?TefbPrax?7NeWtlOLeJ=ra86CG;09mo~`ZAELi#7wovK zK~|w7@RiFO#IMe|qCvI?8e{`H3;$*V_dq+~4_oLvx(x4ZYmfvw504GgN3;jta&3cT z&}n%5b@Wjkhd;u0qsy?|)gXJ&RXEwxAP=MS@cBrCJcjnCc^~uKf)C-%gR~i)h7Sxe zF6uZuW`uD;d*He;+KCRrtF|*P=m>1s(ZKUi+7G{grO;{kRVlS@^`7MhT0u;nGg} zi1xr+ux02py!YBhS&lA3&vlKm0^JN#*h+N{bal~pvke+68xEkD>GMw9WVz-3&9>bLcEwdILF# z_Q0F5{pd7Y6vO{$7ffLDQnVj7Y{CC%2mCCySRIFld=!7F<1mgbQ^(<=kKuo`3qFah zK$l_1R{W2Sz&~KC(2kEc%J;D~>KqvP1pY_Iq2rVIAMJvVVD0K0*b&G7=m^}0MbYx9 zM)`YeD>@0!z7hYU{qPBF8@dcTK8^p;5%@doHniNtXR%>)5?=Hf{Ezm-Oa308qJ!{7 zY_~f99~$MO*dBBoo}9q{=w|pU>@jo|M*k82t8?ICpCzWz4)`UkicZ5tpCgyiE;x+I z|6+{bncMI=x*2{OTZ}Hk^FEKy(SB&X8K0va@JrZobQ&)D0zOB(;4RonbsR2A;&XKz zj$&)jS-A9z_#EwlgV+Xj9NKTe=jwbog>|9xu!=>|@=vq@+lqF;4`4T;gK#gl4c&YP zW4)dFrq0# z#dp$ov>!fs4}Dk1;qGtHcXSaxwVS@9tMDt|r0?h~Jn26Aj&6n;GVF`2)7O^C{3|ADWHRxuT#nR|JT>M?~5bc6VEQ?OV?N|;S{2p`h z_oR|lXQAiE_z>L;pTU-+tMIUgAe-IPi1gM`?KbQ{=4DaPiaREZPNY zWpV~Bzi5=NVOew@jz5Dxm4+XA9v`72@Zx>sCfW}_`&;r6orH(KjNi~MIIsxaAm|q|kAA?y)u* zM*HE#E}LYPhIcHr$sTkTUUi&JO6Umu$q6=j4qb+qoM@9OItbsn+$J@&2Oiq)Lnq-*Yy~r~POb{LUn?jxNIBPR1J@fxEs&U(k8@)w}46((pTX<1ckSeD&+Z09tZ3IpZGU zAKeTu`G!qyMF(N`eKxrb9fv>2GuG%bJpNnU1MPv=>|uP-5oj+kzGxS;J#3T5l!nD0 z+N6vw!(BhZKj`4oHu)H~IE`=N`ZD8)4#Lzkj3YV?zl$wL7vb^G;s>+`?))WwK?-*^Ms34=!ku0y+p^ zb2Q0gXve}P`PSi0vR9p>cx01Q&{f#xY?A%x2y8!!&nOLT$27^j0sIVaU&3p27QX8p zO|ls6fn(SbbsWBYY?CZQ%R8IoL~OY_2QG0n@jG2;cq6tForINlHOVS;6+ZvBO|nL5 z_=gjlB!G6jyGefKX_BBi4sSoLNxINkm|D>!F?1SkIi5>+F(7C*e`uc9~G;KxeOA za!SKgMhh5jxM|2zx_0dOk7T(`aAJIi<+eDktE-0I^VeSPVyn%k9i!iVSAEATr zBU|mV936pIeZnqYrQr>6yELQY@Z?X?M|3m1{YJa2LucWUpSH^evBO1;cu{qIY+VZUB(No_)APUC;L4+zf(zn zIi80vU@49(1|H@(TCoo+qVv%82zjeCd>UJUuEM*Dc4`b7uKN*j%kc>OXKXn-4NrKK z_cG)K{Opg(1&)_t|6_K3mx6QPGR^8_;EV#7}4^x(e4kNnf_p z7kKqvVwK~LpA&aaaecHO9`OvZjdne2m$R|OobQKWYzaC7KaZ_Jr{TA-b?7oY>^bg> zc0ez-677eZv37JE?#5Q3i}3xw#3$$={0z1XorI5IQFIv|_ba<>Rp-DAb`v@eEzjF! z8`=f`5$i%{;q%yXw4-8|A7Zzm<=?m-b}Kp!OV}{F3J?1=W2erC$6>qB9=HkHjZVT5 zEV6^^!_EIrEGZ4|!(!+nymBA$hEBqlFbmr8f?dwSd}u%H#+uP_n8kwVJbWArqswsh zi}(&5gg0Y;bQ<1;1=RV_`Wx~c?Sjjya#D~S5CcKnVwQODsZmQ}~$m9LUN z=s0{3E27JAX^q;2Zic`7yf!v5yIi7~2SPh*$b%7MIfQo8d;Z}1zXn294$M9%FF?^|9zs@s;MZ-OYIm3+M zErweSuQj~F@O_5I8!j^3|8)I6CBr?2I}E>MI6U3Hzm((N;&t+S6`3>dC7TxR%L z!+D1PX~v;y_$$M`hL0NVFz3I;=KMdO#$UEl|HaL2E$%R{dkv$8{f0*xHW|({G=G#o zzQVk=8k)b+AFsds%m4qGPu0igJi|*3uQl9kc$49+hKmieh7TINx9d5>y@rn(-e-8X;e_F!;g<}z87?!|z0th>s9~RB*zjt@D-72d zHXEL4xWw=f!>WnHVRN5?IsTU)!T;VJ{7=;Vt3G`#xfCfLCFREt9LuTv;#j1}Oa)48#)wQtM0`~#NNYcE~B=JeA}Ztv<6 zc|gwZ+Y*VM+jjk?&c2ZTj=Wfuv-Z}HuMKsDTKlJu%cJ$97lwM)@_nYg-Te84Raczr zzi9eu>n}U4Wm>;qx|U_N0$7lqb+>>Su_-j$`$9Yz5LR37hSUY)D@mp+VN*_eyeJ8XYa*45k3nOo;|sBff`GxR6a5WhN)YxDhl zBJThf9p+)-+ZH@Nwov8Dq<@~vf?>Yc#B`lH+xMq^mP(4z$m|p{<`zs`nl|q@_O;Rz2iGEh?4n##g;P9i7)~ z>I=2>wBm#tT3Y+A*(`E>{VtuYU3^dS^jo2x&7FO{J>7&6|ET+*GkSYMvCe2qv~^<_ zKECS^zD@KRLXZ2HcT~JYRn+}b2*FU>rf6vTt@?)^q%Fi&E5X+pCCAOH7LvT}IzGZd z8RlqRePF(FMrRMF%O*azk&JKGQTq72wb8EgTO(2WWNL%#Rmax!_FlIsa)D{b>YivH z+5N0~=Za3gq_MT@@*cj-w4HwvJOA>YdLp;4)>%xm$xd!4^2zy^g`$7NhWX`z{Ezs*O%TM*S>fgC}5oK__d`cau7ue|{`ai#LnY-d&r3e1#khpmU zqWk~G*Z#u~e*e71|L50lbmGR>?FU`|jqlIB{{P7Xe773S!QuzEitj4pfagyfxAK6^ z$9s{t9W7s)9Y_aXVD6Riz;Euof8{x`?k?BnP+vcD@>xqyJ=wF=73yj0ZSU;4=B%Zc zue;zR?@|}*wVw9YE*2hVE!`68UwY2jO${s6LbH2g*A^ES=;=Re>88G(_w~1hL*1?Y zCv|tW_4W4mc0^BN8T-E0{_c}EpSsk=jMmu^>W^MA`)*vyY^o6e9#9cz|{=Ux5Onujc`e)vp{q}0TXrkL|LYqTft}gZeXDw~* zzo=((?{%TRrLIk#=eDU8$5~4|TD$r~OV3_;%FMM7{_xE8XPxn;yRSUupti0&Wv0`7 zeB~+A{ycjwJm);{SLy-(0$uY{nNr5NJ+M8sy|lfy-MfQdAds!NB#|zpD{1$DZy+&{ z8z>Bv1}X!&!OCE5&@$v4stgr|EhEm6z({7KGU6TejRr<*qm~`M9pN3B9fcj1ap!no zJUpHmFN|9z+!Nu6#6)VsGU=WSPbMY{leJ09lyk~G<(=~G4D1Z=EbXlA0G)pU>Woch6gi)1@7%03J;}*GDEqc!cd8JI7fW6B0LfsNsOduO>V?D z79PutmBuP#wJ}S^N$9Ei)0DOih+_%VJZh zsmzpfr*~&;XKK1_@dXm3Z5CRl+T|SZ;+w!gZNNDg7>o@j@Qi!NJLDS*(8AbIW>|U1 zJ>pd!8dn}r_i<19=znIiG8vc(PsOGZ`cAniE}UE-Dd04{E~HENzm~QPI0xL^E5J1q zL$x92a9}t#oEWYRJN4B|BefCBsB<(oT2Uh~=A_^5j5p)U1Tx`FczcGP7j)k%JJg88 z#uKLJh4IpOYSKI9n>x5Hg{jh1WvVu1+38ecl3u`*5)su;_n>#MH0Wdu>itwL$qko= zE3_sxQrS_{WM&P~iEMpL6DdhKPzV`GW26yu&7t1#kjJ?4S!fgLf% zTSeo6R@FUF9|a4&4>Q)&{jIl7@(Xyr#CP_R0~Wj=)@{lS1O_=+Tp(;Ng;B-xUgAD% z+7RIWIbzO<=M$M!CX>l!3Yh{?=O!-_{}JT*YXeLlQKxME-bZMV0beX&_7U*)g5h-ksubh?{ogCi8f)I_aEp;Yq*A`2u-n>YmGC>Ry2C z&*4okl_h2BZfr0|otCK&Z>GTvcEtS#!LnTGBF~smQi(2dDFW?c``=y)ibj; z?xZGrb@aI>y(R)vQ@JVCrr6FL(N~&|KaWFhr4KbKo|`&UqT*QwowTVkGZ$DG-LQ$g z@T^LFAnq*GVYjYIKH8(=PUVDZl|^S}Mn|0TVue}4$vmOruEs2p(QT?sC1$s&nawM0 zvJiVdGrn$Sh?vfZ%wWdM4GA;4VKXxnMoJ^~dJ)hS!#OKYON??YW7%F{W=PDckQFjP zwM+TSHxW>Ee5d#wJY#2EO=YcZx9o84aPP>y@k}$bu9 zGp(DM#G>;#!$?=CdaBwK#=Ls0Q>NO~wySn{$(re!XPMw;5r+gom^n1e+*!~wr}9o^ zIL1{<)U5h-3V6Xy)Fh}1mF+d1c`4$&#tc^Pzk8-y1*RnK&~uho&xs|SZ9Xcvx~_#9 z6xQ=`ZKN{l)^l=!`Pge_rdTF6Gc(n=liS3md%`#A=N`eyIP*r5oGQ=cj+@*GOa;lV zBsr8PGK$PoveUBDLtScSR!Qy5sOpq-$W8RulJ@BtG)6Af<2FXUbdvu$}1Ft98O; zO>L^6W|3??hgH6~@raY^5@VcddQMLbdPkadHHnZXX;x5$ks>u(SXH=3JX3X`(jaWeiiaroaj#z-X!3;?*ORBa?AVemW0S%`33lQJI`! zoGQ$-G3rZAk5!KO-!kmf>kKD3;G?Cr5hwF*Owa#b#;cwQrLh=uNXg9pC6ki{W?eVy zk;FKDC_4B#o65bEURkQU9;j!&AwO%ZIHQs!Kg!(I!N@dI*&>WjmbFKjF>=s`W+J=p zt7%UuKLtjEv?xg}&Xb?jQRkS8X!7H;IO~!uBU&c@9b`Z=qZ-k*C(WE!(c_yT)-2?1 zn3Y0`wSrHto=dterdTNysMaw&TB0f{kA|6L4vM(4gP$-Qs4H&0IxP$ohKsDuWW+t< z!E-@YPf12N&+4U$7hR05A5X>^;VdIuW~Ja5^Nux>uMzy3rot4*YRn{oS+jCVuc5un z$_GYWwXw!(CZN}QHKNd~R}F5~3kk9^r`HS)Nz+DmI$&1#2ghNK%<$^YgSu8SYXfYJ@v@7?~jTI!QL>so7OL z;9_p|GvCLFqb!xHOe-AJ*JffW!kDG0VMS`XFspf((}L8pB;%K-o>dt`7b^lk;}|D@ zYphxV+FP}$06Vpqp2gI77FZ+DXxBnrYg2k{RT)Sy$K+V~1@tZ`!AdKoS6JSeJz7}j zt%WG7*IKU`!4&<=Gh9?9HjLhm8mW|p#;eMDHVS#s2p+RTWC_3Un$+0$0=Rai%rh1F=d zKHKwy_k}vTW~H3ayIQwdDO<=`FY{+%X4bEm{hgcr zosXGedae!}G)t*k9Am~VQ8@xL>yPQU_tCx#wb*U4lDX2qP%=8^o$R=CW{;7ZRfkKo zFYqUJp8-~SIaX9oy~oH=J)DebO#81e7B*`uA9X|3w$gSVwJoFf-m136sK{&AMr!tfQUv8KO3j(ldlx??fwlhv>y~PJ9;AtBwLKtFZF0up>S& zrU^o6#&EI7LcNYtvucdGThnvA7vEX*imyOExXr4*9&&V*$EU|Nre_l; zbG(lgdw3{9%%@pj6scjt?CxR39%RR!BoFeejH-~_GOQAn?{Y+47~d7t>TrA5JWEk6vzR@04Uc*C zj>0{wO{sdD(hFzS?J65oi&EsMn;cD;y{uR78QnSy3d~#t>;+f)yy z*-fP0&=%#PFf(S2-9$`}pi@0#$u5*Npn$jC)NIu=i{6)HjK6()o{Q1L6j7TR_tjVY zGkH|tnw1HQUcW5V^KBtrWJM+HjXbQXg7hd!6y%vbyv!Q)D0L3GiHQ{JQ;*UV zaazxv0G?Jo%9tlsZq^8D#!cxJme;KLoK)}_)jLBB1kBTe%0z(vB@U|6PQ4c{sdZm* zp;?1E$!xcd(16)5r3MbJISIX2ax>Q^Xjg@*xokA4SS~Wc#3s!POncY z+TTtpVm$)Fx@{?4v!z@gdo|zPE4Ysb)++QF7|FMQ&!Lt0E*|yb#d) z=-Nn3&zALZD6y`L=_gChSx;^16(XabMfmh{#tL(|s#|LI<`1xoOU1mNGZVAc;iY;` zx)#;vZ}Z&2M+C>Htpz+1AZlwvUcIwV5g##TqY|-EBRVXmDim0QRdn2{Xst0OUaEYF zY8B8s6pPt4Tl74c(y^e{6FF9|ZgxyQ_5|WtB>dAj37Bp3MgUSJ2A;69Z}FZW3?i@5b{tm+~+XKN12Ic!#*DP5aOnV7CzP7{MQJ)@=c ztWg?|F>93c-YhX|R^sf+$7!li4Sxsp+RVrGa*VH&D<+7t3ga8r(VrSgnVO%Pi83dZ z+DrD=b1pV(MdmiXcADo|7M@Qm($88ddM%%sd4^W{v$f_xG}lMBpyOF(b6BqsDl=p1 zH8Zc1pJJrUN+qS@E4j%0oM5`g0khZfnWs~#zX?6EF|IKF(ad_ytyh%O*H6vtX)F4vhf~)#AG4B*?u4#5IkQTy%|w}dM?ueNHD*dxHN3`q zF>!0 z0_?V9L_uoCGnJW{z&o=KOw4+oSJBnT$tp@^XMi2q8!Kjw`aq2-F4F7AH+x_@4iiLp zMpwSl|8+*FP#0@Eq`XLy47r-o4vw+ZP;6%1^v0O->8CoeH_W3oy()DR+rER=AoVz} zykTysM`Magt13-NX8{eV)_s~A`R`xF@+W>)k}>t8@`h)jBK%DeZd+p=6VQIIjrz>< zvjp=)LGOga=4T9nS!--nk!q~}y{sJ$M4nggp6W4GP`TuIyMB&u(a){C?40Vc?9_Eb zjaS$_$E#6~EUc-+x^4u_x}~I_le!PuUl#OEWV%k*GtD_ur+qrB6GZEDoQBmp%EjM- zp*hp-@R?nvS68sotohricb9yLmHxLePTp5@sYUPZ3PZk`pMj)Id?%>kt}zd5zh?cc zC@`jeKA@g)hShqt`R#gNTN9s?} zdi)6e^Y}EotSobRUO(e0Wh8rqUcXI8MTGhpCr{K9@U)7N^pU!*S=cB2*F0EcpIhcB zK~+BqvP?MG^SbmCAt@fI_r=qd<*nBQ+EYGK_rt}0$UD%?3c|1VMN&OV7W1~G9cfqE zlWtB2)9U5ie{&v~^T3=3<~%UxfjJM%d0@^1a~_!Uz?=u>JTT{hISmM I|GWqOH()a(9RL6T literal 0 HcmV?d00001 diff --git a/gmssl_engine/GmSSL3.1.1/bin/gmssl.exe b/gmssl_engine/GmSSL3.1.1/bin/gmssl.exe new file mode 100644 index 0000000000000000000000000000000000000000..7f5202a3daf1161641bec6f4837cad799cbdb7b0 GIT binary patch literal 308224 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

ZaUO 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 literal 0 HcmV?d00001 diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/aead.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/aead.h new file mode 100644 index 0000000..6dc8833 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/aead.h @@ -0,0 +1,108 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_AEAD_H +#define GMSSL_AEAD_H + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct { + SM4_CBC_CTX enc_ctx; + SM3_HMAC_CTX mac_ctx; + uint8_t mac[SM3_HMAC_SIZE]; + size_t maclen; +} SM4_CBC_SM3_HMAC_CTX; + +#define SM4_CBC_SM3_HMAC_KEY_SIZE 48 +#define SM4_CBC_SM3_HMAC_IV_SIZE 16 + +_gmssl_export int sm4_cbc_sm3_hmac_encrypt_init(SM4_CBC_SM3_HMAC_CTX *ctx, + const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen); +_gmssl_export int sm4_cbc_sm3_hmac_encrypt_update(SM4_CBC_SM3_HMAC_CTX *ctx, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +_gmssl_export int sm4_cbc_sm3_hmac_encrypt_finish(SM4_CBC_SM3_HMAC_CTX *ctx, + uint8_t *out, size_t *outlen); +_gmssl_export int sm4_cbc_sm3_hmac_decrypt_init(SM4_CBC_SM3_HMAC_CTX *ctx, + const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen); +_gmssl_export int sm4_cbc_sm3_hmac_decrypt_update(SM4_CBC_SM3_HMAC_CTX *ctx, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +_gmssl_export int sm4_cbc_sm3_hmac_decrypt_finish(SM4_CBC_SM3_HMAC_CTX *ctx, + uint8_t *out, size_t *outlen); + + +typedef struct { + SM4_CTR_CTX enc_ctx; + SM3_HMAC_CTX mac_ctx; + uint8_t mac[SM3_HMAC_SIZE]; + size_t maclen; +} SM4_CTR_SM3_HMAC_CTX; + +#define SM4_CTR_SM3_HMAC_KEY_SIZE 48 +#define SM4_CTR_SM3_HMAC_IV_SIZE 16 + +_gmssl_export int sm4_ctr_sm3_hmac_encrypt_init(SM4_CTR_SM3_HMAC_CTX *ctx, + const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen); +_gmssl_export int sm4_ctr_sm3_hmac_encrypt_update(SM4_CTR_SM3_HMAC_CTX *ctx, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +_gmssl_export int sm4_ctr_sm3_hmac_encrypt_finish(SM4_CTR_SM3_HMAC_CTX *ctx, + uint8_t *out, size_t *outlen); +_gmssl_export int sm4_ctr_sm3_hmac_decrypt_init(SM4_CTR_SM3_HMAC_CTX *ctx, + const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen); +_gmssl_export int sm4_ctr_sm3_hmac_decrypt_update(SM4_CTR_SM3_HMAC_CTX *ctx, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +_gmssl_export int sm4_ctr_sm3_hmac_decrypt_finish(SM4_CTR_SM3_HMAC_CTX *ctx, + uint8_t *out, size_t *outlen); + + +typedef struct { + SM4_CTR_CTX enc_ctx; + GHASH_CTX mac_ctx; + uint8_t Y[16]; // E(K, Y_0) + size_t taglen; + uint8_t mac[16]; + size_t maclen; +} SM4_GCM_CTX; + +#define SM4_GCM_KEY_SIZE 16 +#define SM4_GCM_DEFAULT_TAG_SIZE 16 + +_gmssl_export int sm4_gcm_encrypt_init(SM4_GCM_CTX *ctx, + const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, size_t taglen); +_gmssl_export int sm4_gcm_encrypt_update(SM4_GCM_CTX *ctx, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +_gmssl_export int sm4_gcm_encrypt_finish(SM4_GCM_CTX *ctx, + uint8_t *out, size_t *outlen); +_gmssl_export int sm4_gcm_decrypt_init(SM4_GCM_CTX *ctx, + const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, size_t taglen); +_gmssl_export int sm4_gcm_decrypt_update(SM4_GCM_CTX *ctx, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +_gmssl_export int sm4_gcm_decrypt_finish(SM4_GCM_CTX *ctx, + uint8_t *out, size_t *outlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/aes.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/aes.h new file mode 100644 index 0000000..618b2f5 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/aes.h @@ -0,0 +1,90 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_AES_H +#define GMSSL_AES_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define AES128_KEY_BITS 128 +#define AES192_KEY_BITS 192 +#define AES256_KEY_BITS 256 + +#define AES128_KEY_SIZE (AES128_KEY_BITS/8) +#define AES192_KEY_SIZE (AES192_KEY_BITS/8) +#define AES256_KEY_SIZE (AES256_KEY_BITS/8) + +#define AES_BLOCK_SIZE 16 + +#define AES128_ROUNDS 10 +#define AES192_ROUNDS 12 +#define AES256_ROUNDS 14 +#define AES_MAX_ROUNDS AES256_ROUNDS + + +typedef struct { + uint32_t rk[4 * (AES_MAX_ROUNDS + 1)]; + size_t rounds; +} AES_KEY; + +int aes_set_encrypt_key(AES_KEY *key, const uint8_t *raw_key, size_t raw_key_len); +int aes_set_decrypt_key(AES_KEY *key, const uint8_t *raw_key, size_t raw_key_len); +void aes_encrypt(const AES_KEY *key, const uint8_t in[AES_BLOCK_SIZE], uint8_t out[AES_BLOCK_SIZE]); +void aes_decrypt(const AES_KEY *key, const uint8_t in[AES_BLOCK_SIZE], uint8_t out[AES_BLOCK_SIZE]); + + +void aes_cbc_encrypt(const AES_KEY *key, const uint8_t iv[AES_BLOCK_SIZE], + const uint8_t *in, size_t nblocks, uint8_t *out); +void aes_cbc_decrypt(const AES_KEY *key, const uint8_t iv[AES_BLOCK_SIZE], + const uint8_t *in, size_t nblocks, uint8_t *out); +int aes_cbc_padding_encrypt(const AES_KEY *key, const uint8_t iv[AES_BLOCK_SIZE], + const uint8_t *in, size_t inlen, + uint8_t *out, size_t *outlen); +int aes_cbc_padding_decrypt(const AES_KEY *key, const uint8_t iv[AES_BLOCK_SIZE], + const uint8_t *in, size_t inlen, + uint8_t *out, size_t *outlen); + +void aes_ctr_encrypt(const AES_KEY *key, uint8_t ctr[AES_BLOCK_SIZE], + const uint8_t *in, size_t inlen, uint8_t *out); +#define aes_ctr_decrypt(key,ctr,in,inlen,out) aes_ctr_encrypt(key,ctr,in,inlen,out) + + +#define AES_GCM_IV_MIN_SIZE 1 +#define AES_GCM_IV_MAX_SIZE ((uint64_t)(1 << (64-3))) +#define AES_GCM_IV_DEFAULT_BITS 96 +#define AES_GCM_IV_DEFAULT_SIZE 12 + +#define AES_GCM_MIN_AAD_SIZE 0 +#define AES_GCM_MAX_AAD_SIZE ((uint64_t)(1 << (64-3))) + +#define AES_GCM_MIN_PLAINTEXT_SIZE 0 +#define AES_GCM_MAX_PLAINTEXT_SIZE ((((uint64_t)1 << 39) - 256) >> 3) + +#define AES_GCM_MAX_TAG_SIZE 16 + +int aes_gcm_encrypt(const AES_KEY *key, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, const uint8_t *in, size_t inlen, + uint8_t *out, size_t taglen, uint8_t *tag); +int aes_gcm_decrypt(const AES_KEY *key, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, const uint8_t *in, size_t inlen, + const uint8_t *tag, size_t taglen, uint8_t *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/api.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/api.h new file mode 100644 index 0000000..1949d65 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/api.h @@ -0,0 +1,23 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_API_H +#define GMSSL_API_H + + +#ifdef WIN32 +#define _gmssl_export __declspec(dllexport) +#elif defined(__GNUC__) +// use -fvisibility=hidden to change the "default" behavior +#define _gmssl_export __attribute__((visibility("default"))) +#else +#define _gmssl_export +#endif + +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/asn1.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/asn1.h new file mode 100644 index 0000000..9b71cfc --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/asn1.h @@ -0,0 +1,301 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_ASN1_H +#define GMSSL_ASN1_H + +#include +#include +#include + +#if __cplusplus +extern "C" { +#endif + + + +#define ASN1_TAG_UNIVERSAL 0x00 +#define ASN1_TAG_APPLICATION 0x40 +#define ASN1_TAG_CONTENT_SPECIFIC 0x80 +#define ASN1_TAG_PRIVATE 0xC0 +#define ASN1_TAG_PRIMITIVE 0x00 +#define ASN1_TAG_CONSTRUCTED 0x20 + +#define ASN1_TAG_IMPLICIT(index) (ASN1_TAG_CONTENT_SPECIFIC|(index)) +#define ASN1_TAG_EXPLICIT(index) ASN1_TAG_IMPLICIT(ASN1_TAG_CONSTRUCTED|(index)) + + +#define ASN1_FMT_FULL 0x01 + + +enum ASN1_TAG { + ASN1_TAG_BOOLEAN = 1, + ASN1_TAG_INTEGER = 2, + ASN1_TAG_BIT_STRING = 3, + ASN1_TAG_OCTET_STRING = 4, + ASN1_TAG_NULL = 5, + ASN1_TAG_OBJECT_IDENTIFIER = 6, + ASN1_TAG_ObjectDescriptor = 7, + ASN1_TAG_EXTERNAL = 8, + ASN1_TAG_REAL = 9, + ASN1_TAG_ENUMERATED = 10, // 0x0A + ASN1_TAG_EMBEDDED = 11, // 0x0B + ASN1_TAG_UTF8String = 12, // 0x0C + ASN1_TAG_RELATIVE_OID = 13, // 0x0D + ASN1_TAG_NumericString = 18, // 0x12 + ASN1_TAG_PrintableString = 19, // 0x13, printable subset of ascii + ASN1_TAG_TeletexString = 20, // 0x14, T61String + ASN1_TAG_VideotexString = 21, // 0x15 + ASN1_TAG_IA5String = 22, // 0x16, 7-bit ascii + ASN1_TAG_UTCTime = 23, // 0x17 + ASN1_TAG_GeneralizedTime = 24, // 0x18 + ASN1_TAG_GraphicString = 25, // 0x19 + ASN1_TAG_VisibleString = 26, // 0x20 + ASN1_TAG_GeneralString = 27, // 0x21 + ASN1_TAG_UniversalString = 28, // 0x22 + ASN1_TAG_CHARACTER_STRING = 29, // 0x23 + ASN1_TAG_BMPString = 30, // 0x24, 2-byte unicode with zeros + ASN1_TAG_SEQUENCE = 0x30, + ASN1_TAG_SET = 0x31, + ASN1_TAG_EXPLICIT = 0xa0, +}; + + +const char *asn1_tag_name(int tag); +int asn1_tag_is_cstring(int tag); +int asn1_tag_to_der(int tag, uint8_t **out, size_t *outlen); +int asn1_tag_from_der(int *tag, const uint8_t **in, size_t *inlen); +int asn1_tag_from_der_readonly(int *tag, const uint8_t **in, size_t *inlen); // read the next tag without changing *in,*inlen +int asn1_length_to_der(size_t dlen, uint8_t **out, size_t *outlen); +int asn1_length_from_der(size_t *dlen, const uint8_t **in, size_t *inlen); +int asn1_length_is_zero(size_t len); +int asn1_length_le(size_t len1, size_t len2); // less than +int asn1_data_to_der(const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_data_from_der(const uint8_t **d, size_t dlen, const uint8_t **in, size_t *inlen); + +int asn1_type_to_der(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_type_from_der(int tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int asn1_nonempty_type_to_der(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_nonempty_type_from_der(int tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int asn1_any_type_from_der(int *tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int asn1_any_to_der(const uint8_t *a, size_t alen, uint8_t **out, size_t *outlen); // 调用方应保证a,alen为TLV +int asn1_any_from_der(const uint8_t **a, size_t *alen, const uint8_t **in, size_t *inlen); // 该函数会检查输入是否为TLV + +#define ASN1_TRUE 0xff +#define ASN1_FALSE 0x00 + +const char *asn1_boolean_name(int val); +int asn1_boolean_from_name(int *val, const char *name); +int asn1_boolean_to_der_ex(int tag, int val, uint8_t **out, size_t *outlen); +int asn1_boolean_from_der_ex(int tag, int *val, const uint8_t **in, size_t *inlen); +#define asn1_boolean_to_der(val,out,outlen) asn1_boolean_to_der_ex(ASN1_TAG_BOOLEAN,val,out,outlen) +#define asn1_boolean_from_der(val,in,inlen) asn1_boolean_from_der_ex(ASN1_TAG_BOOLEAN,val,in,inlen) +#define asn1_implicit_boolean_to_der(i,val,out,outlen) asn1_boolean_to_der_ex(ASN1_TAG_IMPLICIT(i),val,out,outlen) +#define asn1_implicit_boolean_from_der(i,val,in,inlen) asn1_boolean_from_der_ex(ASN1_TAG_IMPLICIT(i),val,in,inlen) + +// asn1_integer_ 不支持负数编解码 +int asn1_integer_to_der_ex(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_integer_from_der_ex(int tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +#define asn1_integer_to_der(d,dlen,out,outlen) asn1_integer_to_der_ex(ASN1_TAG_INTEGER,d,dlen,out,outlen) +#define asn1_integer_from_der(d,dlen,in,inlen) asn1_integer_from_der_ex(ASN1_TAG_INTEGER,d,dlen,in,inlen) +#define asn1_implicit_integer_to_der(i,d,dlen,out,outlen) asn1_integer_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_integer_from_der(i,d,dlen,in,inlen) asn1_integer_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,inlen) + +// asn1_int_ 只支持小的无符号整数的编解码,不支持负数 +int asn1_int_to_der_ex(int tag, int val, uint8_t **out, size_t *outlen); // 当 val == -1 时,不输出,返回 0 +int asn1_int_from_der_ex(int tag, int *val, const uint8_t **in, size_t *inlen); // 不支持负数,返回0时 *val 设置为 -1 +#define asn1_int_to_der(val,out,outlen) asn1_int_to_der_ex(ASN1_TAG_INTEGER,val,out,outlen) +#define asn1_int_from_der(val,in,inlen) asn1_int_from_der_ex(ASN1_TAG_INTEGER,val,in,inlen) +#define asn1_implicit_int_to_der(i,val,out,outlen) asn1_int_to_der_ex(ASN1_TAG_IMPLICIT(i),val,out,outlen) +#define asn1_implicit_int_from_der(i,val,in,inlen) asn1_int_from_der_ex(ASN1_TAG_IMPLICIT(i),val,in,inlen) + +// 比特长度不必须为8的整数倍 +int asn1_bit_string_to_der_ex(int tag, const uint8_t *d, size_t nbits, uint8_t **out, size_t *outlen); +int asn1_bit_string_from_der_ex(int tag, const uint8_t **d, size_t *nbits, const uint8_t **in, size_t *inlen); +#define asn1_bit_string_to_der(d,nbits,out,outlen) asn1_bit_string_to_der_ex(ASN1_TAG_BIT_STRING,d,nbits,out,outlen) +#define asn1_bit_string_from_der(d,nbits,in,inlen) asn1_bit_string_from_der_ex(ASN1_TAG_BIT_STRING,d,nbits,in,inlen) +#define asn1_implicit_bit_string_to_der(i,d,nbits,out,outlen) asn1_bit_string_to_der_ex(ASN1_TAG_IMPLICIT(i),d,nbits,out,outlen) +#define asn1_implicit_bit_string_from_der(i,d,nbits,in,inlen) asn1_bit_string_from_der_ex(ASN1_TAG_IMPLICIT(i),d,nbits,in,inlen) + +// 比特长度必须为8的整数倍,因此使用字节长度 +int asn1_bit_octets_to_der_ex(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_bit_octets_from_der_ex(int tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +#define asn1_bit_octets_to_der(d,dlen,out,outlen) asn1_bit_octets_to_der_ex(ASN1_TAG_BIT_STRING,d,dlen,out,outlen) +#define asn1_bit_octets_from_der(d,dlen,in,inlen) asn1_bit_octets_from_der_ex(ASN1_TAG_BIT_STRING,d,dlen,in,inlen) +#define asn1_implicit_bit_octets_to_der(i,d,dlen,out,outlen) asn1_bit_octets_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_bit_octets_from_der(i,d,dlen,in,inlen) asn1_bit_octets_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,inlen) + +// bits == -1 不编码,只支持较少的比特数量 +int asn1_bits_to_der_ex(int tag, int bits, uint8_t **out, size_t *outlen); +int asn1_bits_from_der_ex(int tag, int *bits, const uint8_t **in, size_t *inlen); +#define asn1_bits_to_der(bits,out,outlen) asn1_bits_to_der_ex(ASN1_TAG_BIT_STRING,bits,out,outlen) +#define asn1_bits_from_der(bits,in,inlen) asn1_bits_from_der_ex(ASN1_TAG_BIT_STRING,bits,in,inlen) +#define asn1_implicit_bits_to_der(i,bits,out,outlen) asn1_bits_to_der_ex(ASN1_TAG_IMPLICIT(i),bits,out,outlen) +#define asn1_implicit_bits_from_der(i,bits,in,inlen) asn1_bits_from_der_ex(ASN1_TAG_IMPLICIT(i),bits,in,inlen) +// names[i]对应第i个比特 +int asn1_bits_print(FILE *fp, int fmt, int ind, const char *label, const char **names, size_t names_cnt, int bits); + +#define asn1_octet_string_to_der_ex(tag,d,dlen,out,outlen) asn1_type_to_der(tag,d,dlen,out,outlen) +#define asn1_octet_string_from_der_ex(tag,d,dlen,in,inlen) asn1_type_from_der(tag,d,dlen,in,inlen) +#define asn1_octet_string_to_der(d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_OCTET_STRING,d,dlen,out,outlen) +#define asn1_octet_string_from_der(d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_OCTET_STRING,d,dlen,in,inlen) +#define asn1_implicit_octet_string_to_der(i,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_octet_string_from_der(i,d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_IMPLICIT(i),d,dlen,in,inlen) + +const char *asn1_null_name(void); +int asn1_null_to_der(uint8_t **out, size_t *outlen); +int asn1_null_from_der(const uint8_t **in, size_t *inlen); + +#define ASN1_OID_MIN_NODES 2 +#define ASN1_OID_MAX_NODES 32 +#define ASN1_OID_MIN_OCTETS 1 +#define ASN1_OID_MAX_OCTETS (1 + (ASN1_OID_MAX_NODES - 2) * 5) +int asn1_object_identifier_to_octets(const uint32_t *nodes, size_t nodes_cnt, uint8_t *out, size_t *outlen); +int asn1_object_identifier_from_octets(uint32_t *nodes, size_t *nodes_cnt, const uint8_t *in, size_t inlen); + +int asn1_object_identifier_to_der_ex(int tag, const uint32_t *nodes, size_t nodes_cnt, uint8_t **out, size_t *outlen); +int asn1_object_identifier_from_der_ex(int tag, uint32_t *nodes, size_t *nodes_cnt, const uint8_t **in, size_t *inlen); +#define asn1_object_identifier_to_der(nodes,nodes_cnt,out,outlen) asn1_object_identifier_to_der_ex(ASN1_TAG_OBJECT_IDENTIFIER,nodes,nodes_cnt,out,outlen) +#define asn1_object_identifier_from_der(nodes,nodes_cnt,in,inlen) asn1_object_identifier_from_der_ex(ASN1_TAG_OBJECT_IDENTIFIER,nodes,nodes_cnt,in,inlen) +#define asn1_implicit_object_identifier_to_der(i,nodes,nodes_cnt,out,outlen) asn1_object_identifier_to_der_ex(ASN1_TAG_IMPLICIT(i),nodes,nodes_cnt,out,outlen) +#define asn1_implicit_object_identifier_from_der(i,nodes,nodes_cnt,in,inlen) asn1_object_identifier_from_der_ex(ASN1_TAG_IMPLICIT(i),nodes,nodes_cnt,in,inlen) +int asn1_object_identifier_equ(const uint32_t *a, size_t a_cnt, const uint32_t *b, size_t b_cnt); +int asn1_object_identifier_print(FILE *fp, int fmt, int ind, const char *label, const char *name, + const uint32_t *nodes, size_t nodes_cnt); + +typedef struct { + int oid; + char *name; + uint32_t *nodes; + size_t nodes_cnt; + int flags; + char *description; +} ASN1_OID_INFO; + +const ASN1_OID_INFO *asn1_oid_info_from_name(const ASN1_OID_INFO *infos, size_t count, const char *name); +const ASN1_OID_INFO *asn1_oid_info_from_oid(const ASN1_OID_INFO *infos, size_t count, int oid); +// 如果一个正确解析的OID并不在infos列表中,那么仍然返回1,但是调用方必须检查返回的info是否为空 +int asn1_oid_info_from_der_ex(const ASN1_OID_INFO **info, uint32_t *nodes, size_t *nodes_cnt, + const ASN1_OID_INFO *infos, size_t count, const uint8_t **in, size_t *inlen); +int asn1_oid_info_from_der(const ASN1_OID_INFO **info, + const ASN1_OID_INFO *infos, size_t count, const uint8_t **in, size_t *inlen); + +#define asn1_enumerated_to_der_ex(tag,val,out,outlen) asn1_int_to_der_ex(tag,val,out,outlen) +#define asn1_enumerated_from_der_ex(tag,val,in,inlen) asn1_int_from_der_ex(tag,val,in,inlen) +#define asn1_enumerated_to_der(val,out,outlen) asn1_int_to_der_ex(ASN1_TAG_ENUMERATED,val,out,outlen) +#define asn1_enumerated_from_der(val,in,inlen) asn1_int_from_der_ex(ASN1_TAG_ENUMERATED,val,in,inlen) +#define asn1_implicit_enumerated_to_der(i,val,out,outlen) asn1_int_to_der_ex(ASN1_TAG_IMPLICIT(i),val,out,outlen) +#define asn1_implicit_enumerated_from_der(i,val,in,inlen) asn1_int_from_der_ex(ASN1_TAG_IMPLICIT(i),val,in,inlen) + +int asn1_string_is_utf8_string(const char *d, size_t dlen); +int asn1_utf8_string_to_der_ex(int tag, const char *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_utf8_string_from_der_ex(int tag, const char **d, size_t *dlen, const uint8_t **in, size_t *inlen); +#define asn1_utf8_string_to_der(d,dlen,out,outlen) asn1_utf8_string_to_der_ex(ASN1_TAG_UTF8String,d,dlen,out,outlen) +#define asn1_utf8_string_from_der(d,dlen,in,inlen) asn1_utf8_string_from_der_ex(ASN1_TAG_UTF8String,d,dlen,in,inlen) +#define asn1_implicit_utf8_string_to_der(i,d,dlen,out,outlen) asn1_utf8_string_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_utf8_string_from_der(i,d,dlen,in,inlen) asn1_utf8_string_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,inlen) + +int asn1_string_is_printable_string(const char *d, size_t dlen); +int asn1_printable_string_case_ignore_match(const char *a, size_t alen, const char *b, size_t blen); +int asn1_printable_string_to_der_ex(int tag, const char *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_printable_string_from_der_ex(int tag, const char **d, size_t *dlen, const uint8_t **in, size_t *inlen); +#define asn1_printable_string_to_der(d,dlen,out,outlen) asn1_printable_string_to_der_ex(ASN1_TAG_PrintableString,d,dlen,out,outlen) +#define asn1_printable_string_from_der(d,dlen,in,inlen) asn1_printable_string_from_der_ex(ASN1_TAG_PrintableString,d,dlen,in,inlen) +#define asn1_implicit_printable_string_to_der(i,d,dlen,out,outlen) asn1_printable_string_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_printable_string_from_der(i,d,dlen,in,inlen) asn1_printable_string_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,inlen) + +int asn1_string_is_ia5_string(const char *d, size_t dlen); +int asn1_ia5_string_to_der_ex(int tag, const char *d, size_t dlen, uint8_t **out, size_t *outlen); +int asn1_ia5_string_from_der_ex(int tag, const char **d, size_t *dlen, const uint8_t **in, size_t *inlen); +#define asn1_ia5_string_to_der(d,dlen,out,outlen) asn1_ia5_string_to_der_ex(ASN1_TAG_IA5String,d,dlen,out,outlen) +#define asn1_ia5_string_from_der(d,dlen,in,inlen) asn1_ia5_string_from_der_ex(ASN1_TAG_IA5String,d,dlen,in,inlen) +#define asn1_implicit_ia5_string_to_der(i,d,dlen,out,outlen) asn1_ia5_string_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_ia5_string_from_der(i,d,dlen,in,inlen) asn1_ia5_string_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,inlen) + +int asn1_string_print(FILE *fp, int fmt, int ind, const char *label, int tag, const uint8_t *d, size_t dlen); + +#define ASN1_UTC_TIME_STRLEN (sizeof("YYMMDDHHMMSSZ")-1) +#define ASN1_GENERALIZED_TIME_STRLEN (sizeof("YYYYMMDDHHMMSSZ")-1) +#define ASN1_GENERALIZED_TIME_MAX_SIZE (2 + ASN1_GENERALIZED_TIME_STRLEN) + +int asn1_time_to_str(int utc_time, time_t timestamp, char *str); +int asn1_time_from_str(int utc_time, time_t *timestamp, const char *str); + +int asn1_utc_time_to_der_ex(int tag, time_t tv, uint8_t **out, size_t *outlen); +int asn1_utc_time_from_der_ex(int tag, time_t *tv, const uint8_t **in, size_t *inlen); +#define asn1_utc_time_to_der(tv,out,outlen) asn1_utc_time_to_der_ex(ASN1_TAG_UTCTime,tv,out,outlen) +#define asn1_utc_time_from_der(tv,in,inlen) asn1_utc_time_from_der_ex(ASN1_TAG_UTCTime,tv,in,inlen) +#define asn1_implicit_utc_time_to_der(i,tv,out,outlen) asn1_utc_time_to_der_ex(ASN1_TAG_IMPLICIT(i),tv,out,outlen) +#define asn1_implicit_utc_time_from_der(i,tv,in,inlen) asn1_utc_time_from_der_ex(ASN1_TAG_IMPLICIT(i),tv,in,inlen) + +int asn1_generalized_time_to_der_ex(int tag, time_t tv, uint8_t **out, size_t *outlen); +int asn1_generalized_time_from_der_ex(int tag, time_t *tv, const uint8_t **in, size_t *inlen); +#define asn1_generalized_time_to_der(tv,out,outlen) asn1_generalized_time_to_der_ex(ASN1_TAG_GeneralizedTime,tv,out,outlen) +#define asn1_generalized_time_from_der(tv,in,inlen) asn1_generalized_time_from_der_ex(ASN1_TAG_GeneralizedTime,tv,in,inlen) +#define asn1_implicit_generalized_time_to_der(i,tv,out,outlen) asn1_generalized_time_to_der_ex(ASN1_TAG_IMPLICIT(i),tv,out,outlen) +#define asn1_implicit_generalized_time_from_der(i,tv,in,inlen) asn1_generalized_time_from_der_ex(ASN1_TAG_IMPLICIT(i),tv,in,inlen) + +// BasicConstraints might be an empty sequence in entity certificates +#define asn1_sequence_to_der(d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_SEQUENCE,d,dlen,out,outlen) +#define asn1_sequence_from_der(d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_SEQUENCE,d,dlen,in,inlen) +#define asn1_implicit_sequence_to_der(i,d,dlen,out,outlen) asn1_nonempty_type_to_der(ASN1_TAG_EXPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_sequence_from_der(i,d,dlen,in,inlen) asn1_nonempty_type_from_der(ASN1_TAG_EXPLICIT(i),d,dlen,in,inlen) + +#define asn1_sequence_of_to_der(d,dlen,out,outlen) asn1_nonempty_type_to_der(ASN1_TAG_SEQUENCE,d,dlen,out,outlen) +#define asn1_sequence_of_from_der(d,dlen,in,inlen) asn1_nonempty_type_from_der(ASN1_TAG_SEQUENCE,d,dlen,in,inlen) +int asn1_sequence_of_int_to_der(const int *nums, size_t nums_cnt, uint8_t **out, size_t *outlen); +int asn1_sequence_of_int_from_der(int *nums, size_t *nums_cnt, size_t max_nums, const uint8_t **in, size_t *inlen); +int asn1_sequence_of_int_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +#define asn1_set_to_der(d,dlen,out,outlen) asn1_nonempty_type_to_der(ASN1_TAG_SET,d,dlen,out,outlen) +#define asn1_set_from_der(d,dlen,in,inlen) asn1_nonempty_type_from_der(ASN1_TAG_SET,d,dlen,in,inlen) +#define asn1_implicit_set_to_der(i,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_EXPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_set_from_der(i,d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_EXPLICIT(i),d,dlen,in,inlen) + +#define asn1_set_of_to_der(d,dlen,out,outlen) asn1_nonempty_type_to_der(ASN1_TAG_SET,d,dlen,out,outlen) +#define asn1_set_of_from_der(d,dlen,in,inlen) asn1_nonempty_type_from_der(ASN1_TAG_SET,d,dlen,in,inlen) + +#define asn1_implicit_to_der(i,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen) +#define asn1_implicit_from_der(i,d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_IMPLICIT(i),d,dlen,in,inlen) + +int asn1_header_to_der(int tag, size_t dlen, uint8_t **out, size_t *outlen); +#define asn1_implicit_header_to_der(i,dlen,out,outlen) asn1_header_to_der(ASN1_TAG_EXPLICIT(i),dlen,out,outlen) + +#define asn1_octet_string_header_to_der(dlen,out,outlen) asn1_header_to_der(ASN1_TAG_OCTET_STRING,dlen,out,outlen) + +#define asn1_sequence_header_to_der_ex(tag,dlen,out,outlen) asn1_header_to_der(tag,dlen,out,outlen) +#define asn1_sequence_header_to_der(dlen,out,outlen) asn1_header_to_der(ASN1_TAG_SEQUENCE,dlen,out,outlen) +#define asn1_implicit_sequence_header_to_der(i,dlen,out,outlen) asn1_header_to_der(ASN1_TAG_EXPLICIT(i),dlen,out,outlen) + +#define asn1_set_header_to_der(dlen,out,outlen) asn1_header_to_der(ASN1_TAG_SET,dlen,out,outlen) +#define asn1_implicit_set_header_to_der(i,dlen,out,outlen) asn1_header_to_der(ASN1_TAG_EXPLICIT(i),dlen,out,outlen) + +#define asn1_explicit_header_to_der(i,dlen,out,outlen) asn1_header_to_der(ASN1_TAG_EXPLICIT(i),dlen,out,outlen) + +#define asn1_explicit_to_der(i,d,dlen,out,outlen) asn1_nonempty_type_to_der(ASN1_TAG_EXPLICIT(i),d,dlen,out,outlen) +#define asn1_explicit_from_der(i,d,dlen,in,inlen) asn1_nonempty_type_from_der(ASN1_TAG_EXPLICIT(i),d,dlen,in,inlen) + +// d,dlen 是 SEQUENCE OF, SET OF 中的值 +int asn1_types_get_count(const uint8_t *d, size_t dlen, int tag, size_t *cnt); +int asn1_types_get_item_by_index(const uint8_t *d, size_t dlen, int tag, + int index, const uint8_t **item_d, size_t *item_dlen); + + + + + +int asn1_check(int expr); + + +#if __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/base64.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/base64.h new file mode 100644 index 0000000..6f611de --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/base64.h @@ -0,0 +1,72 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_BASE64_H +#define GMSSL_BASE64_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +BASE64 Public API + + BASE64_CTX + base64_encode_init + base64_encode_update + base64_encode_finish + base64_decode_init + base64_decode_update + base64_decode_finish + +*/ + + +typedef struct { + /* number saved in a partial encode/decode */ + int num; + /* + * The length is either the output line length (in input bytes) or the + * shortest input line length that is ok. Once decoding begins, the + * length is adjusted up each time a longer line is decoded + */ + int length; + /* data to encode */ + unsigned char enc_data[80]; + /* number read on current line */ + int line_num; + int expect_nl; +} BASE64_CTX; + +# define BASE64_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80) +# define BASE64_DECODE_LENGTH(l) ((l+3)/4*3+80) + + +void base64_encode_init(BASE64_CTX *ctx); +int base64_encode_update(BASE64_CTX *ctx, const uint8_t *in, int inlen, uint8_t *out, int *outlen); +void base64_encode_finish(BASE64_CTX *ctx, uint8_t *out, int *outlen); + +void base64_decode_init(BASE64_CTX *ctx); +int base64_decode_update(BASE64_CTX *ctx, const uint8_t *in, int inlen, uint8_t *out, int *outlen); +int base64_decode_finish(BASE64_CTX *ctx, uint8_t *out, int *outlen); + + +int base64_encode_block(unsigned char *t, const unsigned char *f, int dlen); +int base64_decode_block(unsigned char *t, const unsigned char *f, int n); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/block_cipher.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/block_cipher.h new file mode 100644 index 0000000..54e26ea --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/block_cipher.h @@ -0,0 +1,74 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + + +#ifndef GMSSL_BLOCK_CIPHER_H +#define GMSSL_BLOCK_CIPHER_H + + +#include +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define BLOCK_CIPHER_BLOCK_SIZE 16 +#define BLOCK_CIPHER_MIN_KEY_SIZE 16 +#define BLOCK_CIPHER_MAX_KEY_SIZE 32 + + +typedef struct BLOCK_CIPHER BLOCK_CIPHER; +typedef struct BLOCK_CIPHER_KEY BLOCK_CIPHER_KEY; + +struct BLOCK_CIPHER_KEY { + union { + SM4_KEY sm4_key; + AES_KEY aes_key; + } u; + const BLOCK_CIPHER *cipher; +}; + +typedef void (*block_cipher_set_encrypt_key_func)(BLOCK_CIPHER_KEY *key, const uint8_t *raw_key); +typedef void (*block_cipher_set_decrypt_key_func)(BLOCK_CIPHER_KEY *key, const uint8_t *raw_key); +typedef void (*block_cipher_encrypt_func)(const BLOCK_CIPHER_KEY *key, const uint8_t *in, uint8_t *out); +typedef void (*block_cipher_decrypt_func)(const BLOCK_CIPHER_KEY *key, const uint8_t *in, uint8_t *out); + +struct BLOCK_CIPHER { + int oid; + size_t key_size; + size_t block_size; + block_cipher_set_encrypt_key_func set_encrypt_key; + block_cipher_set_decrypt_key_func set_decrypt_key; + block_cipher_encrypt_func encrypt; + block_cipher_decrypt_func decrypt; +}; + +const BLOCK_CIPHER *BLOCK_CIPHER_sm4(void); +const BLOCK_CIPHER *BLOCK_CIPHER_aes128(void); + +const BLOCK_CIPHER *block_cipher_from_name(const char *name); +const char *block_cipher_name(const BLOCK_CIPHER *cipher); +int block_cipher_set_encrypt_key(BLOCK_CIPHER_KEY *key, const BLOCK_CIPHER *cipher, const uint8_t *raw_key); +int block_cipher_set_decrypt_key(BLOCK_CIPHER_KEY *key, const BLOCK_CIPHER *cipher, const uint8_t *raw_key); +int block_cipher_encrypt(const BLOCK_CIPHER_KEY *key, const uint8_t *in, uint8_t *out); +int block_cipher_decrypt(const BLOCK_CIPHER_KEY *key, const uint8_t *in, uint8_t *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/chacha20.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/chacha20.h new file mode 100644 index 0000000..6193611 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/chacha20.h @@ -0,0 +1,57 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +/* RFC 8439 "ChaCha20 and Poly1305 for IETF Protocols" */ + +#ifndef GMSSL_CHACHA20_H +#define GMSSL_CHACHA20_H + +#define CHACHA20_IS_BIG_ENDIAN 0 + +#include +#include + +#include + +#define CHACHA20_KEY_BITS 256 +#define CHACHA20_NONCE_BITS 96 +#define CHACHA20_COUNTER_BITS 32 + +#define CHACHA20_KEY_SIZE (CHACHA20_KEY_BITS/8) +#define CHACHA20_NONCE_SIZE (CHACHA20_NONCE_BITS/8) +#define CHACHA20_COUNTER_SIZE (CHACHA20_COUNTER_BITS/8) + +#define CHACHA20_KEY_WORDS (CHACHA20_KEY_SIZE/sizeof(uint32_t)) +#define CHACHA20_NONCE_WORDS (CHACHA20_NONCE_SIZE/sizeof(uint32_t)) +#define CHACHA20_COUNTER_WORDS (CHACHA20_COUNTER_SIZE/sizeof(uint32_t)) + + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct { + uint32_t d[16]; +} CHACHA20_STATE; + + +void chacha20_init(CHACHA20_STATE *state, + const uint8_t key[CHACHA20_KEY_SIZE], + const uint8_t nonce[CHACHA20_NONCE_SIZE], uint32_t counter); + +void chacha20_generate_keystream(CHACHA20_STATE *state, + size_t counts, uint8_t *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/cms.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/cms.h new file mode 100644 index 0000000..5d4e0fa --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/cms.h @@ -0,0 +1,552 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +/* +References: + 1. GM/T 0010-2012 SM2 Cryptography Message Syntax Specification + 2. RFC 2315 PKCS #7 Cryptographic Message Syntax Version 1.5 + 3. RFC 5652 Cryptographic Message Syntax (CMS) +*/ + +#ifndef GMSSL_CMS_H +#define GMSSL_CMS_H + + +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + CMS_version_v1 = 1, +}; + + +/* +ContentType: + OID_cms_data + OID_cms_signed_data + OID_cms_enveloped_data + OID_cms_signed_and_enveloped_data + OID_cms_encrypted_data + OID_cms_key_agreement_info +*/ +const char *cms_content_type_name(int oid); +int cms_content_type_from_name(const char *name); +int cms_content_type_to_der(int oid, uint8_t **out, size_t *outlen); +int cms_content_type_from_der(int *oid, const uint8_t **in, size_t *inlen); + +/* +ContentInfo ::= SEQUENCE { + contentType OBJECT IDENTIFIER, + content [0] EXPLICIT ANY OPTIONAL } +*/ +int cms_content_info_header_to_der( + int content_type, size_t content_len, + uint8_t **out, size_t *outlen); +int cms_content_info_to_der( + int content_type, + const uint8_t *content, size_t content_len, + uint8_t **out, size_t *outlen); +int cms_content_info_from_der( + int *content_type, + const uint8_t **content, size_t *content_len, // 这里获得的是完整的TLV + const uint8_t **in, size_t *inlen); +int cms_content_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +Data ::= OCTET STRING +*/ +#define cms_data_to_der(d,dlen,out,outlen) asn1_octet_string_to_der(d,dlen,out,outlen) +#define cms_data_from_der(d,dlen,in,inlen) asn1_octet_string_from_der(d,dlen,in,inlen) +#define cms_data_print(fp,fmt,ind,label,d,dlen) format_bytes(fp,fmt,ind,label,d,dlen) + +/* +EncryptedContentInfo ::= SEQUENCE { + contentType OBJECT IDENTIFIER, + contentEncryptionAlgorithm AlgorithmIdentifier, + encryptedContent [0] IMPLICIT OCTET STRING OPTIONAL, + sharedInfo1 [1] IMPLICIT OCTET STRING OPTIONAL, + sharedInfo2 [2] IMPLICIT OCTET STRING OPTIONAL } +*/ +int cms_enced_content_info_to_der( + int content_type, + int enc_algor, const uint8_t *enc_iv, size_t enc_iv_len, + const uint8_t *enced_content, size_t enced_content_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len, + uint8_t **out, size_t *outlen); +int cms_enced_content_info_from_der( + int *content_type, + int *enc_algor, const uint8_t **enc_iv, size_t *enc_iv_len, + const uint8_t **enced_content, size_t *enced_content_len, + const uint8_t **shared_info1, size_t *shared_info1_len, + const uint8_t **shared_info2, size_t *shared_info2_len, + const uint8_t **in, size_t *inlen); +int cms_enced_content_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int cms_enced_content_info_encrypt_to_der( + int enc_algor, + const uint8_t *key, size_t keylen, + const uint8_t *iv, size_t ivlen, + int content_type, const uint8_t *content, size_t content_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len, + uint8_t **out, size_t *outlen); +int cms_enced_content_info_decrypt_from_der( + int *enc_algor, + const uint8_t *key, size_t keylen, + int *content_type, uint8_t *content, size_t *content_len, + const uint8_t **shared_info1, size_t *shared_info1_len, + const uint8_t **shared_info2, size_t *shared_info2_len, + const uint8_t **in, size_t *inlen); + +/* +EncryptedData ::= SEQUENCE { + version INTEGER (1), + encryptedContentInfo EncryptedContentInfo } +*/ +int cms_encrypted_data_to_der( + int version, + int content_type, + int enc_algor, const uint8_t *iv, size_t ivlen, + const uint8_t *enced_content, size_t enced_content_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len, + uint8_t **out, size_t *outlen); +int cms_encrypted_data_from_der( + int *version, + int *content_type, + int *enc_algor, const uint8_t **iv, size_t *ivlen, + const uint8_t **enced_content, size_t *enced_content_len, + const uint8_t **shared_info1, size_t *shared_info1_len, + const uint8_t **shared_info2, size_t *shared_info2_len, + const uint8_t **in, size_t *inlen); +int cms_encrypted_data_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int cms_encrypted_data_encrypt_to_der( + int enc_algor, + const uint8_t *key, size_t keylen, + const uint8_t *iv, size_t ivlen, + int content_type, const uint8_t *content, size_t content_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len, + uint8_t **out, size_t *outlen); +int cms_encrypted_data_decrypt_from_der( + int *enc_algor, + const uint8_t *key, size_t keylen, + int *content_type, uint8_t *content, size_t *content_len, + const uint8_t **shared_info1, size_t *shared_info1_len, + const uint8_t **shared_info2, size_t *shared_info2_len, + const uint8_t **in, size_t *inlen); + +/* +IssuerAndSerialNumber ::= SEQUENCE { + isser Name, + serialNumber INTEGER } +*/ +int cms_issuer_and_serial_number_to_der( + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial_number, size_t serial_number_len, + uint8_t **out, size_t *outlen); +int cms_issuer_and_serial_number_from_der( + const uint8_t **issuer, size_t *issuer_len, + const uint8_t **serial_number, size_t *serial_number_len, + const uint8_t **in, size_t *inlen); +int cms_issuer_and_serial_number_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +SignerInfo ::= SEQUENCE { + version INTEGER (1), + issuerAndSerialNumber IssuerAndSerialNumber, + digestAlgorithm AlgorithmIdentifier, + authenticatedAttributes [0] IMPLICIT SET OF Attribute OPTINOAL, + digestEncryptionAlgorithm AlgorithmIdentifier, + encryptedDigest OCTET STRING, + unauthenticatedAttributes [1] IMPLICIT SET OF Attribute OPTINOAL, } +*/ +int cms_signer_info_to_der( + int version, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial_number, size_t serial_number_len, + int digest_algor, + const uint8_t *authed_attrs, size_t authed_attrs_len, + int signature_algor, + const uint8_t *enced_digest, size_t enced_digest_len, + const uint8_t *unauthed_attrs, size_t unauthed_attrs_len, + uint8_t **out, size_t *outlen); +int cms_signer_info_from_der( + int *version, + const uint8_t **issuer, size_t *issuer_len, + const uint8_t **serial_number, size_t *serial_number_len, + int *digest_algor, + const uint8_t **authed_attrs, size_t *authed_attrs_len, + int *signature_algor, + const uint8_t **enced_digest, size_t *enced_digest_len, + const uint8_t **unauthed_attrs, size_t *unauthed_attrs_len, + const uint8_t **in, size_t *inlen); +int cms_signer_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int cms_signer_info_sign_to_der( + const SM3_CTX *sm3_ctx, const SM2_KEY *sm2_key, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial_number, size_t serial_number_len, + const uint8_t *authed_attrs, size_t authed_attrs_len, + const uint8_t *unauthed_attrs, size_t unauthed_attrs_len, + uint8_t **out, size_t *outlen); +int cms_signer_info_verify_from_der( + const SM3_CTX *sm3_ctx, const uint8_t *certs, size_t certslen, + const uint8_t **cert, size_t *certlen, + const uint8_t **issuer, size_t *issuer_len, + const uint8_t **serial, size_t *serial_len, + const uint8_t **authed_attrs, size_t *authed_attrs_len, + const uint8_t **unauthed_attrs, size_t *unauthed_attrs_len, + const uint8_t **in, size_t *inlen); +/* +SignerInfos ::= SET OF SignerInfo; +*/ +int cms_signer_infos_add_signer_info( + uint8_t *d, size_t *dlen, size_t maxlen, + const SM3_CTX *sm3_ctx, const SM2_KEY *sign_key, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial_number, size_t serial_number_len, + const uint8_t *authed_attrs, size_t authed_attrs_len, + const uint8_t *unauthed_attrs, size_t unauthed_attrs_len); +#define cms_signer_infos_to_der(d,dlen,out,outlen) asn1_set_to_der(d,dlen,out,outlen) +#define cms_signer_infos_from_der(d,dlen,in,inlen) asn1_set_from_der(d,dlen,in,inlen) +int cms_signer_infos_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int cms_digest_algors_to_der(const int *digest_algors, size_t digest_algors_cnt, uint8_t **out, size_t *outlen); +int cms_digest_algors_from_der(int *digest_algors, size_t *digest_algors_cnt, size_t max_digest_algors, + const uint8_t **in, size_t *inlen); +int cms_digest_algors_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +SignedData ::= SEQUENCE { + version INTEGER (1), + digestAlgorithms SET OF AlgorithmIdentifier, + contentInfo ContentInfo, + certificates [0] IMPLICIT SET OF Certificate OPTIONAL, + crls [1] IMPLICIT SET OF CertificateRevocationList OPTIONAL, + signerInfos SET OF SignerInfo } +*/ +int cms_signed_data_to_der( + int version, + const int *digest_algors, size_t digest_algors_cnt, + const int content_type, const uint8_t *content, const size_t content_len, + const uint8_t *certs, size_t certs_len, + const uint8_t *crls, const size_t crls_len, + const uint8_t *signer_infos, size_t signer_infos_len, + uint8_t **out, size_t *outlen); +int cms_signed_data_from_der( + int *version, + int *digest_algors, size_t *digest_algors_cnt, size_t max_digest_algors, + int *content_type, const uint8_t **content, size_t *content_len, + const uint8_t **certs, size_t *certs_len, + const uint8_t **crls, size_t *crls_len, + const uint8_t **signer_infos, size_t *signer_infos_len, + const uint8_t **in, size_t *inlen); +int cms_signed_data_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +typedef struct { + uint8_t *certs; + size_t certs_len; + SM2_KEY *sign_key; +} CMS_CERTS_AND_KEY; + +int cms_signed_data_sign_to_der( + const CMS_CERTS_AND_KEY *signers, size_t signers_cnt, + int content_type, const uint8_t *data, size_t datalen, // 当OID_cms_data时为raw data + const uint8_t *crls, size_t crls_len, // 可以为空 + uint8_t **out, size_t *outlen); +int cms_signed_data_verify_from_der( + const uint8_t *extra_certs, size_t extra_certs_len, + const uint8_t *extra_crls, size_t extra_crls_len, + int *content_type, const uint8_t **content, size_t *content_len, // 是否应该返回raw data呢? + const uint8_t **certs, size_t *certs_len, + const uint8_t **crls, size_t *crls_len, + const uint8_t **signer_infos, size_t *signer_infos_len, + const uint8_t **in, size_t *inlen); + + +/* +RecipientInfo ::= SEQUENCE { + version INTEGER (1), + issuerAndSerialNumber IssuerAndSerialNumber, + keyEncryptionAlgorithm AlgorithmIdentifier, + encryptedKey OCTET STRING -- DER-encoding of SM2Cipher +} +由于encryptedKey的类型为SM2Cipher, 而SM2Cipher中有2个INTEGER,因此长度是不固定的。 +因此不能预先确定输出长度 +*/ +int cms_recipient_info_to_der( + int version, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial_number, size_t serial_number_len, + int public_key_enc_algor, + const uint8_t *enced_key, size_t enced_key_len, + uint8_t **out, size_t *outlen); +int cms_recipient_info_from_der( + int *version, + const uint8_t **issuer, size_t *issuer_len, + const uint8_t **serial_number, size_t *serial_number_len, + int *pke_algor, const uint8_t **params, size_t *params_len,// SM2加密只使用SM3,没有默认参数,但是ECIES可能有 + const uint8_t **enced_key, size_t *enced_key_len, + const uint8_t **in, size_t *inlen); +int cms_recipient_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +int cms_recipient_info_encrypt_to_der( + const SM2_KEY *public_key, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial, size_t serial_len, + const uint8_t *in, size_t inlen, + uint8_t **out, size_t *outlen); +int cms_recipient_info_decrypt_from_der( + const SM2_KEY *sm2_key, + const uint8_t *rcpt_issuer, size_t rcpt_issuer_len, + const uint8_t *rcpt_serial, size_t rcpt_serial_len, + uint8_t *out, size_t *outlen, size_t maxlen, + const uint8_t **in, size_t *inlen); + +int cms_recipient_infos_add_recipient_info( + uint8_t *d, size_t *dlen, size_t maxlen, + const SM2_KEY *public_key, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial, size_t serial_len, + const uint8_t *in, size_t inlen); +#define cms_recipient_infos_to_der(d,dlen,out,outlen) asn1_set_to_der(d,dlen,out,outlen) +#define cms_recipient_infos_from_der(d,dlen,in,inlen) asn1_set_from_der(d,dlen,in,inlen) +int cms_recipient_infos_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +EnvelopedData ::= SEQUENCE { + version Version, + recipientInfos SET OF RecipientInfo, + encryptedContentInfo EncryptedContentInfo } +*/ +int cms_enveloped_data_to_der( + int version, + const uint8_t *rcpt_infos, size_t rcpt_infos_len, + int content_type, + int enc_algor, const uint8_t *enc_iv, size_t enc_iv_len, + const uint8_t *enced_content, size_t enced_content_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len, + uint8_t **out, size_t *outlen); +int cms_enveloped_data_from_der( + int *version, + const uint8_t **rcpt_infos, size_t *rcpt_infos_len, + const uint8_t **enced_content_info, size_t *enced_content_info_len, + const uint8_t **in, size_t *inlen); +int cms_enveloped_data_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int cms_enveloped_data_encrypt_to_der( + const uint8_t *rcpt_certs, size_t rcpt_certs_len, + int enc_algor, const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + int content_type, const uint8_t *content, size_t content_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len, + uint8_t **out, size_t *outlen); +int cms_enveloped_data_decrypt_from_der( + const SM2_KEY *sm2_key, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial_number, size_t serial_number_len, + int *content_type, uint8_t *content, size_t *content_len, + const uint8_t **rcpt_infos, size_t *rcpt_infos_len, + const uint8_t **shared_info1, size_t *shared_info1_len, + const uint8_t **shared_info2, size_t *shared_info2_len, + const uint8_t **in, size_t *inlen); + +/* +SignedAndEnvelopedData ::= SEQUENCE { + version INTEGER (1), + recipientInfos SET OF RecipientInfo, + digestAlgorithms SET OF AlgorithmIdentifier, + encryptedContentInfo EncryptedContentInfo, + certificates [0] IMPLICIT SET OF Certificate OPTIONAL, + crls [1] IMPLICIT SET OF CertificateRevocationList OPTIONAL, + signerInfos SET OF SignerInfo } +*/ +int cms_signed_and_enveloped_data_to_der( + int version, + const uint8_t *rcpt_infos, size_t rcpt_infos_len, + const int *digest_algors, size_t digest_algors_cnt, + int content_type, + int enc_algor, const uint8_t *iv, size_t ivlen, + const uint8_t *enced_content, size_t enced_content_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len, + const uint8_t *certs, size_t certs_len, + const uint8_t *crls, size_t crls_len, + const uint8_t *signer_infos, size_t signer_infos_len, + uint8_t **out, size_t *outlen); +int cms_signed_and_enveloped_data_from_der( + int *version, + const uint8_t **rcpt_infos, size_t *rcpt_infos_len, + int *digest_algors, size_t *digest_algors_cnt, size_t max_digest_algors, + const uint8_t **enced_content_info, size_t *enced_content_info_len, + const uint8_t **certs, size_t *certs_len, + const uint8_t **crls, size_t *crls_len, + const uint8_t **signer_infos, size_t *signer_infos_len, + const uint8_t **in, size_t *inlen); +int cms_signed_and_enveloped_data_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int cms_signed_and_enveloped_data_encipher_to_der( + const CMS_CERTS_AND_KEY *signers, size_t signers_cnt, + const uint8_t *rcpt_certs, size_t rcpt_certs_len, + int enc_algor, const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + int content_type, const uint8_t *content, size_t content_len, + const uint8_t *signers_crls, size_t signers_crls_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len, + uint8_t **out, size_t *outlen); +int cms_signed_and_enveloped_data_decipher_from_der( + const SM2_KEY *rcpt_key, + const uint8_t *rcpt_issuer, size_t rcpt_issuer_len, + const uint8_t *rcpt_serial, size_t rcpt_serial_len, + int *content_type, uint8_t *content, size_t *content_len, + const uint8_t **prcpt_infos, size_t *prcpt_infos_len, + const uint8_t **shared_info1, size_t *shared_info1_len, + const uint8_t **shared_info2, size_t *shared_info2_len, + const uint8_t **certs, size_t *certs_len, + const uint8_t **crls, size_t *crls_len, + const uint8_t **psigner_infos, size_t *psigner_infos_len, + const uint8_t *extra_certs, size_t extra_certs_len, + const uint8_t *extra_crls, size_t extra_crls_len, + const uint8_t **in, size_t *inlen); + +/* +KeyAgreementInfo ::= SEQUENCE { + version INTEGER (1), + tempPublicKeyR SM2PublicKey, + userCertificate Certificate, + userID OCTET STRING } +*/ +int cms_key_agreement_info_to_der( + int version, + const SM2_KEY *temp_public_key_r, + const uint8_t *user_cert, size_t user_cert_len, + const uint8_t *user_id, size_t user_id_len, + uint8_t **out, size_t *outlen); +int cms_key_agreement_info_from_der( + int *version, + SM2_KEY *temp_public_key_r, + const uint8_t **user_cert, size_t *user_cert_len, + const uint8_t **user_id, size_t *user_id_len, + const uint8_t **in, size_t *inlen); +int cms_key_agreement_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + + +// 下面是公开API +// 公开API的设计考虑: +// 1. 不需要调用其他函数 +// 2. 在逻辑上容易理解 +// 3. 将cms,cmslen看做对象 + + +// 生成ContentInfo, type == data +int cms_set_data(uint8_t *cms, size_t *cmslen, + const uint8_t *d, size_t dlen); + +int cms_encrypt( + uint8_t *cms, size_t *cmslen, // 输出的ContentInfo (type encryptedData) + int enc_algor, const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, // 对称加密算法、密钥和IV + int content_type, const uint8_t *content, size_t content_len, // 待加密的输入数据 + const uint8_t *shared_info1, size_t shared_info1_len, // 附加信息 + const uint8_t *shared_info2, size_t shared_info2_len); + +int cms_decrypt( + const uint8_t *cms, size_t cmslen, // 输入的ContentInfo (type encryptedData) + int *enc_algor, const uint8_t *key, size_t keylen, // 解密密钥(我们不知道解密算法) + int *content_type, uint8_t *content, size_t *content_len, // 输出的解密数据类型及数据 + const uint8_t **shared_info1, size_t *shared_info1_len, // 附加信息 + const uint8_t **shared_info2, size_t *shared_info2_len); + +int cms_sign( + uint8_t *cms, size_t *cms_len, + const CMS_CERTS_AND_KEY *signers, size_t signers_cnt, // 签名者的签名私钥和证书 + int content_type, const uint8_t *content, size_t content_len, // 待签名的输入数据 + const uint8_t *crls, size_t crls_len); + +int cms_verify( + const uint8_t *cms, size_t cms_len, + const uint8_t *extra_certs, size_t extra_certs_len, + const uint8_t *extra_crls, size_t extra_crls_len, + int *content_type, const uint8_t **content, size_t *content_len, + const uint8_t **certs, size_t *certs_len, + const uint8_t **crls, size_t *crls_len, + const uint8_t **signer_infos, size_t *signer_infos_len); + +int cms_envelop( + uint8_t *cms, size_t *cms_len, + const uint8_t *rcpt_certs, size_t rcpt_certs_len, // 接收方证书,注意这个参数的类型可以容纳多个证书,但是只有在一个接受者时对调用方最方便 + int enc_algor, const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, // 对称加密算法及参数 + int content_type, const uint8_t *content, size_t content_len, // 待加密的输入数据 + const uint8_t *shared_info1, size_t shared_info1_len, // 附加输入信息 + const uint8_t *shared_info2, size_t shared_info2_len); + +int cms_deenvelop( + const uint8_t *cms, size_t cms_len, + const SM2_KEY *rcpt_key, const uint8_t *rcpt_cert, size_t rcpt_cert_len, // 接收方的解密私钥和对应的证书,注意只需要一个解密方 + int *content_type, uint8_t *content, size_t *content_len, + const uint8_t **rcpt_infos, size_t *rcpt_infos_len, // 解析得到,用于显示 + const uint8_t **shared_info1, size_t *shared_info1_len, + const uint8_t **shared_info2, size_t *shared_info2_len); + +int cms_sign_and_envelop( + uint8_t *cms, size_t *cms_len, + const CMS_CERTS_AND_KEY *signers, size_t signers_cnt, + const uint8_t *rcpt_certs, size_t rcpt_certs_len, + int enc_algor, const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen, + int content_type, const uint8_t *content, size_t content_len, + const uint8_t *signers_crls, size_t signers_crls_len, + const uint8_t *shared_info1, size_t shared_info1_len, + const uint8_t *shared_info2, size_t shared_info2_len); + +int cms_deenvelop_and_verify( + const uint8_t *cms, size_t cms_len, + const SM2_KEY *rcpt_key, const uint8_t *rcpt_cert, size_t rcpt_cert_len, + const uint8_t *extra_signer_certs, size_t extra_signer_certs_len, + const uint8_t *extra_signer_crls, size_t extra_signer_crls_len, + int *content_type, uint8_t *content, size_t *content_len, + const uint8_t **rcpt_infos, size_t *rcpt_infos_len, + const uint8_t **signer_infos, size_t *signer_infos_len, + const uint8_t **signer_certs, size_t *signer_certs_len, + const uint8_t **signer_crls, size_t *signer_crls_len, + const uint8_t **shared_info1, size_t *shared_info1_len, + const uint8_t **shared_info2, size_t *shared_info2_len); + +// 生成ContentInfo, type == keyAgreementInfo +int cms_set_key_agreement_info( + uint8_t *cms, size_t *cms_len, + const SM2_KEY *temp_public_key_r, + const uint8_t *user_cert, size_t user_cert_len, + const uint8_t *user_id, size_t user_id_len); + +#define PEM_CMS "CMS" +int cms_to_pem(const uint8_t *cms, size_t cms_len, FILE *fp); +int cms_from_pem(uint8_t *cms, size_t *cms_len, size_t maxlen, FILE *fp); + + +int cms_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *a, size_t alen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/des.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/des.h new file mode 100644 index 0000000..3170171 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/des.h @@ -0,0 +1,58 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +/* FIPS PUB 46-3 "Data Encryption Standard (DES)" */ + +#ifndef GMSSL_DES_H +#define GMSSL_DES_H + + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define DES_KEY_BITS 56 +#define DES_BLOCK_BITS 64 +#define DES_KEY_SIZE ((DES_KEY_BITS)/7) +#define DES_BLOCK_SIZE (DES_BLOCK_BITS/8) + +#define DES_RK_BITS 48 +#define DES_RK_SIZE (DES_RK_BITS/8) +#define DES_ROUNDS 16 + +#define DES_EDE_KEY_SIZE (DES_KEY_SIZE * 3) + +typedef struct { + uint64_t rk[DES_ROUNDS]; +} DES_KEY; + +void des_set_encrypt_key(DES_KEY *key, const uint8_t raw_key[DES_KEY_SIZE]); +void des_set_decrypt_key(DES_KEY *key, const uint8_t raw_key[DES_KEY_SIZE]); +void des_encrypt(DES_KEY *key, const uint8_t in[DES_BLOCK_SIZE], uint8_t out[DES_BLOCK_SIZE]); + + +typedef struct { + DES_KEY K[3]; +} DES_EDE_KEY; + +void des_ede_set_encrypt_key(DES_EDE_KEY *key, const uint8_t raw_key[DES_EDE_KEY_SIZE]); +void des_ede_set_decrypt_key(DES_EDE_KEY *key, const uint8_t raw_key[DES_EDE_KEY_SIZE]); +void des_ede_encrypt(DES_EDE_KEY *key, const uint8_t in[DES_BLOCK_SIZE], uint8_t out[DES_BLOCK_SIZE]); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/digest.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/digest.h new file mode 100644 index 0000000..4a73aee --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/digest.h @@ -0,0 +1,87 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_DIGEST_H +#define GMSSL_DIGEST_H + + +#include +#include +#include +#ifdef ENABLE_BROKEN_CRYPTO +#include +#include +#endif +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct DIGEST DIGEST; +typedef struct DIGEST_CTX DIGEST_CTX; + + +#define DIGEST_MAX_SIZE 64 +#define DIGEST_MAX_BLOCK_SIZE (1024/8) + + +struct DIGEST_CTX { + union { + SM3_CTX sm3_ctx; +#ifdef ENABLE_BROKEN_CRYPTO + MD5_CTX md5_ctx; + SHA1_CTX sha1_ctx; +#endif + SHA224_CTX sha224_ctx; + SHA256_CTX sha256_ctx; + SHA384_CTX sha384_ctx; + SHA512_CTX sha512_ctx; + } u; + const DIGEST *digest; +}; + +struct DIGEST { + int oid; + size_t digest_size; + size_t block_size; + size_t ctx_size; + int (*init)(DIGEST_CTX *ctx); + int (*update)(DIGEST_CTX *ctx, const uint8_t *data, size_t datalen); + int (*finish)(DIGEST_CTX *ctx, uint8_t *dgst); +}; + +const DIGEST *DIGEST_sm3(void); +#ifdef ENABLE_BROKEN_CRYPTO +const DIGEST *DIGEST_md5(void); +const DIGEST *DIGEST_sha1(void); +#endif +const DIGEST *DIGEST_sha224(void); +const DIGEST *DIGEST_sha256(void); +const DIGEST *DIGEST_sha384(void); +const DIGEST *DIGEST_sha512(void); +const DIGEST *DIGEST_sha512_224(void); +const DIGEST *DIGEST_sha512_256(void); + +const DIGEST *digest_from_name(const char *name); +const char *digest_name(const DIGEST *digest); +int digest_init(DIGEST_CTX *ctx, const DIGEST *algor); +int digest_update(DIGEST_CTX *ctx, const uint8_t *data, size_t datalen); +int digest_finish(DIGEST_CTX *ctx, uint8_t *dgst, size_t *dgstlen); +int digest(const DIGEST *digest, const uint8_t *data, size_t datalen, uint8_t *dgst, size_t *dgstlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/dylib.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/dylib.h new file mode 100644 index 0000000..3668017 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/dylib.h @@ -0,0 +1,54 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_DYLIB_H +#define GMSSL_DYLIB_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef WIN32 + +#include + +typedef HMODULE dylib_handle_t; + +#define dylib_load_library(so_path) LoadLibraryA(so_path) +#define dylib_get_function(handle,name) GetProcAddress(handle,name) +#define dylib_close_library(handle) +#define dylib_error_str() "" + + +#else + +#include + +typedef void *dylib_handle_t; + +#define dylib_load_library(so_path) dlopen(so_path,RTLD_LAZY) +#define dylib_get_function(handle,name) dlsym(handle,name) +#define dylib_close_library(handle) dlclose(handle) +#define dylib_error_str() dlerror() + + +#endif + + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/ec.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/ec.h new file mode 100644 index 0000000..ea97984 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/ec.h @@ -0,0 +1,64 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_EC_H +#define GMSSL_EC_H + + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +NamedCurve: + OID_sm2 + OID_prime192v1 + OID_prime256v1 + OID_secp256k1 + OID_secp384r1 + OID_secp521r1 +*/ +const char *ec_named_curve_name(int curve); +int ec_named_curve_from_name(const char *name); +int ec_named_curve_to_der(int curve, uint8_t **out, size_t *outlen); +int ec_named_curve_from_der(int *curve, const uint8_t **in, size_t *inlen); + +/* +ECPoint ::= OCTET STRING -- uncompressed point +*/ +int ec_point_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +ECPrivateKey ::= SEQUENCE { + version INTEGER, -- value MUST be (1) + privateKey OCTET STRING, -- big endian encoding of integer + parameters [0] EXPLICIT OBJECT IDENTIFIER OPTIONAL, -- namedCurve + publicKey [1] EXPLICIT BIT STRING OPTIONAL -- ECPoint +} +*/ + +enum { + EC_private_key_version = 1, +}; + +int ec_private_key_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/endian.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/endian.h new file mode 100644 index 0000000..783be6c --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/endian.h @@ -0,0 +1,78 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_ENDIAN_H +#define GMSSL_ENDIAN_H + + +/* Big Endian R/W */ + +#define GETU16(p) \ + ((uint16_t)(p)[0] << 8 | \ + (uint16_t)(p)[1]) + +#define GETU32(p) \ + ((uint32_t)(p)[0] << 24 | \ + (uint32_t)(p)[1] << 16 | \ + (uint32_t)(p)[2] << 8 | \ + (uint32_t)(p)[3]) + +#define GETU64(p) \ + ((uint64_t)(p)[0] << 56 | \ + (uint64_t)(p)[1] << 48 | \ + (uint64_t)(p)[2] << 40 | \ + (uint64_t)(p)[3] << 32 | \ + (uint64_t)(p)[4] << 24 | \ + (uint64_t)(p)[5] << 16 | \ + (uint64_t)(p)[6] << 8 | \ + (uint64_t)(p)[7]) + + +// 注意:PUTU32(buf, val++) 会出错! +#define PUTU16(p,V) \ + ((p)[0] = (uint8_t)((V) >> 8), \ + (p)[1] = (uint8_t)(V)) + +#define PUTU32(p,V) \ + ((p)[0] = (uint8_t)((V) >> 24), \ + (p)[1] = (uint8_t)((V) >> 16), \ + (p)[2] = (uint8_t)((V) >> 8), \ + (p)[3] = (uint8_t)(V)) + +#define PUTU64(p,V) \ + ((p)[0] = (uint8_t)((V) >> 56), \ + (p)[1] = (uint8_t)((V) >> 48), \ + (p)[2] = (uint8_t)((V) >> 40), \ + (p)[3] = (uint8_t)((V) >> 32), \ + (p)[4] = (uint8_t)((V) >> 24), \ + (p)[5] = (uint8_t)((V) >> 16), \ + (p)[6] = (uint8_t)((V) >> 8), \ + (p)[7] = (uint8_t)(V)) + +/* Little Endian R/W */ + +#define GETU16_LE(p) (*(const uint16_t *)(p)) +#define GETU32_LE(p) (*(const uint32_t *)(p)) +#define GETU64_LE(p) (*(const uint64_t *)(p)) + +#define PUTU16_LE(p,V) *(uint16_t *)(p) = (V) +#define PUTU32_LE(p,V) *(uint32_t *)(p) = (V) +#define PUTU64_LE(p,V) *(uint64_t *)(p) = (V) + +/* Rotate */ + +#define ROL32(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n)))) +#define ROL64(a,n) (((a)<<(n))|((a)>>(64-(n)))) + +#define ROR32(a,n) ROL32((a),32-(n)) +#define ROR64(a,n) ROL64(a,64-n) + + +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/error.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/error.h new file mode 100644 index 0000000..a891942 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/error.h @@ -0,0 +1,67 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_ERROR_H +#define GMSSL_ERROR_H + + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define GMSSL_FMT_BIN 1 +#define GMSSL_FMT_HEX 2 +#define GMSSL_FMT_DER 4 +#define GMSSL_FMT_PEM 8 + + + +#define DEBUG 1 + +#define warning_print() \ + do { if (DEBUG) fprintf(stderr, "%s:%d:%s():\n",__FILE__, __LINE__, __func__); } while (0) + +#define error_print() \ + do { if (DEBUG) fprintf(stderr, "%s:%d:%s():\n",__FILE__, __LINE__, __func__); } while (0) + +#define error_print_msg(fmt, ...) \ + do { if (DEBUG) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, __LINE__, __func__, __VA_ARGS__); } while (0) + +#define error_puts(str) \ + do { if (DEBUG) fprintf(stderr, "%s: %d: %s: %s", __FILE__, __LINE__, __func__, str); } while (0) + + +void print_der(const uint8_t *in, size_t inlen); +void print_bytes(const uint8_t *in, size_t inlen); +void print_nodes(const uint32_t *in, size_t inlen); + +#define FMT_CARRAY 0x80 + + +int format_print(FILE *fp, int format, int indent, const char *str, ...); +int format_bytes(FILE *fp, int format, int indent, const char *str, const uint8_t *data, size_t datalen); +int format_string(FILE *fp, int format, int indent, const char *str, const uint8_t *data, size_t datalen); + + + +//int tls_trace(int format, int indent, const char *str, ...); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/file.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/file.h new file mode 100644 index 0000000..ac94474 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/file.h @@ -0,0 +1,29 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_FILE_H +#define GMSSL_FILE_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +int file_size(FILE *fp, size_t *size); +int file_read_all(const char *file, uint8_t **out, size_t *outlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/gcm.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/gcm.h new file mode 100644 index 0000000..c7e7e80 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/gcm.h @@ -0,0 +1,73 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_GCM_H +#define GMSSL_GCM_H + + +#include +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +#define GCM_IV_MIN_SIZE 1 +#define GCM_IV_MAX_SIZE ((uint64_t)(1 << (64-3))) +#define GCM_IV_DEFAULT_BITS 96 +#define GCM_IV_DEFAULT_SIZE 12 + +#define GCM_MIN_AAD_SIZE 0 +#define GCM_MAX_AAD_SIZE ((uint64_t)(1 << (64-3))) + +#define GCM_MIN_PLAINTEXT_SIZE 0 +#define GCM_MAX_PLAINTEXT_SIZE ((((uint64_t)1 << 39) - 256) >> 3) + + +#define GHASH_SIZE (16) + + +#define GCM_IS_LITTLE_ENDIAN 1 + + +void ghash(const uint8_t h[16], const uint8_t *aad, size_t aadlen, + const uint8_t *c, size_t clen, uint8_t out[16]); + +typedef struct { + gf128_t H; + gf128_t X; + size_t aadlen; + size_t clen; + uint8_t block[16]; + size_t num; +} GHASH_CTX; + +void ghash_init(GHASH_CTX *ctx, const uint8_t h[16], const uint8_t *aad, size_t aadlen); +void ghash_update(GHASH_CTX *ctx, const uint8_t *c, size_t clen); +void ghash_finish(GHASH_CTX *ctx, uint8_t out[16]); + + +int gcm_encrypt(const BLOCK_CIPHER_KEY *key, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, const uint8_t *in, size_t inlen, + uint8_t *out, size_t taglen, uint8_t *tag); + +int gcm_decrypt(const BLOCK_CIPHER_KEY *key, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, const uint8_t *in, size_t inlen, + const uint8_t *tag, size_t taglen, uint8_t *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/gf128.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/gf128.h new file mode 100644 index 0000000..6c91bd9 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/gf128.h @@ -0,0 +1,53 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +/* GF(2^128) defined by f(x) = x^128 + x^7 + x^2 + x + 1 + * A + B mod f(x) = a xor b + * A * 2 mod f(x) + */ + +#ifndef GMSSL_GF128_H +#define GMSSL_GF128_H + + +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +//typedef unsigned __int128 gf128_t; + +typedef struct { + uint64_t hi; + uint64_t lo; +} gf128_t; + + +// Note: send by value is comptabile with uint128_t and sse2 +gf128_t gf128_from_hex(const char *s); +int gf128_equ_hex(gf128_t a, const char *s); +gf128_t gf128_zero(void); +gf128_t gf128_add(gf128_t a, gf128_t b); +gf128_t gf128_mul(gf128_t a, gf128_t b); +gf128_t gf128_mul2(gf128_t a); +gf128_t gf128_from_bytes(const uint8_t p[16]); +void gf128_to_bytes(gf128_t a, uint8_t p[16]); +int gf128_print(FILE *fp, int fmt ,int ind, const char *label, gf128_t a); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/hash_drbg.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/hash_drbg.h new file mode 100644 index 0000000..65fa314 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/hash_drbg.h @@ -0,0 +1,79 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +/* NIST SP800-90A Rev.1 "Recommendation for Random Number Generation + * Using Deterministic Random Bit Generators", 10.1.1 Hash_DRBG */ + +#ifndef GMSSL_HASH_DRBG_H +#define GMSSL_HASH_DRBG_H + + +#include +#include +#include + + +/* seedlen for hash_drgb, table 2 of nist sp 800-90a rev.1 */ +#define HASH_DRBG_SM3_SEED_BITS 440 /* 55 bytes */ +#define HASH_DRBG_SHA1_SEED_BITS 440 +#define HASH_DRBG_SHA224_SEED_BITS 440 +#define HASH_DRBG_SHA512_224_SEED_BITS 440 +#define HASH_DRBG_SHA256_SEED_BITS 440 +#define HASH_DRBG_SHA512_256_SEED_BITS 440 +#define HASH_DRBG_SHA384_SEED_BITS 888 /* 110 bytes */ +#define HASH_DRBG_SHA512_SEED_BITS 888 +#define HASH_DRBG_MAX_SEED_BITS 888 + +#define HASH_DRBG_SM3_SEED_SIZE (HASH_DRBG_SM3_SEED_BITS/8) +#define HASH_DRBG_SHA1_SEED_SIZE (HASH_DRBG_SHA1_SEED_BITS/8) +#define HASH_DRBG_SHA224_SEED_SIZE (HASH_DRBG_SHA224_SEED_BITS/8) +#define HASH_DRBG_SHA512_224_SEED_SIZE (HASH_DRBG_SHA512_224_SEED_BITS/8) +#define HASH_DRBG_SHA256_SEED_SIZE (HASH_DRBG_SHA256_SEED_BITS/8) +#define HASH_DRBG_SHA512_256_SEED_SIZE (HASH_DRBG_SHA512_256_SEED_BITS/8) +#define HASH_DRBG_SHA384_SEED_SIZE (HASH_DRBG_SHA384_SEED_BITS/8) +#define HASH_DRBG_SHA512_SEED_SIZE (HASH_DRBG_SHA512_SEED_BITS/8) +#define HASH_DRBG_MAX_SEED_SIZE (HASH_DRBG_MAX_SEED_BITS/8) + +#define HASH_DRBG_RESEED_INTERVAL ((uint64_t)1 << 48) + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct { + const DIGEST *digest; + uint8_t V[HASH_DRBG_MAX_SEED_SIZE]; + uint8_t C[HASH_DRBG_MAX_SEED_SIZE]; + size_t seedlen; + uint64_t reseed_counter; +} HASH_DRBG; + + +int hash_drbg_init(HASH_DRBG *drbg, + const DIGEST *digest, + const uint8_t *entropy, size_t entropy_len, + const uint8_t *nonce, size_t nonce_len, + const uint8_t *personalstr, size_t personalstr_len); + +int hash_drbg_reseed(HASH_DRBG *drbg, + const uint8_t *entropy, size_t entropy_len, + const uint8_t *additional, size_t additional_len); + +int hash_drbg_generate(HASH_DRBG *drbg, + const uint8_t *additional, size_t additional_len, + size_t outlen, uint8_t *out); + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/hex.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/hex.h new file mode 100644 index 0000000..ea50c99 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/hex.h @@ -0,0 +1,32 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_HEX_H +#define GMSSL_HEX_H + + +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +int hex_to_bytes(const char *in, size_t inlen, uint8_t *out, size_t *outlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/hkdf.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/hkdf.h new file mode 100644 index 0000000..6f5cf14 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/hkdf.h @@ -0,0 +1,45 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +// RFC 5869 + +#ifndef GMSSL_HKDF_H +#define GMSSL_HKDF_H + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +int hkdf_extract(const DIGEST *digest, const uint8_t *salt, size_t saltlen, + const uint8_t *ikm, size_t ikmlen, + uint8_t *prk, size_t *prklen); + +int hkdf_expand(const DIGEST *digest, const uint8_t *prk, size_t prklen, + const uint8_t *opt_info, size_t opt_infolen, + size_t L, uint8_t *okm); + +int sm3_hkdf_extract(const uint8_t *salt, size_t saltlen, + const uint8_t *ikm, size_t ikmlen, + uint8_t *prk, size_t *prklen); + +int sm3_hkdf_expand(const uint8_t *prk, size_t prklen, + const uint8_t *opt_info, size_t opt_infolen, + size_t L, uint8_t *okm); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/hmac.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/hmac.h new file mode 100644 index 0000000..1395668 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/hmac.h @@ -0,0 +1,47 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_HMAC_H +#define GMSSL_HMAC_H + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +#define HMAC_MAX_SIZE (DIGEST_MAX_SIZE) + + +typedef struct hmac_ctx_st { + const DIGEST *digest; + DIGEST_CTX digest_ctx; + DIGEST_CTX i_ctx; + DIGEST_CTX o_ctx; +} HMAC_CTX; + + +size_t hmac_size(const HMAC_CTX *ctx); + +int hmac_init(HMAC_CTX *ctx, const DIGEST *digest, const uint8_t *key, size_t keylen); +int hmac_update(HMAC_CTX *ctx, const uint8_t *data, size_t datalen); +int hmac_finish(HMAC_CTX *ctx, uint8_t *mac, size_t *maclen); + +int hmac(const DIGEST *md, const uint8_t *key, size_t keylen, + const uint8_t *data, size_t dlen, + uint8_t *mac, size_t *maclen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/http.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/http.h new file mode 100644 index 0000000..b27ce3e --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/http.h @@ -0,0 +1,29 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_HTTP_H +#define GMSSL_HTTP_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +int http_parse_uri(const char *uri, char host[128], int *port, char path[256]); +int http_parse_response(char *buf, size_t buflen, uint8_t **content, size_t *contentlen, size_t *left); +int http_get(const char *uri, uint8_t *buf, size_t *contentlen, size_t buflen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/md5.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/md5.h new file mode 100644 index 0000000..4e00035 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/md5.h @@ -0,0 +1,48 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_MD5_H +#define GMSSL_MD5_H + + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define MD5_IS_BIG_ENDIAN 0 + +#define MD5_DIGEST_SIZE 16 +#define MD5_BLOCK_SIZE 64 +#define MD5_STATE_WORDS (MD5_BLOCK_SIZE/sizeof(uint32_t)) + +typedef struct { + uint32_t state[MD5_STATE_WORDS]; + uint64_t nblocks; + uint8_t block[MD5_BLOCK_SIZE]; + size_t num; +} MD5_CTX; + + +void md5_init(MD5_CTX *ctx); +void md5_update(MD5_CTX *ctx, const uint8_t *data, size_t datalen); +void md5_finish(MD5_CTX *ctx, uint8_t dgst[MD5_DIGEST_SIZE]); +void md5_digest(const uint8_t *data, size_t datalen, uint8_t dgst[MD5_DIGEST_SIZE]); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/mem.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/mem.h new file mode 100644 index 0000000..ab66639 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/mem.h @@ -0,0 +1,27 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_MEM_H +#define GMSSL_MEM_H + +#include +#include // where size_t from + + +void memxor(void *r, const void *a, size_t len); +void gmssl_memxor(void *r, const void *a, const void *b, size_t len); + +int gmssl_secure_memcmp(const volatile void * volatile in_a, const volatile void * volatile in_b, size_t len); +void gmssl_secure_clear(void *ptr, size_t len); + +int mem_is_zero(const uint8_t *buf, size_t len); // FIXME: uint8_t * to void * + +#endif + diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/oid.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/oid.h new file mode 100644 index 0000000..941b845 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/oid.h @@ -0,0 +1,215 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_OID_H +#define GMSSL_OID_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + OID_undef = 0, + + // ShangMi schemes in GM/T 0006-2012 + OID_sm1, + OID_ssf33, + OID_sm4, + OID_zuc, + OID_sm2, + OID_sm2sign, + OID_sm2keyagreement, + OID_sm2encrypt, + OID_sm9, + OID_sm9sign, + OID_sm9keyagreement, + OID_sm9encrypt, + OID_sm3, + OID_sm3_keyless, + OID_hmac_sm3, + OID_sm2sign_with_sm3, + OID_rsasign_with_sm3, + OID_ec_public_key, // X9.62 ecPublicKey + OID_prime192v1, + OID_prime256v1, + OID_secp256k1, + OID_secp192k1, + OID_secp224k1, + OID_secp224r1, + OID_secp384r1, + OID_secp521r1, + + OID_at_name, + OID_at_surname, + OID_at_given_name, + OID_at_initials, + OID_at_generation_qualifier, + OID_at_common_name, + OID_at_locality_name, + OID_at_state_or_province_name, + OID_at_organization_name, + OID_at_organizational_unit_name, + OID_at_title, + OID_at_dn_qualifier, + OID_at_country_name, + OID_at_serial_number, + OID_at_pseudonym, + OID_domain_component, + OID_email_address, + + // Cert Extensions + OID_ce_authority_key_identifier, + OID_ce_subject_key_identifier, + OID_ce_key_usage, + OID_ce_certificate_policies, + OID_ce_policy_mappings, + OID_ce_subject_alt_name, + OID_ce_issuer_alt_name, + OID_ce_subject_directory_attributes, + OID_ce_basic_constraints, + OID_ce_name_constraints, + OID_ce_policy_constraints, + OID_ce_ext_key_usage, + OID_ce_crl_distribution_points, + OID_ce_inhibit_any_policy, + OID_ce_freshest_crl, + OID_netscape_cert_type, + OID_netscape_cert_comment, + OID_ct_precertificate_scts, + + OID_ad_ca_issuers, + OID_ad_ocsp, + + // CRL Extensions + //OID_ce_authority_key_identifier, + //OID_ce_issuer_alt_name, + OID_ce_crl_number, + OID_ce_delta_crl_indicator, + OID_ce_issuing_distribution_point, + //OID_ce_freshest_crl, + OID_pe_authority_info_access, + + // CRL Entry Extensions + OID_ce_crl_reasons, + OID_ce_invalidity_date, + OID_ce_certificate_issuer, + + // X.509 KeyPropuseID + OID_any_extended_key_usage, + OID_kp_server_auth, + OID_kp_client_auth, + OID_kp_code_signing, + OID_kp_email_protection, + OID_kp_time_stamping, + OID_kp_ocsp_signing, + + OID_qt_cps, + OID_qt_unotice, + + OID_md5, + OID_sha1, + OID_sha224, + OID_sha256, + OID_sha384, + OID_sha512, + OID_sha512_224, + OID_sha512_256, + + + OID_hmac_sha1, + OID_hmac_sha224, + OID_hmac_sha256, + OID_hmac_sha384, + OID_hmac_sha512, + OID_hmac_sha512_224, + OID_hmac_sha512_256, + + OID_pbkdf2, // {pkcs-5 12} + OID_pbes2, // {pkcs-5 13} + + + + OID_sm4_ecb, // 1 2 156 10197 1 104 1 + OID_sm4_cbc, // 1 2 156 10197 1 104 2 + + OID_aes, + OID_aes128_cbc, + OID_aes192_cbc, + OID_aes256_cbc, + + OID_aes128, // 没有OID + + OID_ecdsa_with_sha1, + OID_ecdsa_with_sha224, + OID_ecdsa_with_sha256, + OID_ecdsa_with_sha384, + OID_ecdsa_with_sha512, + + OID_rsasign_with_md5, + OID_rsasign_with_sha1, + OID_rsasign_with_sha224, + OID_rsasign_with_sha256, + OID_rsasign_with_sha384, + OID_rsasign_with_sha512, + + OID_rsa_encryption, + OID_rsaes_oaep, + + OID_any_policy, + + OID_cms_data, + OID_cms_signed_data, + OID_cms_enveloped_data, + OID_cms_signed_and_enveloped_data, + OID_cms_encrypted_data, + OID_cms_key_agreement_info, +}; + +// {iso(1) org(3) dod(6) internet(1) security(5) mechanisms(5) pkix(7)} +#define oid_pkix 1,3,6,1,5,5,7 + +#define oid_pe oid_pkix,1 +#define oid_qt oid_pkix,2 +#define oid_kp oid_pkix,3 +#define oid_ad oid_pkix,48 + +// {iso(1) member-body(2) us(840) rsadsi(113549)} +#define oid_rsadsi 1,2,840,113549 +#define oid_pkcs oid_rsadsi,1 +#define oid_pkcs5 oid_pkcs,5 + +// {iso(1) member-body(2) us(840) ansi-x962(10045)} +#define oid_x9_62 1,2,840,10045 + + + +#define oid_at 2,5,4 +#define oid_ce 2,5,29 + + +#define oid_sm 1,2,156,10197 +#define oid_sm_algors oid_sm,1 +#define oid_sm2_cms oid_sm,6,1,4,2 + + + + + +#define oid_cnt(nodes) (sizeof(nodes)/sizeof((nodes)[0])) + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/pbkdf2.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/pbkdf2.h new file mode 100644 index 0000000..2095a8d --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/pbkdf2.h @@ -0,0 +1,54 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_PBKDF2_H +#define GMSSL_PBKDF2_H + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +PBKDF2 Public API + + PBKDF2_MIN_ITER + PBKDF2_DEFAULT_SALT_SIZE + PBKDF2_MAX_SALT_SIZE + + pbkdf2_hmac_sm3_genkey +*/ + + +#define PBKDF2_MIN_ITER 10000 +#define PBKDF2_MAX_ITER (INT_MAX) +#define PBKDF2_MAX_SALT_SIZE 64 +#define PBKDF2_DEFAULT_SALT_SIZE 8 + + +int pbkdf2_genkey(const DIGEST *digest, + const char *pass, size_t passlen, const uint8_t *salt, size_t saltlen, size_t iter, + size_t outlen, uint8_t *out); + +int pbkdf2_hmac_sm3_genkey( + const char *pass, size_t passlen, const uint8_t *salt, size_t saltlen, size_t iter, + size_t outlen, uint8_t *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/pem.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/pem.h new file mode 100644 index 0000000..cf31eb1 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/pem.h @@ -0,0 +1,33 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_PEM_H +#define GMSSL_PEM_H + + +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +int pem_read(FILE *fp, const char *name, uint8_t *out, size_t *outlen, size_t maxlen); +int pem_write(FILE *fp, const char *name, const uint8_t *in, size_t inlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/pkcs8.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/pkcs8.h new file mode 100644 index 0000000..892a967 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/pkcs8.h @@ -0,0 +1,169 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +// RFC 5208: PKCS #8: Private-Key Information Syntax Specification version 1.2 + + +#ifndef GMSSL_PKCS8_H +#define GMSSL_PKCS8_H + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* +id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} + +PBKDF2-params ::= SEQUENCE { + salt CHOICE { + specified OCTET STRING, + otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}} + }, + iterationCount INTEGER (1..MAX), + keyLength INTEGER (1..MAX) OPTIONAL, -- 这个参数可以由函数指定 + prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1 +} + +prf must be OID_hmac_sm3 +cipher must be OID_sm4_cbc +*/ +int pbkdf2_params_to_der(const uint8_t *salt, size_t saltlen, int iter, int keylen, int prf, + uint8_t **out, size_t *outlen); +int pbkdf2_params_from_der(const uint8_t **salt, size_t *saltlen, int *iter, int *keylen, int *prf, + const uint8_t **in, size_t *inlen); +int pbkdf2_params_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int pbkdf2_algor_to_der( + const uint8_t *salt, size_t saltlen, + int iter, + int keylen, + int prf, + uint8_t **out, size_t *outlen); +int pbkdf2_algor_from_der( + const uint8_t **salt, size_t *saltlen, + int *iter, + int *keylen, + int *prf, + const uint8_t **in, size_t *inlen); +int pbkdf2_algor_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +/* +id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} + +PBES2-params ::= SEQUENCE { + keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}}, -- id-PBKDF2 + encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}} + +PBES2-Encs: + AES-CBC-Pad [RFC2898] + RC5-CBC-Pad + DES-CBC-Pad legacy + DES-EDE3-CBC-Pad legacy + RC2-CBC-Pad legacy +*/ + +int pbes2_enc_algor_to_der( + int cipher, + const uint8_t *iv, size_t ivlen, + uint8_t **out, size_t *outlen); +int pbes2_enc_algor_from_der( + int *cipher, + const uint8_t **iv, size_t *ivlen, + const uint8_t **in, size_t *inlen); +int pbes2_enc_algor_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +int pbes2_params_to_der( + const uint8_t *salt, size_t saltlen, + int iter, + int keylen, + int prf, + int cipher, + const uint8_t *iv, size_t ivlen, + uint8_t **out, size_t *outlen); +int pbes2_params_from_der( + const uint8_t **salt, size_t *saltlen, + int *iter, + int *keylen, + int *prf, + int *cipher, + const uint8_t **iv, size_t *ivlen, + const uint8_t **in, size_t *inlen); +int pbes2_params_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +int pbes2_algor_to_der( + const uint8_t *salt, size_t saltlen, + int iter, + int keylen, + int prf, + int cipher, + const uint8_t *iv, size_t ivlen, + uint8_t **out, size_t *outlen); +int pbes2_algor_from_der( + const uint8_t **salt, size_t *saltlen, + int *iter, + int *keylen, + int *prf, + int *cipher, + const uint8_t **iv, size_t *ivlen, + const uint8_t **in, size_t *inlen); +int pbes2_algor_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +from [RFC 5208] + +EncryptedPrivateKeyInfo ::= SEQUENCE { + encryptionAlgorithm EncryptionAlgorithmIdentifier, + encryptedData OCTET STRING } + +encryptionAlgorithm: + id-PBES2 + +PrivateKeyInfo ::= SEQUENCE { + version INTEGER { v1(0) }, + privateKeyAlgorithm AlgorithmIdentifier, + privateKey OCTET STRING, + attributes [0] Attributes OPTIONAL } +*/ + +int pkcs8_enced_private_key_info_to_der( + const uint8_t *salt, size_t saltlen, + int iter, + int keylen, + int prf, + int cipher, + const uint8_t *iv, size_t ivlen, + const uint8_t *enced, size_t encedlen, + uint8_t **out, size_t *outlen); +int pkcs8_enced_private_key_info_from_der( + const uint8_t **salt, size_t *saltlen, + int *iter, + int *keylen, + int *prf, + int *cipher, + const uint8_t **iv, size_t *ivlen, + const uint8_t **enced, size_t *encedlen, + const uint8_t **in, size_t *inlen); +int pkcs8_enced_private_key_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/rand.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/rand.h new file mode 100644 index 0000000..8250aca --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/rand.h @@ -0,0 +1,31 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_RAND_H +#define GMSSL_RAND_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define RAND_BYTES_MAX_SIZE (256) + +_gmssl_export int rand_bytes(uint8_t *buf, size_t buflen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/rc4.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/rc4.h new file mode 100644 index 0000000..6984c3c --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/rc4.h @@ -0,0 +1,40 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_RC4_H +#define GMSSL_RC4_H + + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define RC4_MIN_KEY_BITS 40 +#define RC4_STATE_NUM_WORDS 256 + + +typedef struct { + uint8_t d[RC4_STATE_NUM_WORDS]; +} RC4_STATE; + +void rc4_init(RC4_STATE *state, const uint8_t *key, size_t keylen); +void rc4_generate_keystream(RC4_STATE *state, size_t outlen, uint8_t *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/rdrand.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/rdrand.h new file mode 100644 index 0000000..94c2f88 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/rdrand.h @@ -0,0 +1,33 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_RDRAND_H +#define GMSSL_RDRAND_H + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +int rdrand_bytes(uint8_t *buf, size_t buflen); + +#ifdef INTEL_RDSEED +int rdseed_bytes(uint8_t *buf, size_t buflen); +#endif + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/rsa.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/rsa.h new file mode 100644 index 0000000..186be4e --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/rsa.h @@ -0,0 +1,56 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_RSA_H +#define GMSSL_RSA_H + + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* +RSAPublicKey ::= SEQUENCE { + modulus INTEGER, -- n + publicExponent INTEGER -- e +} + +RSAPrivateKey ::= SEQUENCE { + version INTEGER, -- 0 + modulus INTEGER, -- n + publicExponent INTEGER, -- e + privateExponent INTEGER, -- d + prime1 INTEGER, -- p + prime2 INTEGER, -- q + exponent1 INTEGER, -- d mod (p-1) + exponent2 INTEGER, -- d mod (q-1) + coefficient INTEGER -- q^-1 mod p +} +*/ + + +int rsa_public_key_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + + + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sdf.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sdf.h new file mode 100644 index 0000000..d2b4688 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sdf.h @@ -0,0 +1,69 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_SDF_H +#define GMSSL_SDF_H + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +/* +SDF Public API + + sdf_load_library + sdf_unload_library + + SDF_DEVICE + sdf_open_device + sdf_close_device + sdf_print_device_info + sdf_rand_bytes + sdf_load_sign_key + + SDF_KEY + sdf_sign + sdf_release_key +*/ + +typedef struct { + void *handle; + char issuer[41]; + char name[17]; + char serial[17]; +} SDF_DEVICE; + +typedef struct { + SM2_KEY public_key; + void *session; + int index; +} SDF_KEY; + + +int sdf_load_library(const char *so_path, const char *vendor); +int sdf_open_device(SDF_DEVICE *dev); +int sdf_print_device_info(FILE *fp, int fmt, int ind, const char *lable, SDF_DEVICE *dev); +int sdf_rand_bytes(SDF_DEVICE *dev, uint8_t *buf, size_t len); +int sdf_load_sign_key(SDF_DEVICE *dev, SDF_KEY *key, int index, const char *pass); +int sdf_sign(SDF_KEY *key, const uint8_t dgst[32], uint8_t *sig, size_t *siglen); +int sdf_release_key(SDF_KEY *key); +int sdf_close_device(SDF_DEVICE *dev); +void sdf_unload_library(void); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sha1.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sha1.h new file mode 100644 index 0000000..c2b4248 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sha1.h @@ -0,0 +1,45 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_SHA1_H +#define GMSSL_SHA1_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SHA1_IS_BIG_ENDIAN 1 + +#define SHA1_DIGEST_SIZE 20 +#define SHA1_BLOCK_SIZE 64 +#define SHA1_STATE_WORDS (SHA1_DIGEST_SIZE/sizeof(uint32_t)) + + +typedef struct { + uint32_t state[SHA1_STATE_WORDS]; + uint64_t nblocks; + uint8_t block[SHA1_BLOCK_SIZE]; + size_t num; +} SHA1_CTX; + +void sha1_init(SHA1_CTX *ctx); +void sha1_update(SHA1_CTX *ctx, const uint8_t *data, size_t datalen); +void sha1_finish(SHA1_CTX *ctx, uint8_t dgst[SHA1_DIGEST_SIZE]); +void sha1_digest(const uint8_t *data, size_t datalen, uint8_t dgst[SHA1_DIGEST_SIZE]); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sha2.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sha2.h new file mode 100644 index 0000000..14bb4bd --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sha2.h @@ -0,0 +1,102 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_SHA2_H +#define GMSSL_SHA2_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SHA2_IS_BIG_ENDIAN 1 + + +#define SHA224_DIGEST_SIZE 28 +#define SHA224_BLOCK_SIZE 64 +#define SHA224_STATE_WORDS 8 + +typedef struct { + uint32_t state[SHA224_STATE_WORDS]; + uint64_t nblocks; + uint8_t block[SHA224_BLOCK_SIZE]; + size_t num; +} SHA224_CTX; + +void sha224_init(SHA224_CTX *ctx); +void sha224_update(SHA224_CTX *ctx, const uint8_t* data, size_t datalen); +void sha224_finish(SHA224_CTX *ctx, uint8_t dgst[SHA224_DIGEST_SIZE]); +void sha224_digest(const uint8_t *data, size_t datalen, + uint8_t dgst[SHA224_DIGEST_SIZE]); + + +#define SHA256_DIGEST_SIZE 32 +#define SHA256_BLOCK_SIZE 64 +#define SHA256_STATE_WORDS 8 + +typedef struct { + uint32_t state[SHA256_STATE_WORDS]; + uint64_t nblocks; + uint8_t block[SHA256_BLOCK_SIZE]; + size_t num; +} SHA256_CTX; + +void sha256_init(SHA256_CTX *ctx); +void sha256_update(SHA256_CTX *ctx, const uint8_t* data, size_t datalen); +void sha256_finish(SHA256_CTX *ctx, uint8_t dgst[SHA256_DIGEST_SIZE]); +void sha256_digest(const uint8_t *data, size_t datalen, + uint8_t dgst[SHA256_DIGEST_SIZE]); + + +#define SHA384_DIGEST_SIZE 48 +#define SHA384_BLOCK_SIZE 128 +#define SHA384_STATE_WORDS 8 + +typedef struct { + uint64_t state[SHA384_STATE_WORDS]; + uint64_t nblocks; + uint8_t block[SHA384_BLOCK_SIZE]; + size_t num; +} SHA384_CTX; + +void sha384_init(SHA384_CTX *ctx); +void sha384_update(SHA384_CTX *ctx, const uint8_t* data, size_t datalen); +void sha384_finish(SHA384_CTX *ctx, uint8_t dgst[SHA384_DIGEST_SIZE]); +void sha384_digest(const uint8_t *data, size_t datalen, + uint8_t dgst[SHA384_DIGEST_SIZE]); + + +#define SHA512_DIGEST_SIZE 64 +#define SHA512_BLOCK_SIZE 128 +#define SHA512_STATE_WORDS 8 + +typedef struct { + uint64_t state[SHA512_STATE_WORDS]; + uint64_t nblocks; + uint8_t block[SHA512_BLOCK_SIZE]; + size_t num; +} SHA512_CTX; + +void sha512_init(SHA512_CTX *ctx); +void sha512_update(SHA512_CTX *ctx, const uint8_t* data, size_t datalen); +void sha512_finish(SHA512_CTX *ctx, uint8_t dgst[SHA512_DIGEST_SIZE]); +void sha512_digest(const uint8_t *data, size_t datalen, + uint8_t dgst[SHA512_DIGEST_SIZE]); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sha3.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sha3.h new file mode 100644 index 0000000..d4ed275 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sha3.h @@ -0,0 +1,92 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_SHA3_H +#define GMSSL_SHA3_H + + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SHA3_KECCAK_P_SIZE (1600/8) + +#define SHA3_224_DIGEST_SIZE (224/8) +#define SHA3_256_DIGEST_SIZE (256/8) +#define SHA3_384_DIGEST_SIZE (384/8) +#define SHA3_512_DIGEST_SIZE (512/8) + +#define SHA3_224_CAPACITY (SHA3_224_DIGEST_SIZE * 2) +#define SHA3_256_CAPACITY (SHA3_256_DIGEST_SIZE * 2) +#define SHA3_384_CAPACITY (SHA3_384_DIGEST_SIZE * 2) +#define SHA3_512_CAPACITY (SHA3_512_DIGEST_SIZE * 2) + +#define SHA3_224_BLOCK_SIZE (SHA3_KECCAK_P_SIZE - SHA3_224_CAPACITY) // 144 +#define SHA3_256_BLOCK_SIZE (SHA3_KECCAK_P_SIZE - SHA3_224_CAPACITY) // 136 +#define SHA3_384_BLOCK_SIZE (SHA3_KECCAK_P_SIZE - SHA3_224_CAPACITY) // 104 +#define SHA3_512_BLOCK_SIZE (SHA3_KECCAK_P_SIZE - SHA3_224_CAPACITY) // 72 + + +typedef struct { + uint64_t A[5][5]; + uint8_t buf[SHA3_224_BLOCK_SIZE]; + int num; +} SHA3_224_CTX; + +void sha3_224_init(SHA3_224_CTX *ctx); +void sha3_224_update(SHA3_224_CTX *ctx, const uint8_t *data, size_t datalen); +void sha3_224_finish(SHA3_224_CTX *ctx, uint8_t dgst[SHA3_224_DIGEST_SIZE]); + +typedef struct { + uint64_t A[5][5]; + uint8_t buf[SHA3_256_BLOCK_SIZE]; + int num; +} SHA3_256_CTX; + +void sha3_256_init(SHA3_256_CTX *ctx); +void sha3_256_update(SHA3_256_CTX *ctx, const uint8_t *data, size_t datalen); +void sha3_256_finish(SHA3_256_CTX *ctx, uint8_t dgst[SHA3_256_DIGEST_SIZE]); + +typedef struct { + uint64_t A[5][5]; + uint8_t buf[SHA3_384_BLOCK_SIZE]; + int num; +} SHA3_384_CTX; + +void sha3_384_init(SHA3_384_CTX *ctx); +void sha3_384_update(SHA3_384_CTX *ctx, const uint8_t *data, size_t datalen); +void sha3_384_finish(SHA3_384_CTX *ctx, uint8_t dgst[SHA3_384_DIGEST_SIZE]); + +typedef struct { + uint64_t A[5][5]; + uint8_t buf[SHA3_512_BLOCK_SIZE]; + int num; +} SHA3_512_CTX; + +void sha3_512_init(SHA3_512_CTX *ctx); +void sha3_512_update(SHA3_512_CTX *ctx, const uint8_t *data, size_t datalen); +void sha3_512_finish(SHA3_512_CTX *ctx, uint8_t dgst[SHA3_512_DIGEST_SIZE]); + +void sha3_shake128(const uint8_t *in, size_t *inlen, size_t outlen, uint8_t *out); +void sha3_shake256(const uint8_t *in, size_t *inlen, size_t outlen, uint8_t *out); +void sha3_keccak_p(uint8_t state[SHA3_KECCAK_P_SIZE]); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/skf.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/skf.h new file mode 100644 index 0000000..bfb2478 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/skf.h @@ -0,0 +1,116 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_SKF_H +#define GMSSL_SKF_H + + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* +SKF Public API + + skf_load_library + skf_unload_library + skf_list_devices + skf_print_device_info + + SKF_DEVICE + skf_open_device + skf_close_deivce + skf_set_label + skf_change_authkey + skf_list_apps + skf_create_app + skf_delete_app + skf_change_app_admin_pin + skf_change_app_user_pin + skf_unblock_user_pin + skf_list_objects + skf_import_object + skf_export_object + skf_delete_object + skf_list_containers + skf_create_container + skf_delete_container + skf_import_sign_cert + skf_export_sign_cert + skf_rand_bytes + skf_load_sign_key + + SKF_KEY + skf_sign + skf_release_key +*/ + +typedef struct { + void *handle; + char manufacturer[65]; + char issuer[65]; + char label[33]; + char serial[33]; + uint8_t hardware_version[2]; + uint8_t firmware_version[2]; +} SKF_DEVICE; + +typedef struct { + SM2_KEY public_key; + void *app_handle; + char app_name[65]; + void *container_handle; + char container_name[65]; +} SKF_KEY; + +int skf_load_library(const char *so_path, const char *vendor); +void skf_unload_library(void); + +int skf_list_devices(FILE *fp, int fmt, int ind, const char *label); +int skf_print_device_info(FILE *fp, int fmt, int ind, const char *devname); +int skf_open_device(SKF_DEVICE *dev, const char *devname, const uint8_t authkey[16]); +int skf_set_label(SKF_DEVICE *dev, const char *label); +int skf_change_authkey(SKF_DEVICE *dev, const uint8_t authkey[16]); +int skf_close_device(SKF_DEVICE *dev); + +int skf_list_apps(SKF_DEVICE *dev, int fmt, int ind, const char *label, FILE *fp); +int skf_create_app(SKF_DEVICE *dev, const char *appname, const char *admin_pin, const char *user_pin); +int skf_delete_app(SKF_DEVICE *dev, const char *appname); +int skf_change_app_admin_pin(SKF_DEVICE *dev, const char *appname, const char *oid_pin, const char *new_pin); +int skf_change_app_user_pin(SKF_DEVICE *dev, const char *appname, const char *oid_pin, const char *new_pin); +int skf_unblock_user_pin(SKF_DEVICE *dev, const char *appname, const char *admin_pin, const char *new_user_pin); + +int skf_list_objects(FILE *fp, int fmt, int ind, const char *label, SKF_DEVICE *dev, const char *appname, const char *pin); +int skf_import_object(SKF_DEVICE *dev, const char *appname, const char *pin, const char *objname, const uint8_t *data, size_t datalen); +int skf_export_object(SKF_DEVICE *dev, const char *appname, const char *pin, const char *objname, uint8_t *out, size_t *outlen); +int skf_delete_object(SKF_DEVICE *dev, const char *appname, const char *pin, const char *objname); + +int skf_list_containers(FILE *fp, int fmt, int ind, const char *label, SKF_DEVICE *dev, const char *appname, const char *pin); +int skf_create_container(SKF_DEVICE *dev, const char *appname, const char *pin, const char *container_name); +int skf_delete_container(SKF_DEVICE *dev, const char *appname, const char *pin, const char *container_name); +int skf_import_sign_cert(SKF_DEVICE *dev, const char *appname, const char *pin, const char *container_name, const uint8_t *cert, size_t certlen); +int skf_export_sign_cert(SKF_DEVICE *dev, const char *appname, const char *pin, const char *container_name, uint8_t *cert, size_t *certlen); + +int skf_rand_bytes(SKF_DEVICE *dev, uint8_t *buf, size_t len); +int skf_load_sign_key(SKF_DEVICE *dev, const char *appname, const char *pin, const char *container_name, SKF_KEY *key); +int skf_sign(SKF_KEY *key, const uint8_t dgst[32], uint8_t *sig, size_t *siglen); +int skf_release_key(SKF_KEY *key); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2.h new file mode 100644 index 0000000..6942d1a --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2.h @@ -0,0 +1,382 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_SM2_H +#define GMSSL_SM2_H + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* +SM2 Public API + + SM2_DEFAULT_ID + SM2_MAX_ID_LENGTH + SM2_MAX_SIGNATURE_SIZE + SM2_MAX_PLAINTEXT_SIZE + SM2_MAX_CIPHERTEXT_SIZE + + SM2_KEY + sm2_key_generate + sm2_private_key_info_encrypt_to_der + sm2_private_key_info_decrypt_from_der + sm2_private_key_info_encrypt_to_pem + sm2_private_key_info_decrypt_from_pem + sm2_public_key_info_to_der + sm2_public_key_info_from_der + sm2_public_key_info_to_pem + sm2_public_key_info_from_pem + + sm2_sign + sm2_verify + sm2_encrypt + sm2_decrypt + sm2_ecdh + + SM2_SIGN_CTX + sm2_sign_init + sm2_sign_update + sm2_sign_finish + sm2_verify_init + sm2_verify_update + sm2_verify_finish +*/ + +typedef uint64_t SM2_BN[8]; + +int sm2_bn_is_zero(const SM2_BN a); +int sm2_bn_is_one(const SM2_BN a); +int sm2_bn_is_odd(const SM2_BN a); +int sm2_bn_cmp(const SM2_BN a, const SM2_BN b); +int sm2_bn_from_hex(SM2_BN r, const char hex[64]); +int sm2_bn_from_asn1_integer(SM2_BN r, const uint8_t *d, size_t dlen); +int sm2_bn_equ_hex(const SM2_BN a, const char *hex); +int sm2_bn_print(FILE *fp, int fmt, int ind, const char *label, const SM2_BN a); +int sm2_bn_rshift(SM2_BN ret, const SM2_BN a, unsigned int nbits); + +void sm2_bn_to_bytes(const SM2_BN a, uint8_t out[32]); +void sm2_bn_from_bytes(SM2_BN r, const uint8_t in[32]); +void sm2_bn_to_hex(const SM2_BN a, char hex[64]); +void sm2_bn_to_bits(const SM2_BN a, char bits[256]); +void sm2_bn_set_word(SM2_BN r, uint32_t a); +void sm2_bn_add(SM2_BN r, const SM2_BN a, const SM2_BN b); +void sm2_bn_sub(SM2_BN ret, const SM2_BN a, const SM2_BN b); +int sm2_bn_rand_range(SM2_BN r, const SM2_BN range); + +#define sm2_bn_init(r) memset((r),0,sizeof(SM2_BN)) +#define sm2_bn_set_zero(r) memset((r),0,sizeof(SM2_BN)) +#define sm2_bn_set_one(r) sm2_bn_set_word((r),1) +#define sm2_bn_copy(r,a) memcpy((r),(a),sizeof(SM2_BN)) +#define sm2_bn_clean(r) memset((r),0,sizeof(SM2_BN)) + + +// GF(p) +typedef SM2_BN SM2_Fp; + +void sm2_fp_add(SM2_Fp r, const SM2_Fp a, const SM2_Fp b); +void sm2_fp_sub(SM2_Fp r, const SM2_Fp a, const SM2_Fp b); +void sm2_fp_mul(SM2_Fp r, const SM2_Fp a, const SM2_Fp b); +void sm2_fp_exp(SM2_Fp r, const SM2_Fp a, const SM2_Fp e); +void sm2_fp_dbl(SM2_Fp r, const SM2_Fp a); +void sm2_fp_tri(SM2_Fp r, const SM2_Fp a); +void sm2_fp_div2(SM2_Fp r, const SM2_Fp a); +void sm2_fp_neg(SM2_Fp r, const SM2_Fp a); +void sm2_fp_sqr(SM2_Fp r, const SM2_Fp a); +void sm2_fp_inv(SM2_Fp r, const SM2_Fp a); +int sm2_fp_rand(SM2_Fp r); + +int sm2_fp_sqrt(SM2_Fp r, const SM2_Fp a); + +#define sm2_fp_init(r) sm2_bn_init(r) +#define sm2_fp_set_zero(r) sm2_bn_set_zero(r) +#define sm2_fp_set_one(r) sm2_bn_set_one(r) +#define sm2_fp_copy(r,a) sm2_bn_copy(r,a) +#define sm2_fp_clean(r) sm2_bn_clean(r) + +// GF(n) +typedef SM2_BN SM2_Fn; + +void sm2_fn_add(SM2_Fn r, const SM2_Fn a, const SM2_Fn b); +void sm2_fn_sub(SM2_Fn r, const SM2_Fn a, const SM2_Fn b); +void sm2_fn_mul(SM2_Fn r, const SM2_Fn a, const SM2_Fn b); +void sm2_fn_mul_word(SM2_Fn r, const SM2_Fn a, uint32_t b); +void sm2_fn_exp(SM2_Fn r, const SM2_Fn a, const SM2_Fn e); +void sm2_fn_neg(SM2_Fn r, const SM2_Fn a); +void sm2_fn_sqr(SM2_Fn r, const SM2_Fn a); +void sm2_fn_inv(SM2_Fn r, const SM2_Fn a); +int sm2_fn_rand(SM2_Fn r); + +#define sm2_fn_init(r) sm2_bn_init(r) +#define sm2_fn_set_zero(r) sm2_bn_set_zero(r) +#define sm2_fn_set_one(r) sm2_bn_set_one(r) +#define sm2_fn_copy(r,a) sm2_bn_copy(r,a) +#define sm2_fn_clean(r) sm2_bn_clean(r) + + +typedef struct { + SM2_BN X; + SM2_BN Y; + SM2_BN Z; +} SM2_JACOBIAN_POINT; + +void sm2_jacobian_point_init(SM2_JACOBIAN_POINT *R); +void sm2_jacobian_point_set_xy(SM2_JACOBIAN_POINT *R, const SM2_BN x, const SM2_BN y); +void sm2_jacobian_point_get_xy(const SM2_JACOBIAN_POINT *P, SM2_BN x, SM2_BN y); +void sm2_jacobian_point_neg(SM2_JACOBIAN_POINT *R, const SM2_JACOBIAN_POINT *P); +void sm2_jacobian_point_dbl(SM2_JACOBIAN_POINT *R, const SM2_JACOBIAN_POINT *P); +void sm2_jacobian_point_add(SM2_JACOBIAN_POINT *R, const SM2_JACOBIAN_POINT *P, const SM2_JACOBIAN_POINT *Q); +void sm2_jacobian_point_sub(SM2_JACOBIAN_POINT *R, const SM2_JACOBIAN_POINT *P, const SM2_JACOBIAN_POINT *Q); +void sm2_jacobian_point_mul(SM2_JACOBIAN_POINT *R, const SM2_BN k, const SM2_JACOBIAN_POINT *P); +void sm2_jacobian_point_to_bytes(const SM2_JACOBIAN_POINT *P, uint8_t out[64]); +void sm2_jacobian_point_from_bytes(SM2_JACOBIAN_POINT *P, const uint8_t in[64]); +void sm2_jacobian_point_mul_generator(SM2_JACOBIAN_POINT *R, const SM2_BN k); +void sm2_jacobian_point_mul_sum(SM2_JACOBIAN_POINT *R, const SM2_BN t, const SM2_JACOBIAN_POINT *P, const SM2_BN s); +void sm2_jacobian_point_from_hex(SM2_JACOBIAN_POINT *P, const char hex[64 * 2]); // for testing only + +int sm2_jacobian_point_is_at_infinity(const SM2_JACOBIAN_POINT *P); +int sm2_jacobian_point_is_on_curve(const SM2_JACOBIAN_POINT *P); +int sm2_jacobian_point_equ_hex(const SM2_JACOBIAN_POINT *P, const char hex[128]); // for testing only +int sm2_jacobian_point_print(FILE *fp, int fmt, int ind, const char *label, const SM2_JACOBIAN_POINT *P); + +#define sm2_jacobian_point_set_infinity(R) sm2_jacobian_point_init(R) +#define sm2_jacobian_point_copy(R, P) memcpy((R), (P), sizeof(SM2_JACOBIAN_POINT)) + +typedef uint8_t sm2_bn_t[32]; + +typedef struct { + uint8_t x[32]; + uint8_t y[32]; +} SM2_POINT; + +#define sm2_point_init(P) memset((P),0,sizeof(SM2_POINT)) +#define sm2_point_set_infinity(P) sm2_point_init(P) +int sm2_point_from_octets(SM2_POINT *P, const uint8_t *in, size_t inlen); +void sm2_point_to_compressed_octets(const SM2_POINT *P, uint8_t out[33]); +void sm2_point_to_uncompressed_octets(const SM2_POINT *P, uint8_t out[65]); + +int sm2_point_from_x(SM2_POINT *P, const uint8_t x[32], int y); +int sm2_point_from_xy(SM2_POINT *P, const uint8_t x[32], const uint8_t y[32]); +int sm2_point_is_on_curve(const SM2_POINT *P); +int sm2_point_is_at_infinity(const SM2_POINT *P); +int sm2_point_add(SM2_POINT *R, const SM2_POINT *P, const SM2_POINT *Q); +int sm2_point_sub(SM2_POINT *R, const SM2_POINT *P, const SM2_POINT *Q); +int sm2_point_neg(SM2_POINT *R, const SM2_POINT *P); +int sm2_point_dbl(SM2_POINT *R, const SM2_POINT *P); +int sm2_point_mul(SM2_POINT *R, const uint8_t k[32], const SM2_POINT *P); +int sm2_point_mul_generator(SM2_POINT *R, const uint8_t k[32]); +int sm2_point_mul_sum(SM2_POINT *R, const uint8_t k[32], const SM2_POINT *P, const uint8_t s[32]); // R = k * P + s * G + +/* +RFC 5480 Elliptic Curve Cryptography Subject Public Key Information +ECPoint ::= OCTET STRING +*/ +#define SM2_POINT_MAX_SIZE (2 + 65) +int sm2_point_to_der(const SM2_POINT *P, uint8_t **out, size_t *outlen); +int sm2_point_from_der(SM2_POINT *P, const uint8_t **in, size_t *inlen); +int sm2_point_print(FILE *fp, int fmt, int ind, const char *label, const SM2_POINT *P); +int sm2_point_from_hash(SM2_POINT *R, const uint8_t *data, size_t datalen); + + +typedef struct { + SM2_POINT public_key; + uint8_t private_key[32]; +} SM2_KEY; + + +_gmssl_export int sm2_key_generate(SM2_KEY *key); +int sm2_key_set_private_key(SM2_KEY *key, const uint8_t private_key[32]); // key->public_key will be replaced +int sm2_key_set_public_key(SM2_KEY *key, const SM2_POINT *public_key); // key->private_key will be cleared // FIXME: support octets as input? +int sm2_key_print(FILE *fp, int fmt, int ind, const char *label, const SM2_KEY *key); + +int sm2_public_key_equ(const SM2_KEY *sm2_key, const SM2_KEY *pub_key); +//int sm2_public_key_copy(SM2_KEY *sm2_key, const SM2_KEY *pub_key); // do we need this? +int sm2_public_key_digest(const SM2_KEY *key, uint8_t dgst[32]); +int sm2_public_key_print(FILE *fp, int fmt, int ind, const char *label, const SM2_KEY *pub_key); + +/* +from RFC 5915 + +ECPrivateKey ::= SEQUENCE { + version INTEGER, -- value MUST be (1) + privateKey OCTET STRING, -- big endian encoding of integer 这里不是以INTEGER编码的,因此长度固定 + parameters [0] EXPLICIT ECParameters OPTIONAL, + -- ONLY namedCurve OID is permitted, by RFC 5480 + -- MUST always include this field, by RFC 5915 + publicKey [1] EXPLICIT BIT STRING OPTIONAL -- compressed_point + -- SHOULD always include this field, by RFC 5915 } + +ECParameters ::= CHOICE { namedCurve OBJECT IDENTIFIER } +*/ +#define SM2_PRIVATE_KEY_DEFAULT_SIZE 120 // generated +#define SM2_PRIVATE_KEY_BUF_SIZE 512 // MUST >= SM2_PRIVATE_KEY_DEFAULT_SIZE + +int sm2_private_key_to_der(const SM2_KEY *key, uint8_t **out, size_t *outlen); +int sm2_private_key_from_der(SM2_KEY *key, const uint8_t **in, size_t *inlen); +int sm2_private_key_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +int sm2_private_key_to_pem(const SM2_KEY *key, FILE *fp); +int sm2_private_key_from_pem(SM2_KEY *key, FILE *fp); + +/* +AlgorithmIdentifier ::= { + algorithm OBJECT IDENTIFIER { id-ecPublicKey }, + parameters OBJECT IDENTIFIER { id-sm2 } } +*/ +int sm2_public_key_algor_to_der(uint8_t **out, size_t *outlen); +int sm2_public_key_algor_from_der(const uint8_t **in, size_t *inlen); + +/* +SubjectPublicKeyInfo from RFC 5280 + +SubjectPublicKeyInfo ::= SEQUENCE { + algorithm AlgorithmIdentifier, + subjectPublicKey BIT STRING -- uncompressed octets of ECPoint } +*/ +_gmssl_export int sm2_public_key_info_to_der(const SM2_KEY *a, uint8_t **out, size_t *outlen); +_gmssl_export int sm2_public_key_info_from_der(SM2_KEY *a, const uint8_t **in, size_t *inlen); +_gmssl_export int sm2_public_key_info_to_pem(const SM2_KEY *a, FILE *fp); +_gmssl_export int sm2_public_key_info_from_pem(SM2_KEY *a, FILE *fp); + +/* +PKCS #8 PrivateKeyInfo from RFC 5208 + +PrivateKeyInfo ::= SEQUENCE { + version Version { v1(0) }, + privateKeyAlgorithm AlgorithmIdentifier, + privateKey OCTET STRING, -- DER-encoding of ECPrivateKey + attributes [0] IMPLICIT SET OF Attribute OPTIONAL } +*/ +enum { + PKCS8_private_key_info_version = 0, +}; + + +int sm2_private_key_info_to_der(const SM2_KEY *key, uint8_t **out, size_t *outlen); +int sm2_private_key_info_from_der(SM2_KEY *key, const uint8_t **attrs, size_t *attrslen, const uint8_t **in, size_t *inlen); +int sm2_private_key_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +int sm2_private_key_info_to_pem(const SM2_KEY *key, FILE *fp); +// FIXME: #define default buffer size for sm2_private_key_info_from_pem +int sm2_private_key_info_from_pem(SM2_KEY *key, FILE *fp); + +/* +EncryptedPrivateKeyInfo ::= SEQUENCE { + encryptionAlgorithm EncryptionAlgorithmIdentifier, -- id-PBES2 + encryptedData OCTET STRING } +*/ +_gmssl_export int sm2_private_key_info_encrypt_to_der(const SM2_KEY *key, + const char *pass, uint8_t **out, size_t *outlen); +_gmssl_export int sm2_private_key_info_decrypt_from_der(SM2_KEY *key, const uint8_t **attrs, size_t *attrs_len, + const char *pass, const uint8_t **in, size_t *inlen); +_gmssl_export int sm2_private_key_info_encrypt_to_pem(const SM2_KEY *key, const char *pass, FILE *fp); +// FIXME: #define default buffer size +_gmssl_export int sm2_private_key_info_decrypt_from_pem(SM2_KEY *key, const char *pass, FILE *fp); + + +typedef struct { + uint8_t r[32]; + uint8_t s[32]; +} SM2_SIGNATURE; + +int sm2_do_sign(const SM2_KEY *key, const uint8_t dgst[32], SM2_SIGNATURE *sig); +int sm2_do_sign_fast(const SM2_Fn d, const uint8_t dgst[32], SM2_SIGNATURE *sig); +int sm2_do_verify(const SM2_KEY *key, const uint8_t dgst[32], const SM2_SIGNATURE *sig); + + +#define SM2_MIN_SIGNATURE_SIZE 8 +#define SM2_MAX_SIGNATURE_SIZE 72 +int sm2_signature_to_der(const SM2_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int sm2_signature_from_der(SM2_SIGNATURE *sig, const uint8_t **in, size_t *inlen); +int sm2_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); +_gmssl_export int sm2_sign(const SM2_KEY *key, const uint8_t dgst[32], uint8_t *sig, size_t *siglen); +_gmssl_export int sm2_verify(const SM2_KEY *key, const uint8_t dgst[32], const uint8_t *sig, size_t siglen); + +enum { + SM2_signature_compact_size = 70, + SM2_signature_typical_size = 71, + SM2_signature_max_size = 72, +}; +int sm2_sign_fixlen(const SM2_KEY *key, const uint8_t dgst[32], size_t siglen, uint8_t *sig); + +#define SM2_DEFAULT_ID "1234567812345678" +#define SM2_DEFAULT_ID_LENGTH (sizeof(SM2_DEFAULT_ID) - 1) // LENGTH for string and SIZE for bytes +#define SM2_DEFAULT_ID_BITS (SM2_DEFAULT_ID_LENGTH * 8) +#define SM2_MAX_ID_BITS 65535 +#define SM2_MAX_ID_LENGTH (SM2_MAX_ID_BITS/8) + +int sm2_compute_z(uint8_t z[32], const SM2_POINT *pub, const char *id, size_t idlen); + + +typedef struct { + SM3_CTX sm3_ctx; + SM2_KEY key; +} SM2_SIGN_CTX; + +_gmssl_export int sm2_sign_init(SM2_SIGN_CTX *ctx, const SM2_KEY *key, const char *id, size_t idlen); +_gmssl_export int sm2_sign_update(SM2_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +_gmssl_export int sm2_sign_finish(SM2_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int sm2_sign_finish_fixlen(SM2_SIGN_CTX *ctx, size_t siglen, uint8_t *sig); + +_gmssl_export int sm2_verify_init(SM2_SIGN_CTX *ctx, const SM2_KEY *key, const char *id, size_t idlen); +_gmssl_export int sm2_verify_update(SM2_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +_gmssl_export int sm2_verify_finish(SM2_SIGN_CTX *ctx, const uint8_t *sig, size_t siglen); + +/* +SM2Cipher ::= SEQUENCE { + XCoordinate INTEGER, + YCoordinate INTEGER, + HASH OCTET STRING SIZE(32), + CipherText OCTET STRING } +*/ +#define SM2_MIN_PLAINTEXT_SIZE 1 // re-compute SM2_MIN_CIPHERTEXT_SIZE when modify +#define SM2_MAX_PLAINTEXT_SIZE 255 // re-compute SM2_MAX_CIPHERTEXT_SIZE when modify + +typedef struct { + SM2_POINT point; + uint8_t hash[32]; + uint8_t ciphertext_size; + uint8_t ciphertext[SM2_MAX_PLAINTEXT_SIZE]; +} SM2_CIPHERTEXT; + +int sm2_do_encrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, SM2_CIPHERTEXT *out); +int sm2_do_decrypt(const SM2_KEY *key, const SM2_CIPHERTEXT *in, uint8_t *out, size_t *outlen); + +#define SM2_MIN_CIPHERTEXT_SIZE 45 // depends on SM2_MIN_PLAINTEXT_SIZE +#define SM2_MAX_CIPHERTEXT_SIZE 366 // depends on SM2_MAX_PLAINTEXT_SIZE +int sm2_ciphertext_to_der(const SM2_CIPHERTEXT *c, uint8_t **out, size_t *outlen); +int sm2_ciphertext_from_der(SM2_CIPHERTEXT *c, const uint8_t **in, size_t *inlen); +int sm2_ciphertext_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *a, size_t alen); +_gmssl_export int sm2_encrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +_gmssl_export int sm2_decrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); + +enum { + SM2_ciphertext_compact_point_size = 68, + SM2_ciphertext_typical_point_size = 69, + SM2_ciphertext_max_point_size = 70, +}; +int sm2_do_encrypt_fixlen(const SM2_KEY *key, const uint8_t *in, size_t inlen, int point_size, SM2_CIPHERTEXT *out); +int sm2_encrypt_fixlen(const SM2_KEY *key, const uint8_t *in, size_t inlen, int point_size, uint8_t *out, size_t *outlen); + + +int sm2_do_ecdh(const SM2_KEY *key, const SM2_POINT *peer_public, SM2_POINT *out); +_gmssl_export int sm2_ecdh(const SM2_KEY *key, const uint8_t *peer_public, size_t peer_public_len, SM2_POINT *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_blind.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_blind.h new file mode 100644 index 0000000..9d62507 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_blind.h @@ -0,0 +1,49 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +#ifndef GMSSL_SM2_BLIND_H +#define GMSSL_SM2_BLIND_H + +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct { + SM3_CTX sm3_ctx; + SM2_KEY public_key; + uint8_t blind_factor_a[32]; + uint8_t blind_factor_b[32]; + uint8_t sig_r[32]; +} SM2_BLIND_SIGN_CTX; + + +#define SM2_BLIND_SIGN_MAX_COMMITLEN 65 + +int sm2_blind_sign_commit(SM2_Fn k, uint8_t *commit, size_t *commitlen); +int sm2_blind_sign_init(SM2_BLIND_SIGN_CTX *ctx, const SM2_KEY *public_key, const char *id, size_t idlen); +int sm2_blind_sign_update(SM2_BLIND_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sm2_blind_sign_finish(SM2_BLIND_SIGN_CTX *ctx, const uint8_t *commit, size_t commitlen, uint8_t blinded_sig_r[32]); +int sm2_blind_sign(const SM2_KEY *key, const SM2_Fn k, const uint8_t blinded_sig_r[32], uint8_t blinded_sig_s[32]); +int sm2_blind_sign_unblind(SM2_BLIND_SIGN_CTX *ctx, const uint8_t blinded_sig_s[32], uint8_t *sig, size_t *siglen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_commit.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_commit.h new file mode 100644 index 0000000..e798f7b --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_commit.h @@ -0,0 +1,40 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +#ifndef GMSSL_SM2_COMMIT_H +#define GMSSL_SM2_COMMIT_H + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +int sm2_commit_generate(const uint8_t x[32], uint8_t r[32], uint8_t commit[65], size_t *commitlen); +int sm2_commit_open(const uint8_t x[32], const uint8_t r[32], const uint8_t *commit, size_t commitlen); +int sm2_commit_vector_generate(const sm2_bn_t *x, size_t count, uint8_t r[32], uint8_t commit[65], size_t *commitlen); +int sm2_commit_vector_open(const sm2_bn_t *x, size_t count, const uint8_t r[32], const uint8_t *commit, size_t commitlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_elgamal.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_elgamal.h new file mode 100644 index 0000000..1253028 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_elgamal.h @@ -0,0 +1,67 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_SM2_ELGAMAL_H +#define GMSSL_SM2_ELGAMAL_H + + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SM2_PRE_COMPUTE_MAX_OFFSETS 6 + +typedef struct { + uint16_t offset[SM2_PRE_COMPUTE_MAX_OFFSETS]; + uint8_t offset_count; + uint8_t x_coordinate[32]; +} SM2_PRE_COMPUTE; + +int sm2_elgamal_decrypt_pre_compute(SM2_PRE_COMPUTE table[1<<16]); +int sm2_elgamal_solve_ecdlp(const SM2_PRE_COMPUTE table[1<<16], const SM2_POINT *point, uint32_t *private); + + +typedef struct { + SM2_POINT C1; + SM2_POINT C2; +} SM2_ELGAMAL_CIPHERTEXT; + +int sm2_elgamal_do_encrypt(const SM2_KEY *pub_key, uint32_t in, SM2_ELGAMAL_CIPHERTEXT *out); +int sm2_elgamal_do_decrypt(const SM2_KEY *key, const SM2_ELGAMAL_CIPHERTEXT *in, uint32_t *out); + +int sm2_elgamal_ciphertext_add(SM2_ELGAMAL_CIPHERTEXT *r, + const SM2_ELGAMAL_CIPHERTEXT *a, + const SM2_ELGAMAL_CIPHERTEXT *b, + const SM2_KEY *pub_key); +int sm2_elgamal_cipehrtext_sub(SM2_ELGAMAL_CIPHERTEXT *r, + const SM2_ELGAMAL_CIPHERTEXT *a, const SM2_ELGAMAL_CIPHERTEXT *b, + const SM2_KEY *pub_key); +int sm2_elgamal_cipehrtext_neg(SM2_ELGAMAL_CIPHERTEXT *r, + const SM2_ELGAMAL_CIPHERTEXT *a, const SM2_KEY *pub_key); +int sm2_elgamal_ciphertext_scalar_mul(SM2_ELGAMAL_CIPHERTEXT *R, + const uint8_t scalar[32], const SM2_ELGAMAL_CIPHERTEXT *A, + const SM2_KEY *pub_key); + +int sm2_elgamal_ciphertext_to_der(const SM2_ELGAMAL_CIPHERTEXT *c, uint8_t **out, size_t *outlen); +int sm2_elgamal_ciphertext_from_der(SM2_ELGAMAL_CIPHERTEXT *c, const uint8_t **in, size_t *inlen); + +int sm2_elgamal_encrypt(const SM2_KEY *pub_key, uint32_t in, uint8_t *out, size_t *outlen); +int sm2_elgamal_decrypt(SM2_KEY *key, const uint8_t *in, size_t inlen, uint32_t *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_key_share.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_key_share.h new file mode 100644 index 0000000..ca26dc7 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_key_share.h @@ -0,0 +1,45 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +// SM2 Key Shamir Secret Sharing + + +#ifndef GMSSL_SM2_KEY_SHARE_H +#define GMSSL_SM2_KEY_SHARE_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SM2_KEY_MAX_SHARES 12 // 12! = 479001600 < 2^31 = 2147483648 + + +typedef struct { + SM2_KEY key; + size_t index; + size_t total_cnt; +} SM2_KEY_SHARE; + +int sm2_key_split(const SM2_KEY *key, size_t recover_cnt, size_t total_cnt, SM2_KEY_SHARE *shares); +int sm2_key_recover(SM2_KEY *key, const SM2_KEY_SHARE *shares, size_t shares_cnt); +int sm2_key_share_encrypt_to_file(const SM2_KEY_SHARE *share, const char *pass, const char *path_prefix); +int sm2_key_share_decrypt_from_file(SM2_KEY_SHARE *share, const char *pass, const char *file); +int sm2_key_share_print(FILE *fp, int fmt, int ind, const char *label, const SM2_KEY_SHARE *share); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_recover.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_recover.h new file mode 100644 index 0000000..032a16f --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_recover.h @@ -0,0 +1,31 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_SM2_RECOVER_H +#define GMSSL_SM2_RECOVER_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int sm2_signature_to_public_key_points(const SM2_SIGNATURE *sig, const uint8_t dgst[32], + SM2_POINT points[4], size_t *points_cnt); +int sm2_signature_conjugate(const SM2_SIGNATURE *sig, SM2_SIGNATURE *new_sig); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_ring.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_ring.h new file mode 100644 index 0000000..38b2764 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_ring.h @@ -0,0 +1,63 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_SM2_RING_H +#define GMSSL_SM2_RING_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef uint8_t sm2_bn_t[32]; + +int sm2_ring_do_sign(const SM2_KEY *sign_key, const SM2_POINT *public_keys, size_t public_keys_cnt, + const uint8_t dgst[32], uint8_t r[32], sm2_bn_t *s); +int sm2_ring_do_verify(const SM2_POINT *public_keys, size_t public_keys_cnt, + const uint8_t dgst[32], const uint8_t r[32], const sm2_bn_t *s); +int sm2_ring_signature_to_der(const sm2_bn_t r, const sm2_bn_t *s, size_t s_cnt, uint8_t **out, size_t *outlen); +int sm2_ring_signature_from_der(sm2_bn_t r, sm2_bn_t *s, size_t *s_cnt, const uint8_t **in, size_t *inlen); +int sm2_ring_sign(const SM2_KEY *sign_key, const SM2_POINT *public_keys, size_t public_keys_cnt, + const uint8_t dgst[32], uint8_t *sig, size_t *siglen); +int sm2_ring_verify(const SM2_POINT *public_keys, size_t public_keys_cnt, + const uint8_t dgst[32], const uint8_t *sig, size_t siglen); + + +#define SM2_RING_SIGN_MAX_SIGNERS 32 +typedef struct { + int state; + SM3_CTX sm3_ctx; + SM2_KEY sign_key; + SM2_POINT public_keys[SM2_RING_SIGN_MAX_SIGNERS]; + size_t public_keys_count; + char *id; + size_t idlen; +} SM2_RING_SIGN_CTX; + +int sm2_ring_sign_init(SM2_RING_SIGN_CTX *ctx, const SM2_KEY *sign_key, const char *id, size_t idlen); +int sm2_ring_sign_add_signer(SM2_RING_SIGN_CTX *ctx, const SM2_KEY *public_key); +int sm2_ring_sign_update(SM2_RING_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sm2_ring_sign_finish(SM2_RING_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen); +int sm2_ring_verify_init(SM2_RING_SIGN_CTX *ctx, const char *id, size_t idlen); +int sm2_ring_verify_add_signer(SM2_RING_SIGN_CTX *ctx, const SM2_KEY *public_key); +int sm2_ring_verify_update(SM2_RING_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sm2_ring_verify_finish(SM2_RING_SIGN_CTX *ctx, uint8_t *sig, size_t siglen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3.h new file mode 100644 index 0000000..24ef1fe --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3.h @@ -0,0 +1,89 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_SM3_H +#define GMSSL_SM3_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +SM3 Public API + + SM3_DIGEST_SIZE + SM3_HMAC_SIZE + + SM3_CTX + sm3_init + sm3_update + sm3_finish + + SM3_HMAC_CTX + sm3_hmac_init + sm3_hmac_update + sm3_hmac_finish + + sm3_digest + sm3_hmac +*/ + +#define SM3_IS_BIG_ENDIAN 1 + +#define SM3_DIGEST_SIZE 32 +#define SM3_BLOCK_SIZE 64 +#define SM3_STATE_WORDS 8 +#define SM3_HMAC_SIZE (SM3_DIGEST_SIZE) + + +typedef struct { + uint32_t digest[SM3_STATE_WORDS]; + uint64_t nblocks; + uint8_t block[SM3_BLOCK_SIZE]; + size_t num; +} SM3_CTX; + +void sm3_init(SM3_CTX *ctx); +void sm3_update(SM3_CTX *ctx, const uint8_t *data, size_t datalen); +void sm3_finish(SM3_CTX *ctx, uint8_t dgst[SM3_DIGEST_SIZE]); +void sm3_digest(const uint8_t *data, size_t datalen, uint8_t dgst[SM3_DIGEST_SIZE]); + +void sm3_compress_blocks(uint32_t digest[8], const uint8_t *data, size_t blocks); + +typedef struct { + SM3_CTX sm3_ctx; + uint8_t key[SM3_BLOCK_SIZE]; +} SM3_HMAC_CTX; + +void sm3_hmac_init(SM3_HMAC_CTX *ctx, const uint8_t *key, size_t keylen); +void sm3_hmac_update(SM3_HMAC_CTX *ctx, const uint8_t *data, size_t datalen); +void sm3_hmac_finish(SM3_HMAC_CTX *ctx, uint8_t mac[SM3_HMAC_SIZE]); +void sm3_hmac(const uint8_t *key, size_t keylen, + const uint8_t *data, size_t datalen, + uint8_t mac[SM3_HMAC_SIZE]); + + +typedef struct { + SM3_CTX sm3_ctx; + size_t outlen; +} SM3_KDF_CTX; + +void sm3_kdf_init(SM3_KDF_CTX *ctx, size_t outlen); +void sm3_kdf_update(SM3_KDF_CTX *ctx, const uint8_t *data, size_t datalen); +void sm3_kdf_finish(SM3_KDF_CTX *ctx, uint8_t *out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_rng.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_rng.h new file mode 100644 index 0000000..7b63b8c --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_rng.h @@ -0,0 +1,42 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_SM3_RNG_H +#define GMSSL_SM3_RNG_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SM3_RNG_MAX_RESEED_COUNTER (1<<20) +#define SM3_RNG_MAX_RESEED_SECONDS 600 + + +typedef struct { + uint8_t V[55]; + uint8_t C[55]; + uint32_t reseed_counter; + time_t last_reseed_time; +} SM3_RNG; + +int sm3_rng_init(SM3_RNG *rng, const uint8_t *nonce, size_t nonce_len, + const uint8_t *label, size_t label_len); +int sm3_rng_reseed(SM3_RNG *rng, const uint8_t *addin, size_t addin_len); +int sm3_rng_generate(SM3_RNG *rng, const uint8_t *addin, size_t addin_len, + uint8_t *out, size_t outlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_x8_avx2.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_x8_avx2.h new file mode 100644 index 0000000..e645f6f --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_x8_avx2.h @@ -0,0 +1,33 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_SM3_X8_AVX2_H +#define GMSSL_SM3_X8_AVX2_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct { + __m256i digest[8]; +} SM3_X8_CTX; + +void sm3_x8_init(SM3_X8_CTX *ctx); +void sm3_x8_compress_blocks(__m256i digest[8], const uint8_t *data, size_t datalen); +void sm3_x8_digest(const uint8_t *data, size_t datalen, uint8_t dgst[8][32]); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4.h new file mode 100644 index 0000000..9b7fa6d --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4.h @@ -0,0 +1,142 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_SM4_H +#define GMSSL_SM4_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* +SM4 Public API + + SM4_KEY_SIZE + SM4_BLOCK_SIZE + + SM4_CBC_CTX + sm4_cbc_encrypt_init + sm4_cbc_encrypt_update + sm4_cbc_encrypt_finish + sm4_cbc_decrypt_init + sm4_cbc_decrypt_update + sm4_cbc_decrypt_finish + + SM4_CTR_CTX + sm4_ctr_encrypt_init + sm4_ctr_encrypt_update + sm4_ctr_encrypt_finish + sm4_ctr_decrypt_init + sm4_ctr_decrypt_update + sm4_ctr_decrypt_finish +*/ + +#define SM4_KEY_SIZE (16) +#define SM4_BLOCK_SIZE (16) +#define SM4_NUM_ROUNDS (32) + + +typedef struct { + uint32_t rk[SM4_NUM_ROUNDS]; +} SM4_KEY; + +void sm4_set_encrypt_key(SM4_KEY *key, const uint8_t raw_key[SM4_KEY_SIZE]); +void sm4_set_decrypt_key(SM4_KEY *key, const uint8_t raw_key[SM4_KEY_SIZE]); +void sm4_encrypt(const SM4_KEY *key, const uint8_t in[SM4_BLOCK_SIZE], uint8_t out[SM4_BLOCK_SIZE]); +#define sm4_decrypt(key,in,out) sm4_encrypt(key,in,out) + + +void sm4_cbc_encrypt(const SM4_KEY *key, const uint8_t iv[SM4_BLOCK_SIZE], + const uint8_t *in, size_t nblocks, uint8_t *out); +void sm4_cbc_decrypt(const SM4_KEY *key, const uint8_t iv[SM4_BLOCK_SIZE], + const uint8_t *in, size_t nblocks, uint8_t *out); +int sm4_cbc_padding_encrypt(const SM4_KEY *key, const uint8_t iv[SM4_BLOCK_SIZE], + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_cbc_padding_decrypt(const SM4_KEY *key, const uint8_t iv[SM4_BLOCK_SIZE], + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); + + +void sm4_ctr_encrypt(const SM4_KEY *key, uint8_t ctr[SM4_BLOCK_SIZE], + const uint8_t *in, size_t inlen, uint8_t *out); +#define sm4_ctr_decrypt(key,ctr,in,inlen,out) sm4_ctr_encrypt(key,ctr,in,inlen,out) + + +#define SM4_GCM_IV_MIN_SIZE 1 +#define SM4_GCM_IV_MAX_SIZE (((uint64_t)1 << (64-3)) - 1) // 2305843009213693951 + +#define SM4_GCM_IV_DEFAULT_BITS 96 +#define SM4_GCM_IV_DEFAULT_SIZE 12 + +//#define NIST_SP800_GCM_MAX_IV_SIZE (((uint64_t)1 << (64-3)) - 1) // 2305843009213693951 + +#define SM4_GCM_MAX_IV_SIZE 64 +#define SM4_GCM_MIN_IV_SIZE 1 +#define SM4_GCM_DEFAULT_IV_SIZE 12 + +#define SM4_GCM_MIN_AAD_SIZE 0 +#define SM4_GCM_MAX_AAD_SIZE (((uint64_t)1 << (64-3)) - 1) // 2305843009213693951 + +#define SM4_GCM_MIN_PLAINTEXT_SIZE 0 +#define SM4_GCM_MAX_PLAINTEXT_SIZE ((((uint64_t)1 << 39) - 256) >> 3) // 68719476704 + +#define SM4_GCM_MAX_TAG_SIZE 16 +#define SM4_GCM_MIN_TAG_SIZE 12 +// For certain applications (voice or video), tag may be 64 or 32 bits +// see NIST Special Publication 800-38D, Appendix C for more details + + +int sm4_gcm_encrypt(const SM4_KEY *key, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, const uint8_t *in, size_t inlen, + uint8_t *out, size_t taglen, uint8_t *tag); +int sm4_gcm_decrypt(const SM4_KEY *key, const uint8_t *iv, size_t ivlen, + const uint8_t *aad, size_t aadlen, const uint8_t *in, size_t inlen, + const uint8_t *tag, size_t taglen, uint8_t *out); + + +typedef struct { + SM4_KEY sm4_key; + uint8_t iv[SM4_BLOCK_SIZE]; + uint8_t block[SM4_BLOCK_SIZE]; + size_t block_nbytes; +} SM4_CBC_CTX; + +int sm4_cbc_encrypt_init(SM4_CBC_CTX *ctx, const uint8_t key[SM4_KEY_SIZE], const uint8_t iv[SM4_BLOCK_SIZE]); +int sm4_cbc_encrypt_update(SM4_CBC_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_cbc_encrypt_finish(SM4_CBC_CTX *ctx, uint8_t *out, size_t *outlen); + +int sm4_cbc_decrypt_init(SM4_CBC_CTX *ctx, const uint8_t key[SM4_KEY_SIZE], const uint8_t iv[SM4_BLOCK_SIZE]); +int sm4_cbc_decrypt_update(SM4_CBC_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_cbc_decrypt_finish(SM4_CBC_CTX *ctx, uint8_t *out, size_t *outlen); + + +typedef struct { + SM4_KEY sm4_key; + uint8_t ctr[SM4_BLOCK_SIZE]; + uint8_t block[SM4_BLOCK_SIZE]; + size_t block_nbytes; +} SM4_CTR_CTX; + +int sm4_ctr_encrypt_init(SM4_CTR_CTX *ctx, const uint8_t key[SM4_KEY_SIZE], const uint8_t ctr[SM4_BLOCK_SIZE]); +int sm4_ctr_encrypt_update(SM4_CTR_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm4_ctr_encrypt_finish(SM4_CTR_CTX *ctx, uint8_t *out, size_t *outlen); + +#define sm4_ctr_decrypt_init(ctx,key,ctr) sm4_ctr_encrypt_init(ctx,key,ctr) +#define sm4_ctr_decrypt_update(ctx,in,inlen,out,outlen) sm4_ctr_encrypt_update(ctx,in,inlen,out,outlen) +#define sm4_ctr_decrypt_finish(ctx,out,outlen) sm4_ctr_encrypt_finish(ctx,out,outlen) + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cbc_mac.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cbc_mac.h new file mode 100644 index 0000000..c7d7cc7 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cbc_mac.h @@ -0,0 +1,35 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_SM4_CBC_MAC_H +#define GMSSL_SM4_CBC_MAC_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct { + SM4_KEY key; + uint8_t iv[16]; + size_t ivlen; +} SM4_CBC_MAC_CTX; + +void sm4_cbc_mac_init(SM4_CBC_MAC_CTX *ctx, const uint8_t key[16]); +void sm4_cbc_mac_update(SM4_CBC_MAC_CTX *ctx, const uint8_t *data, size_t datalen); +void sm4_cbc_mac_finish(SM4_CBC_MAC_CTX *ctx, uint8_t mac[16]); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cl.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cl.h new file mode 100644 index 0000000..8df2533 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cl.h @@ -0,0 +1,55 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_SM4_CL_H +#define GMSSL_SM4_CL_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include + + +#ifdef APPLE +#include +#else +#include +#endif + + +typedef struct { + uint32_t rk[32]; + cl_context context; + cl_command_queue queue; + cl_program program; + cl_kernel kernel; + cl_mem mem_rk; + cl_mem mem_io; + size_t workgroup_size; +} SM4_CL_CTX; + + +int sm4_cl_set_encrypt_key(SM4_CL_CTX *ctx, const uint8_t key[16]); +int sm4_cl_set_decrypt_key(SM4_CL_CTX *ctx, const uint8_t key[16]); +int sm4_cl_encrypt(SM4_CL_CTX *ctx, const uint8_t *in, size_t nblocks, uint8_t *out); +void sm4_cl_cleanup(SM4_CL_CTX *ctx); + +int test_sm4_cl_encrypt(void); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_rng.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_rng.h new file mode 100644 index 0000000..d8a9fc8 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_rng.h @@ -0,0 +1,43 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#ifndef GMSSL_SM4_RNG_H +#define GMSSL_SM4_RNG_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define SM4_RNG_MAX_RESEED_COUNTER (1<<20) +#define SM4_RNG_MAX_RESEED_SECONDS 600 + +typedef struct { + uint8_t V[16]; + uint8_t K[16]; + uint32_t reseed_counter; + time_t last_reseed_time; +} SM4_RNG; + + +int sm4_rng_init(SM4_RNG *rng, const uint8_t *nonce, size_t nonce_len, + const uint8_t *label, size_t label_len); +int sm4_rng_update(SM4_RNG *rng, const uint8_t seed[32]); +int sm4_rng_reseed(SM4_RNG *rng, const uint8_t *addin, size_t addin_len); +int sm4_rng_generate(SM4_RNG *rng, const uint8_t *addin, size_t addin_len, + uint8_t *out, size_t outlen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm9.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm9.h new file mode 100644 index 0000000..c569945 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/sm9.h @@ -0,0 +1,561 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#include +#include +#include +#include +#include +#include + + +#ifndef GMSSL_SM9_H +#define GMSSL_SM9_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* +SM9 Public API + + SM9_SIGNATURE_SIZE + SM9_MAX_PLAINTEXT_SIZE + SM9_MAX_CIPHERTEXT_SIZE + + SM9_SIGN_MASTER_KEY + sm9_sign_master_key_generate + sm9_sign_master_key_extract_key + sm9_sign_master_key_info_encrypt_to_der + sm9_sign_master_key_info_decrypt_from_der + sm9_sign_master_key_info_encrypt_to_pem + sm9_sign_master_key_info_decrypt_from_pem + sm9_sign_master_public_key_to_der + sm9_sign_master_public_key_from_der + sm9_sign_master_public_key_to_pem + sm9_sign_master_public_key_from_pem + + SM9_SIGN_KEY + sm9_sign_key_info_encrypt_to_der + sm9_sign_key_info_decrypt_from_der + sm9_sign_key_info_encrypt_to_pem + sm9_sign_key_info_decrypt_from_pem + + SM9_SIGN_CTX + sm9_sign_init + sm9_sign_update + sm9_sign_finish + sm9_verify_init + sm9_verify_update + sm9_verify_finish + + SM9_ENC_MASTER_KEY + sm9_enc_master_key_generate + sm9_enc_master_key_extract_key + sm9_enc_master_key_info_encrypt_to_der + sm9_enc_master_key_info_decrypt_from_der + sm9_enc_master_key_info_encrypt_to_pem + sm9_enc_master_key_info_decrypt_from_pem + sm9_enc_master_public_key_to_der + sm9_enc_master_public_key_from_der + sm9_enc_master_public_key_to_pem + sm9_enc_master_public_key_from_pem + + SM9_ENC_KEY + sm9_enc_key_info_encrypt_to_der + sm9_enc_key_info_decrypt_from_der + sm9_enc_key_info_encrypt_to_pem + sm9_enc_key_info_decrypt_from_pem + + sm9_encrypt + sm9_decrypt +*/ + +#define SM9_HEX_SEP '\n' + +typedef uint64_t sm9_bn_t[8]; + +#define sm9_bn_init(r) sm9_bn_set_zero(r) +#define sm9_bn_clean(r) sm9_bn_set_zero(r) + +void sm9_bn_set_zero(sm9_bn_t r); +void sm9_bn_set_one(sm9_bn_t r); +int sm9_bn_is_zero(const sm9_bn_t a); +int sm9_bn_is_one(const sm9_bn_t a); +void sm9_bn_set_word(sm9_bn_t r, uint32_t a); +void sm9_bn_copy(sm9_bn_t r, const sm9_bn_t a); +int sm9_bn_rand_range(sm9_bn_t r, const sm9_bn_t range); +int sm9_bn_equ(const sm9_bn_t a, const sm9_bn_t b); +int sm9_bn_cmp(const sm9_bn_t a, const sm9_bn_t b); +void sm9_bn_add(sm9_bn_t r, const sm9_bn_t a, const sm9_bn_t b); +void sm9_bn_sub(sm9_bn_t ret, const sm9_bn_t a, const sm9_bn_t b); +void sm9_bn_to_bits(const sm9_bn_t a, char bits[256]); +void sm9_bn_to_bytes(const sm9_bn_t a, uint8_t out[32]); +void sm9_bn_from_bytes(sm9_bn_t r, const uint8_t in[32]); +void sm9_bn_to_hex(const sm9_bn_t a, char hex[64]); +int sm9_bn_from_hex(sm9_bn_t r, const char hex[64]); +int sm9_bn_print(FILE *fp, int fmt, int ind, const char *label, const sm9_bn_t a); +void sm9_print_bn(const char *prefix, const sm9_bn_t a); // 标准打印格式 + + +typedef sm9_bn_t sm9_fp_t; + +#define sm9_fp_init(r) sm9_fp_set_zero(r) +#define sm9_fp_clean(f) sm9_fp_set_zero(r) +#define sm9_fp_set_zero(r) sm9_bn_set_zero(r) +#define sm9_fp_set_one(r) sm9_bn_set_one(r) +#define sm9_fp_copy(r,a) sm9_bn_copy((r),(a)) +#define sm9_fp_rand(r) sm9_bn_rand_range((r), SM9_P) +#define sm9_fp_is_zero(a) sm9_bn_is_zero(a) +#define sm9_fp_is_one(a) sm9_bn_is_one(a) +#define sm9_fp_equ(a,b) sm9_bn_equ((a),(b)) +#define sm9_fp_to_bytes(a,buf) sm9_bn_to_bytes((a),(buf)) +#define sm9_fp_to_hex(a,s) sm9_bn_to_hex((a),(s)) +#define sm9_fp_print(fp,fmt,ind,label,a) sm9_bn_print(fp,fmt,ind,label,a) + +void sm9_fp_add(sm9_fp_t r, const sm9_fp_t a, const sm9_fp_t b); +void sm9_fp_sub(sm9_fp_t r, const sm9_fp_t a, const sm9_fp_t b); +void sm9_fp_dbl(sm9_fp_t r, const sm9_fp_t a); +void sm9_fp_tri(sm9_fp_t r, const sm9_fp_t a); +void sm9_fp_neg(sm9_fp_t r, const sm9_fp_t a); +void sm9_fp_mul(sm9_fp_t r, const sm9_fp_t a, const sm9_fp_t b); +void sm9_fp_sqr(sm9_fp_t r, const sm9_fp_t a); +void sm9_fp_pow(sm9_fp_t r, const sm9_fp_t a, const sm9_bn_t e); +void sm9_fp_inv(sm9_fp_t r, const sm9_fp_t a); +void sm9_fp_div2(sm9_fp_t r, const sm9_fp_t a); +int sm9_fp_from_bytes(sm9_fp_t r, const uint8_t buf[32]); +int sm9_fp_from_hex(sm9_fp_t r, const char hex[64]); + + +typedef sm9_bn_t sm9_fn_t; + +#define sm9_fn_init(r) sm9_fn_set_zero(r) +#define sm9_fn_clean(f) sm9_fn_set_zero(r) +#define sm9_fn_set_zero(r) sm9_bn_set_zero(r) +#define sm9_fn_set_one(r) sm9_bn_set_one(r) +#define sm9_fn_copy(r,a) sm9_bn_copy((r),(a)) +#define sm9_fn_rand(r) sm9_bn_rand_range((r), SM9_N) +#define sm9_fn_is_zero(a) sm9_bn_is_zero(a) +#define sm9_fn_is_one(a) sm9_bn_is_one(a) +#define sm9_fn_equ(a,b) sm9_bn_equ((a),(b)) +#define sm9_fn_to_bytes(a,out) sm9_bn_to_bytes((a),(out)) +#define sm9_fn_to_hex(a,s) sm9_bn_to_hex((a),(s)) +#define sm9_fn_print(fp,fmt,ind,label,a) sm9_bn_print(fp,fmt,ind,label,a) + +void sm9_fn_add(sm9_fn_t r, const sm9_fn_t a, const sm9_fn_t b); +void sm9_fn_sub(sm9_fn_t r, const sm9_fn_t a, const sm9_fn_t b); +void sm9_fn_mul(sm9_fn_t r, const sm9_fn_t a, const sm9_fn_t b); +void sm9_fn_pow(sm9_fn_t r, const sm9_fn_t a, const sm9_bn_t e); +void sm9_fn_inv(sm9_fn_t r, const sm9_fn_t a); +void sm9_fn_from_hash(sm9_fn_t h, const uint8_t Ha[40]); +int sm9_fn_from_bytes(sm9_fn_t a, const uint8_t in[32]); +int sm9_fn_from_hex(sm9_fn_t r, const char hex[64]); + + +typedef uint64_t sm9_barrett_bn_t[9]; + +int sm9_barrett_bn_cmp(const sm9_barrett_bn_t a, const sm9_barrett_bn_t b); +void sm9_barrett_bn_add(sm9_barrett_bn_t r, const sm9_barrett_bn_t a, const sm9_barrett_bn_t b); +void sm9_barrett_bn_sub(sm9_barrett_bn_t ret, const sm9_barrett_bn_t a, const sm9_barrett_bn_t b); + + +typedef sm9_fp_t sm9_fp2_t[2]; +extern const sm9_fp2_t SM9_FP2_ZERO; +extern const sm9_fp2_t SM9_FP2_ONE; +extern const sm9_fp2_t SM9_FP2_U; + +#define sm9_fp2_init(a) sm9_fp2_set_zero(a) +#define sm9_fp2_clean(a) sm9_fp2_set_zero(a) +#define sm9_fp2_set_zero(a) sm9_fp2_copy((a), SM9_FP2_ZERO) +#define sm9_fp2_set_one(a) sm9_fp2_copy((a), SM9_FP2_ONE) +#define sm9_fp2_set_u(a) sm9_fp2_copy((a), SM9_FP2_U) +#define sm9_fp2_is_zero(a) sm9_fp2_equ((a), SM9_FP2_ZERO) +#define sm9_fp2_is_one(a) sm9_fp2_equ((a), SM9_FP2_ONE) + +void sm9_fp2_set_fp(sm9_fp2_t r, const sm9_fp_t a); +void sm9_fp2_set(sm9_fp2_t r, const sm9_fp_t a0, const sm9_fp_t a1); +void sm9_fp2_copy(sm9_fp2_t r, const sm9_fp2_t a); +int sm9_fp2_rand(sm9_fp2_t r); +int sm9_fp2_equ(const sm9_fp2_t a, const sm9_fp2_t b); +void sm9_fp2_add(sm9_fp2_t r, const sm9_fp2_t a, const sm9_fp2_t b); +void sm9_fp2_dbl(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp2_tri(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp2_sub(sm9_fp2_t r, const sm9_fp2_t a, const sm9_fp2_t b); +void sm9_fp2_neg(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp2_mul(sm9_fp2_t r, const sm9_fp2_t a, const sm9_fp2_t b); +void sm9_fp2_mul_u(sm9_fp2_t r, const sm9_fp2_t a, const sm9_fp2_t b); +void sm9_fp2_mul_fp(sm9_fp2_t r, const sm9_fp2_t a, const sm9_fp_t k); +void sm9_fp2_sqr(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp2_sqr_u(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp2_inv(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp2_div(sm9_fp2_t r, const sm9_fp2_t a, const sm9_fp2_t b); +void sm9_fp2_div2(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp2_to_hex(const sm9_fp2_t a, char hex[129]); +int sm9_fp2_from_hex(sm9_fp2_t r, const char hex[129]); +int sm9_fp2_print(FILE *fp, int fmt, int ind, const char *label, const sm9_fp2_t a); + + +typedef sm9_fp2_t sm9_fp4_t[2]; +extern const sm9_fp4_t SM9_FP4_ZERO; +extern const sm9_fp4_t SM9_FP4_ONE; +extern const sm9_fp4_t SM9_FP4_U; +extern const sm9_fp4_t SM9_FP4_V; + +#define sm9_fp4_init(a) sm9_fp4_set_zero(a) +#define sm9_fp4_clean(a) sm9_fp4_set_zero(a) +#define sm9_fp4_set_zero(a) sm9_fp4_copy((a), SM9_FP4_ZERO) +#define sm9_fp4_set_one(a) sm9_fp4_copy((a), SM9_FP4_ONE) +#define sm9_fp4_is_zero(a) sm9_fp4_equ((a), SM9_FP4_ZERO) +#define sm9_fp4_is_one(a) sm9_fp4_equ((a), SM9_FP4_ONE) + +void sm9_fp4_set_u(sm9_fp4_t r); +void sm9_fp4_set_v(sm9_fp4_t r); +void sm9_fp4_set_fp(sm9_fp4_t r, const sm9_fp_t a); +void sm9_fp4_set_fp2(sm9_fp4_t r, const sm9_fp2_t a); +void sm9_fp4_set(sm9_fp4_t r, const sm9_fp2_t a0, const sm9_fp2_t a1); +void sm9_fp4_copy(sm9_fp4_t r, const sm9_fp4_t a); +int sm9_fp4_rand(sm9_fp4_t r); +int sm9_fp4_equ(const sm9_fp4_t a, const sm9_fp4_t b); +void sm9_fp4_add(sm9_fp4_t r, const sm9_fp4_t a, const sm9_fp4_t b); +void sm9_fp4_dbl(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp4_sub(sm9_fp4_t r, const sm9_fp4_t a, const sm9_fp4_t b); +void sm9_fp4_neg(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp4_mul(sm9_fp4_t r, const sm9_fp4_t a, const sm9_fp4_t b); +void sm9_fp4_mul_fp(sm9_fp4_t r, const sm9_fp4_t a, const sm9_fp_t k); +void sm9_fp4_mul_fp2(sm9_fp4_t r, const sm9_fp4_t a, const sm9_fp2_t b0); +void sm9_fp4_mul_v(sm9_fp4_t r, const sm9_fp4_t a, const sm9_fp4_t b); +void sm9_fp4_sqr(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp4_sqr_v(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp4_inv(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp4_to_bytes(const sm9_fp4_t a, uint8_t buf[128]); +int sm9_fp4_from_bytes(sm9_fp4_t r, const uint8_t buf[128]); +void sm9_fp4_to_hex(const sm9_fp4_t a, char hex[259]); +int sm9_fp4_from_hex(sm9_fp4_t r, const char hex[259]); + + +typedef sm9_fp4_t sm9_fp12_t[3]; + +#define sm9_fp12_init(r) sm9_fp12_set_zero(a) +#define sm9_fp12_clean(r) sm9_fp12_set_zero(a) + +void sm9_fp12_set_zero(sm9_fp12_t r); +void sm9_fp12_set_one(sm9_fp12_t r); +void sm9_fp12_set_u(sm9_fp12_t r); +void sm9_fp12_set_v(sm9_fp12_t r); +void sm9_fp12_set_w(sm9_fp12_t r); +void sm9_fp12_set_w_sqr(sm9_fp12_t r); +void sm9_fp12_set_fp(sm9_fp12_t r, const sm9_fp_t a); +void sm9_fp12_set_fp2(sm9_fp12_t r, const sm9_fp2_t a); +void sm9_fp12_set_fp4(sm9_fp12_t r, const sm9_fp4_t a); +void sm9_fp12_set(sm9_fp12_t r, const sm9_fp4_t a0, const sm9_fp4_t a1, const sm9_fp4_t a2); +void sm9_fp12_copy(sm9_fp12_t r, const sm9_fp12_t a); +int sm9_fp12_rand(sm9_fp12_t r); +int sm9_fp12_is_one(const sm9_fp12_t a); +int sm9_fp12_is_zero(const sm9_fp12_t a); +int sm9_fp12_equ(const sm9_fp12_t a, const sm9_fp12_t b); +void sm9_fp12_add(sm9_fp12_t r, const sm9_fp12_t a, const sm9_fp12_t b); +void sm9_fp12_dbl(sm9_fp12_t r, const sm9_fp12_t a); +void sm9_fp12_tri(sm9_fp12_t r, const sm9_fp12_t a); +void sm9_fp12_sub(sm9_fp12_t r, const sm9_fp12_t a, const sm9_fp12_t b); +void sm9_fp12_neg(sm9_fp12_t r, const sm9_fp12_t a); +void sm9_fp12_mul(sm9_fp12_t r, const sm9_fp12_t a, const sm9_fp12_t b); +void sm9_fp12_sqr(sm9_fp12_t r, const sm9_fp12_t a); +void sm9_fp12_inv(sm9_fp12_t r, const sm9_fp12_t a); +void sm9_fp12_pow(sm9_fp12_t r, const sm9_fp12_t a, const sm9_bn_t k); +void sm9_fp12_to_bytes(const sm9_fp12_t a, uint8_t buf[32 * 12]); +int sm9_fp12_from_bytes(sm9_fp12_t r, const uint8_t in[32 * 12]); +void sm9_fp12_to_hex(const sm9_fp12_t a, char hex[65 * 12]); +int sm9_fp12_from_hex(sm9_fp12_t r, const char hex[65 * 12]); // 这个明显是不对的 +void sm9_fp12_print(const char *prefix, const sm9_fp12_t a); + + +void sm9_fp2_conjugate(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp2_frobenius(sm9_fp2_t r, const sm9_fp2_t a); +void sm9_fp4_frobenius(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp4_conjugate(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp4_frobenius2(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp4_frobenius3(sm9_fp4_t r, const sm9_fp4_t a); +void sm9_fp12_frobenius(sm9_fp12_t r, const sm9_fp12_t x); +void sm9_fp12_frobenius2(sm9_fp12_t r, const sm9_fp12_t x); +void sm9_fp12_frobenius3(sm9_fp12_t r, const sm9_fp12_t x); +void sm9_fp12_frobenius6(sm9_fp12_t r, const sm9_fp12_t x); + + +typedef struct { + sm9_fp_t X; + sm9_fp_t Y; + sm9_fp_t Z; +} SM9_POINT; + +#define sm9_point_init(R) sm9_point_set_infinity(R) +#define sm9_point_clean(R) sm9_point_set_infinity(R) + +void sm9_point_set_infinity(SM9_POINT *R); +void sm9_point_copy(SM9_POINT *R, const SM9_POINT *P); +void sm9_point_get_xy(const SM9_POINT *P, sm9_fp_t x, sm9_fp_t y); +int sm9_point_is_at_infinity(const SM9_POINT *P); +int sm9_point_equ(const SM9_POINT *P, const SM9_POINT *Q); +int sm9_point_is_on_curve(const SM9_POINT *P); +void sm9_point_dbl(SM9_POINT *R, const SM9_POINT *P); +void sm9_point_add(SM9_POINT *R, const SM9_POINT *P, const SM9_POINT *Q); +void sm9_point_neg(SM9_POINT *R, const SM9_POINT *P); +void sm9_point_sub(SM9_POINT *R, const SM9_POINT *P, const SM9_POINT *Q); +void sm9_point_mul(SM9_POINT *R, const sm9_bn_t k, const SM9_POINT *P); +void sm9_point_mul_generator(SM9_POINT *R, const sm9_bn_t k); +void sm9_point_from_hex(SM9_POINT *R, const char hex[65 * 2]); +int sm9_point_to_uncompressed_octets(const SM9_POINT *P, uint8_t octets[65]); +int sm9_point_from_uncompressed_octets(SM9_POINT *P, const uint8_t octets[65]); +int sm9_point_print(FILE *fp, int fmt, int ind, const char *label, const SM9_POINT *P); + + +typedef struct { + sm9_fp2_t X; + sm9_fp2_t Y; + sm9_fp2_t Z; +} SM9_TWIST_POINT; + +#define sm9_twist_point_copy(R, P) memcpy((R), (P), sizeof(SM9_TWIST_POINT)) + +int sm9_twist_point_to_uncompressed_octets(const SM9_TWIST_POINT *P, uint8_t octets[129]); +int sm9_twist_point_from_uncompressed_octets(SM9_TWIST_POINT *P, const uint8_t octets[129]); + + +void sm9_twist_point_from_hex(SM9_TWIST_POINT *R, const char hex[65 * 4]); +int sm9_twist_point_is_at_infinity(const SM9_TWIST_POINT *P); +void sm9_twist_point_set_infinity(SM9_TWIST_POINT *R); +void sm9_twist_point_get_xy(const SM9_TWIST_POINT *P, sm9_fp2_t x, sm9_fp2_t y); + +int sm9_twist_point_equ(const SM9_TWIST_POINT *P, const SM9_TWIST_POINT *Q); +int sm9_twist_point_is_on_curve(const SM9_TWIST_POINT *P); +void sm9_twist_point_neg(SM9_TWIST_POINT *R, const SM9_TWIST_POINT *P); +void sm9_twist_point_dbl(SM9_TWIST_POINT *R, const SM9_TWIST_POINT *P); +void sm9_twist_point_add(SM9_TWIST_POINT *R, const SM9_TWIST_POINT *P, const SM9_TWIST_POINT *Q); +void sm9_twist_point_sub(SM9_TWIST_POINT *R, const SM9_TWIST_POINT *P, const SM9_TWIST_POINT *Q); +void sm9_twist_point_add_full(SM9_TWIST_POINT *R, const SM9_TWIST_POINT *P, const SM9_TWIST_POINT *Q); +void sm9_twist_point_mul(SM9_TWIST_POINT *R, const sm9_bn_t k, const SM9_TWIST_POINT *P); +void sm9_twist_point_mul_generator(SM9_TWIST_POINT *R, const sm9_bn_t k); +int sm9_twist_point_print(FILE *fp, int fmt, int ind, const char *label, const SM9_TWIST_POINT *P); + + + +void sm9_eval_g_tangent(sm9_fp12_t num, sm9_fp12_t den, const SM9_TWIST_POINT *P, const SM9_POINT *Q); +void sm9_eval_g_line(sm9_fp12_t num, sm9_fp12_t den, const SM9_TWIST_POINT *T, const SM9_TWIST_POINT *P, const SM9_POINT *Q); +void sm9_twist_point_pi1(SM9_TWIST_POINT *R, const SM9_TWIST_POINT *P); +void sm9_twist_point_pi2(SM9_TWIST_POINT *R, const SM9_TWIST_POINT *P); +void sm9_twist_point_neg_pi2(SM9_TWIST_POINT *R, const SM9_TWIST_POINT *P); +void sm9_final_exponent_hard_part(sm9_fp12_t r, const sm9_fp12_t f); +void sm9_final_exponent(sm9_fp12_t r, const sm9_fp12_t f); +void sm9_pairing(sm9_fp12_t r, const SM9_TWIST_POINT *Q, const SM9_POINT *P); + + +/* private key extract algorithms */ +#define SM9_HID_SIGN 0x01 +#define SM9_HID_EXCH 0x02 +#define SM9_HID_ENC 0x03 + +#define SM9_HASH1_PREFIX 0x01 +#define SM9_HASH2_PREFIX 0x02 + +int sm9_hash1(sm9_bn_t h1, const char *id, size_t idlen, uint8_t hid); + + +const char *sm9_oid_name(int oid); +int sm9_oid_from_name(const char *name); +int sm9_oid_to_der(int oid, uint8_t **out, size_t *outlen); +int sm9_oid_from_der(int *oid, const uint8_t **in, size_t *inlen); +int sm9_algor_to_der(int alg, int params, uint8_t **out, size_t *outlen); +int sm9_algor_from_der(int *alg, int *params, const uint8_t **in, size_t *inlen); + + +#define PEM_SM9_SIGN_MASTER_KEY "ENCRYPTED SM9 SIGN MASTER KEY" +#define PEM_SM9_SIGN_MASTER_PUBLIC_KEY "SM9 SIGN MASTER PUBLIC KEY" +#define PEM_SM9_SIGN_PRIVATE_KEY "ENCRYPTED SM9 SIGN PRIVATE KEY" +#define PEM_SM9_ENC_MASTER_KEY "ENCRYPTED SM9 ENC MASTER KEY" +#define PEM_SM9_ENC_MASTER_PUBLIC_KEY "SM9 ENC MASTER PUBLIC KEY" +#define PEM_SM9_ENC_PRIVATE_KEY "ENCRYPTED SM9 ENC PRIVATE KEY" + + +#define SM9_MAX_ID_SIZE (SM2_MAX_ID_SIZE) + +/* +SM9SignMasterKey ::= SEQUENCE { + ks INTEGER, + Ppubs BIT STRING -- uncompressed octets of twisted point } + +SM9SignMasterPublicKey ::= SEQUENCE { + Ppubs BIT STRING -- uncompressed octets of twisted point } + +SM9SignPrivateKey ::= SEQUENCE { + ds BIT STRING, -- uncompressed octets of ECPoint + Ppubs BIT STRING -- uncompressed octets of twisted point } +*/ +typedef struct { + SM9_TWIST_POINT Ppubs; // Ppubs = ks * P2 + sm9_fn_t ks; +} SM9_SIGN_MASTER_KEY; + +typedef struct { + SM9_TWIST_POINT Ppubs; + SM9_POINT ds; +} SM9_SIGN_KEY; + +int sm9_sign_master_key_generate(SM9_SIGN_MASTER_KEY *master); +int sm9_sign_master_key_extract_key(SM9_SIGN_MASTER_KEY *master, const char *id, size_t idlen, SM9_SIGN_KEY *key); + +// algorthm,parameters = sm9,sm9sign +#define SM9_SIGN_MASTER_KEY_MAX_SIZE 171 +int sm9_sign_master_key_to_der(const SM9_SIGN_MASTER_KEY *msk, uint8_t **out, size_t *outlen); +int sm9_sign_master_key_from_der(SM9_SIGN_MASTER_KEY *msk, const uint8_t **in, size_t *inlen); +int sm9_sign_master_key_info_encrypt_to_der(const SM9_SIGN_MASTER_KEY *msk, const char *pass, uint8_t **out, size_t *outlen); +int sm9_sign_master_key_info_decrypt_from_der(SM9_SIGN_MASTER_KEY *msk, const char *pass, const uint8_t **in, size_t *inlen); +int sm9_sign_master_key_info_encrypt_to_pem(const SM9_SIGN_MASTER_KEY *msk, const char *pass, FILE *fp); +int sm9_sign_master_key_info_decrypt_from_pem(SM9_SIGN_MASTER_KEY *msk, const char *pass, FILE *fp); +int sm9_sign_master_key_print(FILE *fp, int fmt, int ind, const char *label, const SM9_SIGN_MASTER_KEY *msk); + +#define SM9_SIGN_MASTER_PUBLIC_KEY_SIZE 136 +int sm9_sign_master_public_key_to_der(const SM9_SIGN_MASTER_KEY *mpk, uint8_t **out, size_t *outlen); +int sm9_sign_master_public_key_from_der(SM9_SIGN_MASTER_KEY *mpk, const uint8_t **in, size_t *inlen); +int sm9_sign_master_public_key_to_pem(const SM9_SIGN_MASTER_KEY *mpk, FILE *fp); +int sm9_sign_master_public_key_from_pem(SM9_SIGN_MASTER_KEY *mpk, FILE *fp); +int sm9_sign_master_public_key_print(FILE *fp, int fmt, int ind, const char *label, const SM9_SIGN_MASTER_KEY *mpk); + +// algorithm,parameters = sm9sign, +#define SM9_SIGN_KEY_SIZE 204 +int sm9_sign_key_to_der(const SM9_SIGN_KEY *key, uint8_t **out, size_t *outlen); +int sm9_sign_key_from_der(SM9_SIGN_KEY *key, const uint8_t **in, size_t *inlen); +int sm9_sign_key_info_encrypt_to_der(const SM9_SIGN_KEY *key, const char *pass, uint8_t **out, size_t *outlen); +int sm9_sign_key_info_decrypt_from_der(SM9_SIGN_KEY *key, const char *pass, const uint8_t **in, size_t *inlen); +int sm9_sign_key_info_encrypt_to_pem(const SM9_SIGN_KEY *key, const char *pass, FILE *fp); +int sm9_sign_key_info_decrypt_from_pem(SM9_SIGN_KEY *key, const char *pass, FILE *fp); +int sm9_sign_key_print(FILE *fp, int fmt, int ind, const char *label, const SM9_SIGN_KEY *key); + +/* +from GM/T 0080-2020 SM9 Cryptographic Alagorithm Application Specification +SM9Signature ::= SEQUENCE { + h OCTET STRING, + S BIT STRING -- uncompressed octets of ECPoint } +*/ +typedef struct { + sm9_fn_t h; + SM9_POINT S; +} SM9_SIGNATURE; + +int sm9_do_sign(const SM9_SIGN_KEY *key, const SM3_CTX *sm3_ctx, SM9_SIGNATURE *sig); +int sm9_do_verify(const SM9_SIGN_MASTER_KEY *mpk, const char *id, size_t idlen, const SM3_CTX *sm3_ctx, const SM9_SIGNATURE *sig); + +#define SM9_SIGNATURE_SIZE 104 +int sm9_signature_to_der(const SM9_SIGNATURE *sig, uint8_t **out, size_t *outlen); +int sm9_signature_from_der(SM9_SIGNATURE *sig, const uint8_t **in, size_t *inlen); +int sm9_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen); + +typedef struct { + SM3_CTX sm3_ctx; +} SM9_SIGN_CTX; + +int sm9_sign_init(SM9_SIGN_CTX *ctx); +int sm9_sign_update(SM9_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sm9_sign_finish(SM9_SIGN_CTX *ctx, const SM9_SIGN_KEY *key, uint8_t *sig, size_t *siglen); +int sm9_verify_init(SM9_SIGN_CTX *ctx); +int sm9_verify_update(SM9_SIGN_CTX *ctx, const uint8_t *data, size_t datalen); +int sm9_verify_finish(SM9_SIGN_CTX *ctx, const uint8_t *sig, size_t siglen, + const SM9_SIGN_MASTER_KEY *mpk, const char *id, size_t idlen); + + +/* +SM9EncMasterKey ::= SEQUENCE { + de INTEGER, + Ppube BIT STRING -- uncompressed octets of ECPoint } + +SM9EncMasterPublicKey ::= SEQUENCE { + Ppube BIT STRING -- uncompressed octets of ECPoint } + +SM9EncPrivateKey ::= SEQUENCE { + de BIT STRING, -- uncompressed octets of twisted point + Ppube BIT STRING -- uncompressed octets of ECPoint } +*/ + +typedef struct { + SM9_POINT Ppube; // Ppube = ke * P1 + sm9_fn_t ke; +} SM9_ENC_MASTER_KEY; + +typedef struct { + SM9_POINT Ppube; + SM9_TWIST_POINT de; +} SM9_ENC_KEY; + +int sm9_enc_master_key_generate(SM9_ENC_MASTER_KEY *master); +int sm9_enc_master_key_extract_key(SM9_ENC_MASTER_KEY *master, const char *id, size_t idlen, SM9_ENC_KEY *key); + +// algorithm,parameters = sm9,sm9encrypt +#define SM9_ENC_MASTER_KEY_MAX_SIZE 105 +int sm9_enc_master_key_to_der(const SM9_ENC_MASTER_KEY *msk, uint8_t **out, size_t *outlen); +int sm9_enc_master_key_from_der(SM9_ENC_MASTER_KEY *msk, const uint8_t **in, size_t *inlen); +int sm9_enc_master_key_info_encrypt_to_der(const SM9_ENC_MASTER_KEY *msk, const char *pass, uint8_t **out, size_t *outlen); +int sm9_enc_master_key_info_decrypt_from_der(SM9_ENC_MASTER_KEY *msk, const char *pass, const uint8_t **in, size_t *inlen); +int sm9_enc_master_key_info_encrypt_to_pem(const SM9_ENC_MASTER_KEY *msk, const char *pass, FILE *fp); +int sm9_enc_master_key_info_decrypt_from_pem(SM9_ENC_MASTER_KEY *msk, const char *pass, FILE *fp); +int sm9_enc_master_key_print(FILE *fp, int fmt, int ind, const char *label, const SM9_ENC_MASTER_KEY *msk); + +#define SM9_ENC_MASTER_PUBLIC_KEY_SIZE 70 +int sm9_enc_master_public_key_to_der(const SM9_ENC_MASTER_KEY *mpk, uint8_t **out, size_t *outlen); +int sm9_enc_master_public_key_from_der(SM9_ENC_MASTER_KEY *mpk, const uint8_t **in, size_t *inlen); +int sm9_enc_master_public_key_to_pem(const SM9_ENC_MASTER_KEY *mpk, FILE *fp); +int sm9_enc_master_public_key_from_pem(SM9_ENC_MASTER_KEY *mpk, FILE *fp); +int sm9_enc_master_public_key_print(FILE *fp, int fmt, int ind, const char *label, const SM9_ENC_MASTER_KEY *mpk); + +// algorithm,parameters = sm9encrypt, +#define SM9_ENC_KEY_SIZE 204 +int sm9_enc_key_to_der(const SM9_ENC_KEY *key, uint8_t **out, size_t *outlen); +int sm9_enc_key_from_der(SM9_ENC_KEY *key, const uint8_t **in, size_t *inlen); +int sm9_enc_key_info_encrypt_to_der(const SM9_ENC_KEY *key, const char *pass, uint8_t **out, size_t *outlen); +int sm9_enc_key_info_decrypt_from_der(SM9_ENC_KEY *key, const char *pass, const uint8_t **in, size_t *inlen); +int sm9_enc_key_info_encrypt_to_pem(const SM9_ENC_KEY *key, const char *pass, FILE *fp); +int sm9_enc_key_info_decrypt_from_pem(SM9_ENC_KEY *key, const char *pass, FILE *fp); +int sm9_enc_key_print(FILE *fp, int fmt, int ind, const char *label, const SM9_ENC_KEY *key); + +#define SM9_MAX_PRIVATE_KEY_SIZE (SM9_SIGN_KEY_SIZE) // MAX(SIGN_MASTER_KEY, SIGN_KEY, ENC_MASTER_KEY, ENC_KEY) +#define SM9_MAX_PRIVATE_KEY_INFO_SIZE 512 +#define SM9_MAX_ENCED_PRIVATE_KEY_INFO_SIZE 1024 + +/* +from GM/T 0080-2020 SM9 Cryptographic Alagorithm Application Specification +SM9Cipher ::= SEQUENCE { + EnType INTEGER, -- 0 for XOR + C1 BIT STRING, -- uncompressed octets of ECPoint + C3 OCTET STRING, -- 32 bytes HMAC-SM3 tag + CipherText OCTET STRING } +*/ + +int sm9_kem_encrypt(const SM9_ENC_MASTER_KEY *mpk, const char *id, size_t idlen, size_t klen, uint8_t *kbuf, SM9_POINT *C); +int sm9_kem_decrypt(const SM9_ENC_KEY *key, const char *id, size_t idlen, const SM9_POINT *C, size_t klen, uint8_t *kbuf); +int sm9_do_encrypt(const SM9_ENC_MASTER_KEY *mpk, const char *id, size_t idlen, + const uint8_t *in, size_t inlen, SM9_POINT *C1, uint8_t *c2, uint8_t c3[SM3_HMAC_SIZE]); +int sm9_do_decrypt(const SM9_ENC_KEY *key, const char *id, size_t idlen, + const SM9_POINT *C1, const uint8_t *c2, size_t c2len, const uint8_t c3[SM3_HMAC_SIZE], uint8_t *out); + +#define SM9_MAX_PLAINTEXT_SIZE 255 +#define SM9_MAX_CIPHERTEXT_SIZE 367 // calculated in test_sm9_ciphertext() +int sm9_ciphertext_to_der(const SM9_POINT *C1, const uint8_t *c2, size_t c2len, + const uint8_t c3[SM3_HMAC_SIZE], uint8_t **out, size_t *outlen); +int sm9_ciphertext_from_der(SM9_POINT *C1, const uint8_t **c2, size_t *c2len, + const uint8_t **c3, const uint8_t **in, size_t *inlen); +int sm9_ciphertext_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *a, size_t alen); +int sm9_encrypt(const SM9_ENC_MASTER_KEY *mpk, const char *id, size_t idlen, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int sm9_decrypt(const SM9_ENC_KEY *key, const char *id, size_t idlen, + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/socket.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/socket.h new file mode 100644 index 0000000..1883344 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/socket.h @@ -0,0 +1,73 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_SOCKET_H +#define GMSSL_SOCKET_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + + +#ifdef WIN32 +#pragma comment (lib, "Ws2_32.lib") +#pragma comment (lib, "Mswsock.lib") +#pragma comment (lib, "AdvApi32.lib") + +#include + +typedef SOCKET tls_socket_t; +typedef int tls_ret_t; +typedef int tls_socklen_t; + + +#define tls_socket_send(sock,buf,len,flags) send(sock,buf,(int)(len),flags) +#define tls_socket_recv(sock,buf,len,flags) recv(sock,buf,(int)(len),flags) +#define tls_socket_close(sock) closesocket(sock) + + +#else + +#include +#include +#include +#include +#include +#include +#include + +typedef int tls_socket_t; +typedef ssize_t tls_ret_t; +typedef socklen_t tls_socklen_t; + + +#define tls_socket_send(sock,buf,len,flags) send(sock,buf,len,flags) +#define tls_socket_recv(sock,buf,len,flags) recv(sock,buf,len,flags) +#define tls_socket_close(sock) close(sock) + +#endif + +int tls_socket_lib_init(void); +int tls_socket_lib_cleanup(void); +int tls_socket_create(tls_socket_t *sock, int af, int type, int protocl); +int tls_socket_connect(tls_socket_t sock, const struct sockaddr_in *addr); +int tls_socket_bind(tls_socket_t sock, const struct sockaddr_in *addr); +int tls_socket_listen(tls_socket_t sock, int backlog); +int tls_socket_accept(tls_socket_t sock, struct sockaddr_in *addr, tls_socket_t *conn_sock); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/tls.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/tls.h new file mode 100644 index 0000000..093a43d --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/tls.h @@ -0,0 +1,875 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_TLS_H +#define GMSSL_TLS_H + + +#include +#include +#include +#include +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* +TLS Public API + + TLS_PROTOCOL + TLS_protocol_tlcp + TLS_protocol_tls12 + TLS_protocol_tls13 + + TLS_CIPHER_SUITE + TLS_cipher_ecc_sm4_cbc_sm3 + TLS_cipher_ecc_sm4_gcm_sm3 + TLS_cipher_ecdhe_sm4_cbc_sm3 + TLS_cipher_ecdhe_sm4_gcm_sm3 + TLS_cipher_sm4_gcm_sm3 + + TLS_CTX + tls_ctx_init + tls_ctx_set_cipher_suites + tls_ctx_set_ca_certificates + tls_ctx_set_certificate_and_key + tls_ctx_set_tlcp_server_certificate_and_keys + tls_ctx_cleanup + + TLS_CONNECT + tls_init + tls_set_socket + tls_do_handshake + tls_send + tls_recv + tls_shutdown + tls_cleanup +*/ + +typedef uint32_t uint24_t; + +#define tls_uint8_size() 1 +#define tls_uint16_size() 2 +#define tls_uint24_size() 3 + +void tls_uint8_to_bytes(uint8_t a, uint8_t **out, size_t *outlen); +void tls_uint16_to_bytes(uint16_t a, uint8_t **out, size_t *outlen); +void tls_uint24_to_bytes(uint24_t a, uint8_t **out, size_t *outlen); +void tls_uint32_to_bytes(uint32_t a, uint8_t **out, size_t *outlen); +void tls_array_to_bytes(const uint8_t *data, size_t len, uint8_t **out, size_t *outlen); +void tls_uint8array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen); +void tls_uint16array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen); +void tls_uint24array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen); +int tls_uint8_from_bytes(uint8_t *a, const uint8_t **in, size_t *inlen); +int tls_uint16_from_bytes(uint16_t *a, const uint8_t **in, size_t *inlen); +int tls_uint24_from_bytes(uint24_t *a, const uint8_t **in, size_t *inlen); +int tls_uint32_from_bytes(uint32_t *a, const uint8_t **in, size_t *inlen); +int tls_array_from_bytes(const uint8_t **data, size_t datalen, const uint8_t **in, size_t *inlen); +int tls_uint8array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen); +int tls_uint16array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen); +int tls_uint24array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen); +int tls_length_is_zero(size_t len); + + +typedef enum { + TLS_protocol_tlcp = 0x0101, + TLS_protocol_ssl2 = 0x0200, + TLS_protocol_ssl3 = 0x0300, + TLS_protocol_tls1 = 0x0301, + TLS_protocol_tls11 = 0x0302, + TLS_protocol_tls12 = 0x0303, + TLS_protocol_tls13 = 0x0304, + TLS_protocol_dtls1 = 0xfeff, // {254, 255} + TLS_protocol_dtls12 = 0xfefd, // {254, 253} +} TLS_PROTOCOL; + +const char *tls_protocol_name(int proto); + + +typedef enum { + TLS_cipher_null_with_null_null = 0x0000, + + // TLS 1.3, RFC 8998 + TLS_cipher_sm4_gcm_sm3 = 0x00c6, + TLS_cipher_sm4_ccm_sm3 = 0x00c7, + + // TLCP, GB/T 38636-2020, GM/T 0024-2012 + TLS_cipher_ecdhe_sm4_cbc_sm3 = 0xe011, // 可以让TLSv1.2使用这个 + TLS_cipher_ecdhe_sm4_gcm_sm3 = 0xe051, + TLS_cipher_ecc_sm4_cbc_sm3 = 0xe013, + TLS_cipher_ecc_sm4_gcm_sm3 = 0xe053, + TLS_cipher_ibsdh_sm4_cbc_sm3 = 0xe015, + TLS_cipher_ibsdh_sm4_gcm_sm3 = 0xe055, + TLS_cipher_ibc_sm4_cbc_sm3 = 0xe017, + TLS_cipher_ibc_sm4_gcm_sm3 = 0xe057, + TLS_cipher_rsa_sm4_cbc_sm3 = 0xe019, + TLS_cipher_rsa_sm4_gcm_sm3 = 0xe059, + TLS_cipher_rsa_sm4_cbc_sha256 = 0xe01c, + TLS_cipher_rsa_sm4_gcm_sha256 = 0xe05a, + + // TLS 1.3 RFC 8446 + TLS_cipher_aes_128_gcm_sha256 = 0x1301, // Mandatory-to-implement + TLS_cipher_aes_256_gcm_sha384 = 0x1302, // SHOULD implement + TLS_cipher_chacha20_poly1305_sha256 = 0x1303, // SHOULD implement + TLS_cipher_aes_128_ccm_sha256 = 0x1304, + TLS_cipher_aes_128_ccm_8_sha256 = 0x1305, + + TLS_cipher_empty_renegotiation_info_scsv = 0x00ff, +} TLS_CIPHER_SUITE; + +const char *tls_cipher_suite_name(int cipher); +int tls_cipher_suites_select(const uint8_t *client_ciphers, size_t client_ciphers_len, + const int *server_ciphers, size_t server_ciphers_cnt, int *selected_cipher); +int tls_cipher_suite_in_list(int cipher, const int *list, size_t list_count); + + +typedef enum { + TLS_compression_null = 0, + TLS_compression_default = 1, +} TLS_COMPRESSION_METHOD; + +const char *tls_compression_method_name(int meth); + + +typedef enum { + TLS_record_invalid = 0, // TLS 1.3 + TLS_record_change_cipher_spec = 20, // 0x14 + TLS_record_alert = 21, // 0x15 + TLS_record_handshake = 22, // 0x16 + TLS_record_application_data = 23, // 0x17 + TLS_record_heartbeat = 24, // 0x18 + TLS_record_tls12_cid = 25, // 0x19 +} TLS_RECORD_TYPE; + +const char *tls_record_type_name(int type); + + +typedef enum { + TLS_handshake_hello_request = 0, + TLS_handshake_client_hello = 1, + TLS_handshake_server_hello = 2, + TLS_handshake_hello_verify_request = 3, + TLS_handshake_new_session_ticket = 4, + TLS_handshake_end_of_early_data = 5, + TLS_handshake_hello_retry_request = 6, + TLS_handshake_encrypted_extensions = 8, + TLS_handshake_certificate = 11, + TLS_handshake_server_key_exchange = 12, + TLS_handshake_certificate_request = 13, + TLS_handshake_server_hello_done = 14, + TLS_handshake_certificate_verify = 15, + TLS_handshake_client_key_exchange = 16, + TLS_handshake_finished = 20, + TLS_handshake_certificate_url = 21, + TLS_handshake_certificate_status = 22, + TLS_handshake_supplemental_data = 23, + TLS_handshake_key_update = 24, + TLS_handshake_compressed_certificate = 25, + TLS_handshake_ekt_key = 26, + TLS_handshake_message_hash = 254, +} TLS_HANDSHAKE_TYPE; + +const char *tls_handshake_type_name(int type); + + +typedef enum { + TLS_cert_type_rsa_sign = 1, + TLS_cert_type_dss_sign = 2, + TLS_cert_type_rsa_fixed_dh = 3, + TLS_cert_type_dss_fixed_dh = 4, + TLS_cert_type_rsa_ephemeral_dh_RESERVED = 5, + TLS_cert_type_dss_ephemeral_dh_RESERVED = 6, + TLS_cert_type_fortezza_dms_RESERVED = 20, + TLS_cert_type_ecdsa_sign = 64, // also for sm2 + TLS_cert_type_rsa_fixed_ecdh = 65, + TLS_cert_type_ecdsa_fixed_ecdh = 66, + TLS_cert_type_gost_sign256 = 67, + TLS_cert_type_gost_sign512 = 68, + TLS_cert_type_ibc_params = 80, +} TLS_CERTIFICATE_TYPE; + +const char *tls_cert_type_name(int type); +int tls_cert_type_from_oid(int oid); + +typedef enum { + TLS_extension_server_name = 0, + TLS_extension_max_fragment_length = 1, + TLS_extension_client_certificate_url = 2, + TLS_extension_trusted_ca_keys = 3, + TLS_extension_truncated_hmac = 4, + TLS_extension_status_request = 5, + TLS_extension_user_mapping = 6, + TLS_extension_client_authz = 7, + TLS_extension_server_authz = 8, + TLS_extension_cert_type = 9, + TLS_extension_supported_groups = 10, + TLS_extension_ec_point_formats = 11, + TLS_extension_srp = 12, + TLS_extension_signature_algorithms = 13, + TLS_extension_use_srtp = 14, + TLS_extension_heartbeat = 15, + TLS_extension_application_layer_protocol_negotiation= 16, + TLS_extension_status_request_v2 = 17, + TLS_extension_signed_certificate_timestamp = 18, + TLS_extension_client_certificate_type = 19, + TLS_extension_server_certificate_type = 20, + TLS_extension_padding = 21, + TLS_extension_encrypt_then_mac = 22, + TLS_extension_extended_master_secret = 23, + TLS_extension_token_binding = 24, + TLS_extension_cached_info = 25, + TLS_extension_tls_lts = 26, + TLS_extension_compress_certificate = 27, + TLS_extension_record_size_limit = 28, + TLS_extension_pwd_protect = 29, + TLS_extension_pwd_clear = 30, + TLS_extension_password_salt = 31, + TLS_extension_ticket_pinning = 32, + TLS_extension_tls_cert_with_extern_psk = 33, + TLS_extension_delegated_credentials = 34, + TLS_extension_session_ticket = 35, + TLS_extension_TLMSP = 36, + TLS_extension_TLMSP_proxying = 37, + TLS_extension_TLMSP_delegate = 38, + TLS_extension_supported_ekt_ciphers = 39, + TLS_extension_pre_shared_key = 41, + TLS_extension_early_data = 42, + TLS_extension_supported_versions = 43, + TLS_extension_cookie = 44, + TLS_extension_psk_key_exchange_modes = 46, + TLS_extension_certificate_authorities = 47, + TLS_extension_oid_filters = 48, + TLS_extension_post_handshake_auth = 49, + TLS_extension_signature_algorithms_cert = 50, + TLS_extension_key_share = 51, + TLS_extension_transparency_info = 52, + TLS_extension_connection_id = 53, + TLS_extension_external_id_hash = 55, + TLS_extension_external_session_id = 56, + TLS_extension_quic_transport_parameters = 57, + TLS_extension_ticket_request = 58, + TLS_extension_renegotiation_info = 65281, +} TLS_EXTENSION_TYPE; + +const char *tls_extension_name(int ext); + + +typedef enum { + TLS_point_uncompressed = 0, + TLS_point_ansix962_compressed_prime = 1, + TLS_point_ansix962_compressed_char2 = 2, +} TLS_EC_POINT_FORMAT; + +const char *tls_ec_point_format_name(int format); + + +typedef enum { + TLS_curve_type_explicit_prime = 1, + TLS_curve_type_explicit_char2 = 2, + TLS_curve_type_named_curve = 3, +} TLS_CURVE_TYPE; + +const char *tls_curve_type_name(int type); + + +// 与其支持v2,还不如直接修改v2,让v2和v3兼容 + +typedef enum { + TLS_curve_secp256k1 = 22, + TLS_curve_secp256r1 = 23, + TLS_curve_secp384r1 = 24, + TLS_curve_secp521r1 = 25, + TLS_curve_brainpoolp256r1 = 26, + TLS_curve_brainpoolp384r1 = 27, + TLS_curve_brainpoolp512r1 = 28, + TLS_curve_x25519 = 29, + TLS_curve_x448 = 30, + TLS_curve_brainpoolp256r1tls13 = 31, + TLS_curve_brainpoolp384r1tls13 = 32, + TLS_curve_brainpoolp512r1tls13 = 33, + TLS_curve_sm2p256v1 = 41, // GmSSLv2: 30 +} TLS_NAMED_CURVE; + +const char *tls_named_curve_name(int curve); + + +typedef enum { + TLS_sig_rsa_pkcs1_sha1 = 0x0201, + TLS_sig_ecdsa_sha1 = 0x0203, + TLS_sig_rsa_pkcs1_sha256 = 0x0401, + TLS_sig_ecdsa_secp256r1_sha256 = 0x0403, + TLS_sig_rsa_pkcs1_sha256_legacy = 0x0420, + TLS_sig_rsa_pkcs1_sha384 = 0x0501, + TLS_sig_ecdsa_secp384r1_sha384 = 0x0503, + TLS_sig_rsa_pkcs1_sha384_legacy = 0x0520, + TLS_sig_rsa_pkcs1_sha512 = 0x0601, + TLS_sig_ecdsa_secp521r1_sha512 = 0x0603, + TLS_sig_rsa_pkcs1_sha512_legacy = 0x0620, + TLS_sig_sm2sig_sm3 = 0x0708, // GmSSLv2: 0x0707 + TLS_sig_rsa_pss_rsae_sha256 = 0x0804, + TLS_sig_rsa_pss_rsae_sha384 = 0x0805, + TLS_sig_rsa_pss_rsae_sha512 = 0x0806, + TLS_sig_ed25519 = 0x0807, + TLS_sig_ed448 = 0x0808, + TLS_sig_rsa_pss_pss_sha256 = 0x0809, + TLS_sig_rsa_pss_pss_sha384 = 0x080A, + TLS_sig_rsa_pss_pss_sha512 = 0x080B, + TLS_sig_ecdsa_brainpoolP256r1tls13_sha256 = 0x081A, + TLS_sig_ecdsa_brainpoolP384r1tls13_sha384 = 0x081B, + TLS_sig_ecdsa_brainpoolP512r1tls13_sha512 = 0x081C, +} TLS_SIGNATURE_SCHEME; + +const char *tls_signature_scheme_name(int scheme); + + +typedef enum { + TLS_change_cipher_spec = 1, +} TLS_CHANGE_CIPHER_SPEC_TYPE; + + +typedef enum { + TLS_alert_level_warning = 1, + TLS_alert_level_fatal = 2, +} TLS_ALERT_LEVEL; + +const char *tls_alert_level_name(int level); + + +typedef enum { + TLS_alert_close_notify = 0, + TLS_alert_unexpected_message = 10, + TLS_alert_bad_record_mac = 20, + TLS_alert_decryption_failed = 21, + TLS_alert_record_overflow = 22, + TLS_alert_decompression_failure = 30, + TLS_alert_handshake_failure = 40, + TLS_alert_no_certificate = 41, + TLS_alert_bad_certificate = 42, + TLS_alert_unsupported_certificate = 43, + TLS_alert_certificate_revoked = 44, + TLS_alert_certificate_expired = 45, + TLS_alert_certificate_unknown = 46, + TLS_alert_illegal_parameter = 47, + TLS_alert_unknown_ca = 48, + TLS_alert_access_denied = 49, + TLS_alert_decode_error = 50, + TLS_alert_decrypt_error = 51, + TLS_alert_export_restriction = 60, + TLS_alert_protocol_version = 70, + TLS_alert_insufficient_security = 71, + TLS_alert_internal_error = 80, + TLS_alert_user_canceled = 90, + TLS_alert_no_renegotiation = 100, + TLS_alert_unsupported_extension = 110, + TLS_alert_unsupported_site2site = 200, + TLS_alert_no_area = 201, + TLS_alert_unsupported_areatype = 202, + TLS_alert_bad_ibcparam = 203, + TLS_alert_unsupported_ibcparam = 204, + TLS_alert_identity_need = 205, +} TLS_ALERT_DESCRIPTION; + +const char *tls_alert_description_text(int description); + + +int tls_prf(const uint8_t *secret, size_t secretlen, const char *label, + const uint8_t *seed, size_t seedlen, + const uint8_t *more, size_t morelen, + size_t outlen, uint8_t *out); +int tls13_hkdf_extract(const DIGEST *digest, const uint8_t salt[32], const uint8_t in[32], uint8_t out[32]); +int tls13_hkdf_expand_label(const DIGEST *digest, const uint8_t secret[32], + const char *label, const uint8_t *context, size_t context_len, + size_t outlen, uint8_t *out); +int tls13_derive_secret(const uint8_t secret[32], const char *label, const DIGEST_CTX *dgst_ctx, uint8_t out[32]); + +int tls_cbc_encrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *enc_key, + const uint8_t seq_num[8], const uint8_t header[5], + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int tls_cbc_decrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *dec_key, + const uint8_t seq_num[8], const uint8_t header[5], + const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int tls_record_encrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *cbc_key, + const uint8_t seq_num[8], const uint8_t *in, size_t inlen, + uint8_t *out, size_t *outlen); +int tls_record_decrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *cbc_key, + const uint8_t seq_num[8], const uint8_t *in, size_t inlen, + uint8_t *out, size_t *outlen); + +int tls_seq_num_incr(uint8_t seq_num[8]); +int tls_random_generate(uint8_t random[32]); +int tls_random_print(FILE *fp, const uint8_t random[32], int format, int indent); +int tls_pre_master_secret_generate(uint8_t pre_master_secret[48], int protocol); +int tls_pre_master_secret_print(FILE *fp, const uint8_t pre_master_secret[48], int format, int indent); + +int tls_secrets_print(FILE *fp, + const uint8_t *pre_master_secret, size_t pre_master_secret_len, + const uint8_t client_random[32], const uint8_t server_random[32], + const uint8_t master_secret[48], + const uint8_t *key_block, size_t key_block_len, + int format, int indent); + + +typedef struct { + uint8_t type; + uint8_t protocol[2]; + uint8_t data_length[2]; +} TLS_RECORD_HEADER; + +#define TLS_RECORD_HEADER_SIZE (1 + tls_uint16_size() + tls_uint16_size()) // 5 +#define TLS_MAX_PLAINTEXT_SIZE (1 << 14) // 16384 +#define TLS_MAX_COMPRESSED_SIZE ((1 << 14) + 1024) // 17408 +#define TLS_MAX_CIPHERTEXT_SIZE ((1 << 14) + 2048) // 18432 +#define TLS_MAX_RECORD_SIZE (TLS_RECORD_HEADER_SIZE + TLS_MAX_CIPHERTEXT_SIZE) // 18437 + +#define tls_record_type(record) ((record)[0]) +#define tls_record_header(record) ((record)+0) +#define tls_record_protocol(record) (((uint16_t)((record)[1]) << 8) | (record)[2]) +#define tls_record_data(record) ((record)+TLS_RECORD_HEADER_SIZE) +#define tls_record_data_length(record) (((uint16_t)((record)[3]) << 8) | (record)[4]) +#define tls_record_length(record) (TLS_RECORD_HEADER_SIZE + tls_record_data_length(record)) + +int tls_record_set_type(uint8_t *record, int type); +int tls_record_set_protocol(uint8_t *record, int protocol); +int tls_record_set_data_length(uint8_t *record, size_t length); +int tls_record_set_data(uint8_t *record, const uint8_t *data, size_t datalen); + +// 握手消息ServerKeyExchange, ClientKeyExchange的解析依赖当前密码套件 +#define tls_format_set_cipher_suite(fmt,cipher) do {(fmt)|=((cipher)<<8);} while (0) +int tls_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent); +int tlcp_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent); + +int tls_record_send(const uint8_t *record, size_t recordlen, tls_socket_t sock); +int tls_record_recv(uint8_t *record, size_t *recordlen, tls_socket_t sock); +int tls12_record_recv(uint8_t *record, size_t *recordlen, tls_socket_t sock); + + +// Handshake +typedef struct { + uint8_t type; + uint8_t length[3]; +} TLS_HANDSHAKE_HEADER; + +#define TLS_HANDSHAKE_HEADER_SIZE 4 +#define TLS_MAX_HANDSHAKE_DATA_SIZE (TLS_MAX_PLAINTEXT_SIZE - TLS_HANDSHAKE_HEADER_SIZE) + +#define tls_handshake_data(p) ((p) + TLS_HANDSHAKE_HEADER_SIZE) +//#define tls_handshake_data_length(p) + + +int tls_record_set_handshake(uint8_t *record, size_t *recordlen, + int type, const uint8_t *data, size_t datalen); +int tls_record_get_handshake(const uint8_t *record, + int *type, const uint8_t **data, size_t *datalen); +int tls_handshake_print(FILE *fp, const uint8_t *handshake, size_t handshakelen, int format, int indent); + +// HelloRequest +int tls_hello_request_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + +// ClientHello, ServerHello +#define TLS_MIN_SESSION_ID_SIZE 0 +#define TLS_MAX_SESSION_ID_SIZE 32 + +int tls_record_set_handshake_client_hello(uint8_t *record, size_t *recordlen, + int client_protocol, const uint8_t random[32], + const uint8_t *session_id, size_t session_id_len, + const int *cipher_suites, size_t cipher_suites_count, + const uint8_t *exts, size_t exts_len); +int tls_record_get_handshake_client_hello(const uint8_t *record, + int *client_protocol, const uint8_t **random, + const uint8_t **session_id, size_t *session_id_len, + const uint8_t **cipher_suites, size_t *cipher_suites_len, + const uint8_t **exts, size_t *exts_len); +int tls_client_hello_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + +int tls_record_set_handshake_server_hello(uint8_t *record, size_t *recordlen, + int server_protocol, const uint8_t random[32], + const uint8_t *session_id, size_t session_id_len, + int cipher_suite, const uint8_t *exts, size_t exts_len); +int tls_record_get_handshake_server_hello(const uint8_t *record, + int *protocol, const uint8_t **random, const uint8_t **session_id, size_t *session_id_len, + int *cipher_suite, const uint8_t **exts, size_t *exts_len); +int tls_server_hello_print(FILE *fp, const uint8_t *server_hello, size_t len, int format, int indent); + +// Extensions +int tls_ec_point_formats_ext_to_bytes(const int *formats, size_t formats_cnt, + uint8_t **out, size_t *outlen); +int tls_process_client_ec_point_formats(const uint8_t *ext_data, size_t ext_datalen, + uint8_t **out, size_t *outlen); +int tls_process_server_ec_point_formats(const uint8_t *ext_data, size_t ext_datalen); + +int tls_supported_groups_ext_to_bytes(const int *groups, size_t groups_cnt, + uint8_t **out, size_t *outlen); +int tls_process_client_supported_groups(const uint8_t *ext_data, size_t ext_datalen, + uint8_t **out, size_t *outlen); +int tls_process_server_supported_groups(const uint8_t *ext_data, size_t ext_datalen); + +int tls_signature_algorithms_ext_to_bytes_ex(int ext_type, const int *algs, size_t algs_cnt, + uint8_t **out, size_t *outlen); +int tls_signature_algorithms_ext_to_bytes(const int *algs, size_t algs_cnt, + uint8_t **out, size_t *outlen); +int tls13_signature_algorithms_cert_ext_to_bytes(const int *algs, size_t algs_cnt, + uint8_t **out, size_t *outlen); +int tls_process_client_signature_algorithms(const uint8_t *ext_data, size_t ext_datalen, + uint8_t **out, size_t *outlen); +int tls_process_server_signature_algors(const uint8_t *ext_data, size_t ext_datalen); + +int tls13_supported_versions_ext_to_bytes(int handshake_type, const int *protos, size_t protos_cnt, + uint8_t **out, size_t *outlen); +int tls13_process_client_supported_versions(const uint8_t *ext_data, size_t ext_datalen, + uint8_t **out, size_t *outlen); + +int tls13_process_server_supported_versions(const uint8_t *ext_data, size_t ext_datalen); + +int tls13_key_share_entry_to_bytes(const SM2_POINT *point, uint8_t **out, size_t *outlen); +int tls13_client_key_share_ext_to_bytes(const SM2_POINT *point, uint8_t **out, size_t *outlen); +int tls13_server_key_share_ext_to_bytes(const SM2_POINT *point, uint8_t **out, size_t *outlen); +int tls13_process_client_key_share(const uint8_t *ext_data, size_t ext_datalen, + const SM2_KEY *server_ecdhe_key, SM2_POINT *client_ecdhe_public, + uint8_t **out, size_t *outlen); +int tls13_process_server_key_share(const uint8_t *ext_data, size_t ext_datalen, SM2_POINT *point); + + +int tls13_certificate_authorities_ext_to_bytes(const uint8_t *ca_names, size_t ca_names_len, + uint8_t **out, size_t *outlen); + +int tls_ext_from_bytes(int *type, const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen); +int tls_process_client_exts(const uint8_t *exts, size_t extslen, uint8_t *out, size_t *outlen, size_t maxlen); +int tls_process_server_exts(const uint8_t *exts, size_t extslen, + int *ec_point_format, int *supported_group, int *signature_algor); + + +// Certificate +int tls_record_set_handshake_certificate(uint8_t *record, size_t *recordlen, + const uint8_t *certs, size_t certslen); +// 这个函数比较特殊,是直接解析了证书链,而不是返回指针 +// 应该提供一个独立的解析函数来解析TLS的证书链 +int tls_record_get_handshake_certificate(const uint8_t *record, uint8_t *certs, size_t *certslen); + +// ServerKeyExchange +int tls_server_key_exchange_print(FILE *fp, const uint8_t *ske, size_t skelen, int format, int indent); + +#define TLS_MAX_SIGNATURE_SIZE SM2_MAX_SIGNATURE_SIZE +int tls_sign_server_ecdh_params(const SM2_KEY *server_sign_key, + const uint8_t client_random[32], const uint8_t server_random[32], + int curve, const SM2_POINT *point, uint8_t *sig, size_t *siglen); +int tls_verify_server_ecdh_params(const SM2_KEY *server_sign_key, + const uint8_t client_random[32], const uint8_t server_random[32], + int curve, const SM2_POINT *point, const uint8_t *sig, size_t siglen); +int tls_record_set_handshake_server_key_exchange_ecdhe(uint8_t *record, size_t *recordlen, + int curve, const SM2_POINT *point, const uint8_t *sig, size_t siglen); +int tls_record_get_handshake_server_key_exchange_ecdhe(const uint8_t *record, + int *curve, SM2_POINT *point, const uint8_t **sig, size_t *siglen); +int tls_server_key_exchange_ecdhe_print(FILE *fp, const uint8_t *data, size_t datalen, + int format, int indent); + +int tlcp_record_set_handshake_server_key_exchange_pke(uint8_t *record, size_t *recordlen, + const uint8_t *sig, size_t siglen); +int tlcp_record_get_handshake_server_key_exchange_pke(const uint8_t *record, + const uint8_t **sig, size_t *siglen); +int tlcp_server_key_exchange_pke_print(FILE *fp, const uint8_t *sig, size_t siglen, int format, int indent); + + + +// CertificateRequest +#define TLS_MAX_CERTIFICATE_TYPES 256 +#define TLS_MAX_CA_NAMES_SIZE (TLS_MAX_HANDSHAKE_DATA_SIZE - tls_uint8_size() - tls_uint16_size()) + +int tls_authorities_from_certs(uint8_t *ca_names, size_t *ca_names_len, size_t maxlen, const uint8_t *certs, size_t certslen); +int tls_authorities_issued_certificate(const uint8_t *ca_names, size_t ca_namelen, const uint8_t *certs, size_t certslen); +int tls_cert_types_accepted(const uint8_t *types, size_t types_len, const uint8_t *client_certs, size_t client_certs_len); + +int tls_record_set_handshake_certificate_request(uint8_t *record, size_t *recordlen, + const uint8_t *cert_types, size_t cert_types_len, + const uint8_t *ca_names, size_t ca_names_len); +int tls_record_get_handshake_certificate_request(const uint8_t *record, + const uint8_t **cert_types, size_t *cert_types_len, + const uint8_t **ca_names, size_t *ca_names_len); +int tls_certificate_request_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + + +// ServerHelloDone +int tls_record_set_handshake_server_hello_done(uint8_t *record, size_t *recordlen); +int tls_record_get_handshake_server_hello_done(const uint8_t *record); +int tls_server_hello_done_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + +// ClientKeyExchange +int tls_record_set_handshake_client_key_exchange_pke(uint8_t *record, size_t *recordlen, + const uint8_t *enced_pms, size_t enced_pms_len); +int tls_record_get_handshake_client_key_exchange_pke(const uint8_t *record, + const uint8_t **enced_pms, size_t *enced_pms_len); +int tls_client_key_exchange_pke_print(FILE *fp, const uint8_t *cke, size_t ckelen, int format, int indent); +int tls_client_key_exchange_print(FILE *fp, const uint8_t *cke, size_t ckelen, int format, int indent); + +int tls_record_set_handshake_client_key_exchange_ecdhe(uint8_t *record, size_t *recordlen, + const SM2_POINT *point); // 这里不应该支持SM2_POINT类型 +int tls_record_get_handshake_client_key_exchange_ecdhe(const uint8_t *record, SM2_POINT *point); +int tls_client_key_exchange_ecdhe_print(FILE *fp, const uint8_t *data, size_t datalen, + int format, int indent); + +// CertificateVerify +int tls_record_set_handshake_certificate_verify(uint8_t *record, size_t *recordlen, + const uint8_t *sig, size_t siglen); +int tls_record_get_handshake_certificate_verify(const uint8_t *record, + const uint8_t **sig, size_t *siglen); +int tls_certificate_verify_print(FILE *fp, const uint8_t *p, size_t len, int format, int indent); + +typedef enum { + TLS_client_verify_client_hello = 0, + TLS_client_verify_server_hello = 1, + TLS_client_verify_server_certificate = 2, + TLS_client_verify_server_key_exchange = 3, + TLS_client_verify_cert_request = 4, + TLS_client_verify_server_hello_done = 5, + TLS_client_verify_client_certificate = 6, + TLS_client_verify_client_key_exchange = 7, +} TLS_CLIENT_VERIFY_INDEX; + +typedef struct { + TLS_CLIENT_VERIFY_INDEX index; + uint8_t *handshake[8]; // Record data only, no record header + size_t handshake_len[8]; +} TLS_CLIENT_VERIFY_CTX; + +int tls_client_verify_init(TLS_CLIENT_VERIFY_CTX *ctx); +int tls_client_verify_update(TLS_CLIENT_VERIFY_CTX *ctx, const uint8_t *handshake, size_t handshake_len); +int tls_client_verify_finish(TLS_CLIENT_VERIFY_CTX *ctx, const uint8_t *sig, size_t siglen, const SM2_KEY *public_key); +void tls_client_verify_cleanup(TLS_CLIENT_VERIFY_CTX *ctx); + +// Finished +// FIXME: 支持TLS 1.3 提供MIN, MAX或TLS12, TLS13, TLCP... +#define TLS_VERIFY_DATA_SIZE 12 // TLS 1.3或者其他版本支持更长的verify_data +#define TLS_FINISHED_RECORD_SIZE (TLS_RECORD_HEADER_SIZE + TLS_HANDSHAKE_HEADER_SIZE + TLS_VERIFY_DATA_SIZE) // 21 +#define TLS_MAX_PADDING_SIZE (1 + 255) +#define TLS_MAC_SIZE SM3_HMAC_SIZE +#define TLS_FINISHED_RECORD_BUF_SIZE (TLS_FINISHED_RECORD_SIZE + TLS_MAC_SIZE + TLS_MAX_PADDING_SIZE) // 309 + + +int tls_record_set_handshake_finished(uint8_t *record, size_t *recordlen, + const uint8_t *verify_data, size_t verify_data_len); +int tls_record_get_handshake_finished(const uint8_t *record, + const uint8_t **verify_data, size_t *verify_data_len); +int tls_finished_print(FILE *fp, const uint8_t *a, size_t len, int format, int indent); + + +// Alert +typedef struct { + uint8_t level; + uint8_t description; +} TLS_ALERT; + +#define TLS_ALERT_RECORD_SIZE (TLS_RECORD_HEADER_SIZE + 2) + +int tls_record_set_alert(uint8_t *record, size_t *recordlen, int alert_level, int alert_description); +int tls_record_get_alert(const uint8_t *record, int *alert_level, int *alert_description); +int tls_alert_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + + +// ChangeCipherSpec +typedef struct { + uint8_t type; +} TLS_CHANGE_CIPHER_SPEC; + +const char *tls_change_cipher_spec_text(int change_cipher_spec); +int tls_change_cipher_spec_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); +int tls_record_set_change_cipher_spec(uint8_t *record, size_t *recordlen); +int tls_record_get_change_cipher_spec(const uint8_t *record); + +// ApplicationData +int tls_record_set_application_data(uint8_t *record, size_t *recordlen, + const uint8_t *data, size_t datalen); +int tls_record_get_application_data(uint8_t *record, + const uint8_t **data, size_t *datalen); +int tls_application_data_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent); + + + +enum { + TLS_server_mode = 0, + TLS_client_mode = 1, +}; + +#define TLS_MAX_CIPHER_SUITES_COUNT 64 + +typedef struct { + int protocol; + int is_client; + int cipher_suites[TLS_MAX_CIPHER_SUITES_COUNT]; + size_t cipher_suites_cnt; + uint8_t *cacerts; + size_t cacertslen; + uint8_t *certs; + size_t certslen; + SM2_KEY signkey; + SM2_KEY kenckey; + int verify_depth; +} TLS_CTX; + +int tls_ctx_init(TLS_CTX *ctx, int protocol, int is_client); +int tls_ctx_set_cipher_suites(TLS_CTX *ctx, const int *cipher_suites, size_t cipher_suites_cnt); +int tls_ctx_set_ca_certificates(TLS_CTX *ctx, const char *cacertsfile, int depth); +int tls_ctx_set_certificate_and_key(TLS_CTX *ctx, const char *chainfile, + const char *keyfile, const char *keypass); +int tls_ctx_set_tlcp_server_certificate_and_keys(TLS_CTX *ctx, const char *chainfile, + const char *signkeyfile, const char *signkeypass, + const char *kenckeyfile, const char *kenckeypass); +void tls_ctx_cleanup(TLS_CTX *ctx); + + + +#define TLS_MAX_CERTIFICATES_SIZE 2048 +#define TLS_DEFAULT_VERIFY_DEPTH 4 +#define TLS_MAX_VERIFY_DEPTH 5 + + +typedef struct { + int protocol; + int is_client; + int cipher_suites[TLS_MAX_CIPHER_SUITES_COUNT]; + size_t cipher_suites_cnt; + tls_socket_t sock; + + uint8_t enced_record[TLS_MAX_RECORD_SIZE]; + size_t enced_record_len; + + + uint8_t record[TLS_MAX_RECORD_SIZE]; + + // 其实这个就不太对了,还是应该有一个完整的密文记录 + uint8_t databuf[TLS_MAX_PLAINTEXT_SIZE]; + uint8_t *data; + size_t datalen; + + int cipher_suite; + uint8_t session_id[32]; + size_t session_id_len; + uint8_t server_certs[TLS_MAX_CERTIFICATES_SIZE]; // 动态的可能会好一点 + size_t server_certs_len; + uint8_t client_certs[TLS_MAX_CERTIFICATES_SIZE]; + size_t client_certs_len; + uint8_t ca_certs[2048]; + size_t ca_certs_len; + + SM2_KEY sign_key; + SM2_KEY kenc_key; + + int verify_result; + + uint8_t master_secret[48]; + uint8_t key_block[96]; + + SM3_HMAC_CTX client_write_mac_ctx; + SM3_HMAC_CTX server_write_mac_ctx; + SM4_KEY client_write_enc_key; + SM4_KEY server_write_enc_key; + uint8_t client_seq_num[8]; + uint8_t server_seq_num[8]; + + uint8_t client_write_iv[12]; // tls13 + uint8_t server_write_iv[12]; // tls13 + BLOCK_CIPHER_KEY client_write_key; + BLOCK_CIPHER_KEY server_write_key; + +} TLS_CONNECT; + + +#define TLS_MAX_EXTENSIONS_SIZE 512 // 这个应该再考虑一下数值,是否可以用其他的缓冲区装载? + + +int tls_init(TLS_CONNECT *conn, const TLS_CTX *ctx); +int tls_set_socket(TLS_CONNECT *conn, tls_socket_t sock); +int tls_do_handshake(TLS_CONNECT *conn); +int tls_send(TLS_CONNECT *conn, const uint8_t *in, size_t inlen, size_t *sentlen); +int tls_recv(TLS_CONNECT *conn, uint8_t *out, size_t outlen, size_t *recvlen); +int tls_shutdown(TLS_CONNECT *conn); +void tls_cleanup(TLS_CONNECT *conn); + +int tlcp_do_connect(TLS_CONNECT *conn); +int tlcp_do_accept(TLS_CONNECT *conn); +int tls12_do_connect(TLS_CONNECT *conn); +int tls12_do_accept(TLS_CONNECT *conn); + + +#define TLS13_SM2_ID "TLSv1.3+GM+Cipher+Suite" +#define TLS13_SM2_ID_LENGTH (sizeof(TLS13_SM2_ID)-1) + +int tls13_do_connect(TLS_CONNECT *conn); +int tls13_do_accept(TLS_CONNECT *conn); + +int tls_send_alert(TLS_CONNECT *conn, int alert); +int tls_send_warning(TLS_CONNECT *conn, int alert); + +int tls13_send(TLS_CONNECT *conn, const uint8_t *data, size_t datalen, size_t *sentlen); +int tls13_recv(TLS_CONNECT *conn, uint8_t *out, size_t outlen, size_t *recvlen); + + +int tls13_connect(TLS_CONNECT *conn, const char *hostname, int port, FILE *server_cacerts_fp, + FILE *client_certs_fp, const SM2_KEY *client_sign_key); +int tls13_accept(TLS_CONNECT *conn, int port, + FILE *server_certs_fp, const SM2_KEY *server_sign_key, + FILE *client_cacerts_fp); + + +int tls13_supported_versions_ext_print(FILE *fp, int fmt, int ind, int handshake_type, const uint8_t *data, size_t datalen); +int tls13_key_share_ext_print(FILE *fp, int fmt, int ind, int handshake_type, const uint8_t *data, size_t datalen); + + +int tls_process_client_hello_exts(const uint8_t *exts, size_t extslen, uint8_t *out, size_t *outlen, size_t maxlen); +int tls_process_server_hello_exts(const uint8_t *exts, size_t extslen, + int *ec_point_format, int *supported_group, int *signature_algor); + + +int tls13_encrypted_extensions_print(FILE *fp, int fmt, int ind, const uint8_t *data, size_t datalen); + +int tls13_extension_print(FILE *fp, int fmt, int ind, + int handshake_type, int ext_type, const uint8_t *ext_data, size_t ext_datalen); +int tls13_extensions_print(FILE *fp, int fmt, int ind, + int handshake_type, const uint8_t *exts, size_t extslen); + +int tls13_certificate_print(FILE *fp, int fmt, int ind, const uint8_t *cert, size_t certlen); +int tls13_certificate_request_print(FILE *fp, int fmt, int ind, const uint8_t *cert, size_t certlen); +int tls13_certificate_verify_print(FILE *fp, int fmt, int ind, const uint8_t *d, size_t dlen); +int tls13_record_print(FILE *fp, int format, int indent, const uint8_t *record, size_t recordlen); + + +int tls13_gcm_encrypt(const BLOCK_CIPHER_KEY *key, const uint8_t iv[12], + const uint8_t seq_num[8], int record_type, + const uint8_t *in, size_t inlen, size_t padding_len, // TLSInnerPlaintext.content + uint8_t *out, size_t *outlen); // TLSCiphertext.encrypted_record +int tls13_gcm_decrypt(const BLOCK_CIPHER_KEY *key, const uint8_t iv[12], + const uint8_t seq_num[8], const uint8_t *in, size_t inlen, + int *record_type, uint8_t *out, size_t *outlen); + + +#ifdef TLS_DEBUG +# define tls_trace(s) fprintf(stderr,(s)) +# define tls_record_trace(fp,rec,reclen,fmt,ind) tls_record_print(fp,rec,reclen,fmt,ind) +# define tlcp_record_trace(fp,rec,reclen,fmt,ind) tlcp_record_print(fp,rec,reclen,fmt,ind) +# define tls12_record_trace(fp,rec,reclen,fmt,ind) tls12_record_print(fp,rec,reclen,fmt,ind) +# define tls13_record_trace(fp,rec,reclen,fmt,ind) tls13_record_print(fp,fmt,ind,rec,reclen) +#else +# define tls_trace(s) +# define tls_record_trace(fp,rec,reclen,fmt,ind) +# define tlcp_record_trace(fp,rec,reclen,fmt,ind) +# define tls12_record_trace(fp,rec,reclen,fmt,ind) +# define tls13_record_trace(fp,rec,reclen,fmt,ind) +#endif + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/version.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/version.h new file mode 100644 index 0000000..6f5bba7 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/version.h @@ -0,0 +1,32 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_VERSION_H +#define GMSSL_VERSION_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +// Also update CPACK_PACKAGE_VERSION in CMakeLists.txt +#define GMSSL_VERSION_NUM 30101 +#define GMSSL_VERSION_STR "GmSSL 3.1.1" + +_gmssl_export int gmssl_version_num(void); +_gmssl_export const char *gmssl_version_str(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509.h new file mode 100644 index 0000000..9bbfe91 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509.h @@ -0,0 +1,16 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_X509_H +#define GMSSL_X509_H + +#include + +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_alg.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_alg.h new file mode 100644 index 0000000..d4f9866 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_alg.h @@ -0,0 +1,68 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_X509_ALG_H +#define GMSSL_X509_ALG_H + + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +AlgorithmIdentifier ::= SEQUENCE { + algorithm OBJECT IDENTIFIER, + parameters ANY } +*/ + +const char *x509_digest_algor_name(int oid); +int x509_digest_algor_from_name(const char *name); +int x509_digest_algor_from_der(int *oid, const uint8_t **in, size_t *inlen); +int x509_digest_algor_to_der(int oid, uint8_t **out, size_t *outlen); +int x509_digest_algor_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +const char *x509_encryption_algor_name(int oid); +int x509_encryption_algor_from_name(const char *name); +int x509_encryption_algor_from_der(int *oid, const uint8_t **iv, size_t *ivlen, const uint8_t **in, size_t *inlen); +int x509_encryption_algor_to_der(int oid, const uint8_t *iv, size_t ivlen, uint8_t **out, size_t *outlen); +int x509_encryption_algor_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +const char *x509_signature_algor_name(int oid); +int x509_signature_algor_from_name(const char *name); +int x509_signature_algor_from_der(int *oid, const uint8_t **in, size_t *inlen); +int x509_signature_algor_to_der(int oid, uint8_t **out, size_t *outlen); +int x509_signature_algor_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +const char *x509_public_key_encryption_algor_name(int oid); +int x509_public_key_encryption_algor_from_name(const char *name); +int x509_public_key_encryption_algor_from_der(int *oid, const uint8_t **params, size_t *params_len, const uint8_t **in, size_t *inlen); +int x509_public_key_encryption_algor_to_der(int oid, uint8_t **out, size_t *outlen); +int x509_public_key_encryption_algor_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +const char *x509_public_key_algor_name(int oid); +int x509_public_key_algor_from_name(const char *name); +int x509_public_key_algor_to_der(int oid, int curve, uint8_t **out, size_t *outlen); +int x509_public_key_algor_from_der(int *oid, int *curve_or_null, const uint8_t **in, size_t *inlen); +int x509_public_key_algor_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_cer.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_cer.h new file mode 100644 index 0000000..327c882 --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_cer.h @@ -0,0 +1,390 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_X509_CER_H +#define GMSSL_X509_CER_H + + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +enum X509_Version { + X509_version_v1 = 0, + X509_version_v2 = 1, + X509_version_v3 = 2, +}; + +const char *x509_version_name(int version); +int x509_explicit_version_to_der(int index, int version, uint8_t **out, size_t *outlen); +int x509_explicit_version_from_der(int index, int *version, const uint8_t **in, size_t *inlen); + +/* +Time ::= CHOICE { + utcTime UTCTime, + generalTime GeneralizedTime } +*/ +#define X509_MAX_UTC_TIME 2524607999 // "20491231235959Z" +#define X509_MAX_GENERALIZED_TIME 253402300799 // "99991231235959Z" +int x509_time_to_der(time_t a, uint8_t **out, size_t *outlen); +int x509_time_from_der(time_t *a, const uint8_t **in, size_t *inlen); + +/* +Validity ::= SEQUENCE { + notBefore Time, + notAfter Time } +*/ +#define X509_VALIDITY_MIN_DAYS 1 +#define X509_VALIDITY_MAX_DAYS 3653 +#define X509_VALIDITY_MAX_SECONDS (X509_VALIDITY_MAX_DAYS * 86400) +int x509_validity_add_days(time_t *not_after, time_t not_before, int days); +int x509_validity_to_der(time_t not_before, time_t not_after, uint8_t **out, size_t *outlen); +int x509_validity_from_der(time_t *not_before, time_t *not_after, const uint8_t **in, size_t *inlen); +int x509_validity_check(time_t not_before, time_t not_after, time_t now, int max_secs); +int x509_validity_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +DirectoryString or DirectoryName + +DirectoryName ::= CHOICE { + teletexString TeletexString (SIZE (1..MAX)), + printableString PrintableString (SIZE (1..MAX)), + universalString UniversalString (SIZE (1..MAX)), + utf8String UTF8String (SIZE (1..MAX)), + bmpString BMPString (SIZE (1..MAX)), +} +*/ +int x509_directory_name_check(int tag, const uint8_t *d, size_t dlen); +int x509_directory_name_check_ex(int tag, const uint8_t *d, size_t dlen, size_t minlen, size_t maxlen); +int x509_directory_name_to_der(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_directory_name_from_der(int *tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int x509_explicit_directory_name_to_der(int index, int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_explicit_directory_name_from_der(int index, int *tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int x509_directory_name_print(FILE *fp, int fmt, int ind, const char *label, int tag, const uint8_t *d, size_t dlen); + +/* +AttributeTypeAndValue ::= SEQUENCE { + type OBJECT IDENTIFIER, + value ANY -- DEFINED BY AttributeType } + +id-at + OID_at_name name DirectoryName 1..ub-name + OID_at_surname surname DirectoryName 1..ub-name + OID_at_given_name givenName DirectoryName 1..ub-name + OID_at_initials initials DirectoryName 1..ub-name + OID_at_generation_qualifier generationQualifier DirectoryName 1..ub-name + OID_at_common_name commonName DirectoryName 1..ub-common-name + OID_at_locality_name localityName DirectoryName 1..ub-locality-name + OID_at_state_or_province_name stateOrProvinceName DirectoryName 1..ub-state-name + OID_at_organization_name organizationName DirectoryName 1..ub-organization-name + OID_at_organizational_unit_name organizationalUnitName DirectoryName 1..ub-organizational-unit-name + OID_at_title title DirectoryName 1..ub-title + OID_at_dn_qualifier dnQualifier PrintableString N/A + OID_at_country_name countryName PrintableString 2..2 + OID_at_serial_number serialNumber PrintableString 1..ub-serial-number + OID_at_pseudonym pseudonym DirectoryName 1..ub-pseudonym + OID_domain_component domainComponent IA5String N/A +*/ +const char *x509_name_type_name(int oid); +int x509_name_type_from_name(const char *name); +int x509_name_type_from_der(int *oid, const uint8_t **in, size_t *inlen); +int x509_name_type_to_der(int oid, uint8_t **out, size_t *outlen); + +#define X509_ub_name 32768 +#define X509_ub_common_name 64 +#define X509_ub_locality_name 128 +#define X509_ub_state_name 128 +#define X509_ub_organization_name 64 +#define X509_ub_organizational_unit_name 64 +#define X509_ub_title 64 +#define X509_ub_serial_number 64 +#define X509_ub_pseudonym 128 + +int x509_attr_type_and_value_check(int oid, int tag, const uint8_t *val, size_t vlen); +int x509_attr_type_and_value_to_der(int oid, int tag, const uint8_t *val, size_t vlen, uint8_t **out, size_t *outlen); +int x509_attr_type_and_value_from_der(int *oid, int *tag, const uint8_t **val, size_t *vlen, const uint8_t **in, size_t *inlen); +int x509_attr_type_and_value_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue +*/ +int x509_rdn_to_der(int oid, int tag, const uint8_t *val, size_t vlen, const uint8_t *more, size_t mlen, uint8_t **out, size_t *outlen); +int x509_rdn_from_der(int *oid, int *tag, const uint8_t **val, size_t *vlen, const uint8_t **more, size_t *mlen, const uint8_t **in, size_t *inlen); +int x509_rdn_check(const uint8_t *d, size_t dlen); +int x509_rdn_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +Name ::= SEQUENCE OF RelativeDistinguishedName +*/ +int x509_name_add_rdn(uint8_t *d, size_t *dlen, size_t maxlen, int oid, int tag, const uint8_t *val, size_t vlen, const uint8_t *more, size_t mlen); +int x509_name_add_country_name(uint8_t *d, size_t *dlen, size_t maxlen, const char val[2] ); // val: PrintableString SIZE(2) +int x509_name_add_state_or_province_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_locality_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_organization_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_organizational_unit_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_common_name(uint8_t *d, size_t *dlen, size_t maxlen, int tag, const uint8_t *val, size_t vlen); +int x509_name_add_domain_component(uint8_t *d, size_t *dlen, size_t maxlen, const char *val, size_t vlen); // val: IA5String + +int x509_name_set(uint8_t *d, size_t *dlen, size_t maxlen, + const char country[2], const char *state, const char *locality, + const char *org, const char *org_unit, const char *common_name); + +#define x509_name_to_der(d,dlen,out,outlen) asn1_sequence_to_der(d,dlen,out,outlen) +#define x509_name_from_der(d,dlen,in,inlen) asn1_sequence_from_der(d,dlen,in,inlen) +int x509_name_check(const uint8_t *d, size_t dlen); +int x509_name_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +int x509_name_get_value_by_type(const uint8_t *d, size_t dlen, int oid, int *tag, const uint8_t **val, size_t *vlen); +int x509_name_get_common_name(const uint8_t *d, size_t dlen, int *tag, const uint8_t **val, size_t *vlen); +int x509_name_equ(const uint8_t *a, size_t alen, const uint8_t *b, size_t blen); + +int x509_names_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +SubjectPublicKeyInfo ::= SEQUENCE { + algorithm AlgorithmIdentifier, + subjectPublicKey BIT STRING } + +algorithm.algorithm = OID_ec_public_key; +algorithm.parameters = OID_sm2; +subjectPublicKey = ECPoint +*/ +#define x509_public_key_info_to_der(key,out,outlen) sm2_public_key_info_to_der(key,out,outlen) +#define x509_public_key_info_from_der(key,in,inlen) sm2_public_key_info_from_der(key,in,inlen) +int x509_public_key_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +Extension ::= SEQUENCE { + extnID OBJECT IDENTIFIER, + critical BOOLEAN DEFAULT FALSE, + extnValue OCTET STRING -- contains the DER encoding of an ASN.1 value + +id-ce: + OID_ce_authority_key_identifier + OID_ce_subject_key_identifier + OID_ce_key_usage + OID_ce_certificate_policies + OID_ce_policy_mappings + OID_ce_subject_alt_name + OID_ce_issuer_alt_name + OID_ce_subject_directory_attributes + OID_ce_basic_constraints + OID_ce_name_constraints + OID_ce_policy_constraints + OID_ce_ext_key_usage + OID_ce_crl_distribution_points + OID_ce_inhibit_any_policy + OID_ce_freshest_crl + OID_netscape_cert_comment +*/ +const char *x509_ext_id_name(int oid); +int x509_ext_id_from_name(const char *name); +int x509_ext_id_from_der(int *oid, uint32_t *nodes, size_t *nodes_count, const uint8_t **in, size_t *inlen); +int x509_ext_id_to_der(int oid, uint8_t **out, size_t *outlen); + +int x509_ext_to_der(int oid, int critical, const uint8_t *val, size_t vlen, uint8_t **out, size_t *outlen); +int x509_ext_from_der(int *oid, uint32_t *nodes, size_t *nodes_cnt, int *critical, const uint8_t **val, size_t *vlen, const uint8_t **in, size_t *inlen); +int x509_ext_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +[3] EXPLICIT SEQUENCE OF Extension + */ +int x509_explicit_exts_to_der(int index, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_explicit_exts_from_der(int index, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +#define x509_exts_to_der(d,dlen,out,outlen) x509_explicit_exts_to_der(3,d,dlen,out,outlen) +#define x509_exts_from_der(d,dlen,in,inlen) x509_explicit_exts_from_der(3,d,dlen,in,inlen) + +int x509_exts_get_ext_by_oid(const uint8_t *d, size_t dlen, int oid, + int *critical, const uint8_t **val, size_t *vlen); +int x509_exts_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +TBSCertificate ::= SEQUENCE { + version [0] EXPLICIT INTEGER DEFAULT v1, + serialNumber INTEGER, + siganture AlgorithmIdentifier, + issuer Name, + validity Validity, + subject Name, + subjectPulbicKeyInfo SubjectPublicKeyInfo, + issuerUniqueID [1] IMPLICIT BIT STRING OPTIONAL, -- If present, must be v2,v3 + subjectUniqueID [2] IMPLICIT BIT STRING OPTIONAL, -- If present, must be v2,v3 + extensions [3] EXPLICIT Extensions OPTIONAL -- If present, must be v3 } +*/ +#define X509_SERIAL_NUMBER_MIN_LEN 1 +#define X509_SERIAL_NUMBER_MAX_LEN 20 +#define X509_UNIQUE_ID_MIN_LEN 32 +#define X509_UNIQUE_ID_MAX_LEN 32 + +int x509_tbs_cert_to_der( + int version, + const uint8_t *serial, size_t serial_len, + int signature_algor, + const uint8_t *issuer, size_t issuer_len, + time_t not_before, time_t not_after, + const uint8_t *subject, size_t subject_len, + const SM2_KEY *subject_public_key, + const uint8_t *issuer_unique_id, size_t issuer_unique_id_len, + const uint8_t *subject_unique_id, size_t subject_unique_id_len, + const uint8_t *exts, size_t exts_len, + uint8_t **out, size_t *outlen); +int x509_tbs_cert_from_der( + int *version, + const uint8_t **serial, size_t *serial_len, + int *signature_algor, + const uint8_t **issuer, size_t *issuer_len, + time_t *not_before, time_t *not_after, + const uint8_t **subject, size_t *subject_len, + SM2_KEY *subject_public_key, + const uint8_t **issuer_unique_id, size_t *issuer_unique_id_len, + const uint8_t **subject_unique_id, size_t *subject_unique_id_len, + const uint8_t **exts, size_t *exts_len, + const uint8_t **in, size_t *inlen); +int x509_tbs_cert_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +Certificate ::= SEQUENCE { + tbsCertificate TBSCertificate, + signatureAlgorithm AlgorithmIdentifier, + signatureValue BIT STRING } +*/ +int x509_certificate_to_der( + const uint8_t *tbs, size_t tbslen, + int signature_algor, + const uint8_t *sig, size_t siglen, + uint8_t **out, size_t *outlen); +int x509_certificate_from_der( + const uint8_t **tbs, size_t *tbslen, + int *signature_algor, + const uint8_t **sig, size_t *siglen, + const uint8_t **in, size_t *inlen); + +int x509_signed_from_der( + const uint8_t **tbs, size_t *tbslen, + int *signature_algor, + const uint8_t **sig, size_t *siglen, + const uint8_t **in, size_t *inlen); +int x509_signed_verify(const uint8_t *a, size_t alen, const SM2_KEY *pub_key, + const char *signer_id, size_t signer_id_len); +int x509_signed_verify_by_ca_cert(const uint8_t *a, size_t alen, const uint8_t *cacert, size_t cacertlen, + const char *signer_id, size_t signer_id_len); + +// x509_cert functions +int x509_cert_sign_to_der( + int version, + const uint8_t *serial, size_t serial_len, + int signature_algor, + const uint8_t *issuer, size_t issuer_len, + time_t not_before, time_t not_after, + const uint8_t *subject, size_t subject_len, + const SM2_KEY *subject_public_key, + const uint8_t *issuer_unique_id, size_t issuer_unique_id_len, + const uint8_t *subject_unique_id, size_t subject_unique_id_len, + const uint8_t *exts, size_t exts_len, + const SM2_KEY *sign_key, const char *signer_id, size_t signer_id_len, + uint8_t **out, size_t *outlen); + +int x509_cert_to_der(const uint8_t *a, size_t alen, uint8_t **out, size_t *outlen); +int x509_cert_from_der(const uint8_t **a, size_t *alen, const uint8_t **in, size_t *inlen); +int x509_cert_to_pem(const uint8_t *a, size_t alen, FILE *fp); +int x509_cert_from_pem(uint8_t *a, size_t *alen, size_t maxlen, FILE *fp); +int x509_cert_from_pem_by_subject(uint8_t *a, size_t *alen, size_t maxlen, const uint8_t *name, size_t namelen, FILE *fp); +int x509_cert_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *a, size_t alen); + +int x509_cert_verify_by_ca_cert(const uint8_t *a, size_t alen, const uint8_t *cacert, size_t cacertlen, + const char *signer_id, size_t signer_id_len); + +int x509_cert_get_details(const uint8_t *a, size_t alen, + int *version, + const uint8_t **serial_number, size_t *serial_number_len, + int *inner_signature_algor, + const uint8_t **issuer, size_t *issuer_len, + time_t *not_before, time_t *not_after, + const uint8_t **subject, size_t *subject_len, + SM2_KEY *subject_public_key, + const uint8_t **issuer_unique_id, size_t *issuer_unique_id_len, + const uint8_t **subject_unique_id, size_t *subject_unique_id_len, + const uint8_t **extensions, size_t *extensions_len, + int *signature_algor, + const uint8_t **signature, size_t *signature_len); + + +typedef enum { + X509_cert_server_auth, + X509_cert_client_auth, + X509_cert_server_key_encipher, + X509_cert_client_key_encipher, + X509_cert_ca, + X509_cert_root_ca, + X509_cert_crl_sign, +} X509_CERT_TYPE; + +int x509_cert_check(const uint8_t *cert, size_t certlen, int cert_type, int *path_len_constraint); + +/* +IssuerAndSerialNumber ::= SEQUENCE { + isser Name, + serialNumber INTEGER } +*/ +int x509_cert_get_issuer_and_serial_number(const uint8_t *a, size_t alen, + const uint8_t **issuer, size_t *issuer_len, + const uint8_t **serial_number, size_t *serial_number_len); +int x509_cert_get_issuer(const uint8_t *a, size_t alen, const uint8_t **name, size_t *namelen); +int x509_cert_get_subject(const uint8_t *a, size_t alen, const uint8_t **subj, size_t *subj_len); +int x509_cert_get_subject_public_key(const uint8_t *a, size_t alen, SM2_KEY *public_key); +int x509_cert_get_exts(const uint8_t *a, size_t alen, const uint8_t **d, size_t *dlen); + +int x509_certs_to_pem(const uint8_t *d, size_t dlen, FILE *fp); +int x509_certs_from_pem(uint8_t *d, size_t *dlen, size_t maxlen, FILE *fp); +int x509_certs_get_count(const uint8_t *d, size_t dlen, size_t *cnt); +int x509_certs_get_cert_by_index(const uint8_t *d, size_t dlen, int index, const uint8_t **cert, size_t *certlen); +int x509_certs_get_cert_by_subject(const uint8_t *d, size_t dlen, const uint8_t *subject, size_t subject_len, const uint8_t **cert, size_t *certlen); +int x509_certs_get_last(const uint8_t *d, size_t dlen, const uint8_t **cert, size_t *certlen); + +int x509_certs_get_cert_by_subject_and_key_identifier(const uint8_t *d, size_t dlen, + const uint8_t *subject, size_t subject_len, + const uint8_t *key_id, size_t key_id_len, + const uint8_t **cert, size_t *certlen); +int x509_certs_get_cert_by_issuer_and_serial_number( + const uint8_t *certs, size_t certs_len, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial, size_t serial_len, + const uint8_t **cert, size_t *cert_len); + +typedef enum { + X509_cert_chain_server, + X509_cert_chain_client, +} X509_CERT_CHAIN_TYPE; + +#define X509_MAX_VERIFY_DEPTH 6 +int x509_certs_verify(const uint8_t *certs, size_t certslen, int certs_type, + const uint8_t *rootcerts, size_t rootcertslen, int depth, int *verify_result); +int x509_certs_verify_tlcp(const uint8_t *certs, size_t certslen, int certs_type, + const uint8_t *rootcerts, size_t rootcertslen, int depth, int *verify_result); +int x509_certs_get_subjects(const uint8_t *certs, size_t certslen, uint8_t *names, size_t *nameslen); +int x509_certs_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +int x509_cert_new_from_file(uint8_t **out, size_t *outlen, const char *file); +int x509_certs_new_from_file(uint8_t **out, size_t *outlen, const char *file); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_crl.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_crl.h new file mode 100644 index 0000000..30d39cf --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_crl.h @@ -0,0 +1,309 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + + +#ifndef GMSSL_X509_CRL_H +#define GMSSL_X509_CRL_H + + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* +CRLReason ::= ENUMERATED +*/ +typedef enum { + X509_cr_unspecified = 0, + X509_cr_key_compromise = 1, + X509_cr_ca_compromise = 2 , + X509_cr_affiliation_changed = 3, + X509_cr_superseded = 4, + X509_cr_cessation_of_operation = 5, + X509_cr_certificate_hold = 6, + X509_cr_not_assigned = 7, + X509_cr_remove_from_crl = 8, + X509_cr_privilege_withdrawn = 9, + X509_cr_aa_compromise = 10, +} X509_CRL_REASON; + +const char *x509_crl_reason_name(int reason); +int x509_crl_reason_from_name(int *reason, const char *name); +int x509_crl_reason_to_der(int reason, uint8_t **out, size_t *outlen); +int x509_crl_reason_from_der(int *reason, const uint8_t **in, size_t *inlen); +int x509_implicit_crl_reason_from_der(int index, int *reason, const uint8_t **in, size_t *inlen); + +/* +CRL Entry Extensions: + OID_ce_crl_reasons ENUMERATED non-critical + OID_ce_invalidity_date GeneralizedTime non-critical + OID_ce_certificate_issuer GeneralNames MUST critical +*/ +const char *x509_crl_entry_ext_id_name(int oid); +int x509_crl_entry_ext_id_from_name(const char *name); +int x509_crl_entry_ext_id_to_der(int oid, uint8_t **out, size_t *outlen); +int x509_crl_entry_ext_id_from_der(int *oid, const uint8_t **in, size_t *inlen); + +int x509_crl_entry_ext_to_der(int oid, int critical, const uint8_t *val, size_t vlen, uint8_t **out, size_t *outlen); +int x509_crl_entry_ext_from_der(int *oid, int *critical, const uint8_t **val, size_t *vlen, const uint8_t **in, size_t *inlen); +int x509_crl_entry_ext_critical_check(int oid, int critical); +int x509_crl_entry_ext_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int x509_crl_reason_ext_to_der(int critical, int reason, uint8_t **out, size_t *outlen); +int x509_invalidity_date_ext_to_der(int critical, time_t date, uint8_t **out, size_t *outlen); +int x509_cert_issuer_ext_to_der(int critical, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_crl_entry_ext_from_der_ex(int *oid, int *critical, + int *reason, time_t *invalid_date, const uint8_t **cert_issuer, size_t *cert_issuer_len, + const uint8_t **in, size_t *inlen); + +int x509_crl_entry_exts_to_der( + int reason, time_t invalid_date, const uint8_t *cert_issuer, size_t cert_issuer_len, + uint8_t **out, size_t *outlen); +int x509_crl_entry_exts_from_der( + int *reason, time_t *invalid_date, const uint8_t **cert_issuer, size_t *cert_issuer_len, + const uint8_t **in, size_t *inlen); +int x509_crl_entry_exts_get(const uint8_t *d, size_t dlen, + int *reason, time_t *invalid_date, const uint8_t **cert_issuer, size_t *cert_issuer_len); +int x509_crl_entry_exts_check(const uint8_t *d, size_t dlen); +int x509_crl_entry_exts_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +RevokedCertificate ::= SEQUENCE { + userCertificate CertificateSerialNumber, + revocationDate Time, + crlEntryExtensions Extensions OPTIONAL } +*/ +int x509_revoked_cert_to_der( + const uint8_t *serial, size_t serial_len, time_t revoke_date, + const uint8_t *crl_entry_exts, size_t crl_entry_exts_len, + uint8_t **out, size_t *outlen); +int x509_revoked_cert_from_der( + const uint8_t **serial, size_t *serial_len, time_t *revoke_date, + const uint8_t **crl_entry_exts, size_t *crl_entry_exts_len, + const uint8_t **in, size_t *inlen); +int x509_revoked_cert_to_der_ex( + const uint8_t *serial, size_t serial_len, time_t revoke_date, + int reason, time_t invalid_date, const uint8_t *cert_issuer, size_t cert_issuer_len, + uint8_t **out, size_t *outlen); +int x509_revoked_cert_from_der_ex( + const uint8_t **serial, size_t *serial_len, time_t *revoke_date, + int *reason, time_t *invalid_date, const uint8_t **cert_issuer, size_t *cert_issuer_len, + const uint8_t **in, size_t *inlen); +int x509_revoked_cert_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int x509_cert_revoke_to_der(const uint8_t *cert, size_t certlen, + time_t revoke_date, int reason, time_t invalid_date, const uint8_t *cert_issuer, size_t cert_issuer_len, + uint8_t **out, size_t *outlen); + +/* +RevokedCertificates ::= SEQUENCE OF RevokedCertificate +*/ +int x509_revoked_certs_find_revoked_cert_by_serial_number(const uint8_t *d, size_t dlen, + const uint8_t *serial, size_t serial_len, time_t *revoke_date, + const uint8_t **crl_entry_exts, size_t *crl_entry_exts_len); +int x509_revoked_certs_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +CRL Extensions: + OID_ce_authority_key_identifier AuthorityKeyIdentifier critical or non-critical + OID_ce_issuer_alt_name GeneralNames SHOULD non-critical + OID_ce_crl_number INTEGER MUST non-critical + OID_ce_delta_crl_indicator INTEGER MUST critical + OID_ce_issuing_distribution_point IssuingDistributionPoint critical + OID_ce_freshest_crl CRLDistributionPoints MUST non-critical + OID_pe_authority_info_access AccessDescriptions MUST non-critical +*/ +const char *x509_crl_ext_id_name(int oid); +int x509_crl_ext_id_from_name(const char *name); +int x509_crl_ext_id_to_der(int oid, uint8_t **out, size_t *outlen); +int x509_crl_ext_id_from_der(int *oid, const uint8_t **in, size_t *inlen); +int x509_crl_ext_id_from_der_ex(int *oid, uint32_t *nodes, size_t *nodes_cnt, const uint8_t **in, size_t *inlen); + +/* +IssuingDistributionPoint ::= SEQUENCE { + distributionPoint [0] EXPLICIT DistributionPointName OPTIONAL, + onlyContainsUserCerts [1] IMPLICIT BOOLEAN DEFAULT FALSE, + onlyContainsCACerts [2] IMPLICIT BOOLEAN DEFAULT FALSE, + onlySomeReasons [3] IMPLICIT ReasonFlags OPTIONAL, + indirectCRL [4] IMPLICIT BOOLEAN DEFAULT FALSE, + onlyContainsAttributeCerts [5] IMPLICIT BOOLEAN DEFAULT FALSE } +*/ +int x509_issuing_distribution_point_to_der( + const char *dist_point_uri, size_t dist_point_uri_len, + int only_contains_user_certs, + int only_contains_ca_certs, + int only_some_reasons, + int indirect_crl, + int only_contains_attr_certs, + uint8_t **out, size_t *outlen); +int x509_issuing_distribution_point_from_der( + int *dist_point_choice, const uint8_t **dist_point, size_t *dist_point_len, + int *only_contains_user_certs, + int *only_contains_ca_certs, + int *only_some_reasons, + int *indirect_crl, + int *only_contains_attr_certs, + const uint8_t **in, size_t *inlen); +int x509_issuing_distribution_point_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int x509_crl_ext_to_der(int oid, int critical, const uint8_t *val, size_t vlen, uint8_t **out, size_t *outlen); +int x509_crl_ext_from_der_ex(int *oid, uint32_t *nodes, size_t *nodes_cnt, + int *critical, const uint8_t **val, size_t *vlen, + const uint8_t **in, size_t *inlen); +int x509_crl_ext_critical_check(int oid, int critical); +int x509_crl_ext_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +int x509_crl_exts_add_authority_key_identifier( + uint8_t *exts, size_t *extslen, size_t maxlen, + int critical, + const uint8_t *keyid, size_t keyid_len, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial, size_t serial_len); +int x509_crl_exts_add_default_authority_key_identifier(uint8_t *exts, size_t *extslen, size_t maxlen, + const SM2_KEY *public_key); +int x509_crl_exts_add_issuer_alt_name( + uint8_t *exts, size_t *extslen, size_t maxlen, + int critical, + const uint8_t *d, size_t dlen); +int x509_crl_exts_add_crl_number_ex( + uint8_t *exts, size_t *extslen, size_t maxlen, + int oid, int critical, int num); +int x509_crl_exts_add_crl_number( + uint8_t *exts, size_t *extslen, size_t maxlen, + int critical, + int num); +int x509_crl_exts_add_delta_crl_indicator( + uint8_t *exts, size_t *extslen, size_t maxlen, + int critical, + int num); +int x509_crl_exts_add_issuing_distribution_point( + uint8_t *exts, size_t *extslen, size_t maxlen, + int critical, + const char *dist_point_uri, size_t dist_point_uri_len, + int only_contains_user_certs, + int only_contains_ca_certs, + int only_some_reasons, + int indirect_crl, + int only_contains_attr_certs); +int x509_crl_exts_add_freshest_crl( + uint8_t *exts, size_t *extslen, size_t maxlen, int critical, + const char *http_uri, size_t http_urilen, + const char *ldap_uri, size_t ldap_urilen); +int x509_crl_exts_add_authority_info_acess( + uint8_t *exts, size_t *extslen, size_t maxlen, int critical, + const char *ca_issuers_uri, size_t ca_issuers_urilen, + const char *ocsp_uri, size_t ocsp_urilen); + +#define x509_crl_exts_to_der(d,dlen,out,outlen) x509_explicit_exts_to_der(0,d,dlen,out,outlen) +#define x509_crl_exts_from_der(d,dlen,in,inlen) x509_explicit_exts_from_der(0,d,dlen,in,inlen) +int x509_crl_exts_check(const uint8_t *d, size_t dlen); +int x509_crl_exts_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +TBSCertList ::= SEQUENCE { + version INTEGER OPTIONAL, -- if present, MUST be v2 + signature AlgorithmIdentifier, + issuer Name, + thisUpdate Time, + nextUpdate Time OPTIONAL, + revokedCertificates RevokedCertificates OPTIONAL, + crlExtensions [0] EXPLICIT Extensions OPTIONAL, -- if present, MUST be v2 } +*/ +int x509_tbs_crl_to_der( + int version, + int signature_algor, + const uint8_t *issuer, size_t issuer_len, + time_t this_update, + time_t next_update, + const uint8_t *revoked_certs, size_t revoked_certs_len, + const uint8_t *exts, size_t exts_len, + uint8_t **out, size_t *outlen); +int x509_tbs_crl_from_der( + int *version, + int *signature_algor, + const uint8_t **issuer, size_t *issuer_len, + time_t *this_update, + time_t *next_update, + const uint8_t **revoked_certs, size_t *revoked_certs_len, + const uint8_t **exts, size_t *exts_len, + const uint8_t **in, size_t *inlen); +int x509_tbs_crl_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +CertificateList ::= SEQUENCE { + tbsCertList TBSCertList, + signatureAlgorithm AlgorithmIdentifier, + signatureValue BIT STRING } +*/ +int x509_crl_to_der(const uint8_t *a, size_t alen, uint8_t **out, size_t *outlen); +int x509_crl_from_der(const uint8_t **a, size_t *alen, const uint8_t **in, size_t *inlen); +int x509_crl_to_pem(const uint8_t *a, size_t alen, FILE *fp); +int x509_crl_from_pem(uint8_t *a, size_t *alen, size_t maxlen, FILE *fp); +int x509_crl_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *a, size_t alen); + + +int x509_crl_sign_to_der( + int version, int sig_alg, + const uint8_t *issuer, size_t issuer_len, + time_t this_update, time_t next_update, + const uint8_t *revoked_certs, size_t revoked_certs_len, + const uint8_t *crl_exts, size_t crl_exts_len, + const SM2_KEY *sign_key, const char *signer_id, size_t signer_id_len, + uint8_t **out, size_t *outlen); +int x509_crl_from_der_ex( + int *version, + int *inner_sig_alg, + const uint8_t **issuer, size_t *issuer_len, + time_t *this_update, time_t *next_update, + const uint8_t **revoked_certs, size_t *revoked_certs_len, + const uint8_t **exts, size_t *exts_len, + int *sig_alg, const uint8_t **sig, size_t *siglen, + const uint8_t **in, size_t *inlen); +int x509_crl_check(const uint8_t *a, size_t alen, time_t now); +int x509_crl_verify(const uint8_t *a, size_t alen, + const SM2_KEY *sign_pub_key, const char *signer_id, size_t signer_id_len); +int x509_crl_verify_by_ca_cert(const uint8_t *a, size_t alen, const uint8_t *cacert, size_t cacertlen, + const char *signer_id, size_t signer_id_len); +int x509_crl_get_details(const uint8_t *crl, size_t crl_len, + int *version, + int *inner_sig_alg, + const uint8_t **issuer, size_t *issuer_len, + time_t *this_update, + time_t *next_update, + const uint8_t **revoked_certs, size_t *revoked_certs_len, + const uint8_t **exts, size_t *exts_len, + int *signature_algor, + const uint8_t **sig, size_t *siglen); +int x509_crl_get_issuer(const uint8_t *crl, size_t crl_len, + const uint8_t **issuer, size_t *issuer_len); +int x509_crl_get_revoked_certs(const uint8_t *a, size_t alen, const uint8_t **d, size_t *dlen); +int x509_crl_find_revoked_cert_by_serial_number(const uint8_t *a, size_t alen, + const uint8_t *serial, size_t serial_len, time_t *revoke_date, + const uint8_t **entry_exts, size_t *entry_exts_len); + +int x509_crls_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int x509_crl_new_from_uri(uint8_t **crl, size_t *crl_len, const char *uri, size_t urilen); +int x509_crl_new_from_cert(uint8_t **crl, size_t *crl_len, const uint8_t *cert, size_t certlen); +int x509_cert_check_crl(const uint8_t *cert, size_t certlen, const uint8_t *cacert, size_t cacertlen, + const char *ca_signer_id, size_t ca_signer_id_len); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_ext.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_ext.h new file mode 100644 index 0000000..1b9600e --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_ext.h @@ -0,0 +1,641 @@ +/* + * Copyright 2014-2023 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_X509_EXT_H +#define GMSSL_X509_EXT_H + + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +enum { + X509_non_critical = 0, + X509_critical = 1, +}; + +/* +Extensions: + + 1. AuthorityKeyIdentifier SEQUENCE AuthorityKeyIdentifier MUST non-critical + 2. SubjectKeyIdentifier OCTET STRING MUST non-critical + 3. KeyUsage BIT STRING SHOULD critical + 4. CertificatePolicies SEQUENCE OF SEQUENCE CertificatePolicies + 5. PolicyMappings SEQUENCE OF SEQUENCE PolicyMappings SHOULD critical + 6. SubjectAltName SEQUENCE OF SEQUENCE GeneralNames SHOULD non-critical + 7. IssuerAltName SEQUENCE OF SEQUENCE GeneralNames SHOULD non-critical + 8. SubjectDirectoryAttributes SEQUENCE OF SEQUENCE Attributes MUST non-critical + 9. BasicConstraints SEQUENCE BasicConstraints CA: MUST critical, End-entity: MAY critical or non-critical + 10. NameConstraints SEQUENCE NameConstraints + 11. PolicyConstraints SEQUENCE PolicyConstraints MUST critical + 12. ExtKeyUsageSyntax SEQUENCE OF OBJECT IDENTIFIER MAY critical or non-critical + 13. CRLDistributionPoints SEQUENCE OF SEQUENCE DistributionPoints + 14. InhibitAnyPolicy INTEGER MUST critical + 15. FreshestCRL SEQUENCE OF SEQUENCE DistributionPoints MUST non-critical +*/ + +int x509_exts_add_authority_key_identifier(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, + const uint8_t *keyid, size_t keyid_len, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial, size_t serial_len); +int x509_exts_add_default_authority_key_identifier(uint8_t *exts, size_t *extslen, size_t maxlen, + const SM2_KEY *public_key); +int x509_exts_add_subject_key_identifier(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const uint8_t *d, size_t dlen); +int x509_exts_add_subject_key_identifier_ex(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const SM2_KEY *subject_key); +int x509_exts_add_key_usage(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, int bits); +int x509_exts_add_certificate_policies(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const uint8_t *d, size_t dlen); +int x509_exts_add_policy_mappings(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const uint8_t *d, size_t dlen); +int x509_exts_add_subject_alt_name(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const uint8_t *d, size_t dlen); +int x509_exts_add_issuer_alt_name(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const uint8_t *d, size_t dlen); +int x509_exts_add_subject_directory_attributes(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const uint8_t *d, size_t dlen); +int x509_exts_add_name_constraints(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, + const uint8_t *permitted_subtrees, size_t permitted_subtrees_len, + const uint8_t *excluded_subtrees, size_t excluded_subtrees_len); +int x509_exts_add_policy_constraints(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, + int require_explicit_policy, int inhibit_policy_mapping); +int x509_exts_add_basic_constraints(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, int ca, int path_len_constraint); +int x509_exts_add_ext_key_usage(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const int *key_purposes, size_t key_purposes_cnt); +int x509_exts_add_crl_distribution_points_ex(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, int oid, + const char *http_uri, size_t http_urilen, const char *ldap_uri, size_t ldap_urilen); +int x509_exts_add_crl_distribution_points(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, + const char *http_uri, size_t http_urilen, const char *ldap_uri, size_t ldap_urilen); +int x509_exts_add_inhibit_any_policy(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, int skip_certs); +int x509_exts_add_freshest_crl(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, const uint8_t *d, size_t dlen); +int x509_exts_add_authority_info_access(uint8_t *exts, size_t *extslen, size_t maxlen, int critical, + const char *ca_issuers_uri, size_t ca_issuers_urilen, // ca_issuers_uri is the URI (http://examaple.com/subCA.crt) of DER-encoded CA cert + const char *ocsp_uri, size_t ocsp_urilen); + +int x509_exts_add_sequence(uint8_t *exts, size_t *extslen, size_t maxlen, + int oid, int critical, const uint8_t *d, size_t dlen); + +/* +OtherName ::= SEQUENCE { + type-id OBJECT IDENTIFIER, -- known oid from x509_rdn_oid such as OID_at_common_name, or oid nodes + value [0] EXPLICIT ANY DEFINED BY type-id } +*/ +int x509_other_name_to_der( + const uint32_t *nodes, size_t nodes_count, + const uint8_t *value, size_t value_len, + uint8_t **out, size_t *outlen); +int x509_other_name_from_der( + uint32_t *nodes, size_t *nodes_count, + const uint8_t **value, size_t *valuelen, + const uint8_t **in, size_t *inlen); +int x509_other_name_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +EDIPartyName ::= SEQUENCE { + nameAssigner [0] EXPLICIT DirectoryString OPTIONAL, + partyName [1] EXPLICIT DirectoryString } +*/ +int x509_edi_party_name_to_der( + int assigner_tag, const uint8_t *assigner, size_t assigner_len, + int party_name_tag, const uint8_t *party_name, size_t party_name_len, + uint8_t **out, size_t *outlen); +int x509_edi_party_name_from_der( + int *assigner_tag, const uint8_t **assigner, size_t *assigner_len, + int *party_name_tag, const uint8_t **party_name, size_t *party_name_len, + const uint8_t **in, size_t *inlen); +int x509_edi_party_name_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +GeneralName ::= CHOICE { + otherName [0] IMPLICIT OtherName, -- Only in GeneralName + rfc822Name [1] IMPLICIT IA5String, + dNSName [2] IMPLICIT IA5String, + x400Address [3] IMPLICIT ORAddress, + directoryName [4] IMPLICIT Name, -- SEQENCE OF + ediPartyName [5] IMPLICIT EDIPartyName, -- Only in GeneralName + uniformResourceIdentifier [6] IMPLICIT IA5String, + iPAddress [7] IMPLICIT OCTET STRING, -- 4 bytes or string? + registeredID [8] IMPLICIT OBJECT IDENTIFIER } +*/ +typedef enum { + X509_gn_other_name = 0, + X509_gn_rfc822_name = 1, + X509_gn_dns_name = 2, + X509_gn_x400_address = 3, + X509_gn_directory_name = 4, + X509_gn_edi_party_name = 5, + X509_gn_uniform_resource_identifier = 6, + X509_gn_ip_address = 7, + X509_gn_registered_id = 8, +} X509_GENERAL_NAME_CHOICE; + +int x509_general_name_to_der(int choice, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_general_name_from_der(int *choice, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int x509_general_name_print(FILE *fp, int fmt, int ind, const char *label, int choice, const uint8_t *d, size_t dlen); + +/* +GeneralNames ::= SEQUENCE OF GeneralName +*/ +#define x509_general_names_to_der(d,dlen,out,outlen) asn1_sequence_to_der(d,dlen,out,outlen) +#define x509_general_names_from_der(d,dlen,in,inlen) asn1_sequence_from_der(d,dlen,in,inlen) +int x509_general_names_add_general_name(uint8_t *gns, size_t *gnslen, size_t maxlen, + int choice, const uint8_t *d, size_t dlen); +int x509_general_names_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int x509_general_names_add_other_name(uint8_t *gns, size_t *gnslen, size_t maxlen, + const uint32_t *nodes, size_t nodes_count, + const uint8_t *value, size_t value_len); +#define x509_general_names_add_rfc822_name(a,alen,maxlen,s) x509_general_names_add_general_name(a,alen,maxlen,X509_gn_rfc822_name,(uint8_t*)s,strlen(s)) +#define x509_general_names_add_dns_name(a,alen,maxlen,s) x509_general_names_add_general_name(a,alen,maxlen,X509_gn_dns_name,(uint8_t*)s,strlen(s)) +#define x509_general_names_add_x400_address(a,alen,maxlen,d,dlen) x509_general_names_add_general_name(a,alen,maxlen,X509_gn_x400_address,d,dlen) +#define x509_general_names_add_directory_name(a,alen,maxlen,d,dlen) x509_general_names_add_general_name(a,alen,maxlen,X509_gn_directory_name,d,dlen) +int x509_general_names_add_edi_party_name(uint8_t *gns, size_t *gnslen, size_t maxlen, + int assigner_tag, const uint8_t *assigner, size_t assigner_len, + int party_name_tag, const uint8_t *party_name, size_t party_name_len); +#define x509_general_names_add_uniform_resource_identifier(a,alen,maxlen,s) x509_general_names_add_general_name(a,alen,maxlen,X509_gn_uniform_resource_identifier,(uint8_t*)s,strlen(s)) +#define x509_general_names_add_ip_address(a,alen,maxlen,s) x509_general_names_add_general_name(a,alen,maxlen,X509_gn_ip_address,(uint8_t*)s,strlen(s)) +int x509_general_names_add_registered_id(uint8_t *gns, size_t *gnslen, size_t maxlen, + const uint32_t *nodes, size_t nodes_cnt); + +int x509_uri_as_general_names_to_der_ex(int tag, const char *uri, size_t urilen, uint8_t **out, size_t *outlen); +#define x509_uri_as_general_names_to_der(uri,urilen,out,outlen) x509_uri_as_general_names_to_der_ex(ASN1_TAG_SEQUENCE,uri,urilen,out,outlen) + +/* +AuthorityKeyIdentifier ::= SEQUENCE { + keyIdentifier [0] IMPLICIT OCTET STRING OPTIONAL, + authorityCertIssuer [1] IMPLICIT GeneralNames OPTIONAL, + authorityCertSerialNumber [2] IMPLICIT INTEGER OPTIONAL } +*/ +int x509_authority_key_identifier_to_der( + const uint8_t *keyid, size_t keyid_len, + const uint8_t *issuer, size_t issuer_len, + const uint8_t *serial, size_t serial_len, + uint8_t **out, size_t *outlen); +int x509_authority_key_identifier_from_der( + const uint8_t **keyid, size_t *keyid_len, + const uint8_t **issuer, size_t *issuer_len, + const uint8_t **serial, size_t *serial_len, + const uint8_t **in, size_t *inlen); +int x509_authority_key_identifier_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +SubjectKeyIdentifier ::= OCTET STRING +*/ +#define X509_SUBJECT_KEY_IDENTIFIER_MIN_LEN 16 +#define X509_SUBJECT_KEY_IDENTIFIER_MAX_LEN 64 + +/* +KeyUsage ::= BIT STRING { + digitalSignature (0), + nonRepudiation (1), -- recent renamed contentCommitment + keyEncipherment (2), + dataEncipherment (3), + keyAgreement (4), + keyCertSign (5), + cRLSign (6), + encipherOnly (7), + decipherOnly (8) } +*/ +#define X509_KU_DIGITAL_SIGNATURE (1 << 0) +#define X509_KU_NON_REPUDIATION (1 << 1) +#define X509_KU_KEY_ENCIPHERMENT (1 << 2) +#define X509_KU_DATA_ENCIPHERMENT (1 << 3) +#define X509_KU_KEY_AGREEMENT (1 << 4) +#define X509_KU_KEY_CERT_SIGN (1 << 5) +#define X509_KU_CRL_SIGN (1 << 6) +#define X509_KU_ENCIPHER_ONLY (1 << 7) +#define X509_KU_DECIPHER_ONLY (1 << 8) + +const char *x509_key_usage_name(int flag); +int x509_key_usage_from_name(int *flag, const char *name); +#define x509_key_usage_to_der(bits,out,outlen) asn1_bits_to_der(bits,out,outlen) +#define x509_key_usage_from_der(bits,in,inlen) asn1_bits_from_der(bits,in,inlen) +int x509_key_usage_check(int bits, int cert_type); +int x509_key_usage_print(FILE *fp, int fmt, int ind, const char *label, int bits); + +/* +DisplayText ::= CHOICE { + ia5String IA5String (SIZE (1..200)), + visibleString VisibleString (SIZE (1..200)), + bmpString BMPString (SIZE (1..200)), + utf8String UTF8String (SIZE (1..200)) +} +*/ +#define X509_DISPLAY_TEXT_MIN_LEN 1 +#define X509_DISPLAY_TEXT_MAX_LEN 200 + +int x509_display_text_check(int tag, const uint8_t *d, size_t dlen); +int x509_display_text_to_der(int tag, const uint8_t *d, size_t dlen, uint8_t **out, size_t *outlen); +int x509_display_text_from_der(int *tag, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int x509_display_text_print(FILE *fp, int fmt, int ind, const char *label, int tag, const uint8_t *d, size_t dlen); + +/* +NoticeReference ::= SEQUENCE { + organization DisplayText, + noticeNumbers SEQUENCE OF INTEGER } + +UserNotice ::= SEQUENCE { + noticeRef NoticeReference OPTIONAL, + explicitText DisplayText OPTIONAL } +*/ +#define X509_MAX_NOTICE_NUMBERS 32 + +int x509_notice_reference_to_der( + int org_tag, const uint8_t *org, size_t org_len, + const int *notice_numbers, size_t notice_numbers_cnt, + uint8_t **out, size_t *outlen); +int x509_notice_reference_from_der( + int *org_tag, const uint8_t **org, size_t *org_len, + int *notice_numbers, size_t *notice_numbers_cnt, size_t max_notice_numbers, + const uint8_t **in, size_t *inlen); +int x509_notice_reference_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int x509_user_notice_to_der( + int notice_ref_org_tag, const uint8_t *notice_ref_org, size_t notice_ref_org_len, + const int *notice_ref_notice_numbers, size_t notice_ref_notice_numbers_cnt, + int explicit_text_tag, const uint8_t *explicit_text, size_t explicit_text_len, + uint8_t **out, size_t *outlen); +int x509_user_notice_from_der( + int *notice_ref_org_tag, const uint8_t **notice_ref_org, size_t *notice_ref_org_len, + int *notice_ref_notice_numbers, size_t *notice_ref_notice_numbers_cnt, size_t max_notice_ref_notice_numbers, + int *explicit_text_tag, const uint8_t **explicit_text, size_t *explicit_text_len, + const uint8_t **in, size_t *inlen); +int x509_user_notice_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +PolicyQualifierInfo ::= SEQUENCE { + policyQualifierId PolicyQualifierId, + qualifier ANY DEFINED BY policyQualifierId } + +id-qt + OID_qt_cps + OID_qt_unotice + + switch(policyQualifierId) + case id-qt-cps : qualifier ::= IA5String + case id-qt-unotice : qualifier ::= UserNotice +*/ +const char *x509_qualifier_id_name(int oid); +int x509_qualifier_id_from_name(const char *name); +int x509_qualifier_id_from_der(int *oid, const uint8_t **in, size_t *inlen); +int x509_qualifier_id_to_der(int oid, uint8_t **out, size_t *outlen); + +int x509_policy_qualifier_info_to_der( + int oid, + const uint8_t *qualifier, size_t qualifier_len, + uint8_t **out, size_t *outlen); +int x509_policy_qualifier_info_from_der( + int *oid, + const uint8_t **qualifier, size_t *qualifier_len, + const uint8_t **in, size_t *inlen); +int x509_policy_qualifier_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +#define x509_policy_qualifier_infos_to_der(d,dlen,out,outlen) asn1_sequence_to_der(d,dlen,out,outlen) +#define x509_policy_qualifier_infos_from_der(d,dlen,in,ineln) asn1_sequence_from_der(d,dlen,in,inlen) +int x509_policy_qualifier_infos_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +PolicyInformation ::= SEQUENCE { + policyIdentifier CertPolicyId, + policyQualifiers SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo OPTIONAL } + +CertPolicyId ::= OBJECT IDENTIFIER -- undefined + + OID_any_policy +*/ +char *x509_cert_policy_id_name(int oid); +int x509_cert_policy_id_from_name(const char *name); +int x509_cert_policy_id_from_der(int *oid, uint32_t *nodes, size_t *nodes_cnt, const uint8_t **in, size_t *inlen); +int x509_cert_policy_id_to_der(int oid, const uint32_t *nodes, size_t nodes_cnt, uint8_t **out, size_t *outlen); + +int x509_policy_information_to_der( + int policy_oid, const uint32_t *policy_nodes, size_t policy_nodes_cnt, + const uint8_t *qualifiers, size_t qualifiers_len, + uint8_t **out, size_t *outlen); +int x509_policy_information_from_der( + int *policy_oid, uint32_t *policy_nodes, size_t *policy_nodes_cnt, + const uint8_t **qualifiers, size_t *qualifiers_len, + const uint8_t **in, size_t *inlen); +int x509_policy_information_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +CertificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation +*/ +int x509_certificate_policies_add_policy_information(uint8_t *d, size_t *dlen, size_t maxlen, + int policy_oid, const uint32_t *policy_nodes, size_t policy_nodes_cnt, + const uint8_t *qualifiers, size_t qualifiers_len); +int x509_certificate_policies_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +#define x509_certificate_policies_to_der(d,dlen,out,outlen) asn1_sequence_to_der(d,dlen,out,outlen) +#define x509_certificate_policies_from_der(d,dlen,in,inlen) asn1_sequence_from_der(d,dlen,in,inlen) + +/* +PolicyMapping ::= SEQUENCE { + issuerDomainPolicy CertPolicyId, -- id-anyPolicy or other undefined + subjectDomainPolicy CertPolicyId } +*/ +int x509_policy_mapping_to_der( + int issuer_policy_oid, const uint32_t *issuer_policy_nodes, size_t issuer_policy_nodes_cnt, + int subject_policy_oid, const uint32_t *subject_policy_nodes, size_t subject_policy_nodes_cnt, + uint8_t **out, size_t *outlen); +int x509_policy_mapping_from_der( + int *issuer_policy_oid, uint32_t *issuer_policy_nodes, size_t *issuer_policy_nodes_cnt, + int *subject_policy_oid, uint32_t *subject_policy_nodes, size_t *subject_policy_nodes_cnt, + const uint8_t **in, size_t *inlen); +int x509_policy_mapping_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +PolicyMappings ::= SEQUENCE OF PolicyMapping +*/ +int x509_policy_mappings_add_policy_mapping(uint8_t *d, size_t *dlen, size_t maxlen, + int issuer_policy_oid, const uint32_t *issuer_policy_nodes, size_t issuer_policy_nodes_cnt, + int subject_policy_oid, const uint32_t *subject_policy_nodes, size_t subject_policy_nodes_cnt); +int x509_policy_mappings_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +#define x509_policy_mappings_to_der(d,dlen,out,outlen) asn1_sequence_to_der(d,dlen,out,outlen) +#define x509_policy_mappings_from_der(d,dlen,in,inlen) asn1_sequence_from_der(d,dlen,in,inlen) + +/* +SubjectAltName ::= GeneralNames +*/ +#define x509_subject_alt_name_print(fp,fmt,ind,label,d,dlen) x509_general_names_print(fp,fmt,ind,label,d,dlen) + +/* +IssuerAltName ::= GeneralNames +*/ +#define x509_issuer_alt_name_print(fp,fmt,ind,label,d,dlen) x509_general_names_print(fp,fmt,ind,label,d,dlen) + +/* +SubjectDirectoryAttributes ::= SEQUENCE OF Attribute + +Attribute ::= SEQUENCE { + type OBJECT IDENTIFIER, + values SET OF ANY } +*/ +int x509_attribute_to_der( + const uint32_t *nodes, size_t nodes_cnt, + const uint8_t *values, size_t values_len, + uint8_t **out, size_t *outlen); +int x509_attribute_from_der( + int *oid, uint32_t *nodes, size_t *nodes_cnt, + const uint8_t **values, size_t *values_len, + const uint8_t **in, size_t *inlen); +int x509_attribute_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int x509_attributes_add_attribute(uint8_t *d, size_t *dlen, size_t maxlen, + const uint32_t *nodes, size_t nodes_cnt, + const uint8_t *values, size_t values_len); +int x509_attributes_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +#define x509_attributes_to_der(d,dlen,out,outlen) asn1_sequence_to_der(d,dlen,out,outlen) +#define x509_attributes_from_der(d,dlen,in,inlen) asn1_sequence_from_der(d,dlen,in,inlen) + +/* +BasicConstraints ::= SEQUENCE { + cA BOOLEAN DEFAULT FALSE, + pathLenConstraint INTEGER (0..MAX) OPTIONAL } +*/ +#define X509_MAX_PATH_LEN_CONSTRAINT 6 +int x509_basic_constraints_to_der(int ca, int path_len_cons, uint8_t **out, size_t *outlen); +int x509_basic_constraints_from_der(int *ca, int *path_len_cons, const uint8_t **in, size_t *inlen); +int x509_basic_constraints_check(int ca, int path_len_cons, int cert_type); +int x509_basic_constraints_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +GeneralSubtree ::= SEQUENCE { + base GeneralName, + minimum [0] IMPLICIT BaseDistance DEFAULT 0, + maximum [1] IMPLICIT BaseDistance OPTIONAL } + +BaseDistance ::= INTEGER (0..MAX) +*/ +int x509_general_subtree_to_der( + int base_choice, const uint8_t *base, size_t base_len, + int minimum, int maximum, + uint8_t **out, size_t *outlen); +int x509_general_subtree_from_der( + int *base_choice, const uint8_t **base, size_t *base_len, + int *minimum, int *maximum, + const uint8_t **in, size_t *inlen); +int x509_general_subtree_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree +*/ +int x509_general_subtrees_add_general_subtree(uint8_t *d, size_t *dlen, size_t maxlen, + int base_choice, const uint8_t *base, size_t base_len, + int minimum, int maximum); +int x509_general_subtrees_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); +#define x509_general_subtrees_to_der(d,dlen,out,outlen) asn1_sequence_to_der(d,dlen,out,outlen) +#define x509_general_subtrees_from_der(d,dlen,in,inlen) asn1_sequence_from_der(d,dlen,in,inlen) + +/* +NameConstraints ::= SEQUENCE { + permittedSubtrees [0] GeneralSubtrees OPTIONAL, + excludedSubtrees [1] GeneralSubtrees OPTIONAL } +*/ +int x509_name_constraints_to_der( + const uint8_t *permitted_subtrees, size_t permitted_subtrees_len, + const uint8_t *excluded_subtrees, size_t excluded_subtrees_len, + uint8_t **out, size_t *outlen); +int x509_name_constraints_from_der( + const uint8_t **permitted_subtrees, size_t *permitted_subtrees_len, + const uint8_t **excluded_subtrees, size_t *excluded_subtrees_len, + const uint8_t **in, size_t *inlen); +int x509_name_constraints_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +PolicyConstraints ::= SEQUENCE { + requireExplicitPolicy [0] IMPLICIT SkipCerts OPTIONAL, + inhibitPolicyMapping [1] IMPLICIT SkipCerts OPTIONAL +} + +SkipCerts ::= INTEGER (0..MAX) +*/ +int x509_policy_constraints_to_der(int require_explicit_policy, int inhibit_policy_mapping, uint8_t **out, size_t *outlen); +int x509_policy_constraints_from_der(int *require_explicit_policy, int *inhibit_policy_mapping, const uint8_t **in, size_t *inlen); +int x509_policy_constraints_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId + +KeyPurposeId: + OID_any_extended_key_usage + id-kp + OID_kp_server_auth + OID_kp_client_auth + OID_kp_code_signing + OID_kp_email_protection + OID_kp_time_stamping + OID_kp_ocsp_signing +*/ +#define X509_MAX_KEY_PURPOSES 7 +const char *x509_key_purpose_name(int oid); +const char *x509_key_purpose_text(int oid); +int x509_key_purpose_from_name(const char *name); +int x509_key_purpose_from_der(int *oid, const uint8_t **in, size_t *inlen); +int x509_key_purpose_to_der(int oid, uint8_t **out, size_t *outlen); + +int x509_ext_key_usage_to_der(const int *oids, size_t oids_cnt, uint8_t **out, size_t *outlen); +int x509_ext_key_usage_from_der(int *oids, size_t *oids_cnt, size_t max_cnt, const uint8_t **in, size_t *inlen); +int x509_ext_key_usage_check(const int *oids, size_t oids_cnt, int cert_type); +int x509_ext_key_usage_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +ReasonFlags ::= BIT STRING { + unused (0), + keyCompromise (1), + cACompromise (2), + affiliationChanged (3), + superseded (4), + cessationOfOperation (5), + certificateHold (6), + privilegeWithdrawn (7), + aACompromise (8) } +*/ +#define X509_RF_UNUSED (1 << 0) +#define X509_RF_KEY_COMPROMISE (1 << 1) +#define X509_RF_CA_COMPROMISE (1 << 2) +#define X509_RF_AFFILIATION_CHANGED (1 << 3) +#define X509_RF_SUPERSEDED (1 << 4) +#define X509_RF_CESSATION_OF_OPERATION (1 << 5) +#define X509_RF_CERTIFICATE_HOLD (1 << 6) +#define X509_RF_PRIVILEGE_WITHDRAWN (1 << 7) +#define X509_RF_AA_COMPROMISE (1 << 8) + +const char *x509_revoke_reason_flag_name(int flag); +int x509_revoke_reason_flag_from_name(int *flag, const char *name); +#define x509_revoke_reason_flags_to_der(bits,out,outlen) asn1_bits_to_der(bits,out,outlen) +#define x509_revoke_reason_flags_from_der(bits,in,inlen) asn1_bits_from_der(bits,in,inlen) +int x509_revoke_reason_flags_print(FILE *fp, int fmt, int ind, const char *label, int bits); + +/* +DistributionPointName ::= CHOICE { + fullName [0] IMPLICIT GeneralNames, -- SEQUENCE OF + nameRelativeToCRLIssuer [1] IMPLICIT RelativeDistinguishedName } -- SET OF +*/ +enum { + X509_full_name = 0, + X509_name_relative_to_crl_issuer = 1, +}; + +int x509_uri_as_distribution_point_name_to_der(const char *uri, size_t urilen, uint8_t **out, size_t *outlen); +int x509_distribution_point_name_from_der(int *choice, const uint8_t **d, size_t *dlen, const uint8_t **in, size_t *inlen); +int x509_uri_as_distribution_point_name_from_der(const char **uri, size_t *urilen, const uint8_t **in, size_t *inlen); +int x509_distribution_point_name_print(FILE *fp, int fmt, int ind, const char *label,const uint8_t *a, size_t alen); + +int x509_uri_as_explicit_distribution_point_name_to_der(int index, const char *uri, size_t urilen, uint8_t **out, size_t *outlen); +int x509_uri_as_explicit_distribution_point_name_from_der(int index, const char **uri, size_t *urilen, const uint8_t **in, size_t *inlen); + +/* +DistributionPoint ::= SEQUENCE { + distributionPoint [0] EXPLICIT DistributionPointName OPTIONAL, + reasons [1] IMPLICIT ReasonFlags OPTIONAL, + cRLIssuer [2] IMPLICIT GeneralNames OPTIONAL } +*/ +int x509_uri_as_distribution_point_to_der(const char *uri, size_t urilen, + int reasons, const uint8_t *crl_issuer, size_t crl_issuer_len, + uint8_t **out, size_t *outlen); +int x509_uri_as_distribution_point_from_der(const char **uri, size_t *urilen, + int *reasons, const uint8_t **crl_issuer, size_t *crl_issuer_len, + const uint8_t **in, size_t *inlen); +int x509_distribution_point_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +DistributionPoints ::= SEQUENCE OF DistributionPoint +*/ +int x509_uri_as_distribution_points_to_der(const char *uri, size_t urilen, + int reasons, const uint8_t *crl_issuer, size_t crl_issuer_len, + uint8_t **out, size_t *outlen); +int x509_uri_as_distribution_points_from_der(const char **uri, size_t *urilen, + int *reasons, const uint8_t **crl_issuer, size_t *crl_issuer_len, + const uint8_t **in, size_t *inlen); +int x509_distribution_points_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +/* +CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint +*/ +#define x509_crl_distribution_points_to_der(d,dlen,out,outlen) x509_distribution_points_to_der(d,dlen,out,outlen) +#define x509_crl_distribution_points_from_der(d,dlen,in,inlen) x509_distribution_points_from_der(d,dlen,in,inlen) +#define x509_crl_distribution_points_print(fp,fmt,ind,label,d,dlen) x509_distribution_points_print(fp,fmt,ind,label,d,dlen) + + +/* +InhibitAnyPolicy ::= SkipCerts +SkipCerts ::= INTEGER (0..MAX) +*/ +#define x509_inhibit_any_policy_to_der(val,out,outlen) asn1_int_to_der(val,out,outlen) +#define x509_inhibit_any_policy_from_der(val,in,inlen) asn1_int_from_der(val,in,inlen) + +/* +FreshestCRL ::= CRLDistributionPoints + */ +#define x509_freshest_crl_to_der(d,dlen,out,outlen) x509_crl_distribution_points_to_der(d,dlen,out,outlen) +#define x509_freshest_crl_from_der(d,dlen,in,inlen) x509_crl_distribution_points_from_der(d,dlen,in,inlen) +#define x509_freshest_crl_print(fp,fmt,ind,label,d,dlen) x509_crl_distribution_points_print(fp,fmt,ind,label,d,dlen) + +/* +Netscape-Defined Certificate Extensions +https://docs.oracle.com/cd/E19957-01/816-5533-10/ext.htm#1023061 + +NetscapeCertType ::= BIT STRING + + bit 0: SSL Client certificate + bit 1: SSL Server certificate + bit 2: S/MIME certificate + bit 3: Object-signing certificate + bit 4: Reserved for future use + bit 5: SSL CA certificate + bit 6: S/MIME CA certificate + bit 7: Object-signing CA certificate + +NetscapeCertComment ::= IA5String +*/ +int x509_netscape_cert_type_print(FILE *fp, int fmt, int ind, const char *label, int bits); + +int x509_exts_check(const uint8_t *exts, size_t extslen, int cert_type, + int *path_len_constraints); + +/* +AuthorityInfoAccessSyntax ::= SEQUENCE OF AccessDescription + +AccessDescription ::= SEQUENCE { + accessMethod OBJECT IDENTIFIER, + accessLocation GeneralName } + +accessMethods: + OID_ad_ca_issuers + OID_ad_ocsp +*/ +const char *x509_access_method_name(int oid); +int x509_access_method_from_name(const char *name); +int x509_access_method_to_der(int oid, uint8_t **out, size_t *outlen); +int x509_access_method_from_der(int *oid, const uint8_t **in, size_t *inlen); + +int x509_access_description_to_der(int oid, const char *uri, size_t urilen, uint8_t **out, size_t *outlen); +int x509_access_description_from_der(int *oid, const char **uri, size_t *urilen, const uint8_t **in, size_t *inlen); +int x509_access_description_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +int x509_authority_info_access_to_der( + const char *ca_issuers_uri, size_t ca_issuers_urilen, + const char *ocsp_uri, size_t ocsp_urilen, + uint8_t **out, size_t *outlen); +int x509_authority_info_access_from_der( + const char **ca_issuers_uri, size_t *ca_issuers_urilen, + const char **ocsp_uri, size_t *ocsp_urilen, + const uint8_t **in, size_t *inlen); +int x509_authority_info_access_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_req.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_req.h new file mode 100644 index 0000000..1ac0f6c --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_req.h @@ -0,0 +1,81 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_X509_REQ_H +#define GMSSL_X509_REQ_H + + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +from RFC 2986 + +CertificationRequestInfo ::= SEQUENCE { + version INTEGER { v1(0) }, + subject Name, + subjectPKInfo SubjectPublicKeyInfo, + attributes [0] IMPLICIT SET OF Attribute } +*/ +int x509_request_info_to_der(int version, const uint8_t *subject, size_t subject_len, + const SM2_KEY *subject_public_key, const uint8_t *attrs, size_t attrs_len, + uint8_t **out, size_t *outlen); +int x509_request_info_from_der(int *version, const uint8_t **subject, size_t *subject_len, + SM2_KEY *subject_public_key, const uint8_t **attrs, size_t *attrs_len, + const uint8_t **in, size_t *inlen); +int x509_request_info_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *d, size_t dlen); + +/* +CertificationRequest ::= SEQUENCE { + certificationRequestInfo CertificationRequestInfo, + signatureAlgorithm AlgorithmIdentifier, + signature BIT STRING } +*/ +int x509_req_sign_to_der( + int version, + const uint8_t *subject, size_t subject_len, + const SM2_KEY *subject_public_key, + const uint8_t *attrs, size_t attrs_len, + int signature_algor, + const SM2_KEY *sign_key, const char *signer_id, size_t signer_id_len, + uint8_t **out, size_t *outlen); +int x509_req_verify(const uint8_t *req, size_t reqlen, + const char *signer_id, size_t signer_id_len); +int x509_req_get_details(const uint8_t *req, size_t reqlen, + int *verison, + const uint8_t **subject, size_t *subject_len, + SM2_KEY *subject_public_key, + const uint8_t **attributes, size_t *attributes_len, + int *signature_algor, + const uint8_t **signature, size_t *signature_len); +int x509_req_to_der(const uint8_t *a, size_t alen, uint8_t **out, size_t *outlen); +int x509_req_from_der(const uint8_t **a, size_t *alen, const uint8_t **in, size_t *inlen); +int x509_req_to_pem(const uint8_t *req, size_t reqlen, FILE *fp); +int x509_req_from_pem(uint8_t *req, size_t *reqlen, size_t maxlen, FILE *fp); +int x509_req_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *req, size_t reqlen); + +int x509_req_new_from_pem(uint8_t **req, size_t *reqlen, FILE *fp); +int x509_req_new_from_file(uint8_t **req, size_t *reqlen, const char *file); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/zuc.h b/gmssl_engine/GmSSL3.1.1/include/gmssl/zuc.h new file mode 100644 index 0000000..f0f839b --- /dev/null +++ b/gmssl_engine/GmSSL3.1.1/include/gmssl/zuc.h @@ -0,0 +1,147 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_ZUC_H +#define GMSSL_ZUC_H + + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* +ZUC Public API + + ZUC_KEY_SIZE + ZUC_IV_SIZE + ZUC_MAC_SIZE + + ZUC_CTX + zuc_encrypt_init + zuc_encrypt_update + zuc_encrypt_finish + zuc_decrypt_init + zuc_decrypt_update + zuc_decrypt_finish + + ZUC_MAC_CTX + zuc_mac_init + zuc_mac_update + zuc_mac_finish + + zuc_eea_encrypt + zuc_eia_generate_mac +*/ + + +# define ZUC_KEY_SIZE 16 +# define ZUC_IV_SIZE 16 +# define ZUC_MAC_SIZE 4 + +typedef uint32_t ZUC_BIT; +typedef uint32_t ZUC_UINT5; +typedef uint8_t ZUC_UINT6; +typedef uint32_t ZUC_UINT15; +typedef uint32_t ZUC_UINT31; +typedef uint32_t ZUC_UINT32; + +typedef struct { + ZUC_UINT31 LFSR[16]; + ZUC_UINT32 R1; + ZUC_UINT32 R2; +} ZUC_STATE; + +void zuc_init(ZUC_STATE *state, const uint8_t key[ZUC_KEY_SIZE], const uint8_t iv[ZUC_IV_SIZE]); +void zuc_generate_keystream(ZUC_STATE *state, size_t nwords, ZUC_UINT32 *words); +ZUC_UINT32 zuc_generate_keyword(ZUC_STATE *state); +void zuc_encrypt(ZUC_STATE *state, const uint8_t *in, size_t inlen, uint8_t *out); + +typedef struct ZUC_MAC_CTX_st { + ZUC_UINT31 LFSR[16]; + ZUC_UINT32 R1; + ZUC_UINT32 R2; + ZUC_UINT32 T; + ZUC_UINT32 K0; + uint8_t buf[4]; + size_t buflen; +} ZUC_MAC_CTX; + +void zuc_mac_init(ZUC_MAC_CTX *ctx, const uint8_t key[ZUC_KEY_SIZE], const uint8_t iv[ZUC_IV_SIZE]); +void zuc_mac_update(ZUC_MAC_CTX *ctx, const uint8_t *data, size_t len); +void zuc_mac_finish(ZUC_MAC_CTX *ctx, const uint8_t *data, size_t nbits, uint8_t mac[ZUC_MAC_SIZE]); + +#define ZUC_EEA_ENCRYPT_NWORDS(nbits) ((nbits + 31)/32) +#define ZUC_EEA_ENCRYPT_NBYTES(nbits) (ZUC_EEA_ENCRYPT_NWORDS(nbits)*4) +void zuc_eea_encrypt(const ZUC_UINT32 *in, ZUC_UINT32 *out, size_t nbits, + const uint8_t key[ZUC_KEY_SIZE], ZUC_UINT32 count, ZUC_UINT5 bearer, + ZUC_BIT direction); +ZUC_UINT32 zuc_eia_generate_mac(const ZUC_UINT32 *data, size_t nbits, + const uint8_t key[ZUC_KEY_SIZE], ZUC_UINT32 count, ZUC_UINT5 bearer, + ZUC_BIT direction); + + +# define ZUC256_KEY_SIZE 32 +# define ZUC256_IV_SIZE 23 +# define ZUC256_MAC32_SIZE 4 +# define ZUC256_MAC64_SIZE 8 +# define ZUC256_MAC128_SIZE 16 +# define ZUC256_MIN_MAC_SIZE ZUC256_MAC32_SIZE +# define ZUC256_MAX_MAC_SIZE ZUC256_MAC128_SIZE + +typedef ZUC_STATE ZUC256_STATE; + +void zuc256_init(ZUC256_STATE *state, const uint8_t key[ZUC256_KEY_SIZE], const uint8_t iv[ZUC256_IV_SIZE]); +#define zuc256_generate_keystream(state,nwords,words) zuc_generate_keystream(state,nwords,words) +#define zuc256_generate_keyword(state) zuc_generate_keyword(state) + + +typedef struct ZUC256_MAC_CTX_st { + ZUC_UINT31 LFSR[16]; + ZUC_UINT32 R1; + ZUC_UINT32 R2; + ZUC_UINT32 T[4]; + ZUC_UINT32 K0[4]; + uint8_t buf[4]; + size_t buflen; + int macbits; +} ZUC256_MAC_CTX; + +void zuc256_mac_init(ZUC256_MAC_CTX *ctx, const uint8_t key[ZUC256_KEY_SIZE], + const uint8_t iv[ZUC256_IV_SIZE], int macbits); +void zuc256_mac_update(ZUC256_MAC_CTX *ctx, const uint8_t *data, size_t len); +void zuc256_mac_finish(ZUC256_MAC_CTX *ctx, const uint8_t *data, size_t nbits, uint8_t mac[ZUC_MAC_SIZE]); + + +// Public API + +typedef struct { + ZUC_STATE zuc_state; + uint8_t block[4]; + size_t block_nbytes; +} ZUC_CTX; + +int zuc_encrypt_init(ZUC_CTX *ctx, const uint8_t key[ZUC_KEY_SIZE], const uint8_t iv[ZUC_IV_SIZE]); +int zuc_encrypt_update(ZUC_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen); +int zuc_encrypt_finish(ZUC_CTX *ctx, uint8_t *out, size_t *outlen); + +#define zuc_decrypt_init(ctx,key,iv) zuc_encrypt_init(ctx,key,iv) +#define zuc_decrypt_update(ctx,in,inlen,out,outlen) zuc_encrypt_update(ctx,in,inlen,out,outlen) +#define zuc_decrypt_finish(ctx,out,outlen) zuc_encrypt_finish(ctx,out,outlen) + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gmssl_engine/GmSSL3.1.1/lib/gmssl.lib b/gmssl_engine/GmSSL3.1.1/lib/gmssl.lib new file mode 100644 index 0000000000000000000000000000000000000000..6647dea63ba21dd734009a64844b9a0ed8826761 GIT binary patch literal 342666 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 literal 0 HcmV?d00001 From 93e6bf1f2b78b49e8c3c2483cd28ef2930768585 Mon Sep 17 00:00:00 2001 From: sureror Date: Mon, 15 Jan 2024 14:18:16 +0800 Subject: [PATCH 04/12] GmSSL --- gmssl_engine/{GmSSL3.1.1 => GmSSL}/bin/gmssl.dll | Bin gmssl_engine/{GmSSL3.1.1 => GmSSL}/bin/gmssl.exe | Bin .../{GmSSL3.1.1 => GmSSL}/include/gmssl/aead.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/aes.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/api.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/asn1.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/base64.h | 0 .../include/gmssl/block_cipher.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/chacha20.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/cms.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/des.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/digest.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/dylib.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/ec.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/endian.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/error.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/file.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/gcm.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/gf128.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/hash_drbg.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/hex.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/hkdf.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/hmac.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/http.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/md5.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/mem.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/oid.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/pbkdf2.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/pem.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/pkcs8.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/rand.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/rc4.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/rdrand.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/rsa.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sdf.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sha1.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sha2.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sha3.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/skf.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2_blind.h | 0 .../include/gmssl/sm2_commit.h | 0 .../include/gmssl/sm2_elgamal.h | 0 .../include/gmssl/sm2_key_share.h | 0 .../include/gmssl/sm2_recover.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2_ring.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm3.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm3_rng.h | 0 .../include/gmssl/sm3_x8_avx2.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm4.h | 0 .../include/gmssl/sm4_cbc_mac.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm4_cl.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm4_rng.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/sm9.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/socket.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/tls.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/version.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/x509.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_alg.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_cer.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_crl.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_ext.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_req.h | 0 .../{GmSSL3.1.1 => GmSSL}/include/gmssl/zuc.h | 0 gmssl_engine/{GmSSL3.1.1 => GmSSL}/lib/gmssl.lib | Bin 65 files changed, 0 insertions(+), 0 deletions(-) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/bin/gmssl.dll (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/bin/gmssl.exe (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/aead.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/aes.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/api.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/asn1.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/base64.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/block_cipher.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/chacha20.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/cms.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/des.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/digest.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/dylib.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/ec.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/endian.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/error.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/file.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/gcm.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/gf128.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/hash_drbg.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/hex.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/hkdf.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/hmac.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/http.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/md5.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/mem.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/oid.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/pbkdf2.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/pem.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/pkcs8.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/rand.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/rc4.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/rdrand.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/rsa.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sdf.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sha1.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sha2.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sha3.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/skf.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2_blind.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2_commit.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2_elgamal.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2_key_share.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2_recover.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm2_ring.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm3.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm3_rng.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm3_x8_avx2.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm4.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm4_cbc_mac.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm4_cl.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm4_rng.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/sm9.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/socket.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/tls.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/version.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/x509.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_alg.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_cer.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_crl.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_ext.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/x509_req.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/include/gmssl/zuc.h (100%) rename gmssl_engine/{GmSSL3.1.1 => GmSSL}/lib/gmssl.lib (100%) diff --git a/gmssl_engine/GmSSL3.1.1/bin/gmssl.dll b/gmssl_engine/GmSSL/bin/gmssl.dll similarity index 100% rename from gmssl_engine/GmSSL3.1.1/bin/gmssl.dll rename to gmssl_engine/GmSSL/bin/gmssl.dll diff --git a/gmssl_engine/GmSSL3.1.1/bin/gmssl.exe b/gmssl_engine/GmSSL/bin/gmssl.exe similarity index 100% rename from gmssl_engine/GmSSL3.1.1/bin/gmssl.exe rename to gmssl_engine/GmSSL/bin/gmssl.exe diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/aead.h b/gmssl_engine/GmSSL/include/gmssl/aead.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/aead.h rename to gmssl_engine/GmSSL/include/gmssl/aead.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/aes.h b/gmssl_engine/GmSSL/include/gmssl/aes.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/aes.h rename to gmssl_engine/GmSSL/include/gmssl/aes.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/api.h b/gmssl_engine/GmSSL/include/gmssl/api.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/api.h rename to gmssl_engine/GmSSL/include/gmssl/api.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/asn1.h b/gmssl_engine/GmSSL/include/gmssl/asn1.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/asn1.h rename to gmssl_engine/GmSSL/include/gmssl/asn1.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/base64.h b/gmssl_engine/GmSSL/include/gmssl/base64.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/base64.h rename to gmssl_engine/GmSSL/include/gmssl/base64.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/block_cipher.h b/gmssl_engine/GmSSL/include/gmssl/block_cipher.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/block_cipher.h rename to gmssl_engine/GmSSL/include/gmssl/block_cipher.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/chacha20.h b/gmssl_engine/GmSSL/include/gmssl/chacha20.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/chacha20.h rename to gmssl_engine/GmSSL/include/gmssl/chacha20.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/cms.h b/gmssl_engine/GmSSL/include/gmssl/cms.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/cms.h rename to gmssl_engine/GmSSL/include/gmssl/cms.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/des.h b/gmssl_engine/GmSSL/include/gmssl/des.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/des.h rename to gmssl_engine/GmSSL/include/gmssl/des.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/digest.h b/gmssl_engine/GmSSL/include/gmssl/digest.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/digest.h rename to gmssl_engine/GmSSL/include/gmssl/digest.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/dylib.h b/gmssl_engine/GmSSL/include/gmssl/dylib.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/dylib.h rename to gmssl_engine/GmSSL/include/gmssl/dylib.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/ec.h b/gmssl_engine/GmSSL/include/gmssl/ec.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/ec.h rename to gmssl_engine/GmSSL/include/gmssl/ec.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/endian.h b/gmssl_engine/GmSSL/include/gmssl/endian.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/endian.h rename to gmssl_engine/GmSSL/include/gmssl/endian.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/error.h b/gmssl_engine/GmSSL/include/gmssl/error.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/error.h rename to gmssl_engine/GmSSL/include/gmssl/error.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/file.h b/gmssl_engine/GmSSL/include/gmssl/file.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/file.h rename to gmssl_engine/GmSSL/include/gmssl/file.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/gcm.h b/gmssl_engine/GmSSL/include/gmssl/gcm.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/gcm.h rename to gmssl_engine/GmSSL/include/gmssl/gcm.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/gf128.h b/gmssl_engine/GmSSL/include/gmssl/gf128.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/gf128.h rename to gmssl_engine/GmSSL/include/gmssl/gf128.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/hash_drbg.h b/gmssl_engine/GmSSL/include/gmssl/hash_drbg.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/hash_drbg.h rename to gmssl_engine/GmSSL/include/gmssl/hash_drbg.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/hex.h b/gmssl_engine/GmSSL/include/gmssl/hex.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/hex.h rename to gmssl_engine/GmSSL/include/gmssl/hex.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/hkdf.h b/gmssl_engine/GmSSL/include/gmssl/hkdf.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/hkdf.h rename to gmssl_engine/GmSSL/include/gmssl/hkdf.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/hmac.h b/gmssl_engine/GmSSL/include/gmssl/hmac.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/hmac.h rename to gmssl_engine/GmSSL/include/gmssl/hmac.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/http.h b/gmssl_engine/GmSSL/include/gmssl/http.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/http.h rename to gmssl_engine/GmSSL/include/gmssl/http.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/md5.h b/gmssl_engine/GmSSL/include/gmssl/md5.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/md5.h rename to gmssl_engine/GmSSL/include/gmssl/md5.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/mem.h b/gmssl_engine/GmSSL/include/gmssl/mem.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/mem.h rename to gmssl_engine/GmSSL/include/gmssl/mem.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/oid.h b/gmssl_engine/GmSSL/include/gmssl/oid.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/oid.h rename to gmssl_engine/GmSSL/include/gmssl/oid.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/pbkdf2.h b/gmssl_engine/GmSSL/include/gmssl/pbkdf2.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/pbkdf2.h rename to gmssl_engine/GmSSL/include/gmssl/pbkdf2.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/pem.h b/gmssl_engine/GmSSL/include/gmssl/pem.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/pem.h rename to gmssl_engine/GmSSL/include/gmssl/pem.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/pkcs8.h b/gmssl_engine/GmSSL/include/gmssl/pkcs8.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/pkcs8.h rename to gmssl_engine/GmSSL/include/gmssl/pkcs8.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/rand.h b/gmssl_engine/GmSSL/include/gmssl/rand.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/rand.h rename to gmssl_engine/GmSSL/include/gmssl/rand.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/rc4.h b/gmssl_engine/GmSSL/include/gmssl/rc4.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/rc4.h rename to gmssl_engine/GmSSL/include/gmssl/rc4.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/rdrand.h b/gmssl_engine/GmSSL/include/gmssl/rdrand.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/rdrand.h rename to gmssl_engine/GmSSL/include/gmssl/rdrand.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/rsa.h b/gmssl_engine/GmSSL/include/gmssl/rsa.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/rsa.h rename to gmssl_engine/GmSSL/include/gmssl/rsa.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sdf.h b/gmssl_engine/GmSSL/include/gmssl/sdf.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sdf.h rename to gmssl_engine/GmSSL/include/gmssl/sdf.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sha1.h b/gmssl_engine/GmSSL/include/gmssl/sha1.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sha1.h rename to gmssl_engine/GmSSL/include/gmssl/sha1.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sha2.h b/gmssl_engine/GmSSL/include/gmssl/sha2.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sha2.h rename to gmssl_engine/GmSSL/include/gmssl/sha2.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sha3.h b/gmssl_engine/GmSSL/include/gmssl/sha3.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sha3.h rename to gmssl_engine/GmSSL/include/gmssl/sha3.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/skf.h b/gmssl_engine/GmSSL/include/gmssl/skf.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/skf.h rename to gmssl_engine/GmSSL/include/gmssl/skf.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2.h b/gmssl_engine/GmSSL/include/gmssl/sm2.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm2.h rename to gmssl_engine/GmSSL/include/gmssl/sm2.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_blind.h b/gmssl_engine/GmSSL/include/gmssl/sm2_blind.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_blind.h rename to gmssl_engine/GmSSL/include/gmssl/sm2_blind.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_commit.h b/gmssl_engine/GmSSL/include/gmssl/sm2_commit.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_commit.h rename to gmssl_engine/GmSSL/include/gmssl/sm2_commit.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_elgamal.h b/gmssl_engine/GmSSL/include/gmssl/sm2_elgamal.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_elgamal.h rename to gmssl_engine/GmSSL/include/gmssl/sm2_elgamal.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_key_share.h b/gmssl_engine/GmSSL/include/gmssl/sm2_key_share.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_key_share.h rename to gmssl_engine/GmSSL/include/gmssl/sm2_key_share.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_recover.h b/gmssl_engine/GmSSL/include/gmssl/sm2_recover.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_recover.h rename to gmssl_engine/GmSSL/include/gmssl/sm2_recover.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_ring.h b/gmssl_engine/GmSSL/include/gmssl/sm2_ring.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm2_ring.h rename to gmssl_engine/GmSSL/include/gmssl/sm2_ring.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3.h b/gmssl_engine/GmSSL/include/gmssl/sm3.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm3.h rename to gmssl_engine/GmSSL/include/gmssl/sm3.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_rng.h b/gmssl_engine/GmSSL/include/gmssl/sm3_rng.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_rng.h rename to gmssl_engine/GmSSL/include/gmssl/sm3_rng.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_x8_avx2.h b/gmssl_engine/GmSSL/include/gmssl/sm3_x8_avx2.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm3_x8_avx2.h rename to gmssl_engine/GmSSL/include/gmssl/sm3_x8_avx2.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4.h b/gmssl_engine/GmSSL/include/gmssl/sm4.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm4.h rename to gmssl_engine/GmSSL/include/gmssl/sm4.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cbc_mac.h b/gmssl_engine/GmSSL/include/gmssl/sm4_cbc_mac.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cbc_mac.h rename to gmssl_engine/GmSSL/include/gmssl/sm4_cbc_mac.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cl.h b/gmssl_engine/GmSSL/include/gmssl/sm4_cl.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_cl.h rename to gmssl_engine/GmSSL/include/gmssl/sm4_cl.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_rng.h b/gmssl_engine/GmSSL/include/gmssl/sm4_rng.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm4_rng.h rename to gmssl_engine/GmSSL/include/gmssl/sm4_rng.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/sm9.h b/gmssl_engine/GmSSL/include/gmssl/sm9.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/sm9.h rename to gmssl_engine/GmSSL/include/gmssl/sm9.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/socket.h b/gmssl_engine/GmSSL/include/gmssl/socket.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/socket.h rename to gmssl_engine/GmSSL/include/gmssl/socket.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/tls.h b/gmssl_engine/GmSSL/include/gmssl/tls.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/tls.h rename to gmssl_engine/GmSSL/include/gmssl/tls.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/version.h b/gmssl_engine/GmSSL/include/gmssl/version.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/version.h rename to gmssl_engine/GmSSL/include/gmssl/version.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509.h b/gmssl_engine/GmSSL/include/gmssl/x509.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/x509.h rename to gmssl_engine/GmSSL/include/gmssl/x509.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_alg.h b/gmssl_engine/GmSSL/include/gmssl/x509_alg.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/x509_alg.h rename to gmssl_engine/GmSSL/include/gmssl/x509_alg.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_cer.h b/gmssl_engine/GmSSL/include/gmssl/x509_cer.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/x509_cer.h rename to gmssl_engine/GmSSL/include/gmssl/x509_cer.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_crl.h b/gmssl_engine/GmSSL/include/gmssl/x509_crl.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/x509_crl.h rename to gmssl_engine/GmSSL/include/gmssl/x509_crl.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_ext.h b/gmssl_engine/GmSSL/include/gmssl/x509_ext.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/x509_ext.h rename to gmssl_engine/GmSSL/include/gmssl/x509_ext.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/x509_req.h b/gmssl_engine/GmSSL/include/gmssl/x509_req.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/x509_req.h rename to gmssl_engine/GmSSL/include/gmssl/x509_req.h diff --git a/gmssl_engine/GmSSL3.1.1/include/gmssl/zuc.h b/gmssl_engine/GmSSL/include/gmssl/zuc.h similarity index 100% rename from gmssl_engine/GmSSL3.1.1/include/gmssl/zuc.h rename to gmssl_engine/GmSSL/include/gmssl/zuc.h diff --git a/gmssl_engine/GmSSL3.1.1/lib/gmssl.lib b/gmssl_engine/GmSSL/lib/gmssl.lib similarity index 100% rename from gmssl_engine/GmSSL3.1.1/lib/gmssl.lib rename to gmssl_engine/GmSSL/lib/gmssl.lib From 697268031935c8ba212f472b1c02fa1848ee7f93 Mon Sep 17 00:00:00 2001 From: sureror Date: Mon, 15 Jan 2024 14:47:40 +0800 Subject: [PATCH 05/12] test for python calls Cdll Library --- gmssl_engine/test/pythonTest.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 gmssl_engine/test/pythonTest.py diff --git a/gmssl_engine/test/pythonTest.py b/gmssl_engine/test/pythonTest.py new file mode 100644 index 0000000..422010b --- /dev/null +++ b/gmssl_engine/test/pythonTest.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from ctypes.util import find_library +from ctypes import * +import os +import sys + + +engine_path = os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0]))) +GmSSL_path = os.path.join(engine_path, 'GmSSL') +bin_path = os.path.join(GmSSL_path, 'bin') +dll_path = os.path.join(bin_path, 'gmssl.dll') + +try: + GmSSL_dllHandle = cdll.LoadLibrary(dll_path) +except FileNotFoundError: + raise + +def gmssl_version(): + return GmSSL_dllHandle.gmssl_version_num() + +def main_test(): + version = gmssl_version() + print(version) + +if __name__ == '__main__': + main_test() + From b9408940389e2a1f00718d796fe3b4a6aaec8371 Mon Sep 17 00:00:00 2001 From: sureror Date: Mon, 15 Jan 2024 15:06:03 +0800 Subject: [PATCH 06/12] gmssl & test --- gmssl_engine/test/callTest.py | 8 ++++++++ gmssl_engine/test/{pythonTest.py => gmssl.py} | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 gmssl_engine/test/callTest.py rename gmssl_engine/test/{pythonTest.py => gmssl.py} (89%) diff --git a/gmssl_engine/test/callTest.py b/gmssl_engine/test/callTest.py new file mode 100644 index 0000000..366ea03 --- /dev/null +++ b/gmssl_engine/test/callTest.py @@ -0,0 +1,8 @@ +from gmssl import gmssl_version + +def maintest(): + version = gmssl_version() + print(version) + +if __name__ == '__main__': + maintest() \ No newline at end of file diff --git a/gmssl_engine/test/pythonTest.py b/gmssl_engine/test/gmssl.py similarity index 89% rename from gmssl_engine/test/pythonTest.py rename to gmssl_engine/test/gmssl.py index 422010b..687c310 100644 --- a/gmssl_engine/test/pythonTest.py +++ b/gmssl_engine/test/gmssl.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from ctypes.util import find_library from ctypes import * import os import sys From a83b347e6768629e178b9b8744c2fd50d32ab485 Mon Sep 17 00:00:00 2001 From: sureror Date: Mon, 15 Jan 2024 15:32:30 +0800 Subject: [PATCH 07/12] gmssl_py --- gmssl_engine/README.md | 20 ++++++++++++++++---- gmssl_engine/{test => gmssl_py}/callTest.py | 0 gmssl_engine/{test => gmssl_py}/gmssl.py | 4 ++++ 3 files changed, 20 insertions(+), 4 deletions(-) rename gmssl_engine/{test => gmssl_py}/callTest.py (100%) rename gmssl_engine/{test => gmssl_py}/gmssl.py (87%) diff --git a/gmssl_engine/README.md b/gmssl_engine/README.md index 5494e8f..908c326 100644 --- a/gmssl_engine/README.md +++ b/gmssl_engine/README.md @@ -1,9 +1,21 @@ -# 提供基于gmssl的接口 +# 关于本库 +- 基于GmSSL的动态库 -- GMSSL的动态库 +- 使用Python封装的接口 -- Python封装的加解密,签名验签接口 +> [GmSSL代码源地址](https://github.com/guanzhi/GmSSL) -> [GMSSL代码源地址](https://github.com/guanzhi/GmSSL) \ No newline at end of file +## 接口说明 + +1. gmssl_version() + - 输入 + + 无输入值 + - 输出: + + 返回GmSSL的版本号 + > 例 + ```python + version = gmssl_version() + ``` + \ No newline at end of file diff --git a/gmssl_engine/test/callTest.py b/gmssl_engine/gmssl_py/callTest.py similarity index 100% rename from gmssl_engine/test/callTest.py rename to gmssl_engine/gmssl_py/callTest.py diff --git a/gmssl_engine/test/gmssl.py b/gmssl_engine/gmssl_py/gmssl.py similarity index 87% rename from gmssl_engine/test/gmssl.py rename to gmssl_engine/gmssl_py/gmssl.py index 687c310..fdebd47 100644 --- a/gmssl_engine/test/gmssl.py +++ b/gmssl_engine/gmssl_py/gmssl.py @@ -17,6 +17,10 @@ raise def gmssl_version(): + """ + return version num of GmSSL + """ + return GmSSL_dllHandle.gmssl_version_num() def main_test(): From e7bc7a16ef7448075677c55f0577898f70cb9e2d Mon Sep 17 00:00:00 2001 From: sureror Date: Mon, 15 Jan 2024 16:29:47 +0800 Subject: [PATCH 08/12] random num --- gmssl_engine/README.md | 21 ++++++++++++++++++++- gmssl_engine/gmssl_py/callTest.py | 14 +++++++++++--- gmssl_engine/gmssl_py/gmssl.py | 24 ++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/gmssl_engine/README.md b/gmssl_engine/README.md index 908c326..80dfee3 100644 --- a/gmssl_engine/README.md +++ b/gmssl_engine/README.md @@ -18,4 +18,23 @@ ```python version = gmssl_version() ``` - \ No newline at end of file + +2. rand_bytes(size) + - 输入 + + size:int 型,为需要的字符长度 + - 输出 + + bytes类型,返回一个指定(size)长度的bytes串 + > 例 + ```python + randbytes = rand_bytes(5) + ``` + +2. rand_int(size) + - 输入 + + size:int 型,为需要的字符长度 + - 输出 + + int类型,返回一个指定(size)长度的int串 + > 例 + ```python + randbytes = rand_int(5) + ``` diff --git a/gmssl_engine/gmssl_py/callTest.py b/gmssl_engine/gmssl_py/callTest.py index 366ea03..6f9096c 100644 --- a/gmssl_engine/gmssl_py/callTest.py +++ b/gmssl_engine/gmssl_py/callTest.py @@ -1,8 +1,16 @@ -from gmssl import gmssl_version +from gmssl import gmssl_version, rand_bytes, rand_int -def maintest(): +def versiontest(): version = gmssl_version() print(version) +def random_byte_test(): + randnum = rand_bytes(1) + print(randnum) + +def random_int_test(): + randnum = rand_int(1) + print(randnum) + if __name__ == '__main__': - maintest() \ No newline at end of file + random_int_test() \ No newline at end of file diff --git a/gmssl_engine/gmssl_py/gmssl.py b/gmssl_engine/gmssl_py/gmssl.py index fdebd47..83332e0 100644 --- a/gmssl_engine/gmssl_py/gmssl.py +++ b/gmssl_engine/gmssl_py/gmssl.py @@ -23,9 +23,29 @@ def gmssl_version(): return GmSSL_dllHandle.gmssl_version_num() + +def rand_bytes(size): + """ + generate a random number(Type:bytes) of a specified length + """ + + buf = create_string_buffer(size) + GmSSL_dllHandle.rand_bytes(buf, c_size_t(size)) #write random number into buffer + return buf.raw + +def rand_int(size): + """ + generate a random number(Type:int) of a specified length, byteorder='big' + """ + + radnint = int.from_bytes(rand_bytes(size), byteorder='big') + return radnint + + def main_test(): - version = gmssl_version() - print(version) + rand = rand_bytes(1) + print(rand) + print(type(rand)) if __name__ == '__main__': main_test() From a2f728e7600e5d1d18c4df74bd59105e9d5b4150 Mon Sep 17 00:00:00 2001 From: sureror Date: Tue, 16 Jan 2024 17:50:26 +0800 Subject: [PATCH 09/12] sm4 & sm4cbc --- gmssl_engine/gmssl_py/callTest.py | 24 +++++- gmssl_engine/gmssl_py/gmssl.py | 139 +++++++++++++++++++++++++++++- 2 files changed, 158 insertions(+), 5 deletions(-) diff --git a/gmssl_engine/gmssl_py/callTest.py b/gmssl_engine/gmssl_py/callTest.py index 6f9096c..43d9bfe 100644 --- a/gmssl_engine/gmssl_py/callTest.py +++ b/gmssl_engine/gmssl_py/callTest.py @@ -1,4 +1,8 @@ -from gmssl import gmssl_version, rand_bytes, rand_int +from gmssl import gmssl_version, rand_bytes, rand_int, Sm4 + + +DO_ENCRYPT=True +DO_DECRYPT = False def versiontest(): version = gmssl_version() @@ -12,5 +16,21 @@ def random_int_test(): randnum = rand_int(1) print(randnum) +def test_sm4(): + key = b'1234567812345678' + decrypted = b'block of message' + ciphertext_hex = 'dd99d30fd7baf5af2930335d2554ddb7' + sm4 = Sm4(key) + ciphertext = sm4.encrypt(decrypted) + cipher_hex = ciphertext.hex() + print(cipher_hex) + assert(cipher_hex == ciphertext_hex) + + decrypted_text = sm4.decrypt(ciphertext) + print(decrypted_text) + assert(decrypted_text == decrypted) + + + if __name__ == '__main__': - random_int_test() \ No newline at end of file + test_sm4() \ No newline at end of file diff --git a/gmssl_engine/gmssl_py/gmssl.py b/gmssl_engine/gmssl_py/gmssl.py index 83332e0..302929b 100644 --- a/gmssl_engine/gmssl_py/gmssl.py +++ b/gmssl_engine/gmssl_py/gmssl.py @@ -1,16 +1,34 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- + +################################################################################ from ctypes import * import os import sys +################################################################################ engine_path = os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0]))) GmSSL_path = os.path.join(engine_path, 'GmSSL') bin_path = os.path.join(GmSSL_path, 'bin') dll_path = os.path.join(bin_path, 'gmssl.dll') + +################################################################################ +SM4_KEY_SIZE = 16 +SM4_BLOCK_SIZE = 16 +_SM4_NUM_ROUNDS = 32 +DO_ENCRYPT = True +DO_DECRYPT= False + + +################################################################################ +class NativeError(Exception): + """ + GmSSL libraray inner error + """ + try: GmSSL_dllHandle = cdll.LoadLibrary(dll_path) except FileNotFoundError: @@ -42,10 +60,125 @@ def rand_int(size): return radnint + +class Sm4(Structure): + """ + Sm4 encryption and decryption + """ + + _fields_ = [ + ("rk", c_uint32 * _SM4_NUM_ROUNDS) + ] + + def __init__(self, key:bytes): + if len(key) != SM4_KEY_SIZE: + raise ValueError('Invalid key length') + self._key = key + + def encrypt(self, block:bytes): + GmSSL_dllHandle.sm4_set_encrypt_key(byref(self), self._key) + if len(block) != SM4_BLOCK_SIZE: + raise ValueError('Invalid block size') + outbuf = create_string_buffer(SM4_BLOCK_SIZE) + GmSSL_dllHandle.sm4_encrypt(byref(self), block, outbuf) + return outbuf.raw + + def decrypt(self, block:bytes): + GmSSL_dllHandle.sm4_set_decrypt_key(byref(self), self._key) + if len(block) != SM4_BLOCK_SIZE: + raise ValueError('Invalid block size') + outbuf = create_string_buffer(SM4_BLOCK_SIZE) + GmSSL_dllHandle.sm4_encrypt(byref(self), block, outbuf) + return outbuf.raw + + +class Sm4Cbc(Structure): + """ + Sm4Cbc encryption and decryption + """ + + _fields_ = [ + ("sm4_key", Sm4), + ("iv", c_uint8 * SM4_BLOCK_SIZE), + ("block", c_uint8 * SM4_BLOCK_SIZE), + ("block_nbytes", c_size_t) + ] + + def __init__(self, key, iv): + + if len(key) != SM4_KEY_SIZE: + raise ValueError('Invalid key length') + if len(iv) != SM4_BLOCK_SIZE: + raise ValueError('Invalid IV size') + + self._iv = iv + self._key = key + + def update(self, data): + outbuf = create_string_buffer(len(data) + SM4_BLOCK_SIZE) + outlen = c_size_t() + if self._encrypt == DO_ENCRYPT: + if GmSSL_dllHandle.sm4_cbc_encrypt_update(byref(self), data, c_size_t(len(data)), + outbuf, byref(outlen)) != 1: + raise NativeError('libgmssl inner error') + else: + if GmSSL_dllHandle.sm4_cbc_decrypt_update(byref(self), data, c_size_t(len(data)), + outbuf, byref(outlen)) != 1: + raise NativeError('libgmssl inner error') + return outbuf[0:outlen.value] + + def finish(self): + outbuf = create_string_buffer(SM4_BLOCK_SIZE) + outlen = c_size_t() + if self._encrypt == True: + if GmSSL_dllHandle.sm4_cbc_encrypt_finish(byref(self), outbuf, byref(outlen)) != 1: + raise NativeError('libgmssl inner error') + else: + if GmSSL_dllHandle.sm4_cbc_decrypt_finish(byref(self), outbuf, byref(outlen)) != 1: + raise NativeError('libgmssl inner error') + return outbuf[:outlen.value] + + def encrypt(self, data:bytes): + """ + for sm4_cbc encryption + """ + + self._encrypt = True + if GmSSL_dllHandle.sm4_cbc_encrypt_init(byref(self), self._key, self._iv): + ciphertext = self.update(data) + ciphertext += self.finish() + return ciphertext + else: + raise NativeError('libgmssl inner error') + + def decrypt(self, data:bytes): + """ + for sm4_cbc decryption + """ + + self._encrypt = False + if GmSSL_dllHandle.sm4_cbc_decrypt_init(byref(self), self._key, self._iv): + plaintext = self.update(data) + plaintext += self.finish() + return plaintext + else: + raise NativeError('libgmssl inner error') + + def main_test(): - rand = rand_bytes(1) - print(rand) - print(type(rand)) + + key = b'1234567812345678' + iv = b'1234567812345678' + plaintext = b'0123456789abcdefg' + + sm4cbc = Sm4Cbc(key, iv) + + ret = sm4cbc.encrypt(plaintext) + print(ret) + + ret1 = sm4cbc.decrypt(ret) + print(ret1) + if __name__ == '__main__': main_test() From e5363921207a2265ec4d89f724579c178f50ed0d Mon Sep 17 00:00:00 2001 From: sureror Date: Tue, 16 Jan 2024 17:51:42 +0800 Subject: [PATCH 10/12] sm4 class and function illustration --- gmssl_engine/README.md | 88 ++++++++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/gmssl_engine/README.md b/gmssl_engine/README.md index 80dfee3..351a56d 100644 --- a/gmssl_engine/README.md +++ b/gmssl_engine/README.md @@ -9,32 +9,62 @@ ## 接口说明 -1. gmssl_version() - - 输入 - + 无输入值 - - 输出: - + 返回GmSSL的版本号 - > 例 - ```python - version = gmssl_version() - ``` - -2. rand_bytes(size) - - 输入 - + size:int 型,为需要的字符长度 - - 输出 - + bytes类型,返回一个指定(size)长度的bytes串 - > 例 - ```python - randbytes = rand_bytes(5) - ``` - -2. rand_int(size) - - 输入 - + size:int 型,为需要的字符长度 - - 输出 - + int类型,返回一个指定(size)长度的int串 - > 例 - ```python - randbytes = rand_int(5) - ``` +## 1.(function) gmssl_version() + +- 输入 + + 无输入值 +- 输出: + + 返回GmSSL的版本号 +- 例 +```python +version = gmssl_version() +``` + +## 2. (function) rand_bytes(size:int) + +- 输入 + + size:int 型,为需要的字符长度 +- 输出 + + bytes类型,返回一个指定(size)长度的bytes串 +- 例 +```python +randbytes = rand_bytes(5) +``` + +## 3. (function)rand_int(size:int) + +- 输入 + + size:int 型,为需要的字符长度 +- 输出 + + int类型,返回一个指定(size)长度的int串 +- 例 +```python +randbytes = rand_int(5) +``` + +## 4. (class)Sm4(key:bytes) +- sm4的类,提供sm4的加密和解密 +- key:bytes类型,为sm4的key,长度需为16字节 + + + ### 4.1 (function)encrypt(block:bytes) + - 输入: + + block:bytes型,为需要加密的文本 + - 输出: + + bytes型,为加密后的密文 + > + ### 4.2 (function)decrypt(block:bytes) + - 输入: + + block:bytes型,为需要解密的文本 + - 输出: + + bytes型,为解密后的明文 +- 例 +```python +key = b'1234567812345678' #sm4key +plaintext = '0123456' #待加密的文本 + +sm4 = Sm4(key) #实例化 +ciphtertext = sm4.encrypt(plaintext) #加密 +plaintext = sm4.decrypt(ciphtertext) #解密 + +``` \ No newline at end of file From 329cfdc06514d713b2e6041df2bcb7ec320cfed2 Mon Sep 17 00:00:00 2001 From: sureror Date: Wed, 17 Jan 2024 17:45:49 +0800 Subject: [PATCH 11/12] README sm4cbc --- gmssl_engine/README.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/gmssl_engine/README.md b/gmssl_engine/README.md index 351a56d..aa55133 100644 --- a/gmssl_engine/README.md +++ b/gmssl_engine/README.md @@ -9,7 +9,7 @@ ## 接口说明 -## 1.(function) gmssl_version() +## 1.(function) : gmssl_version() - 输入 + 无输入值 @@ -20,7 +20,7 @@ version = gmssl_version() ``` -## 2. (function) rand_bytes(size:int) +## 2. (function) : rand_bytes(size:int) - 输入 + size:int 型,为需要的字符长度 @@ -66,5 +66,31 @@ plaintext = '0123456' #待加密的文本 sm4 = Sm4(key) #实例化 ciphtertext = sm4.encrypt(plaintext) #加密 plaintext = sm4.decrypt(ciphtertext) #解密 +``` + +## 5. (class)Sm4Cbc(key:bytes, iv:bytes) +- sm4的cbc模式,提供cbc模式的加密和解密 +- key:bytes类型,需要长度为16字节,iv:bytes类型,需要长度为16字节 + + ### 5.1 (function)encrypt(data:bytes) + - 输入: + + data:bytes类型,为需要加密的文本 + - 输出: + + bytes类型,为加密后的密文 + + ### 5.2 (function)decrypt(data:bytes) + - 输入: + + data:bytes类型,为需要解密的密文 + - 输出: + + bytes类型,为解密后的明文 +- 例 +```python +key = b'1234567812345678' # sm4的key +iv = b'1234567812345678' # 初始向量 +plaintext = b'1234567812345678' # 待加密的文本 + +sm4cbc = Sm4Cbc(key, iv) # 实例化Sm4Cbc的类 +encrypted = sm4cbc.encrypt(plaintext) #对bytes类型的文本 plaintext 加密,得到bytes类型的密文 encrypted +decrypted = sm4cbc.decrypted(encrypted) #对bytes类型的密文 encrypted 解密,得到bytes类型的铭文 decrypted ``` \ No newline at end of file From 34b50611fed77c4e9805ac13f7d24e5746411dfa Mon Sep 17 00:00:00 2001 From: sureror Date: Wed, 17 Jan 2024 17:57:13 +0800 Subject: [PATCH 12/12] sm4cbc_test --- gmssl_engine/gmssl_py/callTest.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/gmssl_engine/gmssl_py/callTest.py b/gmssl_engine/gmssl_py/callTest.py index 43d9bfe..27b33f6 100644 --- a/gmssl_engine/gmssl_py/callTest.py +++ b/gmssl_engine/gmssl_py/callTest.py @@ -1,4 +1,4 @@ -from gmssl import gmssl_version, rand_bytes, rand_int, Sm4 +from gmssl import gmssl_version, rand_bytes, rand_int, Sm4, Sm4Cbc DO_ENCRYPT=True @@ -16,21 +16,28 @@ def random_int_test(): randnum = rand_int(1) print(randnum) -def test_sm4(): +def sm4_test(): key = b'1234567812345678' - decrypted = b'block of message' - ciphertext_hex = 'dd99d30fd7baf5af2930335d2554ddb7' + plaintext = b'block of message' + sm4 = Sm4(key) - ciphertext = sm4.encrypt(decrypted) - cipher_hex = ciphertext.hex() - print(cipher_hex) - assert(cipher_hex == ciphertext_hex) + encrypted = sm4.encrypt(plaintext) + decrypted = sm4.decrypt(encrypted) + + print('原文是:{}, \n密文是:{},\n 解密后:{}'.format(plaintext, encrypted, decrypted)) + +def sm4cbc_test(): + key = b'1234567812345678' + iv = b'1234567812345678' + plaintext = b'1234567812345678' - decrypted_text = sm4.decrypt(ciphertext) - print(decrypted_text) - assert(decrypted_text == decrypted) + sm4cbc = Sm4Cbc(key, iv) + encrypted = sm4cbc.encrypt(plaintext) + decrypted = sm4cbc.decrypt(encrypted) + print('原文是:{}, \n密文是:{},\n 解密后:{}'.format(plaintext, encrypted, decrypted)) if __name__ == '__main__': - test_sm4() \ No newline at end of file + sm4_test() + sm4cbc_test() \ No newline at end of file