hash.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. int
  2. hydro_hash_update(hydro_hash_state *state, const void *in_, size_t in_len)
  3. {
  4. const uint8_t *in = (const uint8_t *) in_;
  5. uint8_t * buf = (uint8_t *) (void *) state->state;
  6. size_t left;
  7. size_t ps;
  8. size_t i;
  9. while (in_len > 0) {
  10. left = gimli_RATE - state->buf_off;
  11. if ((ps = in_len) > left) {
  12. ps = left;
  13. }
  14. for (i = 0; i < ps; i++) {
  15. buf[state->buf_off + i] ^= in[i];
  16. }
  17. in += ps;
  18. in_len -= ps;
  19. state->buf_off += (uint8_t) ps;
  20. if (state->buf_off == gimli_RATE) {
  21. gimli_core_u8(buf, 0);
  22. state->buf_off = 0;
  23. }
  24. }
  25. return 0;
  26. }
  27. /* pad(str_enc("kmac") || str_enc(context)) || pad(str_enc(k)) ||
  28. msg || right_enc(msg_len) || 0x00 */
  29. int
  30. hydro_hash_init(hydro_hash_state *state, const char ctx[hydro_hash_CONTEXTBYTES],
  31. const uint8_t key[hydro_hash_KEYBYTES])
  32. {
  33. uint8_t block[64] = { 4, 'k', 'm', 'a', 'c', 8 };
  34. size_t p;
  35. COMPILER_ASSERT(hydro_hash_KEYBYTES <= sizeof block - gimli_RATE - 1);
  36. COMPILER_ASSERT(hydro_hash_CONTEXTBYTES == 8);
  37. mem_zero(block + 14, sizeof block - 14);
  38. memcpy(block + 6, ctx, 8);
  39. if (key != NULL) {
  40. block[gimli_RATE] = (uint8_t) hydro_hash_KEYBYTES;
  41. memcpy(block + gimli_RATE + 1, key, hydro_hash_KEYBYTES);
  42. p = (gimli_RATE + 1 + hydro_hash_KEYBYTES + (gimli_RATE - 1)) & ~(size_t) (gimli_RATE - 1);
  43. } else {
  44. block[gimli_RATE] = (uint8_t) 0;
  45. p = (gimli_RATE + 1 + 0 + (gimli_RATE - 1)) & ~(size_t) (gimli_RATE - 1);
  46. }
  47. mem_zero(state, sizeof *state);
  48. hydro_hash_update(state, block, p);
  49. return 0;
  50. }
  51. /* pad(str_enc("tmac") || str_enc(context)) || pad(str_enc(k)) ||
  52. pad(right_enc(tweak)) || msg || right_enc(msg_len) || 0x00 */
  53. static int
  54. hydro_hash_init_with_tweak(hydro_hash_state *state, const char ctx[hydro_hash_CONTEXTBYTES],
  55. uint64_t tweak, const uint8_t key[hydro_hash_KEYBYTES])
  56. {
  57. uint8_t block[80] = { 4, 't', 'm', 'a', 'c', 8 };
  58. size_t p;
  59. COMPILER_ASSERT(hydro_hash_KEYBYTES <= sizeof block - 2 * gimli_RATE - 1);
  60. COMPILER_ASSERT(hydro_hash_CONTEXTBYTES == 8);
  61. mem_zero(block + 14, sizeof block - 14);
  62. memcpy(block + 6, ctx, 8);
  63. if (key != NULL) {
  64. block[gimli_RATE] = (uint8_t) hydro_hash_KEYBYTES;
  65. memcpy(block + gimli_RATE + 1, key, hydro_hash_KEYBYTES);
  66. p = (gimli_RATE + 1 + hydro_hash_KEYBYTES + (gimli_RATE - 1)) & ~(size_t) (gimli_RATE - 1);
  67. } else {
  68. block[gimli_RATE] = (uint8_t) 0;
  69. p = (gimli_RATE + 1 + 0 + (gimli_RATE - 1)) & ~(size_t) (gimli_RATE - 1);
  70. }
  71. block[p] = (uint8_t) sizeof tweak;
  72. STORE64_LE(&block[p + 1], tweak);
  73. p += gimli_RATE;
  74. mem_zero(state, sizeof *state);
  75. hydro_hash_update(state, block, p);
  76. return 0;
  77. }
  78. int
  79. hydro_hash_final(hydro_hash_state *state, uint8_t *out, size_t out_len)
  80. {
  81. uint8_t lc[4];
  82. uint8_t *buf = (uint8_t *) (void *) state->state;
  83. size_t i;
  84. size_t lc_len;
  85. size_t leftover;
  86. if (out_len < hydro_hash_BYTES_MIN || out_len > hydro_hash_BYTES_MAX) {
  87. return -1;
  88. }
  89. COMPILER_ASSERT(hydro_hash_BYTES_MAX <= 0xffff);
  90. lc[1] = (uint8_t) out_len;
  91. lc[2] = (uint8_t) (out_len >> 8);
  92. lc[3] = 0;
  93. lc_len = (size_t) (1 + (lc[2] != 0));
  94. lc[0] = (uint8_t) lc_len;
  95. hydro_hash_update(state, lc, 1 + lc_len + 1);
  96. gimli_pad_u8(buf, state->buf_off, gimli_DOMAIN_XOF);
  97. for (i = 0; i < out_len / gimli_RATE; i++) {
  98. gimli_core_u8(buf, 0);
  99. memcpy(out + i * gimli_RATE, buf, gimli_RATE);
  100. }
  101. leftover = out_len % gimli_RATE;
  102. if (leftover != 0) {
  103. gimli_core_u8(buf, 0);
  104. mem_cpy(out + i * gimli_RATE, buf, leftover);
  105. }
  106. state->buf_off = gimli_RATE;
  107. return 0;
  108. }
  109. int
  110. hydro_hash_hash(uint8_t *out, size_t out_len, const void *in_, size_t in_len,
  111. const char ctx[hydro_hash_CONTEXTBYTES], const uint8_t key[hydro_hash_KEYBYTES])
  112. {
  113. hydro_hash_state st;
  114. const uint8_t * in = (const uint8_t *) in_;
  115. if (hydro_hash_init(&st, ctx, key) != 0 || hydro_hash_update(&st, in, in_len) != 0 ||
  116. hydro_hash_final(&st, out, out_len) != 0) {
  117. return -1;
  118. }
  119. return 0;
  120. }
  121. void
  122. hydro_hash_keygen(uint8_t key[hydro_hash_KEYBYTES])
  123. {
  124. hydro_random_buf(key, hydro_hash_KEYBYTES);
  125. }