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.
 
 
 
 
 
 

97 rindas
2.5 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_sha_test processes a NIST CAVP SHA test vector request file and emits
  15. // the corresponding response.
  16. #include <stdlib.h>
  17. #include <openssl/crypto.h>
  18. #include <openssl/digest.h>
  19. #include "../crypto/test/file_test.h"
  20. #include "cavp_test_util.h"
  21. namespace {
  22. struct TestCtx {
  23. std::string hash;
  24. };
  25. }
  26. static bool TestSHA(FileTest *t, void *arg) {
  27. TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
  28. const EVP_MD *md = EVP_get_digestbyname(ctx->hash.c_str());
  29. if (md == nullptr) {
  30. return false;
  31. }
  32. const size_t md_len = EVP_MD_size(md);
  33. std::string out_len;
  34. if (!t->GetInstruction(&out_len, "L") ||
  35. md_len != strtoul(out_len.c_str(), nullptr, 0)) {
  36. return false;
  37. }
  38. std::string msg_len_str;
  39. std::vector<uint8_t> msg;
  40. if (!t->GetAttribute(&msg_len_str, "Len") ||
  41. !t->GetBytes(&msg, "Msg")) {
  42. return false;
  43. }
  44. size_t msg_len = strtoul(msg_len_str.c_str(), nullptr, 0);
  45. if (msg_len % 8 != 0 ||
  46. msg_len / 8 > msg.size()) {
  47. return false;
  48. }
  49. msg_len /= 8;
  50. std::vector<uint8_t> out;
  51. out.resize(md_len);
  52. unsigned digest_len;
  53. if (!EVP_Digest(msg.data(), msg_len, out.data(), &digest_len, md, nullptr) ||
  54. digest_len != out.size()) {
  55. return false;
  56. }
  57. printf("%s", t->CurrentTestToString().c_str());
  58. printf("MD = %s\r\n\r\n", EncodeHex(out.data(), out.size()).c_str());
  59. return true;
  60. }
  61. static int usage(char *arg) {
  62. fprintf(stderr, "usage: %s <hash> <test file>\n", arg);
  63. return 1;
  64. }
  65. int cavp_sha_test_main(int argc, char **argv) {
  66. if (argc != 3) {
  67. return usage(argv[0]);
  68. }
  69. TestCtx ctx = {std::string(argv[1])};
  70. FileTest::Options opts;
  71. opts.path = argv[2];
  72. opts.callback = TestSHA;
  73. opts.arg = &ctx;
  74. opts.silent = true;
  75. opts.comment_callback = EchoComment;
  76. return FileTestMain(opts);
  77. }