Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

125 rindas
4.2 KiB

  1. /* Copyright (c) 2017, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. // cavp_ecdsa2_siggen_test processes NIST CAVP ECDSA2 SigGen and
  15. // SigGenComponent test vector request files and emits the corresponding
  16. // response.
  17. #include <vector>
  18. #include <openssl/bn.h>
  19. #include <openssl/crypto.h>
  20. #include <openssl/digest.h>
  21. #include <openssl/ec_key.h>
  22. #include <openssl/ecdsa.h>
  23. #include <openssl/err.h>
  24. #include <openssl/nid.h>
  25. #include "../crypto/internal.h"
  26. #include "../crypto/test/file_test.h"
  27. #include "cavp_test_util.h"
  28. static bool TestECDSA2SigGenImpl(FileTest *t, bool is_component) {
  29. int nid = GetECGroupNIDFromInstruction(t);
  30. const EVP_MD *md = GetDigestFromInstruction(t);
  31. if (nid == NID_undef || md == nullptr) {
  32. return false;
  33. }
  34. bssl::UniquePtr<BIGNUM> qx(BN_new()), qy(BN_new());
  35. bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
  36. std::vector<uint8_t> msg;
  37. if (!qx || !qy || !key ||
  38. !EC_KEY_generate_key_fips(key.get()) ||
  39. !EC_POINT_get_affine_coordinates_GFp(EC_KEY_get0_group(key.get()),
  40. EC_KEY_get0_public_key(key.get()),
  41. qx.get(), qy.get(), nullptr) ||
  42. !t->GetBytes(&msg, "Msg")) {
  43. return false;
  44. }
  45. uint8_t digest[EVP_MAX_MD_SIZE];
  46. unsigned digest_len;
  47. if (is_component) {
  48. if (msg.size() != EVP_MD_size(md)) {
  49. t->PrintLine("Bad input length.");
  50. return false;
  51. }
  52. digest_len = EVP_MD_size(md);
  53. OPENSSL_memcpy(digest, msg.data(), msg.size());
  54. } else if (!EVP_Digest(msg.data(), msg.size(), digest, &digest_len, md,
  55. nullptr)) {
  56. return false;
  57. }
  58. bssl::UniquePtr<ECDSA_SIG> sig(ECDSA_do_sign(digest, digest_len, key.get()));
  59. if (!sig) {
  60. return false;
  61. }
  62. size_t degree_len =
  63. (EC_GROUP_get_degree(EC_KEY_get0_group(key.get())) + 7) / 8;
  64. size_t order_len =
  65. BN_num_bytes(EC_GROUP_get0_order(EC_KEY_get0_group(key.get())));
  66. std::vector<uint8_t> qx_bytes(degree_len), qy_bytes(degree_len);
  67. std::vector<uint8_t> r_bytes(order_len), s_bytes(order_len);
  68. if (!BN_bn2bin_padded(qx_bytes.data(), qx_bytes.size(), qx.get()) ||
  69. !BN_bn2bin_padded(qy_bytes.data(), qy_bytes.size(), qy.get()) ||
  70. !BN_bn2bin_padded(r_bytes.data(), r_bytes.size(), sig->r) ||
  71. !BN_bn2bin_padded(s_bytes.data(), s_bytes.size(), sig->s)) {
  72. return false;
  73. }
  74. printf("%sQx = %s\r\nQy = %s\r\nR = %s\r\nS = %s\r\n\r\n",
  75. t->CurrentTestToString().c_str(),
  76. EncodeHex(qx_bytes.data(), qx_bytes.size()).c_str(),
  77. EncodeHex(qy_bytes.data(), qy_bytes.size()).c_str(),
  78. EncodeHex(r_bytes.data(), r_bytes.size()).c_str(),
  79. EncodeHex(s_bytes.data(), s_bytes.size()).c_str());
  80. return true;
  81. }
  82. static bool TestECDSA2SigGen(FileTest *t, void *arg) {
  83. return TestECDSA2SigGenImpl(t, false);
  84. }
  85. static bool TestECDSA2SigGenComponent(FileTest *t, void *arg) {
  86. return TestECDSA2SigGenImpl(t, true);
  87. }
  88. int cavp_ecdsa2_siggen_test_main(int argc, char **argv) {
  89. if (argc != 3) {
  90. fprintf(stderr, "usage: %s (SigGen|SigGenComponent) <test file>\n",
  91. argv[0]);
  92. return 1;
  93. }
  94. static bool (*test_func)(FileTest *, void *);
  95. if (strcmp(argv[1], "SigGen") == 0) {
  96. test_func = TestECDSA2SigGen;
  97. } else if (strcmp(argv[1], "SigGenComponent") == 0) {
  98. test_func = TestECDSA2SigGenComponent;
  99. } else {
  100. fprintf(stderr, "Unknown test type: %s\n", argv[1]);
  101. return 1;
  102. }
  103. FileTest::Options opts;
  104. opts.path = argv[2];
  105. opts.callback = test_func;
  106. opts.silent = true;
  107. opts.comment_callback = EchoComment;
  108. return FileTestMain(opts);
  109. }