hydrogen.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. #ifndef hydrogen_H
  2. #define hydrogen_H
  3. #include <stdbool.h>
  4. #include <stdint.h>
  5. #include <stdlib.h>
  6. #ifdef __cplusplus
  7. # ifdef __GNUC__
  8. # pragma GCC diagnostic ignored "-Wlong-long"
  9. # endif
  10. extern "C" {
  11. #endif
  12. #if defined(__clang__) || defined(__GNUC__)
  13. # define _hydro_attr_(X) __attribute__(X)
  14. #else
  15. # define _hydro_attr_(X)
  16. #endif
  17. #define _hydro_attr_deprecated_ _hydro_attr_((deprecated))
  18. #define _hydro_attr_malloc_ _hydro_attr_((malloc))
  19. #define _hydro_attr_noinline_ _hydro_attr_((noinline))
  20. #define _hydro_attr_noreturn_ _hydro_attr_((noreturn))
  21. #define _hydro_attr_warn_unused_result_ _hydro_attr_((warn_unused_result))
  22. #define _hydro_attr_weak_ _hydro_attr_((weak))
  23. #if defined(__INTEL_COMPILER) || defined(_MSC_VER)
  24. # define _hydro_attr_aligned_(X) __declspec(align(X))
  25. #elif defined(__clang__) || defined(__GNUC__)
  26. # define _hydro_attr_aligned_(X) _hydro_attr_((aligned(X)))
  27. #else
  28. # define _hydro_attr_aligned_(X)
  29. #endif
  30. #define HYDRO_VERSION_MAJOR 1
  31. #define HYDRO_VERSION_MINOR 0
  32. int hydro_init(void);
  33. /* ---------------- */
  34. #define hydro_random_SEEDBYTES 32
  35. uint32_t hydro_random_u32(void);
  36. uint32_t hydro_random_uniform(const uint32_t upper_bound);
  37. void hydro_random_buf(void *out, size_t out_len);
  38. void hydro_random_buf_deterministic(void *out, size_t out_len,
  39. const uint8_t seed[hydro_random_SEEDBYTES]);
  40. void hydro_random_ratchet(void);
  41. void hydro_random_reseed(void);
  42. /* ---------------- */
  43. #define hydro_hash_BYTES 32
  44. #define hydro_hash_BYTES_MAX 65535
  45. #define hydro_hash_BYTES_MIN 16
  46. #define hydro_hash_CONTEXTBYTES 8
  47. #define hydro_hash_KEYBYTES 32
  48. typedef struct hydro_hash_state {
  49. uint32_t state[12];
  50. uint8_t buf_off;
  51. uint8_t align[3];
  52. } hydro_hash_state;
  53. void hydro_hash_keygen(uint8_t key[hydro_hash_KEYBYTES]);
  54. int hydro_hash_init(hydro_hash_state *state, const char ctx[hydro_hash_CONTEXTBYTES],
  55. const uint8_t key[hydro_hash_KEYBYTES]);
  56. int hydro_hash_update(hydro_hash_state *state, const void *in_, size_t in_len);
  57. int hydro_hash_final(hydro_hash_state *state, uint8_t *out, size_t out_len);
  58. int hydro_hash_hash(uint8_t *out, size_t out_len, const void *in_, size_t in_len,
  59. const char ctx[hydro_hash_CONTEXTBYTES],
  60. const uint8_t key[hydro_hash_KEYBYTES]);
  61. /* ---------------- */
  62. #define hydro_secretbox_CONTEXTBYTES 8
  63. #define hydro_secretbox_HEADERBYTES (20 + 16)
  64. #define hydro_secretbox_KEYBYTES 32
  65. #define hydro_secretbox_PROBEBYTES 16
  66. void hydro_secretbox_keygen(uint8_t key[hydro_secretbox_KEYBYTES]);
  67. int hydro_secretbox_encrypt(uint8_t *c, const void *m_, size_t mlen, uint64_t msg_id,
  68. const char ctx[hydro_secretbox_CONTEXTBYTES],
  69. const uint8_t key[hydro_secretbox_KEYBYTES]);
  70. int hydro_secretbox_decrypt(void *m_, const uint8_t *c, size_t clen, uint64_t msg_id,
  71. const char ctx[hydro_secretbox_CONTEXTBYTES],
  72. const uint8_t key[hydro_secretbox_KEYBYTES])
  73. _hydro_attr_warn_unused_result_;
  74. void hydro_secretbox_probe_create(uint8_t probe[hydro_secretbox_PROBEBYTES], const uint8_t *c,
  75. size_t c_len, const char ctx[hydro_secretbox_CONTEXTBYTES],
  76. const uint8_t key[hydro_secretbox_KEYBYTES]);
  77. int hydro_secretbox_probe_verify(const uint8_t probe[hydro_secretbox_PROBEBYTES], const uint8_t *c,
  78. size_t c_len, const char ctx[hydro_secretbox_CONTEXTBYTES],
  79. const uint8_t key[hydro_secretbox_KEYBYTES])
  80. _hydro_attr_warn_unused_result_;
  81. /* ---------------- */
  82. #define hydro_kdf_CONTEXTBYTES 8
  83. #define hydro_kdf_KEYBYTES 32
  84. #define hydro_kdf_BYTES_MAX 65535
  85. #define hydro_kdf_BYTES_MIN 16
  86. void hydro_kdf_keygen(uint8_t key[hydro_kdf_KEYBYTES]);
  87. int hydro_kdf_derive_from_key(uint8_t *subkey, size_t subkey_len, uint64_t subkey_id,
  88. const char ctx[hydro_kdf_CONTEXTBYTES],
  89. const uint8_t key[hydro_kdf_KEYBYTES]);
  90. /* ---------------- */
  91. #define hydro_sign_BYTES 64
  92. #define hydro_sign_CONTEXTBYTES 8
  93. #define hydro_sign_PUBLICKEYBYTES 32
  94. #define hydro_sign_SECRETKEYBYTES 64
  95. #define hydro_sign_SEEDBYTES 32
  96. typedef struct hydro_sign_state {
  97. hydro_hash_state hash_st;
  98. } hydro_sign_state;
  99. typedef struct hydro_sign_keypair {
  100. uint8_t pk[hydro_sign_PUBLICKEYBYTES];
  101. uint8_t sk[hydro_sign_SECRETKEYBYTES];
  102. } hydro_sign_keypair;
  103. void hydro_sign_keygen(hydro_sign_keypair *kp);
  104. void hydro_sign_keygen_deterministic(hydro_sign_keypair *kp,
  105. const uint8_t seed[hydro_sign_SEEDBYTES]);
  106. int hydro_sign_init(hydro_sign_state *state, const char ctx[hydro_sign_CONTEXTBYTES]);
  107. int hydro_sign_update(hydro_sign_state *state, const void *m_, size_t mlen);
  108. int hydro_sign_final_create(hydro_sign_state *state, uint8_t csig[hydro_sign_BYTES],
  109. const uint8_t sk[hydro_sign_SECRETKEYBYTES]);
  110. int hydro_sign_final_verify(hydro_sign_state *state, const uint8_t csig[hydro_sign_BYTES],
  111. const uint8_t pk[hydro_sign_PUBLICKEYBYTES])
  112. _hydro_attr_warn_unused_result_;
  113. int hydro_sign_create(uint8_t csig[hydro_sign_BYTES], const void *m_, size_t mlen,
  114. const char ctx[hydro_sign_CONTEXTBYTES],
  115. const uint8_t sk[hydro_sign_SECRETKEYBYTES]);
  116. int hydro_sign_verify(const uint8_t csig[hydro_sign_BYTES], const void *m_, size_t mlen,
  117. const char ctx[hydro_sign_CONTEXTBYTES],
  118. const uint8_t pk[hydro_sign_PUBLICKEYBYTES]) _hydro_attr_warn_unused_result_;
  119. /* ---------------- */
  120. #define hydro_kx_SESSIONKEYBYTES 32
  121. #define hydro_kx_PUBLICKEYBYTES 32
  122. #define hydro_kx_SECRETKEYBYTES 32
  123. #define hydro_kx_PSKBYTES 32
  124. #define hydro_kx_SEEDBYTES 32
  125. typedef struct hydro_kx_keypair {
  126. uint8_t pk[hydro_kx_PUBLICKEYBYTES];
  127. uint8_t sk[hydro_kx_SECRETKEYBYTES];
  128. } hydro_kx_keypair;
  129. typedef struct hydro_kx_session_keypair {
  130. uint8_t rx[hydro_kx_SESSIONKEYBYTES];
  131. uint8_t tx[hydro_kx_SESSIONKEYBYTES];
  132. } hydro_kx_session_keypair;
  133. typedef struct hydro_kx_state {
  134. hydro_kx_keypair eph_kp;
  135. uint8_t h[32];
  136. uint8_t ck[32];
  137. uint8_t k[32];
  138. } hydro_kx_state;
  139. void hydro_kx_keygen(hydro_kx_keypair *static_kp);
  140. void hydro_kx_keygen_deterministic(hydro_kx_keypair *static_kp,
  141. const uint8_t seed[hydro_kx_SEEDBYTES]);
  142. /* NOISE_N */
  143. #define hydro_kx_N_PACKET1BYTES 32
  144. int hydro_kx_n_1(hydro_kx_session_keypair *kp, uint8_t packet1[hydro_kx_N_PACKET1BYTES],
  145. const uint8_t psk[hydro_kx_PSKBYTES],
  146. const uint8_t peer_static_pk[hydro_kx_PUBLICKEYBYTES]);
  147. int hydro_kx_n_2(hydro_kx_session_keypair *kp, const uint8_t packet1[hydro_kx_N_PACKET1BYTES],
  148. const uint8_t psk[hydro_kx_PSKBYTES], const hydro_kx_keypair *static_kp);
  149. /* NOISE_KK */
  150. #define hydro_kx_KK_PACKET1BYTES 32
  151. #define hydro_kx_KK_PACKET2BYTES 32
  152. int hydro_kx_kk_1(hydro_kx_state *state, uint8_t packet1[hydro_kx_KK_PACKET1BYTES],
  153. const uint8_t peer_static_pk[hydro_kx_PUBLICKEYBYTES],
  154. const hydro_kx_keypair *static_kp);
  155. int hydro_kx_kk_2(hydro_kx_session_keypair *kp, uint8_t packet2[hydro_kx_KK_PACKET2BYTES],
  156. const uint8_t packet1[hydro_kx_KK_PACKET1BYTES],
  157. const uint8_t peer_static_pk[hydro_kx_PUBLICKEYBYTES],
  158. const hydro_kx_keypair *static_kp);
  159. int hydro_kx_kk_3(hydro_kx_state *state, hydro_kx_session_keypair *kp,
  160. const uint8_t packet2[hydro_kx_KK_PACKET2BYTES],
  161. const hydro_kx_keypair *static_kp);
  162. /* NOISE_XX */
  163. #define hydro_kx_XX_PACKET1BYTES 32
  164. #define hydro_kx_XX_PACKET2BYTES 80
  165. #define hydro_kx_XX_PACKET3BYTES 48
  166. int hydro_kx_xx_1(hydro_kx_state *state, uint8_t packet1[hydro_kx_XX_PACKET1BYTES],
  167. const uint8_t psk[hydro_kx_PSKBYTES]);
  168. int hydro_kx_xx_2(hydro_kx_state *state, uint8_t packet2[hydro_kx_XX_PACKET2BYTES],
  169. const uint8_t packet1[hydro_kx_XX_PACKET1BYTES],
  170. const uint8_t psk[hydro_kx_PSKBYTES], const hydro_kx_keypair *static_kp);
  171. int hydro_kx_xx_3(hydro_kx_state *state, hydro_kx_session_keypair *kp,
  172. uint8_t packet3[hydro_kx_XX_PACKET3BYTES],
  173. uint8_t peer_static_pk[hydro_kx_PUBLICKEYBYTES],
  174. const uint8_t packet2[hydro_kx_XX_PACKET2BYTES],
  175. const uint8_t psk[hydro_kx_PSKBYTES], const hydro_kx_keypair *static_kp);
  176. int hydro_kx_xx_4(hydro_kx_state *state, hydro_kx_session_keypair *kp,
  177. uint8_t peer_static_pk[hydro_kx_PUBLICKEYBYTES],
  178. const uint8_t packet3[hydro_kx_XX_PACKET3BYTES],
  179. const uint8_t psk[hydro_kx_PSKBYTES]);
  180. /* ---------------- */
  181. #define hydro_pwhash_CONTEXTBYTES 8
  182. #define hydro_pwhash_MASTERKEYBYTES 32
  183. #define hydro_pwhash_STOREDBYTES 128
  184. void hydro_pwhash_keygen(uint8_t master_key[hydro_pwhash_MASTERKEYBYTES]);
  185. int hydro_pwhash_deterministic(uint8_t *h, size_t h_len, const char *passwd, size_t passwd_len,
  186. const char ctx[hydro_pwhash_CONTEXTBYTES],
  187. const uint8_t master_key[hydro_pwhash_MASTERKEYBYTES],
  188. uint64_t opslimit, size_t memlimit, uint8_t threads);
  189. int hydro_pwhash_create(uint8_t stored[hydro_pwhash_STOREDBYTES], const char *passwd,
  190. size_t passwd_len, const uint8_t master_key[hydro_pwhash_MASTERKEYBYTES],
  191. uint64_t opslimit, size_t memlimit, uint8_t threads);
  192. int hydro_pwhash_verify(const uint8_t stored[hydro_pwhash_STOREDBYTES], const char *passwd,
  193. size_t passwd_len, const uint8_t master_key[hydro_pwhash_MASTERKEYBYTES],
  194. uint64_t opslimit_max, size_t memlimit_max, uint8_t threads_max);
  195. int hydro_pwhash_derive_static_key(uint8_t *static_key, size_t static_key_len,
  196. const uint8_t stored[hydro_pwhash_STOREDBYTES],
  197. const char *passwd, size_t passwd_len,
  198. const char ctx[hydro_pwhash_CONTEXTBYTES],
  199. const uint8_t master_key[hydro_pwhash_MASTERKEYBYTES],
  200. uint64_t opslimit_max, size_t memlimit_max, uint8_t threads_max);
  201. int hydro_pwhash_reencrypt(uint8_t stored[hydro_pwhash_STOREDBYTES],
  202. const uint8_t master_key[hydro_pwhash_MASTERKEYBYTES],
  203. const uint8_t new_master_key[hydro_pwhash_MASTERKEYBYTES]);
  204. int hydro_pwhash_upgrade(uint8_t stored[hydro_pwhash_STOREDBYTES],
  205. const uint8_t master_key[hydro_pwhash_MASTERKEYBYTES], uint64_t opslimit,
  206. size_t memlimit, uint8_t threads);
  207. /* ---------------- */
  208. void hydro_memzero(void *pnt, size_t len);
  209. void hydro_increment(uint8_t *n, size_t len);
  210. bool hydro_equal(const void *b1_, const void *b2_, size_t len);
  211. int hydro_compare(const uint8_t *b1_, const uint8_t *b2_, size_t len);
  212. char *hydro_bin2hex(char *hex, size_t hex_maxlen, const uint8_t *bin, size_t bin_len);
  213. int hydro_hex2bin(uint8_t *bin, size_t bin_maxlen, const char *hex, size_t hex_len,
  214. const char *ignore, const char **hex_end_p);
  215. int hydro_pad(unsigned char *buf, size_t unpadded_buflen, size_t blocksize, size_t max_buflen);
  216. int hydro_unpad(const unsigned char *buf, size_t padded_buflen, size_t blocksize);
  217. /* ---------------- */
  218. #define HYDRO_HWTYPE_ATMEGA328 1
  219. #ifndef HYDRO_HWTYPE
  220. # ifdef __AVR__
  221. # define HYDRO_HWTYPE HYDRO_HWTYPE_ATMEGA328
  222. # endif
  223. #endif
  224. #ifdef __cplusplus
  225. }
  226. #endif
  227. #endif