You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

107 rivejä
5.0 KiB

  1. #include <stdint.h>
  2. #include <string.h>
  3. #include "address.h"
  4. #include "hash.h"
  5. #include "params.h"
  6. #include "utils.h"
  7. #include "fips202.h"
  8. /* For SHAKE256, there is no immediate reason to initialize at the start,
  9. so this function is an empty operation. */
  10. void PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_initialize_hash_function(
  11. hash_state *hash_state_seeded, // NOLINT(readability-non-const-parameter)
  12. const unsigned char *pub_seed, const unsigned char *sk_seed) {
  13. (void)hash_state_seeded; /* Suppress an 'unused parameter' warning. */
  14. (void)pub_seed; /* Suppress an 'unused parameter' warning. */
  15. (void)sk_seed; /* Suppress an 'unused parameter' warning. */
  16. }
  17. /* This is not necessary for SHAKE256, so we don't do anything */
  18. void PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_destroy_hash_function(
  19. hash_state *hash_state_seeded) { // NOLINT(readability-non-const-parameter)
  20. (void)hash_state_seeded;
  21. }
  22. /*
  23. * Computes PRF(key, addr), given a secret key of PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N bytes and an address
  24. */
  25. void PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_prf_addr(
  26. unsigned char *out, const unsigned char *key, const uint32_t addr[8],
  27. const hash_state *hash_state_seeded) {
  28. unsigned char buf[PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N + PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_ADDR_BYTES];
  29. memcpy(buf, key, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N);
  30. PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_addr_to_bytes(buf + PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N, addr);
  31. shake256(out, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N, buf, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N + PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_ADDR_BYTES);
  32. (void)hash_state_seeded; /* Prevent unused parameter warning. */
  33. }
  34. /**
  35. * Computes the message-dependent randomness R, using a secret seed and an
  36. * optional randomization value as well as the message.
  37. */
  38. void PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_gen_message_random(
  39. unsigned char *R,
  40. const unsigned char *sk_prf, const unsigned char *optrand,
  41. const unsigned char *m, size_t mlen,
  42. const hash_state *hash_state_seeded) {
  43. shake256incctx state;
  44. shake256_inc_init(&state);
  45. shake256_inc_absorb(&state, sk_prf, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N);
  46. shake256_inc_absorb(&state, optrand, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N);
  47. shake256_inc_absorb(&state, m, mlen);
  48. shake256_inc_finalize(&state);
  49. shake256_inc_squeeze(R, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N, &state);
  50. shake256_inc_ctx_release(&state);
  51. (void)hash_state_seeded; /* Prevent unused parameter warning. */
  52. }
  53. /**
  54. * Computes the message hash using R, the public key, and the message.
  55. * Outputs the message digest and the index of the leaf. The index is split in
  56. * the tree index and the leaf index, for convenient copying to an address.
  57. */
  58. void PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_hash_message(
  59. unsigned char *digest, uint64_t *tree, uint32_t *leaf_idx,
  60. const unsigned char *R, const unsigned char *pk,
  61. const unsigned char *m, size_t mlen,
  62. const hash_state *hash_state_seeded) {
  63. #define PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_BITS (PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_HEIGHT * (PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_D - 1))
  64. #define PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_BYTES ((PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_BITS + 7) / 8)
  65. #define PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_LEAF_BITS PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_HEIGHT
  66. #define PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_LEAF_BYTES ((PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_LEAF_BITS + 7) / 8)
  67. #define PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_DGST_BYTES (PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_FORS_MSG_BYTES + PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_BYTES + PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_LEAF_BYTES)
  68. unsigned char buf[PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_DGST_BYTES];
  69. unsigned char *bufp = buf;
  70. shake256incctx state;
  71. shake256_inc_init(&state);
  72. shake256_inc_absorb(&state, R, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_N);
  73. shake256_inc_absorb(&state, pk, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_PK_BYTES);
  74. shake256_inc_absorb(&state, m, mlen);
  75. shake256_inc_finalize(&state);
  76. shake256_inc_squeeze(buf, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_DGST_BYTES, &state);
  77. shake256_inc_ctx_release(&state);
  78. memcpy(digest, bufp, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_FORS_MSG_BYTES);
  79. bufp += PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_FORS_MSG_BYTES;
  80. *tree = PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_bytes_to_ull(
  81. bufp, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_BYTES);
  82. *tree &= (~(uint64_t)0) >> (64 - PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_BITS);
  83. bufp += PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_TREE_BYTES;
  84. *leaf_idx = (uint32_t)PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_bytes_to_ull(
  85. bufp, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_LEAF_BYTES);
  86. *leaf_idx &= (~(uint32_t)0) >> (32 - PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CLEAN_LEAF_BITS);
  87. (void)hash_state_seeded; /* Prevent unused parameter warning. */
  88. }