btcollider/bf/algo/brainv2.c
2018-04-04 15:18:34 +02:00

60 lines
1.6 KiB
C

/* Copyright (c) 2015 Ryan Castellucci, All Rights Reserved */
#include <time.h>
#include <unistd.h>
#include <assert.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <signal.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <openssl/evp.h>
#include <openssl/sha.h>
// crypto.h used for the version
#include <openssl/crypto.h>
#include "../scrypt-jane/scrypt-jane.h"
#include "../hex.h"
#include "brainv2.h"
#define SALT_BITS_PER_THREAD 256
#define SALT_BYTES_PER_THREAD (SALT_BITS_PER_THREAD / 8)
#define THREADS 256
#define KEY_SIZE 128
#define first_scrypt(p, pl, s, ss, k, ks) \
scrypt(p, pl, s, ss, 13, 0, 6, k, ks)
#define middle_scrypt(p, pl, s, ss, k, ks) \
scrypt(p, pl, s, ss, 15, 0, 6, k, ks)
#define last_scrypt(p, pl, s, ss, k, ks) \
scrypt(p, pl, s, ss, 13, 0, 6, k, ks)
int brainv2(unsigned char *pass, size_t pass_sz,
unsigned char *salt, size_t salt_sz,
unsigned char *out) {
unsigned char key1[THREADS*SALT_BYTES_PER_THREAD*2];
unsigned char key2[THREADS*SALT_BYTES_PER_THREAD];
unsigned char key3[16];
int key1_sz = sizeof(key1);
int key2_sz = sizeof(key2);
int key3_sz = sizeof(key3);
int t;
first_scrypt(pass, pass_sz, salt, salt_sz, key1, key1_sz);
for (t = 0; t < THREADS; ++t) {
middle_scrypt(key1+((t*2+0)*SALT_BYTES_PER_THREAD), SALT_BYTES_PER_THREAD,
key1+((t*2+1)*SALT_BYTES_PER_THREAD), SALT_BYTES_PER_THREAD,
key2+(t*SALT_BYTES_PER_THREAD), SALT_BYTES_PER_THREAD);
}
last_scrypt(pass, pass_sz, key2, key2_sz, key3, key3_sz);
hex(key3, key3_sz, out, 33);
return 0;
}