secretbox_xsalsa20poly1305.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "crypto_onetimeauth_poly1305.h"
  2. #include "crypto_secretbox_xsalsa20poly1305.h"
  3. #include "crypto_stream_xsalsa20.h"
  4. #include "randombytes.h"
  5. int
  6. crypto_secretbox_xsalsa20poly1305(unsigned char *c, const unsigned char *m,
  7. unsigned long long mlen,
  8. const unsigned char *n,
  9. const unsigned char *k)
  10. {
  11. int i;
  12. if (mlen < 32) {
  13. return -1;
  14. }
  15. crypto_stream_xsalsa20_xor(c, m, mlen, n, k);
  16. crypto_onetimeauth_poly1305(c + 16, c + 32, mlen - 32, c);
  17. for (i = 0; i < 16; ++i) {
  18. c[i] = 0;
  19. }
  20. return 0;
  21. }
  22. int
  23. crypto_secretbox_xsalsa20poly1305_open(unsigned char *m, const unsigned char *c,
  24. unsigned long long clen,
  25. const unsigned char *n,
  26. const unsigned char *k)
  27. {
  28. unsigned char subkey[32];
  29. int i;
  30. if (clen < 32) {
  31. return -1;
  32. }
  33. crypto_stream_xsalsa20(subkey, 32, n, k);
  34. if (crypto_onetimeauth_poly1305_verify(c + 16, c + 32,
  35. clen - 32, subkey) != 0) {
  36. return -1;
  37. }
  38. crypto_stream_xsalsa20_xor(m, c, clen, n, k);
  39. for (i = 0; i < 32; ++i) {
  40. m[i] = 0;
  41. }
  42. return 0;
  43. }
  44. size_t
  45. crypto_secretbox_xsalsa20poly1305_keybytes(void)
  46. {
  47. return crypto_secretbox_xsalsa20poly1305_KEYBYTES;
  48. }
  49. size_t
  50. crypto_secretbox_xsalsa20poly1305_noncebytes(void)
  51. {
  52. return crypto_secretbox_xsalsa20poly1305_NONCEBYTES;
  53. }
  54. size_t
  55. crypto_secretbox_xsalsa20poly1305_zerobytes(void)
  56. {
  57. return crypto_secretbox_xsalsa20poly1305_ZEROBYTES;
  58. }
  59. size_t
  60. crypto_secretbox_xsalsa20poly1305_boxzerobytes(void)
  61. {
  62. return crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES;
  63. }
  64. size_t
  65. crypto_secretbox_xsalsa20poly1305_macbytes(void)
  66. {
  67. return crypto_secretbox_xsalsa20poly1305_MACBYTES;
  68. }
  69. size_t
  70. crypto_secretbox_xsalsa20poly1305_messagebytes_max(void)
  71. {
  72. return crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX;
  73. }
  74. void
  75. crypto_secretbox_xsalsa20poly1305_keygen(unsigned char k[crypto_secretbox_xsalsa20poly1305_KEYBYTES])
  76. {
  77. randombytes_buf(k, crypto_secretbox_xsalsa20poly1305_KEYBYTES);
  78. }