Test.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import 'dart:convert';
  2. import 'dart:ffi';
  3. import 'dart:io';
  4. import 'dart:math';
  5. import 'package:ffi/ffi.dart';
  6. import 'package:flutter/cupertino.dart';
  7. import 'package:flutter/foundation.dart';
  8. import 'package:path_provider/path_provider.dart';
  9. import 'package:prime_chat/screens/ChatScreen.dart';
  10. import 'package:tuple/tuple.dart';
  11. import 'Encrypt.dart';
  12. void testPrint(bool x, String name) {
  13. print("test $name: $x");
  14. }
  15. Uint8List randomVector(int length) {
  16. final random = Random.secure();
  17. final values = List<int>.generate(length, (i) => random.nextInt(255));
  18. return Uint8List.fromList(values);
  19. }
  20. void testSM2(Pointer<SM2Key> key) {
  21. const plaintext = "Hello, GmSSL!";
  22. var plain = Uint8List.fromList(plaintext.codeUnits);
  23. plain = randomVector(255);
  24. try {
  25. final encrypted = sm2Encrypt(key, plain);
  26. final decrypted = sm2Decrypt(key, encrypted);
  27. testPrint(listEquals(decrypted, plain), "sm2 encrypt & decrypt");
  28. } on Error catch(e) {
  29. debugPrint(e.toString());
  30. return;
  31. }
  32. }
  33. Future<void> testSM2PrivateKeyPem(Pointer<SM2Key> key) async {
  34. final pass = "123456".toNativeUtf8();
  35. final private = key.privateKey.list;
  36. final tempDirPath = (await getTemporaryDirectory()).path;
  37. final path = "$tempDirPath/private.pem";
  38. sm2PrivateKeyInfoEncryptToPEM(key, pass, path);
  39. sm2PrivateKeyInfoDecryptFromPEM(key, pass, path);
  40. testPrint(listEquals(private, key.privateKey.list), "private key <-> PEM");
  41. }
  42. void testSM2PublicKeyDER(Pointer<SM2Key> key) {
  43. final public = Tuple2(key.publicKey.x.list, key.publicKey.y.list);
  44. try {
  45. final der = sm2PublicKeyInfoToDER(key);
  46. debugPrint("der.length = ${der.length}");
  47. debugPrint("der = $der");
  48. final encoded = base64Encode(der);
  49. debugPrint("pem = $encoded");
  50. final res = sm2PublicKeyInfoFromDER(key, der);
  51. // assert(res>=0, "sm2PublicKeyInfoFromDER error");
  52. if (res != 1) {
  53. debugPrint("sm2PublicKeyInfoFromDER error! res == $res");
  54. }
  55. } on Error catch(e) {
  56. debugPrint(e.toString());
  57. return;
  58. }
  59. testPrint(listEquals(public.item1, key.publicKey.x.list) &&
  60. listEquals(public.item2, key.publicKey.y.list), "public key <-> DER");
  61. }
  62. void testSM4() {
  63. final plain = randomVector(1<<16);
  64. // debugPrint("plain=");
  65. // debugPrint(base64Encode(plain));
  66. final sm4key = randomVector(16);
  67. final iv = randomVector(16);
  68. final sm4enc = sm4cbcEncrypt(plain, sm4key, iv);
  69. // debugPrint("sm4enc=");
  70. // debugPrint(base64Encode(sm4enc));
  71. final sm4dec = sm4cbcDecrypt(sm4enc, sm4key, iv);
  72. // debugPrint("sm4dec=");
  73. // debugPrint(base64Encode(sm4dec));
  74. testPrint(listEquals(plain, sm4dec), "sm4 encrypt & decrypt");
  75. }
  76. void testPemToDerToKey(Pointer<SM2Key> key, String tempPath) {
  77. final public = Tuple2(key.publicKey.x.list, key.publicKey.y.list);
  78. final private = key.privateKey.list;
  79. assert(sm2PublicKeyInfoToPEM(key, tempPath) == 1);
  80. File pemFile = File(tempPath);
  81. final lines = pemFile.readAsLinesSync();
  82. lines.remove("-----BEGIN PUBLIC KEY-----");
  83. lines.remove("-----END PUBLIC KEY-----");
  84. final content = lines.join();
  85. debugPrint("pem=$content");
  86. final der = base64Decode(content);
  87. debugPrint("der.length=${der.length} der=$der");
  88. assert(sm2PublicKeyInfoFromDER(key, der)==1);
  89. testPrint(listEquals(public.item1, key.publicKey.x.list) &&
  90. listEquals(public.item2, key.publicKey.y.list), "der -> publicKey");
  91. final equals = listEquals(private, key.privateKey.list);
  92. debugPrint("privateKey equals : $equals");
  93. }
  94. void encryptTest() async {
  95. final tempDirPath = (await getTemporaryDirectory()).path;
  96. final errorPath = "$tempDirPath/error.txt";
  97. final tempPath = "$tempDirPath/temp.pem";
  98. final pf = freopen(errorPath, "w", stderrAddress);
  99. debugPrint("==========encrypt test start===========");
  100. try {
  101. // int s = add(1, 5);
  102. // debugPrint("test libadd sum = $s");
  103. final key = gm.newSM2Key();
  104. key.generate();
  105. testPemToDerToKey(key, tempPath);
  106. final key1 = gm.newSM2Key();
  107. testSM2(key);
  108. // testSM2(key);
  109. // testSM2(key);
  110. // testSM2(key);
  111. await testSM2PrivateKeyPem(key);
  112. testSM2(key);
  113. testSM2PublicKeyDER(key);
  114. // testSM2PublicKeyDER(key);
  115. // testSM2PublicKeyDER(key);
  116. // testSM2PublicKeyDER(key);
  117. // testSM2(key);
  118. // testSM2(key);
  119. // testSM2(key);
  120. // testSM2(key);
  121. // TODO: ERROR sm2PublicKeyInfoToDER
  122. // final private = sm2PrivateKeyInfoDecryptFromPEMString(key, pass);
  123. // final publicPem = await sm2PublicKeyInfoToPEMString(key);
  124. // debugPrint(privatePem);
  125. // debugPrint(publicPem);
  126. testSM4();
  127. } on Error catch (e) {
  128. debugPrint(e.toString());
  129. }
  130. debugPrint("==========encrypt test end===========");
  131. gm.fclose(pf);
  132. File errorFile = File(errorPath);
  133. final errorInfo = errorFile.readAsStringSync();
  134. debugPrint("error info = ");
  135. debugPrint(errorInfo);
  136. }