PageRenderTime 86ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/hashlib.cc

http://github.com/brainfucker/hashlib
C++ | 359 lines | 270 code | 77 blank | 12 comment | 9 complexity | c461aff37d886a155dfc38978a9be39f MD5 | raw file
  1. /**
  2. * FAST nodejs(http://github.com/ry/node/) library for making hashes
  3. *
  4. * @package hashlib
  5. * @link http://github.com/brainfucker/hashlib
  6. * @autor Oleg Illarionov <oleg@emby.ru>
  7. * @version 1.0
  8. */
  9. #include <iostream>
  10. #include <v8.h>
  11. #include <fcntl.h>
  12. #include <node_buffer.h>
  13. extern "C" {
  14. #include "sha.h"
  15. #include "md4.h"
  16. #include "md5.h"
  17. }
  18. #include "lib/sha/shamodule.c"
  19. #include "lib/sha/sha256module.c"
  20. #include "lib/sha/sha512module.c"
  21. #include "lib/md6/md6.h"
  22. #include "lib/md6/md6_compress.c"
  23. #include "lib/md6/md6_mode.c"
  24. class file_data {
  25. public:
  26. int fd;
  27. int byte;
  28. MD5_CTX mdContext;
  29. void* environment;
  30. };
  31. using namespace v8;
  32. // make digest from php
  33. static void
  34. make_digest_ex(unsigned char *md5str, unsigned char *digest, int len)
  35. {
  36. static const char hexits[17] = "0123456789abcdef";
  37. int i;
  38. for (i = 0; i < len; i++) {
  39. md5str[i * 2] = hexits[digest[i] >> 4];
  40. md5str[(i * 2) + 1] = hexits[digest[i] & 0x0F];
  41. }
  42. md5str[len * 2] = '\0';
  43. }
  44. // extracts the data from POSition of arguments. Respects Buffers
  45. #define get_data(POS, DATA, LENGTH) \
  46. String::Utf8Value mdata_##POS (args[POS]->ToString()); \
  47. Local<Object> buffer_obj_##POS; \
  48. if (node::Buffer::HasInstance(args[POS])) { \
  49. Local<Object> buffer_obj_##POS = args[POS]->ToObject(); \
  50. LENGTH = node::Buffer::Length(buffer_obj_##POS); \
  51. DATA = (unsigned char *)node::Buffer::Data(buffer_obj_##POS); \
  52. } else { \
  53. LENGTH = (size_t)mdata_##POS.length(); \
  54. DATA = (unsigned char *)*mdata_##POS; \
  55. }
  56. Handle<Value>
  57. sha(const Arguments& args)
  58. {
  59. HandleScope scope;
  60. size_t length;
  61. unsigned char *data;
  62. get_data(0, data, length);
  63. SHA_CTX ctx;
  64. unsigned char digest[20];
  65. unsigned char hexdigest[40];
  66. SHA_Init(&ctx);
  67. SHA_Update(&ctx, data, length);
  68. SHA_Final(digest, &ctx);
  69. make_digest_ex(hexdigest, digest, 20);
  70. return scope.Close(String::New((char*)hexdigest,40));
  71. }
  72. Handle<Value>
  73. sha1(const Arguments& args)
  74. {
  75. HandleScope scope;
  76. using namespace sha1module;
  77. size_t length;
  78. unsigned char *data;
  79. get_data(0, data, length);
  80. unsigned char digest[40];
  81. unsigned char hexdigest[40];
  82. SHAobject *sha;
  83. sha=new SHAobject;
  84. sha_init(sha);
  85. sha_update(sha, data, length);
  86. sha_final(digest, sha);
  87. make_digest_ex(hexdigest, digest, 20);
  88. return scope.Close(String::New((char*)hexdigest,40));
  89. }
  90. Handle<Value>
  91. hmac_sha1(const Arguments& args)
  92. {
  93. HandleScope scope;
  94. using namespace sha1module;
  95. unsigned char *data, *key_input;
  96. size_t data_length, keylen;
  97. get_data(0, data, data_length);
  98. get_data(1, key_input, keylen);
  99. unsigned char digest[40];
  100. unsigned char hexdigest[40];
  101. unsigned int i;
  102. const void *key = key_input;
  103. char ipad[64], opad[64];
  104. if(keylen > 64)
  105. {
  106. char optkeybuf[20];
  107. SHAobject *keyhash;
  108. keyhash = new SHAobject;
  109. sha_init(keyhash);
  110. sha_update(keyhash, key_input, keylen);
  111. sha_final((unsigned char*) optkeybuf, keyhash);
  112. keylen = 20;
  113. key = optkeybuf;
  114. }
  115. memcpy(ipad, key, keylen);
  116. memcpy(opad, key, keylen);
  117. memset(ipad+keylen, 0, 64 - keylen);
  118. memset(opad+keylen, 0, 64 - keylen);
  119. for (i = 0; i < 64; i++)
  120. {
  121. ipad[i] ^= 0x36;
  122. opad[i] ^= 0x5c;
  123. }
  124. SHAobject *context;
  125. context = new SHAobject;
  126. sha_init(context);
  127. sha_update(context, (unsigned char*) ipad, 64);
  128. sha_update(context, data, data_length);
  129. sha_final(digest, context);
  130. sha_init(context);
  131. sha_update(context, (unsigned char*) opad, 64);
  132. sha_update(context, digest, 20);
  133. sha_final(digest, context);
  134. make_digest_ex(hexdigest, digest, 20);
  135. return scope.Close(String::New((char*)hexdigest,40));
  136. }
  137. Handle<Value>
  138. hmac_md5(const Arguments& args)
  139. {
  140. HandleScope scope;
  141. unsigned char *data, *key_input;
  142. size_t data_length, keylen;
  143. get_data(0, data, data_length);
  144. get_data(1, key_input, keylen);
  145. unsigned char digest[16];
  146. unsigned char hexdigest[32];
  147. unsigned int i;
  148. const void *key = (unsigned char*) key_input;
  149. char ipad[64], opad[64];
  150. if (keylen > 64)
  151. {
  152. char optkeybuf[20];
  153. MD5_CTX keyhash;
  154. MD5Init(&keyhash);
  155. MD5Update(&keyhash, (unsigned char*) key, keylen);
  156. MD5Final((unsigned char*) optkeybuf, &keyhash);
  157. keylen = 20;
  158. key = optkeybuf;
  159. }
  160. memcpy(ipad, key, keylen);
  161. memcpy(opad, key, keylen);
  162. memset(ipad+keylen, 0, 64 - keylen);
  163. memset(opad+keylen, 0, 64 - keylen);
  164. for (i = 0; i < 64; i++)
  165. {
  166. ipad[i] ^= 0x36;
  167. opad[i] ^= 0x5c;
  168. }
  169. MD5_CTX context;
  170. MD5Init(&context);
  171. MD5Update(&context, (unsigned char*) ipad, 64);
  172. MD5Update(&context, data, data_length);
  173. MD5Final(digest, &context);
  174. MD5Init(&context);
  175. MD5Update(&context, (unsigned char*) opad, 64);
  176. MD5Update(&context, digest, 16);
  177. MD5Final(digest, &context);
  178. make_digest_ex(hexdigest, digest, 16);
  179. return scope.Close(String::New((char*)hexdigest,32));
  180. }
  181. Handle<Value>
  182. sha256(const Arguments& args)
  183. {
  184. HandleScope scope;
  185. using namespace sha256module;
  186. size_t length;
  187. unsigned char *data;
  188. get_data(0, data, length);
  189. unsigned char digest[64];
  190. unsigned char hexdigest[64];
  191. SHAobject *sha;
  192. sha=new SHAobject;
  193. sha_init(sha);
  194. sha_update(sha, data, length);
  195. sha_final(digest, sha);
  196. make_digest_ex(hexdigest, digest, 32);
  197. return scope.Close(String::New((char*)hexdigest,64));
  198. }
  199. Handle<Value>
  200. sha512(const Arguments& args)
  201. {
  202. HandleScope scope;
  203. using namespace sha512module;
  204. size_t length;
  205. unsigned char *data;
  206. get_data(0, data, length);
  207. unsigned char digest[128];
  208. unsigned char hexdigest[128];
  209. SHAobject *sha;
  210. sha = new SHAobject;
  211. sha512_init(sha);
  212. sha512_update(sha, data, length);
  213. sha512_final(digest, sha);
  214. make_digest_ex(hexdigest, digest, 64);
  215. return scope.Close(String::New((char*)hexdigest,128));
  216. }
  217. Handle<Value>
  218. md4(const Arguments& args)
  219. {
  220. HandleScope scope;
  221. size_t length;
  222. unsigned char *data;
  223. get_data(0, data, length);
  224. MD4_CTX mdContext;
  225. unsigned char digest[16];
  226. unsigned char hexdigest[32];
  227. /* make an hash */
  228. MD4Init(&mdContext);
  229. MD4Update(&mdContext, data, length);
  230. MD4Final(digest, &mdContext);
  231. make_digest_ex(hexdigest, digest, 16);
  232. return scope.Close(String::New((char*)hexdigest,32));
  233. }
  234. Handle<Value>
  235. md5(const Arguments& args)
  236. {
  237. HandleScope scope;
  238. size_t length;
  239. unsigned char *data;
  240. get_data(0, data, length);
  241. MD5_CTX mdContext;
  242. unsigned char digest[16];
  243. unsigned char hexdigest[32];
  244. /* make an hash */
  245. MD5Init(&mdContext);
  246. MD5Update(&mdContext, data, length);
  247. MD5Final(digest, &mdContext);
  248. make_digest_ex(hexdigest, digest, 16);
  249. return scope.Close(String::New((char*)hexdigest,32));
  250. }
  251. Handle<Value>
  252. md6(const Arguments& args)
  253. {
  254. HandleScope scope;
  255. size_t length;
  256. unsigned char *data;
  257. get_data(0, data, length);
  258. int len(32);
  259. if (!args[1]->IsUndefined()) {
  260. len=args[1]->ToInteger()->Value();
  261. }
  262. unsigned char digest[len];
  263. unsigned char hexdigest[len];
  264. md6_hash(len*8, data, length, digest);
  265. int half_len=len/2;
  266. if (len%2!=0) half_len++;
  267. make_digest_ex(hexdigest, digest, half_len);
  268. return scope.Close(String::New((char*)hexdigest,len));
  269. }
  270. extern "C" void init (Handle<Object> target)
  271. {
  272. HandleScope scope;
  273. target->Set(String::New("md4"), FunctionTemplate::New(md4)->GetFunction());
  274. target->Set(String::New("md5"), FunctionTemplate::New(md5)->GetFunction());
  275. target->Set(String::New("md6"), FunctionTemplate::New(md6)->GetFunction());
  276. target->Set(String::New("sha"), FunctionTemplate::New(sha)->GetFunction());
  277. target->Set(String::New("sha1"), FunctionTemplate::New(sha1)->GetFunction());
  278. target->Set(String::New("hmac_sha1"), FunctionTemplate::New(hmac_sha1)->GetFunction());
  279. target->Set(String::New("hmac_md5"), FunctionTemplate::New(hmac_md5)->GetFunction());
  280. target->Set(String::New("sha256"), FunctionTemplate::New(sha256)->GetFunction());
  281. target->Set(String::New("sha512"), FunctionTemplate::New(sha512)->GetFunction());
  282. }