test.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright © 2018 Guillem Jover <[email protected]>
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * 3. The name of the author may not be used to endorse or promote products
  13. * derived from this software without specific prior written permission.
  14. *
  15. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
  16. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17. * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
  18. * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  19. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  20. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  21. * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  22. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  23. * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  24. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #include <config.h>
  27. #include <assert.h>
  28. #include <string.h>
  29. static int
  30. hexchar2bin(int c)
  31. {
  32. if (c >= '0' && c <= '9')
  33. return c - '0';
  34. else if (c >= 'a' && c <= 'f')
  35. return c - 'a' + 10;
  36. else if (c >= 'A' && c <= 'F')
  37. return c - 'A' + 10;
  38. assert(!"invalid hexadecimal input");
  39. }
  40. static void
  41. hex2bin(uint8_t *bin, const char *str, size_t bin_len)
  42. {
  43. size_t i;
  44. for (i = 0; i < bin_len; i++)
  45. bin[i] = hexchar2bin(str[i * 2]) << 4 |
  46. hexchar2bin(str[i * 2 + 1]);
  47. }
  48. #define DEF_TEST_DIGEST(name, type) \
  49. static void \
  50. test_##name(const char *hash_str_ref, const char *data) \
  51. { \
  52. uint8_t hash_bin_ref[name##_DIGEST_LENGTH]; \
  53. uint8_t hash_bin_got[name##_DIGEST_LENGTH]; \
  54. char hash_str_got[name##_DIGEST_STRING_LENGTH]; \
  55. type##_CTX ctx; \
  56. \
  57. hex2bin(hash_bin_ref, hash_str_ref, name##_DIGEST_LENGTH); \
  58. \
  59. name##Data((const uint8_t *)data, strlen(data), hash_str_got); \
  60. assert(strcmp(hash_str_ref, hash_str_got) == 0); \
  61. \
  62. name##Init(&ctx); \
  63. name##Update(&ctx, (const uint8_t *)data, strlen(data)); \
  64. name##End(&ctx, hash_str_got); \
  65. assert(strcmp(hash_str_ref, hash_str_got) == 0); \
  66. \
  67. name##Init(&ctx); \
  68. name##Update(&ctx, (const uint8_t *)data, strlen(data)); \
  69. name##Final(hash_bin_got, &ctx); \
  70. assert(memcmp(hash_bin_ref, hash_bin_got, sizeof(hash_bin_ref)) == 0); \
  71. }