1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
--- a/src/crypto_openssl.c
+++ b/src/crypto_openssl.c
@@ -109,6 +109,8 @@
is called by SQLCipher internally. This should prevent SQLCipher from
"cleaning up" openssl when it was initialized externally by the program */
EVP_cleanup();
+ } else {
+ openssl_external_init = 0;
}
#ifndef SQLCIPHER_OPENSSL_NO_MUTEX_RAND
sqlite3_mutex_free(openssl_rand_mutex);
@@ -143,14 +145,24 @@
}
static int sqlcipher_openssl_hmac(void *ctx, unsigned char *hmac_key, int key_sz, unsigned char *in, int in_sz, unsigned char *in2, int in2_sz, unsigned char *out) {
- HMAC_CTX hctx;
unsigned int outlen;
+#if OPENSSL_VERSION_NUMBER >= 0x10100001L
+ HMAC_CTX* hctx = HMAC_CTX_new();
+ if(hctx == NULL) return SQLITE_ERROR;
+ HMAC_Init_ex(hctx, hmac_key, key_sz, EVP_sha1(), NULL);
+ HMAC_Update(hctx, in, in_sz);
+ HMAC_Update(hctx, in2, in2_sz);
+ HMAC_Final(hctx, out, &outlen);
+ HMAC_CTX_free(hctx);
+#else
+ HMAC_CTX hctx;
HMAC_CTX_init(&hctx);
HMAC_Init_ex(&hctx, hmac_key, key_sz, EVP_sha1(), NULL);
HMAC_Update(&hctx, in, in_sz);
HMAC_Update(&hctx, in2, in2_sz);
HMAC_Final(&hctx, out, &outlen);
HMAC_CTX_cleanup(&hctx);
+#endif
return SQLITE_OK;
}
@@ -160,9 +172,23 @@
}
static int sqlcipher_openssl_cipher(void *ctx, int mode, unsigned char *key, int key_sz, unsigned char *iv, unsigned char *in, int in_sz, unsigned char *out) {
- EVP_CIPHER_CTX ectx;
int tmp_csz, csz;
+#if OPENSSL_VERSION_NUMBER >= 0x10100001L
+ EVP_CIPHER_CTX* ectx = EVP_CIPHER_CTX_new();
+ if(ectx == NULL) return SQLITE_ERROR;
+ EVP_CipherInit_ex(ectx, ((openssl_ctx *)ctx)->evp_cipher, NULL, NULL, NULL, mode);
+ EVP_CIPHER_CTX_set_padding(ectx, 0); // no padding
+ EVP_CipherInit_ex(ectx, NULL, NULL, key, iv, mode);
+ EVP_CipherUpdate(ectx, out, &tmp_csz, in, in_sz);
+ csz = tmp_csz;
+ out += tmp_csz;
+ EVP_CipherFinal_ex(ectx, out, &tmp_csz);
+ csz += tmp_csz;
+ EVP_CIPHER_CTX_free(ectx);
+
+#else
+ EVP_CIPHER_CTX ectx;
EVP_CipherInit(&ectx, ((openssl_ctx *)ctx)->evp_cipher, NULL, NULL, mode);
EVP_CIPHER_CTX_set_padding(&ectx, 0); // no padding
EVP_CipherInit(&ectx, NULL, key, iv, mode);
@@ -172,14 +198,19 @@
EVP_CipherFinal(&ectx, out, &tmp_csz);
csz += tmp_csz;
EVP_CIPHER_CTX_cleanup(&ectx);
+#endif
assert(in_sz == csz);
+
return SQLITE_OK;
}
static int sqlcipher_openssl_set_cipher(void *ctx, const char *cipher_name) {
openssl_ctx *o_ctx = (openssl_ctx *)ctx;
- o_ctx->evp_cipher = (EVP_CIPHER *) EVP_get_cipherbyname(cipher_name);
- return SQLITE_OK;
+ EVP_CIPHER* cipher = (EVP_CIPHER *) EVP_get_cipherbyname(cipher_name);
+ if(cipher != NULL) {
+ o_ctx->evp_cipher = cipher;
+ }
+ return cipher != NULL ? SQLITE_OK : SQLITE_ERROR;
}
static const char* sqlcipher_openssl_get_cipher(void *ctx) {
|