crypto_generichash_blake2b.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /**
  2. * Node Native Module for Lib Sodium
  3. *
  4. * @Author Pedro Paixao
  5. * @email paixaop at gmail dot com
  6. * @License MIT
  7. */
  8. #include "node_sodium.h"
  9. /**
  10. * int crypto_generichash_blake2b(unsigned char *out,
  11. * size_t outlen,
  12. * const unsigned char *in,
  13. * unsigned long long inlen,
  14. * const unsigned char *key,
  15. * size_t keylen);
  16. * buffer out,
  17. * number out_size,
  18. * buffer in,
  19. * buffer key
  20. */
  21. NAN_METHOD(bind_crypto_generichash_blake2b) {
  22. Nan::EscapableHandleScope scope;
  23. ARGS(3,"arguments must be: hash size, message, key");
  24. ARG_TO_NUMBER(out_size);
  25. ARG_TO_UCHAR_BUFFER(in);
  26. ARG_TO_UCHAR_BUFFER(key);
  27. CHECK_SIZE(key_size, crypto_generichash_blake2b_KEYBYTES_MIN, crypto_generichash_blake2b_KEYBYTES_MAX);
  28. CHECK_SIZE(out_size, crypto_generichash_blake2b_BYTES_MIN, crypto_generichash_blake2b_BYTES_MAX);
  29. NEW_BUFFER_AND_PTR(hash, out_size);
  30. sodium_memzero(hash_ptr, out_size);
  31. if (crypto_generichash_blake2b(hash_ptr, out_size, in, in_size, key, key_size) == 0) {
  32. return info.GetReturnValue().Set(hash);
  33. }
  34. return JS_NULL;
  35. }
  36. /*
  37. int crypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state,
  38. const unsigned char *key,
  39. const size_t keylen, const size_t outlen);
  40. Buffer state
  41. Buffer key
  42. Number out_size
  43. state = sodium_malloc((crypto_generichash_blake2b_statebytes() + (size_t) 63U)
  44. * & ~(size_t) 63U);
  45. */
  46. NAN_METHOD(bind_crypto_generichash_blake2b_init) {
  47. Nan::EscapableHandleScope scope;
  48. ARGS(2,"arguments must be: key buffer, output size");
  49. ARG_TO_UCHAR_BUFFER(key);
  50. ARG_TO_NUMBER(out_size);
  51. CHECK_SIZE(key_size, crypto_generichash_blake2b_KEYBYTES_MIN, crypto_generichash_blake2b_KEYBYTES_MAX);
  52. CHECK_SIZE(out_size, crypto_generichash_blake2b_BYTES_MIN, crypto_generichash_blake2b_BYTES_MAX);
  53. NEW_BUFFER_AND_PTR(state, (crypto_generichash_blake2b_statebytes() + (size_t) 63U) & ~(size_t) 63U);
  54. if (crypto_generichash_blake2b_init((crypto_generichash_blake2b_state *)state_ptr, key, key_size, out_size) == 0) {
  55. return info.GetReturnValue().Set(state);
  56. }
  57. return JS_NULL;
  58. }
  59. /*
  60. int crypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state,
  61. const unsigned char *in,
  62. unsigned long long inlen);
  63. buffer state
  64. buffer message
  65. */
  66. NAN_METHOD(bind_crypto_generichash_blake2b_update) {
  67. Nan::EscapableHandleScope scope;
  68. ARGS(2,"arguments must be: state buffer, message buffer");
  69. ARG_TO_VOID_BUFFER(state);
  70. ARG_TO_UCHAR_BUFFER(message);
  71. NEW_BUFFER_AND_PTR(state2, (crypto_generichash_blake2b_statebytes() + (size_t) 63U) & ~(size_t) 63U);
  72. memcpy(state2_ptr, state, (crypto_generichash_blake2b_statebytes() + (size_t) 63U) & ~(size_t) 63U);
  73. crypto_generichash_blake2b_update((crypto_generichash_blake2b_state *)state2_ptr, message, message_size);
  74. return info.GetReturnValue().Set(state2);
  75. }
  76. /*
  77. int crypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state,
  78. unsigned char *out, const size_t outlen);
  79. */
  80. NAN_METHOD(bind_crypto_generichash_blake2b_final) {
  81. Nan::EscapableHandleScope scope;
  82. ARGS(2,"arguments must be: state buffer, output size");
  83. ARG_TO_VOID_BUFFER(state);
  84. ARG_TO_NUMBER(out_size);
  85. CHECK_SIZE(out_size, crypto_generichash_blake2b_BYTES_MIN, crypto_generichash_blake2b_BYTES_MAX);
  86. NEW_BUFFER_AND_PTR(hash, out_size);
  87. if (crypto_generichash_blake2b_final((crypto_generichash_blake2b_state *)state, hash_ptr, out_size) == 0) {
  88. return info.GetReturnValue().Set(hash);
  89. }
  90. return JS_NULL;
  91. }
  92. /*
  93. *int crypto_generichash_blake2b_salt_personal(unsigned char *out, size_t outlen,
  94. const unsigned char *in,
  95. unsigned long long inlen,
  96. const unsigned char *key,
  97. size_t keylen,
  98. const unsigned char *salt,
  99. const unsigned char *personal);
  100. Buffer out
  101. Buffer in
  102. Buffer key
  103. Buffer salt
  104. Buffer personal
  105. */
  106. NAN_METHOD(bind_crypto_generichash_blake2b_salt_personal) {
  107. Nan::EscapableHandleScope scope;
  108. ARGS(5,"arguments must five buffers: output, message, key, salt, personal");
  109. ARG_TO_UCHAR_BUFFER(out);
  110. ARG_TO_UCHAR_BUFFER(in);
  111. ARG_TO_UCHAR_BUFFER(key);
  112. ARG_TO_UCHAR_BUFFER_LEN(salt, crypto_generichash_blake2b_SALTBYTES);
  113. ARG_TO_UCHAR_BUFFER_LEN(personal, crypto_generichash_blake2b_PERSONALBYTES);
  114. CHECK_SIZE(out_size, crypto_generichash_blake2b_BYTES_MIN, crypto_generichash_blake2b_BYTES_MAX);
  115. CHECK_SIZE(key_size, crypto_generichash_blake2b_KEYBYTES_MIN, crypto_generichash_blake2b_KEYBYTES_MAX);
  116. sodium_memzero(out, out_size);
  117. if (crypto_generichash_blake2b_salt_personal(out, out_size, in, in_size, key, key_size, salt, personal) == 0) {
  118. return JS_TRUE;
  119. }
  120. return JS_FALSE;
  121. }
  122. /**
  123. * Register function calls in node binding
  124. */
  125. void register_crypto_generichash_blake2b(Handle<Object> target) {
  126. // Generic Hash
  127. NEW_METHOD(crypto_generichash_blake2b);
  128. NEW_METHOD(crypto_generichash_blake2b_init);
  129. NEW_METHOD(crypto_generichash_blake2b_update);
  130. NEW_METHOD(crypto_generichash_blake2b_final);
  131. NEW_METHOD(crypto_generichash_blake2b_salt_personal);
  132. NEW_INT_PROP(crypto_generichash_blake2b_BYTES);
  133. NEW_INT_PROP(crypto_generichash_blake2b_BYTES_MIN);
  134. NEW_INT_PROP(crypto_generichash_blake2b_BYTES_MAX);
  135. NEW_INT_PROP(crypto_generichash_blake2b_KEYBYTES);
  136. NEW_INT_PROP(crypto_generichash_blake2b_KEYBYTES_MIN);
  137. NEW_INT_PROP(crypto_generichash_blake2b_KEYBYTES_MAX);
  138. NEW_INT_PROP(crypto_generichash_blake2b_SALTBYTES);
  139. NEW_INT_PROP(crypto_generichash_blake2b_PERSONALBYTES);
  140. }