GmUtil.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using Org.BouncyCastle.Asn1;
  6. using Org.BouncyCastle.Asn1.GM;
  7. using Org.BouncyCastle.Asn1.X9;
  8. using Org.BouncyCastle.Crypto;
  9. using Org.BouncyCastle.Crypto.Digests;
  10. using Org.BouncyCastle.Crypto.Engines;
  11. using Org.BouncyCastle.Crypto.Generators;
  12. using Org.BouncyCastle.Crypto.Parameters;
  13. using Org.BouncyCastle.Math;
  14. using Org.BouncyCastle.Math.EC;
  15. using Org.BouncyCastle.Security;
  16. using Org.BouncyCastle.Utilities;
  17. using Org.BouncyCastle.Utilities.Encoders;
  18. using Org.BouncyCastle.X509;
  19. namespace PTMedicalInsurance.Common
  20. {
  21. public class GmUtil
  22. {
  23. public static byte[] SignSm3WithSm2(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey)
  24. {
  25. return GmUtil.RsAsn1ToPlainByteArray(GmUtil.SignSm3WithSm2Asn1Rs(msg, userId, privateKey));
  26. }
  27. public static byte[] SignSm3WithSm2Asn1Rs(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey)
  28. {
  29. byte[] result;
  30. try
  31. {
  32. ISigner signer = SignerUtilities.GetSigner("SM3withSM2");
  33. //signer.Init(true, new ParametersWithRandom(privateKey));
  34. signer.Init(true, new ParametersWithID(privateKey, userId));
  35. signer.BlockUpdate(msg, 0, msg.Length);
  36. result = signer.GenerateSignature();
  37. }
  38. catch (Exception)
  39. {
  40. result = null;
  41. }
  42. return result;
  43. }
  44. public static bool VerifySm3WithSm2(byte[] msg, byte[] userId, byte[] rs, AsymmetricKeyParameter publicKey)
  45. {
  46. return rs != null && msg != null && userId != null && rs.Length == 64 && GmUtil.VerifySm3WithSm2Asn1Rs(msg, userId, GmUtil.RsPlainByteArrayToAsn1(rs), publicKey);
  47. }
  48. public static bool VerifySm3WithSm2Asn1Rs(byte[] msg, byte[] userId, byte[] sign, AsymmetricKeyParameter publicKey)
  49. {
  50. bool result;
  51. try
  52. {
  53. ISigner signer = SignerUtilities.GetSigner("SM3withSM2");
  54. signer.Init(false, publicKey);
  55. signer.BlockUpdate(msg, 0, msg.Length);
  56. result = signer.VerifySignature(sign);
  57. }
  58. catch (Exception)
  59. {
  60. result = false;
  61. }
  62. return result;
  63. }
  64. private static byte[] ChangeC1C2C3ToC1C3C2(byte[] c1c2c3)
  65. {
  66. int num = (GmUtil.x9ECParameters.Curve.FieldSize + 7) / 8 * 2 + 1;
  67. byte[] array = new byte[c1c2c3.Length];
  68. Buffer.BlockCopy(c1c2c3, 0, array, 0, num);
  69. Buffer.BlockCopy(c1c2c3, c1c2c3.Length - 32, array, num, 32);
  70. Buffer.BlockCopy(c1c2c3, num, array, num + 32, c1c2c3.Length - num - 32);
  71. return array;
  72. }
  73. private static byte[] ChangeC1C3C2ToC1C2C3(byte[] c1c3c2)
  74. {
  75. int num = (GmUtil.x9ECParameters.Curve.FieldSize + 7) / 8 * 2 + 1;
  76. byte[] array = new byte[c1c3c2.Length];
  77. Buffer.BlockCopy(c1c3c2, 0, array, 0, num);
  78. Buffer.BlockCopy(c1c3c2, num + 32, array, num, c1c3c2.Length - num - 32);
  79. Buffer.BlockCopy(c1c3c2, num, array, c1c3c2.Length - 32, 32);
  80. return array;
  81. }
  82. public static byte[] Sm2Decrypt(byte[] data, AsymmetricKeyParameter key)
  83. {
  84. return GmUtil.Sm2DecryptOld(GmUtil.ChangeC1C3C2ToC1C2C3(data), key);
  85. }
  86. public static byte[] Sm2Encrypt(byte[] data, AsymmetricKeyParameter key)
  87. {
  88. return GmUtil.ChangeC1C2C3ToC1C3C2(GmUtil.Sm2EncryptOld(data, key));
  89. }
  90. public static byte[] Sm2EncryptOld(byte[] data, AsymmetricKeyParameter pubkey)
  91. {
  92. byte[] result;
  93. try
  94. {
  95. SM2Engine sm2Engine = new SM2Engine();
  96. sm2Engine.Init(true, new ParametersWithRandom(pubkey, new SecureRandom()));
  97. result = sm2Engine.ProcessBlock(data, 0, data.Length);
  98. }
  99. catch (Exception)
  100. {
  101. result = null;
  102. }
  103. return result;
  104. }
  105. public static byte[] Sm2DecryptOld(byte[] data, AsymmetricKeyParameter key)
  106. {
  107. byte[] result;
  108. try
  109. {
  110. SM2Engine sm2Engine = new SM2Engine();
  111. sm2Engine.Init(false, key);
  112. result = sm2Engine.ProcessBlock(data, 0, data.Length);
  113. }
  114. catch (Exception)
  115. {
  116. result = null;
  117. }
  118. return result;
  119. }
  120. public static byte[] Sm3(byte[] bytes)
  121. {
  122. byte[] result;
  123. try
  124. {
  125. SM3Digest sm3Digest = new SM3Digest();
  126. sm3Digest.BlockUpdate(bytes, 0, bytes.Length);
  127. result = DigestUtilities.DoFinal(sm3Digest);
  128. }
  129. catch (Exception)
  130. {
  131. result = null;
  132. }
  133. return result;
  134. }
  135. private static byte[] BigIntToFixexLengthBytes(BigInteger rOrS)
  136. {
  137. byte[] array = rOrS.ToByteArray();
  138. if (array.Length == 32)
  139. {
  140. return array;
  141. }
  142. if (array.Length == 33 && array[0] == 0)
  143. {
  144. return Arrays.CopyOfRange(array, 1, 33);
  145. }
  146. if (array.Length < 32)
  147. {
  148. byte[] array2 = new byte[32];
  149. Arrays.Fill(array2, 0);
  150. Buffer.BlockCopy(array, 0, array2, 32 - array.Length, array.Length);
  151. return array2;
  152. }
  153. throw new ArgumentException("err rs: " + Hex.ToHexString(array));
  154. }
  155. private static byte[] RsAsn1ToPlainByteArray(byte[] rsDer)
  156. {
  157. Asn1Sequence instance = Asn1Sequence.GetInstance(rsDer);
  158. byte[] array = GmUtil.BigIntToFixexLengthBytes(DerInteger.GetInstance(instance[0]).Value);
  159. byte[] array2 = GmUtil.BigIntToFixexLengthBytes(DerInteger.GetInstance(instance[1]).Value);
  160. byte[] array3 = new byte[64];
  161. Buffer.BlockCopy(array, 0, array3, 0, array.Length);
  162. Buffer.BlockCopy(array2, 0, array3, 32, array2.Length);
  163. return array3;
  164. }
  165. private static byte[] RsPlainByteArrayToAsn1(byte[] sign)
  166. {
  167. if (sign.Length != 64)
  168. {
  169. throw new ArgumentException("err rs. ");
  170. }
  171. BigInteger value = new BigInteger(1, Arrays.CopyOfRange(sign, 0, 32));
  172. BigInteger value2 = new BigInteger(1, Arrays.CopyOfRange(sign, 32, 64));
  173. Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector();
  174. asn1EncodableVector.Add(new DerInteger(value));
  175. asn1EncodableVector.Add(new DerInteger(value2));
  176. byte[] result;
  177. try
  178. {
  179. result = new DerSequence(asn1EncodableVector).GetEncoded("DER");
  180. }
  181. catch (IOException)
  182. {
  183. result = null;
  184. }
  185. return result;
  186. }
  187. public static AsymmetricCipherKeyPair GenerateKeyPair()
  188. {
  189. AsymmetricCipherKeyPair result;
  190. try
  191. {
  192. ECKeyPairGenerator eckeyPairGenerator = new ECKeyPairGenerator();
  193. eckeyPairGenerator.Init(new ECKeyGenerationParameters(GmUtil.ecDomainParameters, new SecureRandom()));
  194. result = eckeyPairGenerator.GenerateKeyPair();
  195. }
  196. catch (Exception)
  197. {
  198. result = null;
  199. }
  200. return result;
  201. }
  202. public static ECPrivateKeyParameters GetPrivatekeyFromD(BigInteger d)
  203. {
  204. return new ECPrivateKeyParameters(d, GmUtil.ecDomainParameters);
  205. }
  206. public static ECPublicKeyParameters GetPublickeyFromXY(byte[] pubkey)
  207. {
  208. ECPoint q = GMNamedCurves.GetByName("SM2P256V1").Curve.DecodePoint(pubkey);
  209. ECDomainParameters parameters = new ECDomainParameters(GmUtil.x9ECParameters.Curve, GmUtil.x9ECParameters.G, GmUtil.x9ECParameters.N);
  210. return new ECPublicKeyParameters(q, parameters);
  211. }
  212. public static ECPublicKeyParameters GetPublickeyFromXY(BigInteger x, BigInteger y)
  213. {
  214. return new ECPublicKeyParameters(GmUtil.x9ECParameters.Curve.CreatePoint(x, y), GmUtil.ecDomainParameters);
  215. }
  216. public static AsymmetricKeyParameter GetPublickeyFromX509File(FileInfo file)
  217. {
  218. FileStream fileStream = null;
  219. try
  220. {
  221. fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read);
  222. return new X509CertificateParser().ReadCertificate(fileStream).GetPublicKey();
  223. }
  224. catch (Exception)
  225. {
  226. }
  227. finally
  228. {
  229. if (fileStream != null)
  230. {
  231. fileStream.Close();
  232. }
  233. }
  234. return null;
  235. }
  236. private static byte[] ToByteArray(int i)
  237. {
  238. return new byte[]
  239. {
  240. (byte)(i >> 24),
  241. (byte)((i & 16777215) >> 16),
  242. (byte)((i & 65535) >> 8),
  243. (byte)(i & 255)
  244. };
  245. }
  246. private static byte[] Join(params byte[][] byteArrays)
  247. {
  248. List<byte> list = new List<byte>();
  249. for (int i = 0; i < byteArrays.Length; i++)
  250. {
  251. list.AddRange(byteArrays[i]);
  252. }
  253. return list.ToArray();
  254. }
  255. private static byte[] KDF(byte[] Z, int klen)
  256. {
  257. int num = 1;
  258. int num2 = (int)Math.Ceiling((double)klen * 1.0 / 32.0);
  259. List<byte> list = new List<byte>();
  260. try
  261. {
  262. for (int i = 1; i < num2; i++)
  263. {
  264. list.AddRange(GmUtil.Sm3(GmUtil.Join(new byte[][]
  265. {
  266. Z,
  267. GmUtil.ToByteArray(num)
  268. })));
  269. num++;
  270. }
  271. byte[] array = GmUtil.Sm3(GmUtil.Join(new byte[][]
  272. {
  273. Z,
  274. GmUtil.ToByteArray(num)
  275. }));
  276. if (klen % 32 == 0)
  277. {
  278. list.AddRange(array);
  279. }
  280. else
  281. {
  282. list.AddRange(Arrays.CopyOfRange(array, 0, klen % 32));
  283. }
  284. return list.ToArray();
  285. }
  286. catch (Exception)
  287. {
  288. }
  289. return null;
  290. }
  291. public static byte[] Sm4DecryptCBC(byte[] keyBytes, byte[] cipher, byte[] iv, string algo)
  292. {
  293. if (keyBytes.Length != 16)
  294. {
  295. throw new ArgumentException("err key length");
  296. }
  297. if (cipher.Length % 16 != 0)
  298. {
  299. throw new ArgumentException("err data length");
  300. }
  301. byte[] result;
  302. try
  303. {
  304. KeyParameter parameters = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
  305. IBufferedCipher cipher2 = CipherUtilities.GetCipher(algo);
  306. if (iv == null)
  307. {
  308. iv = GmUtil.ZeroIv(algo);
  309. }
  310. cipher2.Init(false, new ParametersWithIV(parameters, iv));
  311. result = cipher2.DoFinal(cipher);
  312. }
  313. catch (Exception)
  314. {
  315. result = null;
  316. }
  317. return result;
  318. }
  319. public static byte[] Sm4EncryptCBC(byte[] keyBytes, byte[] plain, byte[] iv, string algo)
  320. {
  321. if (keyBytes.Length != 16)
  322. {
  323. throw new ArgumentException("err key length");
  324. }
  325. if (plain.Length % 16 != 0)
  326. {
  327. throw new ArgumentException("err data length");
  328. }
  329. byte[] result;
  330. try
  331. {
  332. KeyParameter parameters = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
  333. IBufferedCipher cipher = CipherUtilities.GetCipher(algo);
  334. if (iv == null)
  335. {
  336. iv = GmUtil.ZeroIv(algo);
  337. }
  338. cipher.Init(true, new ParametersWithIV(parameters, iv));
  339. result = cipher.DoFinal(plain);
  340. }
  341. catch (Exception)
  342. {
  343. result = null;
  344. }
  345. return result;
  346. }
  347. public static byte[] Sm4EncryptECB(byte[] keyBytes, byte[] plain, string algo)
  348. {
  349. if (keyBytes.Length != 16)
  350. {
  351. throw new ArgumentException("err key length");
  352. }
  353. byte[] result;
  354. try
  355. {
  356. KeyParameter parameters = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
  357. IBufferedCipher cipher = CipherUtilities.GetCipher(algo);
  358. cipher.Init(true, parameters);
  359. result = cipher.DoFinal(plain);
  360. }
  361. catch (Exception)
  362. {
  363. result = null;
  364. }
  365. return result;
  366. }
  367. public static byte[] Sm4DecryptECB(byte[] keyBytes, byte[] cipher, string algo)
  368. {
  369. if (cipher.Length % 16 != 0)
  370. {
  371. throw new ArgumentException("err data length");
  372. }
  373. byte[] result;
  374. try
  375. {
  376. KeyParameter parameters = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
  377. IBufferedCipher cipher2 = CipherUtilities.GetCipher(algo);
  378. cipher2.Init(false, parameters);
  379. result = cipher2.DoFinal(cipher);
  380. }
  381. catch (Exception)
  382. {
  383. result = null;
  384. }
  385. return result;
  386. }
  387. public static GmUtil.Sm2Cert readSm2File(byte[] pem, string pwd)
  388. {
  389. GmUtil.Sm2Cert sm2Cert = new GmUtil.Sm2Cert();
  390. GmUtil.Sm2Cert result;
  391. try
  392. {
  393. Asn1Sequence asn1Sequence = (Asn1Sequence)Asn1Object.FromByteArray(pem);
  394. Asn1Sequence asn1Sequence2 = (Asn1Sequence)asn1Sequence[1];
  395. Asn1Sequence asn1Sequence3 = (Asn1Sequence)asn1Sequence[2];
  396. Asn1OctetString asn1OctetString = (Asn1OctetString)asn1Sequence2[2];
  397. byte[] data = GmUtil.KDF(Encoding.UTF8.GetBytes(pwd), 32);
  398. byte[] bytes = GmUtil.Sm4DecryptCBC(Arrays.CopyOfRange(data, 16, 32), asn1OctetString.GetOctets(), Arrays.CopyOfRange(data, 0, 16), "SM4/CBC/PKCS7Padding");
  399. sm2Cert.privateKey = GmUtil.GetPrivatekeyFromD(new BigInteger(1, bytes));
  400. Asn1OctetString asn1OctetString2 = (Asn1OctetString)asn1Sequence3[1];
  401. X509Certificate x509Certificate = new X509CertificateParser().ReadCertificate(asn1OctetString2.GetOctets());
  402. sm2Cert.publicKey = x509Certificate.GetPublicKey();
  403. sm2Cert.certId = x509Certificate.SerialNumber.ToString(10);
  404. result = sm2Cert;
  405. }
  406. catch (Exception)
  407. {
  408. result = null;
  409. }
  410. return result;
  411. }
  412. public static GmUtil.Sm2Cert ReadSm2X509Cert(byte[] cert)
  413. {
  414. GmUtil.Sm2Cert sm2Cert = new GmUtil.Sm2Cert();
  415. GmUtil.Sm2Cert result;
  416. try
  417. {
  418. X509Certificate x509Certificate = new X509CertificateParser().ReadCertificate(cert);
  419. sm2Cert.publicKey = x509Certificate.GetPublicKey();
  420. sm2Cert.certId = x509Certificate.SerialNumber.ToString(10);
  421. result = sm2Cert;
  422. }
  423. catch (Exception)
  424. {
  425. result = null;
  426. }
  427. return result;
  428. }
  429. public static byte[] ZeroIv(string algo)
  430. {
  431. byte[] result;
  432. try
  433. {
  434. byte[] array = new byte[CipherUtilities.GetCipher(algo).GetBlockSize()];
  435. Arrays.Fill(array, 0);
  436. result = array;
  437. }
  438. catch (Exception)
  439. {
  440. result = null;
  441. }
  442. return result;
  443. }
  444. public static void Main2(string[] s)
  445. {
  446. foreach (object obj in GMNamedCurves.Names)
  447. {
  448. string text = (string)obj;
  449. }
  450. AsymmetricCipherKeyPair asymmetricCipherKeyPair = GmUtil.GenerateKeyPair();
  451. byte[] bytes = Encoding.UTF8.GetBytes("message digest");
  452. byte[] bytes2 = Encoding.UTF8.GetBytes("userId");
  453. GmUtil.SignSm3WithSm2(bytes, bytes2, asymmetricCipherKeyPair.Private);
  454. GmUtil.GetPrivatekeyFromD(new BigInteger("097b5230ef27c7df0fa768289d13ad4e8a96266f0fcb8de40d5942af4293a54a", 16));
  455. GmUtil.GetPublickeyFromX509File(new FileInfo("d:/certs/69629141652.cer"));
  456. GmUtil.GetPublickeyFromXY(new BigInteger("59cf9940ea0809a97b1cbffbb3e9d96d0fe842c1335418280bfc51dd4e08a5d4", 16), new BigInteger("9a7f77c578644050e09a9adc4245d1e6eba97554bc8ffd4fe15a78f37f891ff8", 16));
  457. AsymmetricCipherKeyPair asymmetricCipherKeyPair2 = GmUtil.GenerateKeyPair();
  458. AsymmetricKeyParameter @public = asymmetricCipherKeyPair2.Public;
  459. AsymmetricKeyParameter @private = asymmetricCipherKeyPair2.Private;
  460. byte[] array = GmUtil.Sm2Encrypt(Encoding.UTF8.GetBytes("s"), @public);
  461. array = GmUtil.Sm2Decrypt(array, @private);
  462. byte[] plain = Hex.Decode("0123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210");
  463. byte[] keyBytes = Hex.Decode("0123456789abcdeffedcba9876543210");
  464. Hex.Decode("595298c7c6fd271f0402f804c33d3f66");
  465. array = GmUtil.Sm4EncryptECB(keyBytes, plain, "SM4/ECB/NoPadding");
  466. array = GmUtil.Sm4DecryptECB(keyBytes, array, "SM4/ECB/NoPadding");
  467. array = Convert.FromBase64String("MIIDHQIBATBHBgoqgRzPVQYBBAIBBgcqgRzPVQFoBDDW5/I9kZhObxXE9Vh1CzHdZhIhxn+3byBU\nUrzmGRKbDRMgI3hJKdvpqWkM5G4LNcIwggLNBgoqgRzPVQYBBAIBBIICvTCCArkwggJdoAMCAQIC\nBRA2QSlgMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFu\nY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0Ex\nMB4XDTE4MTEyNjEwMTQxNVoXDTIwMTEyNjEwMTQxNVowcjELMAkGA1UEBhMCY24xEjAQBgNVBAoM\nCUNGQ0EgT0NBMTEOMAwGA1UECwwFQ1VQUkExFDASBgNVBAsMC0VudGVycHJpc2VzMSkwJwYDVQQD\nDCAwNDFAWnRlc3RAMDAwMTAwMDA6U0lHTkAwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYIt\nA0IABDRNKhvnjaMUShsM4MJ330WhyOwpZEHoAGfqxFGX+rcL9x069dyrmiF3+2ezwSNh1/6YqfFZ\nX9koM9zE5RG4USmjgfMwgfAwHwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0g\nBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3Vz\nL3VzLTE0Lmh0bTA4BgNVHR8EMTAvMC2gK6AphidodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIv\nY3JsNDI4NS5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBREhx9VlDdMIdIbhAxKnGhPx8FcHDAd\nBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UBg3UFAANIADBFAiEAgWvQi3h6\niW4jgF4huuXfhWInJmTTYr2EIAdG8V4M8fYCIBixygdmfPL9szcK2pzCYmIb6CBzo5SMv50Odycc\nVfY6");
  468. string pwd = "cfca1234";
  469. GmUtil.Sm2Cert sm2Cert = GmUtil.readSm2File(array, pwd);
  470. array = GmUtil.Sm2Encrypt(Encoding.UTF8.GetBytes("s"), (ECPublicKeyParameters)sm2Cert.publicKey);
  471. array = GmUtil.Sm2Decrypt(array, (ECPrivateKeyParameters)sm2Cert.privateKey);
  472. byte[] bytes3 = Encoding.UTF8.GetBytes("message digest");
  473. bytes2 = Encoding.UTF8.GetBytes("userId");
  474. GmUtil.SignSm3WithSm2(bytes3, bytes2, (ECPrivateKeyParameters)sm2Cert.privateKey);
  475. }
  476. private static X9ECParameters x9ECParameters = GMNamedCurves.GetByName("sm2p256v1");
  477. private static ECDomainParameters ecDomainParameters = new ECDomainParameters(GmUtil.x9ECParameters.Curve, GmUtil.x9ECParameters.G, GmUtil.x9ECParameters.N);
  478. public const string SM4_ECB_NOPADDING = "SM4/ECB/NoPadding";
  479. public const string SM4_ECB_PKCS7PADDING = "SM4/ECB/PKCS7Padding";
  480. public const string SM4_CBC_NOPADDING = "SM4/CBC/NoPadding";
  481. public const string SM4_CBC_PKCS7PADDING = "SM4/CBC/PKCS7Padding";
  482. public class Sm2Cert
  483. {
  484. public AsymmetricKeyParameter privateKey;
  485. public AsymmetricKeyParameter publicKey;
  486. public string certId;
  487. }
  488. }
  489. }