crypt.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * crypt.c -- handles:
  3. * psybnc crypt()
  4. * File encryption
  5. *
  6. */
  7. #include "common.h"
  8. #include "crypt.h"
  9. #include "settings.h"
  10. #include "misc.h"
  11. #include "base64.h"
  12. #include "libcrypto.h"
  13. #include <stdarg.h>
  14. #include <bdlib/src/String.h>
  15. #include <bdlib/src/Stream.h>
  16. #include "EncryptedStream.h"
  17. char *encrypt_string(const char *keydata, char *in)
  18. {
  19. size_t len = 0;
  20. unsigned char *bdata = NULL;
  21. char *res = NULL;
  22. len = strlen(in);
  23. bdata = aes_encrypt_ecb_binary(keydata, (unsigned char *) in, &len);
  24. if (likely(keydata && *keydata)) {
  25. res = b64enc(bdata, len);
  26. OPENSSL_cleanse(bdata, len);
  27. free(bdata);
  28. return res;
  29. } else {
  30. return (char *) bdata;
  31. }
  32. }
  33. char *decrypt_string(const char *keydata, char *in)
  34. {
  35. size_t len = strlen(in);
  36. char *buf = NULL, *res = NULL;
  37. if (likely(keydata && *keydata)) {
  38. buf = b64dec((const unsigned char *) in, &len);
  39. res = (char *) aes_decrypt_ecb_binary(keydata, (unsigned char *) buf, &len);
  40. OPENSSL_cleanse(buf, len);
  41. free(buf);
  42. return res;
  43. } else {
  44. res = (char *) my_calloc(1, len + 1);
  45. strlcpy(res, in, len + 1);
  46. return res;
  47. }
  48. }
  49. int salted_sha1cmp(const char *salted_hash, const char *string) {
  50. char* cmp = salted_sha1(string, &salted_hash[1]); //Pass in the salt from the given hash
  51. int n = strcmp(salted_hash, cmp);
  52. free(cmp);
  53. return n;
  54. }
  55. char *salted_sha1(const char *in, const char* saltin)
  56. {
  57. char *tmp = NULL, buf[101] = "", *ret = NULL;
  58. size_t ret_size = 0;
  59. /* Create a 5 byte salt */
  60. char salt[SHA1_SALT_LEN + 1] = "";
  61. if (saltin) {
  62. strlcpy(salt, saltin, sizeof(salt));
  63. } else {
  64. make_rand_str(salt, sizeof(salt) - 1);
  65. }
  66. /* SHA1 the salt+password */
  67. simple_snprintf(buf, sizeof(buf), STR("%s%s"), salt, in);
  68. tmp = SHA1(buf);
  69. ret_size = SHA1_SALTED_LEN + 1;
  70. ret = (char *) my_calloc(1, ret_size);
  71. simple_snprintf(ret, ret_size, STR("+%s$%s"), salt, tmp);
  72. /* Wipe cleartext pass from sha1 buffers/tmp */
  73. SHA1(NULL);
  74. return ret;
  75. }
  76. void Encrypt_File(char *infile, char *outfile)
  77. {
  78. const char salt1[] = SALT1;
  79. bd::Stream stream_in;
  80. EncryptedStream stream_out(salt1);
  81. stream_in.loadFile(infile);
  82. stream_out << bd::String(stream_in);
  83. stream_out.writeFile(outfile);
  84. }
  85. void Decrypt_File(char *infile, char *outfile)
  86. {
  87. const char salt1[] = SALT1;
  88. bd::Stream stream_out;
  89. EncryptedStream stream_in(salt1);
  90. stream_in.loadFile(infile);
  91. stream_out << bd::String(stream_in);
  92. stream_out.writeFile(outfile);
  93. }
  94. char *MD5(const char *string)
  95. {
  96. static int n = 0;
  97. static char ret[5][MD5_HASH_LENGTH + 1];
  98. //Cleanse the current buffer
  99. if (!string) {
  100. OPENSSL_cleanse(ret[n], MD5_HASH_LENGTH + 1);
  101. return NULL;
  102. }
  103. char* md5string = ret[n++];
  104. unsigned char md5out[MD5_HASH_LENGTH + 1] = "";
  105. MD5_CTX ctx;
  106. MD5_Init(&ctx);
  107. MD5_Update(&ctx, string, strlen(string));
  108. MD5_Final(md5out, &ctx);
  109. btoh(md5out, MD5_DIGEST_LENGTH, md5string, MD5_HASH_LENGTH + 1);
  110. OPENSSL_cleanse(&ctx, sizeof(ctx));
  111. if (n == 5) n = 0;
  112. return md5string;
  113. }
  114. int md5cmp(const char *hash, const char *string) {
  115. int n = strcmp(hash, MD5(string));
  116. MD5(NULL);
  117. return n;
  118. }
  119. char *SHA1(const char *string)
  120. {
  121. static int n = 0;
  122. static char ret[5][SHA_HASH_LENGTH + 1];
  123. //Cleanse the current buffer
  124. if (!string) {
  125. OPENSSL_cleanse(ret[n], SHA_HASH_LENGTH + 1);
  126. return NULL;
  127. }
  128. char* sha1string = ret[n++];
  129. unsigned char sha1out[SHA_HASH_LENGTH + 1] = "";
  130. SHA_CTX ctx;
  131. SHA1_Init(&ctx);
  132. SHA1_Update(&ctx, string, strlen(string));
  133. SHA1_Final(sha1out, &ctx);
  134. btoh(sha1out, SHA_DIGEST_LENGTH, sha1string, SHA_HASH_LENGTH + 1);
  135. OPENSSL_cleanse(&ctx, sizeof(ctx));
  136. if (n == 5) n = 0;
  137. return sha1string;
  138. }
  139. int sha1cmp(const char *hash, const char *string) {
  140. int n = strcmp(hash, SHA1(string));
  141. SHA1(NULL);
  142. return n;
  143. }
  144. char *SHA256(const char *string)
  145. {
  146. static int n = 0;
  147. static char ret[5][SHA256_HASH_LENGTH + 1];
  148. //Cleanse the current buffer
  149. if (!string) {
  150. OPENSSL_cleanse(ret[n], SHA256_HASH_LENGTH + 1);
  151. return NULL;
  152. }
  153. char* sha256string = ret[n++];
  154. unsigned char sha256out[SHA256_HASH_LENGTH + 1] = "";
  155. SHA256_CTX ctx;
  156. SHA256_Init(&ctx);
  157. SHA256_Update(&ctx, string, strlen(string));
  158. SHA256_Final(sha256out, &ctx);
  159. btoh(sha256out, SHA256_DIGEST_LENGTH, sha256string, SHA256_HASH_LENGTH + 1);
  160. OPENSSL_cleanse(&ctx, sizeof(ctx));
  161. if (n == 5) n = 0;
  162. return sha256string;
  163. }
  164. int sha256cmp(const char *hash, const char *string) {
  165. int n = strcmp(hash, SHA256(string));
  166. SHA256(NULL);
  167. return n;
  168. }
  169. void btoh(const unsigned char *md, size_t md_len, char *buf, const size_t buf_len)
  170. {
  171. #define doblock(n) simple_snprintf(&(buf[(i + n) << 1]), buf_len - ((i + n) << 1), "%02x", md[i + n]);
  172. for (size_t i = 0; i < md_len; i+=4) {
  173. doblock(0);
  174. doblock(1);
  175. doblock(2);
  176. doblock(3);
  177. }
  178. }