選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

77 行
2.6 KiB

  1. #include <stdint.h>
  2. #include <string.h>
  3. #include "address.h"
  4. #include "params.h"
  5. #include "thash.h"
  6. #include "sha2.h"
  7. #include "sha256.h"
  8. /**
  9. * Takes an array of inblocks concatenated arrays of SPX_N bytes.
  10. */
  11. static void PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash(
  12. unsigned char *out, unsigned char *buf,
  13. const unsigned char *in, unsigned int inblocks,
  14. const unsigned char *pub_seed, uint32_t addr[8]) {
  15. unsigned char outbuf[SPX_SHA256_OUTPUT_BYTES];
  16. unsigned char *bitmask = buf + SPX_N + SPX_SHA256_ADDR_BYTES;
  17. uint8_t sha2_state[40];
  18. unsigned int i;
  19. memcpy(buf, pub_seed, SPX_N);
  20. PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_compress_address(buf + SPX_N, addr);
  21. PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_mgf1(bitmask, inblocks * SPX_N, buf, SPX_N + SPX_SHA256_ADDR_BYTES);
  22. /* Retrieve precomputed state containing pub_seed */
  23. memcpy(sha2_state, PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_state_seeded, 40 * sizeof(uint8_t));
  24. for (i = 0; i < inblocks * SPX_N; i++) {
  25. buf[SPX_N + SPX_SHA256_ADDR_BYTES + i] = in[i] ^ bitmask[i];
  26. }
  27. sha256_inc_finalize(outbuf, sha2_state, buf + SPX_N,
  28. SPX_SHA256_ADDR_BYTES + inblocks * SPX_N);
  29. memcpy(out, outbuf, SPX_N);
  30. }
  31. /* The wrappers below ensure that we use fixed-size buffers on the stack */
  32. void PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash_1(
  33. unsigned char *out, const unsigned char *in,
  34. const unsigned char *pub_seed, uint32_t addr[8]) {
  35. unsigned char buf[SPX_N + SPX_SHA256_ADDR_BYTES + 1 * SPX_N];
  36. PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash(
  37. out, buf, in, 1, pub_seed, addr);
  38. }
  39. void PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash_2(
  40. unsigned char *out, const unsigned char *in,
  41. const unsigned char *pub_seed, uint32_t addr[8]) {
  42. unsigned char buf[SPX_N + SPX_SHA256_ADDR_BYTES + 2 * SPX_N];
  43. PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash(
  44. out, buf, in, 2, pub_seed, addr);
  45. }
  46. void PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash_WOTS_LEN(
  47. unsigned char *out, const unsigned char *in,
  48. const unsigned char *pub_seed, uint32_t addr[8]) {
  49. unsigned char buf[SPX_N + SPX_SHA256_ADDR_BYTES + SPX_WOTS_LEN * SPX_N];
  50. PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash(
  51. out, buf, in, SPX_WOTS_LEN, pub_seed, addr);
  52. }
  53. void PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash_FORS_TREES(
  54. unsigned char *out, const unsigned char *in,
  55. const unsigned char *pub_seed, uint32_t addr[8]) {
  56. unsigned char buf[SPX_N + SPX_SHA256_ADDR_BYTES + SPX_FORS_TREES * SPX_N];
  57. PQCLEAN_SPHINCSSHA256128FROBUST_CLEAN_thash(
  58. out, buf, in, SPX_FORS_TREES, pub_seed, addr);
  59. }