aboutsummaryrefslogtreecommitdiff
path: root/extension/opensslmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'extension/opensslmanager.cpp')
-rw-r--r--extension/opensslmanager.cpp371
1 files changed, 371 insertions, 0 deletions
diff --git a/extension/opensslmanager.cpp b/extension/opensslmanager.cpp
new file mode 100644
index 0000000..26b783b
--- /dev/null
+++ b/extension/opensslmanager.cpp
@@ -0,0 +1,371 @@
+#include "opensslmanager.h"
+#include <openssl/crypto.h>
+#include <openssl/md5.h>
+#include <openssl/md4.h>
+#include <openssl/md2.h>
+#include <openssl/sha.h>
+#include <openssl/ripemd.h>
+
+// NEED to convert this to using EVP one of these days...
+// https://www.openssl.org/docs/manmaster/man3/EVP_DigestInit.html
+// -sappho
+
+#define MD5_FILE_BUFFER_SIZE 1024*16
+#define MD4_FILE_BUFFER_SIZE 1024*16
+// #define MD2_FILE_BUFFER_SIZE 1024*16
+// #define SHA_FILE_BUFFER_SIZE 1024*16
+#define SHA1_FILE_BUFFER_SIZE 1024*16
+#define SHA224_FILE_BUFFER_SIZE 1024*16
+#define SHA256_FILE_BUFFER_SIZE 1024*16
+#define SHA384_FILE_BUFFER_SIZE 1024*16
+#define SHA512_FILE_BUFFER_SIZE 1024*16
+#define RIPEMD160_FILE_BUFFER_SIZE 1024*16
+
+
+OpensslManager g_OpensslManager;
+
+static IMutex **ssl_lockarray;
+
+static void MD5_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[MD5_DIGEST_LENGTH];
+ *outlength = MD5_DIGEST_LENGTH;
+
+ MD5_CTX c;
+ int i;
+ unsigned char buf[MD5_FILE_BUFFER_SIZE];
+
+ MD5_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,MD5_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ MD5_Update(&c,buf,(unsigned long)i);
+ }
+ MD5_Final(*output, &c);
+}
+
+static void MD4_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[MD4_DIGEST_LENGTH];
+ *outlength = MD4_DIGEST_LENGTH;
+
+ MD4_CTX c;
+ int i;
+ unsigned char buf[MD4_FILE_BUFFER_SIZE];
+
+ MD4_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,MD4_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ MD4_Update(&c,buf,(unsigned long)i);
+ }
+ MD4_Final(*output, &c);
+}
+
+/*
+static void MD2_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[MD2_DIGEST_LENGTH];
+ *outlength = MD2_DIGEST_LENGTH;
+
+ MD2_CTX c;
+ int i;
+ unsigned char buf[MD2_FILE_BUFFER_SIZE];
+
+ MD2_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,MD2_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ MD2_Update(&c,buf,(unsigned long)i);
+ }
+ MD2_Final(*output, &c);
+}
+
+static void SHA_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[SHA_DIGEST_LENGTH];
+ *outlength = SHA_DIGEST_LENGTH;
+
+ SHA_CTX c;
+ int i;
+ unsigned char buf[SHA_FILE_BUFFER_SIZE];
+
+ SHA_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,SHA_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ SHA_Update(&c,buf,(unsigned long)i);
+ }
+ SHA_Final(*output, &c);
+}
+*/
+
+static void SHA1_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[SHA_DIGEST_LENGTH];
+ *outlength = SHA_DIGEST_LENGTH;
+
+ SHA_CTX c;
+ int i;
+ unsigned char buf[SHA1_FILE_BUFFER_SIZE];
+
+ SHA1_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,SHA1_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ SHA1_Update(&c,buf,(unsigned long)i);
+ }
+ SHA1_Final(*output, &c);
+}
+
+static void SHA224_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[SHA224_DIGEST_LENGTH];
+ *outlength = SHA224_DIGEST_LENGTH;
+
+ SHA256_CTX c;
+ int i;
+ unsigned char buf[SHA224_FILE_BUFFER_SIZE];
+
+ SHA224_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,SHA224_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ SHA224_Update(&c,buf,(unsigned long)i);
+ }
+ SHA224_Final(*output, &c);
+}
+
+static void SHA256_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[SHA256_DIGEST_LENGTH];
+ *outlength = SHA256_DIGEST_LENGTH;
+
+ SHA256_CTX c;
+ int i;
+ unsigned char buf[SHA256_FILE_BUFFER_SIZE];
+
+ SHA256_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,SHA256_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ SHA256_Update(&c,buf,(unsigned long)i);
+ }
+ SHA256_Final(*output, &c);
+}
+
+static void SHA384_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[SHA384_DIGEST_LENGTH];
+ *outlength = SHA384_DIGEST_LENGTH;
+
+ SHA512_CTX c;
+ int i;
+ unsigned char buf[SHA384_FILE_BUFFER_SIZE];
+
+ SHA384_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,SHA384_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ SHA384_Update(&c,buf,(unsigned long)i);
+ }
+ SHA384_Final(*output, &c);
+}
+
+static void SHA512_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[SHA512_DIGEST_LENGTH];
+ *outlength = SHA512_DIGEST_LENGTH;
+
+ SHA512_CTX c;
+ int i;
+ unsigned char buf[SHA384_FILE_BUFFER_SIZE];
+
+ SHA512_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,SHA512_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ SHA512_Update(&c,buf,(unsigned long)i);
+ }
+ SHA512_Final(*output, &c);
+}
+
+static void RIPEMD160_File(FILE *file, unsigned char **output, int *outlength)
+{
+ *output = new unsigned char[RIPEMD160_DIGEST_LENGTH];
+ *outlength = RIPEMD160_DIGEST_LENGTH;
+
+ RIPEMD160_CTX c;
+ int i;
+ unsigned char buf[RIPEMD160_FILE_BUFFER_SIZE];
+
+ RIPEMD160_Init(&c);
+ for (;;)
+ {
+ i = fread(buf,1,RIPEMD160_FILE_BUFFER_SIZE,file);
+ if(i <= 0)
+ break;
+ RIPEMD160_Update(&c,buf,(unsigned long)i);
+ }
+ RIPEMD160_Final(*output, &c);
+}
+
+static void ssl_locking_callback(int mode, int type, const char *file, int line)
+{
+ if(mode & CRYPTO_LOCK)
+ {
+ ssl_lockarray[type]->Lock();
+ } else {
+ ssl_lockarray[type]->Unlock();
+ }
+}
+
+#ifdef PLATFORM_LINUX
+static unsigned long ssl_id_function(void)
+{
+ return ((unsigned long)getpid());
+}
+#endif
+
+void OpensslManager::SDK_OnLoad()
+{
+ ssl_lockarray = (IMutex **)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(IMutex *));
+ for(int i = 0; i < CRYPTO_num_locks(); i++)
+ {
+ ssl_lockarray[i] = threader->MakeMutex();
+ }
+
+#ifdef PLATFORM_LINUX
+ CRYPTO_set_id_callback(ssl_id_function);
+#endif
+ CRYPTO_set_locking_callback(ssl_locking_callback);
+}
+
+void OpensslManager::SDK_OnUnload()
+{
+#ifdef PLATFORM_LINUX
+ CRYPTO_set_id_callback(NULL);
+#endif
+ CRYPTO_set_locking_callback(NULL);
+ for (int i=0; i<CRYPTO_num_locks(); i++)
+ {
+ ssl_lockarray[i]->DestroyThis();
+ }
+ OPENSSL_free(ssl_lockarray);
+}
+
+
+bool OpensslManager::HashFile(Openssl_Hash algorithm, FILE *pFile, unsigned char **output, int *outlength)
+{
+ if(pFile == NULL)
+ return false;
+
+ switch(algorithm)
+ {
+ case Openssl_Hash_MD5:
+ MD5_File(pFile, output, outlength);
+ return true;
+ case Openssl_Hash_MD4:
+ MD4_File(pFile, output, outlength);
+ return true;
+ case Openssl_Hash_MD2:
+ //MD2_File(pFile, output, outlength);
+ //return true;
+ return false;
+ case Openssl_Hash_SHA:
+ //SHA_File(pFile, output, outlength);
+ //return true;
+ return false;
+ case Openssl_Hash_SHA1:
+ SHA1_File(pFile, output, outlength);
+ return true;
+ case Openssl_Hash_SHA224:
+ SHA224_File(pFile, output, outlength);
+ return true;
+ case Openssl_Hash_SHA256:
+ SHA256_File(pFile, output, outlength);
+ return true;
+ case Openssl_Hash_SHA384:
+ SHA384_File(pFile, output, outlength);
+ return true;
+ case Openssl_Hash_SHA512:
+ SHA512_File(pFile, output, outlength);
+ return true;
+ case Openssl_Hash_RIPEMD160:
+ RIPEMD160_File(pFile, output, outlength);
+ return true;
+ }
+
+ return false;
+}
+
+
+bool OpensslManager::HashString(Openssl_Hash algorithm, unsigned char *input, int size, unsigned char *output, int *outlength)
+{
+ switch(algorithm)
+ {
+ case Openssl_Hash_MD5:
+ MD5(input, size, output);
+ *outlength = MD5_DIGEST_LENGTH;
+ return true;
+ case Openssl_Hash_MD4:
+ MD4(input, size, output);
+ *outlength = MD4_DIGEST_LENGTH;
+ return true;
+ //case Openssl_Hash_MD2:
+ // MD2(input, size, output);
+ // *outlength = MD2_DIGEST_LENGTH;
+ // return true;
+ return false;
+ //case Openssl_Hash_SHA:
+ // SHA(input, size, output);
+ // *outlength = SHA_DIGEST_LENGTH;
+ // return true;
+ return false;
+ case Openssl_Hash_SHA1:
+ SHA1(input, size, output);
+ *outlength = SHA_DIGEST_LENGTH;
+ return true;
+ case Openssl_Hash_SHA224:
+ SHA224(input, size, output);
+ *outlength = SHA224_DIGEST_LENGTH;
+ return true;
+ case Openssl_Hash_SHA256:
+ SHA256(input, size, output);
+ *outlength = SHA256_DIGEST_LENGTH;
+ return true;
+ case Openssl_Hash_SHA384:
+ SHA384(input, size, output);
+ *outlength = SHA384_DIGEST_LENGTH;
+ return true;
+ case Openssl_Hash_SHA512:
+ SHA512(input, size, output);
+ *outlength = SHA512_DIGEST_LENGTH;
+ return true;
+ case Openssl_Hash_RIPEMD160:
+ RIPEMD160(input, size, output);
+ *outlength = RIPEMD160_DIGEST_LENGTH;
+ return true;
+ }
+
+ return false;
+}
+