mirror of
https://git.freebsd.org/ports.git
synced 2025-06-12 16:20:33 -04:00
254 lines
7 KiB
C
254 lines
7 KiB
C
--- rar_fmt_plug.c.orig 2014-12-18 07:59:02 UTC
|
|
+++ rar_fmt_plug.c
|
|
@@ -48,15 +48,7 @@ john_register_one(&fmt_rar);
|
|
#else
|
|
|
|
#include <string.h>
|
|
-#include <assert.h>
|
|
#include <errno.h>
|
|
-#include <openssl/engine.h>
|
|
-#include <openssl/evp.h>
|
|
-#include <openssl/ssl.h>
|
|
-
|
|
-#include "arch.h"
|
|
-#include "sha.h"
|
|
-
|
|
#if AC_BUILT
|
|
#include "autoconfig.h"
|
|
#endif
|
|
@@ -71,6 +63,8 @@ john_register_one(&fmt_rar);
|
|
#include <sys/mman.h>
|
|
#endif
|
|
|
|
+#include "arch.h"
|
|
+#include "sha.h"
|
|
#include "crc32.h"
|
|
#include "misc.h"
|
|
#include "common.h"
|
|
@@ -119,9 +113,7 @@ john_register_one(&fmt_rar);
|
|
|
|
#ifdef _OPENMP
|
|
#include <omp.h>
|
|
-#include <pthread.h>
|
|
#define OMP_SCALE 4
|
|
-static pthread_mutex_t *lockarray;
|
|
#endif
|
|
|
|
#include "memdbg.h"
|
|
@@ -198,71 +190,6 @@ static struct fmt_tests cpu_tests[] = {
|
|
{NULL}
|
|
};
|
|
|
|
-#if defined (_OPENMP)
|
|
-static void lock_callback(int mode, int type, const char *file, int line)
|
|
-{
|
|
- (void)file;
|
|
- (void)line;
|
|
- if (mode & CRYPTO_LOCK)
|
|
- pthread_mutex_lock(&(lockarray[type]));
|
|
- else
|
|
- pthread_mutex_unlock(&(lockarray[type]));
|
|
-}
|
|
-
|
|
-static unsigned long thread_id(void)
|
|
-{
|
|
- return omp_get_thread_num();
|
|
-}
|
|
-
|
|
-static void init_locks(void)
|
|
-{
|
|
- int i;
|
|
- lockarray = (pthread_mutex_t*) OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
|
|
- for (i = 0; i < CRYPTO_num_locks(); i++)
|
|
- pthread_mutex_init(&(lockarray[i]), NULL);
|
|
- CRYPTO_set_id_callback(thread_id);
|
|
- CRYPTO_set_locking_callback(lock_callback);
|
|
-}
|
|
-#endif /* _OPENMP */
|
|
-
|
|
-/* Use AES-NI if available. This is not supported with low-level calls,
|
|
- we have to use EVP) */
|
|
-static void init_aesni(void)
|
|
-{
|
|
- ENGINE *e;
|
|
- const char *engine_id = "aesni";
|
|
-
|
|
- ENGINE_load_builtin_engines();
|
|
- e = ENGINE_by_id(engine_id);
|
|
- if (!e) {
|
|
- //fprintf(stderr, "AES-NI engine not available\n");
|
|
- return;
|
|
- }
|
|
- if (!ENGINE_init(e)) {
|
|
- fprintf(stderr, "AES-NI engine could not init\n");
|
|
- ENGINE_free(e);
|
|
- return;
|
|
- }
|
|
- if (!ENGINE_set_default(e, ENGINE_METHOD_ALL & ~ENGINE_METHOD_RAND)) {
|
|
- /* This should only happen when 'e' can't initialise, but the
|
|
- * previous statement suggests it did. */
|
|
- fprintf(stderr, "AES-NI engine initialized but then failed\n");
|
|
- abort();
|
|
- }
|
|
- ENGINE_finish(e);
|
|
- ENGINE_free(e);
|
|
-}
|
|
-
|
|
-#ifndef __APPLE__ /* Apple segfaults on this :) */
|
|
-static void openssl_cleanup(void)
|
|
-{
|
|
- ENGINE_cleanup();
|
|
- ERR_free_strings();
|
|
- CRYPTO_cleanup_all_ex_data();
|
|
- EVP_cleanup();
|
|
-}
|
|
-#endif
|
|
-
|
|
#undef set_key
|
|
static void set_key(char *key, int index)
|
|
{
|
|
@@ -418,7 +345,6 @@ static void init(struct fmt_main *self)
|
|
omp_t = omp_get_max_threads();
|
|
self->params.min_keys_per_crypt *= omp_t;
|
|
self->params.max_keys_per_crypt = omp_t * OMP_SCALE * MAX_KEYS_PER_CRYPT;
|
|
- init_locks();
|
|
#endif /* _OPENMP */
|
|
|
|
if (pers_opts.target_enc == UTF_8)
|
|
@@ -436,14 +362,6 @@ static void init(struct fmt_main *self)
|
|
self->params.benchmark_comment = " (1-16 characters)";
|
|
#endif
|
|
|
|
- /* OpenSSL init */
|
|
- init_aesni();
|
|
- SSL_load_error_strings();
|
|
- SSL_library_init();
|
|
- OpenSSL_add_all_algorithms();
|
|
-#ifndef __APPLE__
|
|
- atexit(openssl_cleanup);
|
|
-#endif
|
|
/* CRC-32 table init, do it before we start multithreading */
|
|
{
|
|
CRC32_t crc;
|
|
@@ -716,53 +634,43 @@ static int crypt_all(int *pcount, struct db_salt *salt
|
|
#pragma omp parallel for
|
|
#endif
|
|
for (index = 0; index < count; index++) {
|
|
- int i16 = index*16;
|
|
- unsigned int inlen = 16;
|
|
- int outlen;
|
|
- EVP_CIPHER_CTX aes_ctx;
|
|
+ AES_KEY aes_ctx;
|
|
+ unsigned char *key = &aes_key[index * 16];
|
|
+ unsigned char *iv = &aes_iv[index * 16];
|
|
|
|
- EVP_CIPHER_CTX_init(&aes_ctx);
|
|
- EVP_DecryptInit_ex(&aes_ctx, EVP_aes_128_cbc(), NULL, &aes_key[i16], &aes_iv[i16]);
|
|
- EVP_CIPHER_CTX_set_padding(&aes_ctx, 0);
|
|
+ AES_set_decrypt_key(key, 128, &aes_ctx);
|
|
|
|
//fprintf(stderr, "key %s\n", utf16_to_enc((UTF16*)&saved_key[index * UNICODE_LENGTH]));
|
|
/* AES decrypt, uses aes_iv, aes_key and blob */
|
|
if (cur_file->type == 0) { /* rar-hp mode */
|
|
unsigned char plain[16];
|
|
|
|
- outlen = 0;
|
|
+ AES_cbc_encrypt(cur_file->blob, plain, 16,
|
|
+ &aes_ctx, iv, AES_DECRYPT);
|
|
|
|
- EVP_DecryptUpdate(&aes_ctx, plain, &outlen, cur_file->blob, inlen);
|
|
- EVP_DecryptFinal_ex(&aes_ctx, &plain[outlen], &outlen);
|
|
-
|
|
cracked[index] = !memcmp(plain, "\xc4\x3d\x7b\x00\x40\x07\x00", 7);
|
|
-
|
|
} else {
|
|
-
|
|
if (cur_file->method == 0x30) { /* stored, not deflated */
|
|
CRC32_t crc;
|
|
unsigned char crc_out[4];
|
|
- unsigned char plain[0x8010];
|
|
+ unsigned char plain[0x8000];
|
|
unsigned long long size = cur_file->unp_size;
|
|
unsigned char *cipher = cur_file->blob;
|
|
|
|
/* Use full decryption with CRC check.
|
|
Compute CRC of the decompressed plaintext */
|
|
CRC32_Init(&crc);
|
|
- outlen = 0;
|
|
|
|
- while (size > 0x8000) {
|
|
- inlen = 0x8000;
|
|
+ while (size) {
|
|
+ unsigned int inlen = (size > 0x8000) ? 0x8000 : size;
|
|
|
|
- EVP_DecryptUpdate(&aes_ctx, plain, &outlen, cipher, inlen);
|
|
- CRC32_Update(&crc, plain, outlen > size ? size : outlen);
|
|
- size -= outlen;
|
|
+ AES_cbc_encrypt(cipher, plain, inlen,
|
|
+ &aes_ctx, iv, AES_DECRYPT);
|
|
+
|
|
+ CRC32_Update(&crc, plain, inlen);
|
|
+ size -= inlen;
|
|
cipher += inlen;
|
|
}
|
|
- EVP_DecryptUpdate(&aes_ctx, plain, &outlen, cipher, (size + 15) & ~0xf);
|
|
- EVP_DecryptFinal_ex(&aes_ctx, &plain[outlen], &outlen);
|
|
- size += outlen;
|
|
- CRC32_Update(&crc, plain, size);
|
|
CRC32_Final(crc_out, crc);
|
|
|
|
/* Compare computed CRC with stored CRC */
|
|
@@ -771,15 +679,16 @@ static int crypt_all(int *pcount, struct db_salt *salt
|
|
const int solid = 0;
|
|
unpack_data_t *unpack_t;
|
|
unsigned char plain[20];
|
|
+ unsigned char pre_iv[16];
|
|
|
|
cracked[index] = 0;
|
|
|
|
+ memcpy(pre_iv, iv, 16);
|
|
+
|
|
/* Decrypt just one block for early rejection */
|
|
- outlen = 0;
|
|
- EVP_DecryptUpdate(&aes_ctx, plain, &outlen, cur_file->blob, 16);
|
|
- EVP_DecryptFinal_ex(&aes_ctx, &plain[outlen], &outlen);
|
|
+ AES_cbc_encrypt(cur_file->blob, plain, 16,
|
|
+ &aes_ctx, pre_iv, AES_DECRYPT);
|
|
|
|
-#if 1
|
|
/* Early rejection */
|
|
if (plain[0] & 0x80) {
|
|
// PPM checks here.
|
|
@@ -792,10 +701,10 @@ static int crypt_all(int *pcount, struct db_salt *salt
|
|
!check_huffman(plain)) // Huffman table check
|
|
goto bailOut;
|
|
}
|
|
-#endif
|
|
+
|
|
/* Reset stuff for full check */
|
|
- EVP_DecryptInit_ex(&aes_ctx, EVP_aes_128_cbc(), NULL, &aes_key[i16], &aes_iv[i16]);
|
|
- EVP_CIPHER_CTX_set_padding(&aes_ctx, 0);
|
|
+ AES_set_decrypt_key(key, 128, &aes_ctx);
|
|
+
|
|
#ifdef _OPENMP
|
|
unpack_t = &unpack_data[omp_get_thread_num()];
|
|
#else
|
|
@@ -804,16 +713,15 @@ static int crypt_all(int *pcount, struct db_salt *salt
|
|
unpack_t->max_size = cur_file->unp_size;
|
|
unpack_t->dest_unp_size = cur_file->unp_size;
|
|
unpack_t->pack_size = cur_file->pack_size;
|
|
- unpack_t->iv = &aes_iv[i16];
|
|
+ unpack_t->iv = iv;
|
|
unpack_t->ctx = &aes_ctx;
|
|
- unpack_t->key = &aes_key[i16];
|
|
+ unpack_t->key = key;
|
|
|
|
if (rar_unpack29(cur_file->blob, solid, unpack_t))
|
|
cracked[index] = !memcmp(&unpack_t->unp_crc, &cur_file->crc.c, 4);
|
|
bailOut:;
|
|
}
|
|
}
|
|
- EVP_CIPHER_CTX_cleanup(&aes_ctx);
|
|
}
|
|
return count;
|
|
}
|