+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright 2010 Martin Westergaard Jørgensen <martinwj2005@gmail.com>
- * Copyright 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "BaseRTReader.h"
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright 2010 Martin Westergaard Jørgensen <martinwj2005@gmail.com>
- * Copyright 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __BASERTREADER_H__
-#define __BASERTREADER_H__
-
-#include "Public.h"
-#include <string>
-
-#if defined(_WIN32) && !defined(__GNUC__)
- #include <io.h>
-#endif
-
-using namespace std;
-
-class BaseRTReader
-{
-public:
- virtual int ReadChains(unsigned int &numChains, RainbowChainO *pData) = 0;
- virtual unsigned int GetChainsLeft() = 0;
-
-};
-
-#endif
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright (C) Zhu Shuanglei <shuanglei@hotmail.com>
- * Copyright Martin Westergaard Jørgensen <martinwj2005@gmail.com>
- * Copyright 2009, 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2009, 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- *
- * Changes: not using OpenSSL routines the slow way anymore, as suggested by jci.
- */
-
-#include "HashAlgorithm.h"
-
-#include "Public.h"
-
-#include <openssl/des.h>
-//#include <openssl/md2.h>
-#include <openssl/md4.h>
-#include <openssl/sha.h>
-//#include <openssl/ripemd.h>
-#include "fast_md5.h"
-#include "md4.h"
-//#include "sha1.h"
-#if defined(_WIN32) && !defined(__GNUC__)
- #pragma comment(lib, "libeay32.lib")
-#endif
-
-#ifdef __NetBSD__
- #include <des.h>
-#endif
-
-#define MSCACHE_HASH_SIZE 16
-void setup_des_key(unsigned char key_56[], des_key_schedule &ks)
-{
- des_cblock key;
-
- key[0] = key_56[0];
- key[1] = (key_56[0] << 7) | (key_56[1] >> 1);
- key[2] = (key_56[1] << 6) | (key_56[2] >> 2);
- key[3] = (key_56[2] << 5) | (key_56[3] >> 3);
- key[4] = (key_56[3] << 4) | (key_56[4] >> 4);
- key[5] = (key_56[4] << 3) | (key_56[5] >> 5);
- key[6] = (key_56[5] << 2) | (key_56[6] >> 6);
- key[7] = (key_56[6] << 1);
-
- //des_set_odd_parity(&key);
- des_set_key(&key, ks);
-}
-
-void HashLM(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- /*
- unsigned char data[7] = {0};
- memcpy(data, pPlain, nPlainLen > 7 ? 7 : nPlainLen);
- */
-
- int i;
- for (i = nPlainLen; i < 7; i++)
- pPlain[i] = 0;
-
- static unsigned char magic[] = {0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
- des_key_schedule ks;
- //setup_des_key(data, ks);
- setup_des_key(pPlain, ks);
- des_ecb_encrypt((des_cblock*)magic, (des_cblock*)pHash, ks, DES_ENCRYPT);
-}
-
-void HashLMCHALL(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- unsigned char pass[14];
- unsigned char pre_lmresp[21];
- static unsigned char magic[] = {0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
- static unsigned char spoofed_challange[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
- des_key_schedule ks;
-
- memset (pass,0,sizeof(pass));
- memset (pre_lmresp,0,sizeof(pre_lmresp));
-
- memcpy (pass,pPlain, nPlainLen);
-
- setup_des_key(pass, ks);
- des_ecb_encrypt((des_cblock*)magic, (des_cblock*)pre_lmresp, ks, DES_ENCRYPT);
-
- setup_des_key(&pass[7], ks);
- des_ecb_encrypt((des_cblock*)magic, (des_cblock*)&pre_lmresp[8], ks, DES_ENCRYPT);
-
- setup_des_key(pre_lmresp, ks);
- des_ecb_encrypt((des_cblock*)spoofed_challange, (des_cblock*)pHash, ks, DES_ENCRYPT);
-
- setup_des_key(&pre_lmresp[7], ks);
- des_ecb_encrypt((des_cblock*)spoofed_challange, (des_cblock*)&pHash[8], ks, DES_ENCRYPT);
-
- setup_des_key(&pre_lmresp[14], ks);
- des_ecb_encrypt((des_cblock*)spoofed_challange, (des_cblock*)&pHash[16], ks, DES_ENCRYPT);
-
-}
-
-void HashHALFLMCHALL(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- unsigned char pre_lmresp[8];
- static unsigned char magic[] = {0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
- static unsigned char salt[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
-
- des_key_schedule ks;
- unsigned char plain[8] = {0};
- memcpy(plain, pPlain, nPlainLen);
- setup_des_key(plain, ks);
- des_ecb_encrypt((des_cblock*)magic, (des_cblock*)pre_lmresp, ks, DES_ENCRYPT);
-
- setup_des_key(pre_lmresp, ks);
- des_ecb_encrypt((des_cblock*)salt, (des_cblock*)pHash, ks, DES_ENCRYPT);
-}
-
-
-
-void HashNTLMCHALL(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- unsigned char UnicodePlain[MAX_PLAIN_LEN];
- static unsigned char spoofed_challange[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
-
- int len = (nPlainLen < 127) ? nPlainLen : 127;
- int i;
-
- for (i = 0; i < len; i++)
- {
- UnicodePlain[i * 2] = pPlain[i];
- UnicodePlain[i * 2 + 1] = 0x00;
- }
-
- des_key_schedule ks;
- unsigned char lm[21];
-
- /*MD4_CTX ctx;
- MD4_Init(&ctx);
- MD4_Update(&ctx, UnicodePlain, len * 2);
- MD4_Final(lm, &ctx); */
- MD4_NEW(UnicodePlain, len * 2, lm);
-
- //MD4(UnicodePlain, len * 2, lm);
- lm[16] = lm[17] = lm[18] = lm[19] = lm[20] = 0;
-
- setup_des_key(lm, ks);
- des_ecb_encrypt((des_cblock*)spoofed_challange, (des_cblock*)pHash, ks, DES_ENCRYPT);
-
- setup_des_key(&lm[7], ks);
- des_ecb_encrypt((des_cblock*)spoofed_challange, (des_cblock*)&pHash[8], ks, DES_ENCRYPT);
-
- setup_des_key(&lm[14], ks);
- des_ecb_encrypt((des_cblock*)spoofed_challange, (des_cblock*)&pHash[16], ks, DES_ENCRYPT);
-}
-
-void HashORACLE(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- char ToEncrypt[256];
- char temp[256];
- char username[256];
-
- DES_cblock iv,iv2;
- DES_key_schedule ks1,ks2;
- unsigned char deskey_fixed[]={ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
- int i,j;
-#if defined(_WIN32) && !defined(__GNUC__)
- strcpy_s(username, sizeof(username), "SYS");
-#else
- strcpy(username, "SYS");
-#endif
- int userlen = 3;
-#if defined(_WIN32) && !defined(__GNUC__)
- _strupr((char*) pPlain);
-#else
- strupr((char*) pPlain);
-#endif
- memset (ToEncrypt,0,sizeof(ToEncrypt));
-
- for (i=1,j=0; j<userlen; i++,j++)
- {
- ToEncrypt[i] = username[j];
- i++;
- }
-
- for (j=0; j<nPlainLen; i++,j++)
- {
- ToEncrypt[i] = pPlain[j];
- i++;
- }
-
- i=i-1;
- memset (iv,0,8);
- memset (iv2,0,8);
- DES_set_key((DES_cblock*) deskey_fixed, &ks1);
- DES_ncbc_encrypt((unsigned char*) ToEncrypt, (unsigned char*) temp, i, &ks1, &iv, DES_ENCRYPT);
- DES_set_key((DES_cblock*) &iv, &ks2);
- DES_ncbc_encrypt((unsigned char*) ToEncrypt, (unsigned char*) temp, i, &ks2, &iv2, DES_ENCRYPT);
- memcpy (pHash,iv2,8);
-}
-
-void HashNTLM(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- unsigned char UnicodePlain[MAX_PLAIN_LEN * 2];
- int i;
- for (i = 0; i < nPlainLen; i++)
- {
- UnicodePlain[i * 2] = pPlain[i];
- UnicodePlain[i * 2 + 1] = 0x00;
- }
-
- MD4_NEW(UnicodePlain, nPlainLen * 2, pHash);
-}
-
-/*
-void HashMD2(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- MD2_CTX ctx;
- MD2_Init(&ctx);
- MD2_Update(&ctx, pPlain, nPlainLen);
- MD2_Final(pHash, &ctx);
-
- //MD2(pPlain, nPlainLen, pHash);
-}
-*/
-
-void HashMD4(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- MD4_NEW(pPlain, nPlainLen, pHash);
-}
-
-void HashMD5(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- fast_MD5(pPlain, nPlainLen, pHash);
-}
-void HashDoubleMD5(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- fast_MD5(pPlain, nPlainLen, pHash);
- unsigned char hash[16];
- memcpy(hash, pHash, 16);
- fast_MD5(hash, 16, pHash);
-}
-
-void HashSHA1(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- SHA_CTX ctx;
- SHA1_Init(&ctx);
- SHA1_Update(&ctx, (unsigned char *) pPlain, nPlainLen);
- SHA1_Final(pHash, &ctx);
-}
-
-/*
-void HashRIPEMD160(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- RIPEMD160_CTX ctx;
- RIPEMD160_Init(&ctx);
- RIPEMD160_Update(&ctx, pPlain, nPlainLen);
- RIPEMD160_Final(pHash, &ctx);
-
- //RIPEMD160(pPlain, nPlainLen, pHash);
-}
-*/
-
-void HashMSCACHE(unsigned char *pPlain, int nPlainLen, unsigned char* pHash)
-{
- char unicode_pwd[256];
- char unicode_user[256];
- static unsigned char username[] = "administrator";
- static int userlen = 13;
- unsigned char final1[MD4_DIGEST_LENGTH];
- MD4_CTX ctx;
- int i;
-
-// strcpy (username, "administrator");
-// userlen = 13;
-
- for (i=0; i<nPlainLen; i++)
- {
- unicode_pwd[i*2] = pPlain[i];
- unicode_pwd[i*2+1] = 0x00;
- }
-
- for (i=0; i<userlen; i++)
- {
- unicode_user[i*2] = username[i];
- unicode_user[i*2+1] = 0x00;
- }
- /*
- MD4_Init(&ctx);
- MD4_Update(&ctx,unicode_pwd,nPlainLen*2);
- MD4_Final(final1,&ctx);
- */
- MD4_NEW( (unsigned char*)unicode_pwd, nPlainLen*2, final1 );
-
- MD4_Init(&ctx);
- MD4_Update(&ctx,final1,MD4_DIGEST_LENGTH);
- MD4_Update(&ctx,(unsigned char*) unicode_user,userlen*2);
- MD4_Final(pHash,&ctx);
-
- /*
- unsigned char unicode_pwd[256];
- for (int i=0; i<nPlainLen; i++)
- {
- unicode_pwd[i*2] = pPlain[i];
- unicode_pwd[i*2+1] = 0x00;
- }*/
- /*
- unsigned char *buf = (unsigned char*)calloc(MSCACHE_HASH_SIZE + nSaltLength, sizeof(unsigned char));
- HashNTLM(pPlain, nPlainLen, buf, NULL);
- //MD4(unicode_pwd, nPlainLen*2, buf);
- memcpy(buf + MSCACHE_HASH_SIZE, pSalt, nSaltLength);
- MD4(buf, MSCACHE_HASH_SIZE + nSaltLength, pHash);
- free(buf);
- */
-}
-
-//*********************************************************************************
-// Code for MySQL password hashing
-//*********************************************************************************
-
-inline void mysql_hash_password_323(unsigned long *result, const char *password)
-{
- register unsigned long nr=1345345333L, add=7, nr2=0x12345671L;
- unsigned long tmp;
- for (; *password ; password++)
- {
- if (*password == ' ' || *password == '\t') continue;
- tmp= (unsigned long) (unsigned char) *password;
- nr^= (((nr & 63)+add)*tmp)+ (nr << 8);
- nr2+=(nr2 << 8) ^ nr;
- add+=tmp;
- }
- result[0]=nr & (((unsigned long) 1L << 31) -1L); /* Don't use sign bit (str2int) */;
- result[1]=nr2 & (((unsigned long) 1L << 31) -1L);
- return;
-}
-
-void HashMySQL323(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- unsigned long hash_pass[2];
- unsigned char* f = (unsigned char*) hash_pass;
-
- unsigned char* pass = (unsigned char*) calloc (nPlainLen+4,sizeof(unsigned char));
- memcpy(pass,pPlain,nPlainLen);
-
- mysql_hash_password_323(hash_pass, (char*) pass);
- pHash[0]=*(f+3); pHash[1]=*(f+2); pHash[2]=*(f+1); pHash[3]=*(f+0);
- pHash[4]=*(f+7); pHash[5]=*(f+6); pHash[6]=*(f+5); pHash[7]=*(f+4);
-
- free (pass);
-}
-
-void HashMySQLSHA1(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- unsigned char hash_stage1[SHA_DIGEST_LENGTH];
- SHA_CTX ctx;
-
- SHA1_Init(&ctx);
- SHA1_Update(&ctx, (unsigned char *) pPlain, nPlainLen);
- SHA1_Final(hash_stage1, &ctx);
- SHA1_Init(&ctx);
- SHA1_Update(&ctx, hash_stage1, SHA_DIGEST_LENGTH);
- SHA1_Final(pHash, &ctx);
-}
-
-//*********************************************************************************
-// Code for PIX password hashing
-//*********************************************************************************
-static char itoa64[] = /* 0 ... 63 => ascii - 64 */
- "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-
-void _crypt_to64(char *s, unsigned long v, int n)
-{
- while (--n >= 0) {
- *s++ = itoa64[v&0x3f];
- v >>= 6;
- }
-}
-
-void HashPIX(unsigned char* pPlain, int nPlainLen, unsigned char* pHash)
-{
- char temp[MD5_DIGEST_LENGTH+1];
- unsigned char final[MD5_DIGEST_LENGTH];
- char* pass = (char*) calloc (nPlainLen+MD5_DIGEST_LENGTH,sizeof(char));
-
- memcpy (pass,pPlain,nPlainLen);
-
- /*MD5_CTX ctx;
- MD5_Init(&ctx);
- MD5_Update(&ctx, (unsigned char *) pass, MD5_DIGEST_LENGTH);
- MD5_Final(final, &ctx);*/
- fast_MD5((unsigned char *) pass, MD5_DIGEST_LENGTH, final);
-
- char* p = (char*) temp;
- _crypt_to64(p,*(unsigned long*) (final+0),4); p += 4;
- _crypt_to64(p,*(unsigned long*) (final+4),4); p += 4;
- _crypt_to64(p,*(unsigned long*) (final+8),4); p += 4;
- _crypt_to64(p,*(unsigned long*) (final+12),4); p += 4;
- *p=0;
-
- memcpy(pHash,temp,MD5_DIGEST_LENGTH);
-
- free (pass);
-}
-
-#if !defined(_WIN32) || defined(__GNUC__)
-char *strupr(char *s1)
-{
- char *p = s1;
- while(*p)
- {
- *p = (char) toupper(*p);
- p++;
- }
- return s1;
-}
-#endif
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright (C) Zhu Shuanglei <shuanglei@hotmail.com>
- * Copyright Martin Westergaard Jørgensen <martinwj2005@gmail.com>
- * Copyright 2009, 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2009, 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _HASHALGORITHM_H
-#define _HASHALGORITHM_H
-
-void HashLM(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashNTLM(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-//void HashMD2(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashMD4(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashMD5(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashDoubleMD5(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashSHA1(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-//void HashRIPEMD160(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashMSCACHE(unsigned char *pPlain, int nPlainLen, unsigned char* pHash);
-
-//****************************************************************************
-// MySQL Password Hashing
-//****************************************************************************
-
-void HashMySQL323(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashMySQLSHA1(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-
-//****************************************************************************
-// Cisco PIX Password Hashing
-//****************************************************************************
-
-void HashPIX(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-
-//****************************************************************************
-// (HALF) LM CHALL hashing
-void HashLMCHALL(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashHALFLMCHALL(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-
-// From mao
-void HashNTLMCHALL(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-void HashORACLE(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-
-#if !defined(_WIN32) || defined(__GNUC__)
-char *strupr(char *s1);
-#endif
-#endif
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright (C) Zhu Shuanglei <shuanglei@hotmail.com>
- * Copyright Martin Westergaard Jørgensen <martinwj2005@gmail.com>
- * Copyright 2009, 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2009, 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#if defined(_WIN32) && !defined(__GNUC__)
- #pragma warning(disable : 4786 4267 4018)
-#endif
-
-#include "HashRoutine.h"
-#include "HashAlgorithm.h"
-
-//////////////////////////////////////////////////////////////////////
-
-CHashRoutine::CHashRoutine()
-{
- // Notice: MIN_HASH_LEN <= nHashLen <= MAX_HASH_LEN
-
-
- AddHashRoutine("lm", HashLM, 8);
- AddHashRoutine("ntlm", HashNTLM, 16);
-// AddHashRoutine("md2", HashMD2, 16);
- AddHashRoutine("md4", HashMD4, 16);
- AddHashRoutine("md5", HashMD5, 16);
- AddHashRoutine("doublemd5", HashDoubleMD5, 16);
- AddHashRoutine("sha1", HashSHA1, 20);
-// AddHashRoutine("ripemd160", HashRIPEMD160, 20);
- AddHashRoutine("mysql323", HashMySQL323, 8);
- AddHashRoutine("mysqlsha1", HashMySQLSHA1, 20);
- AddHashRoutine("ciscopix", HashPIX, 16);
- AddHashRoutine("mscache", HashMSCACHE, 16);
- AddHashRoutine("halflmchall", HashHALFLMCHALL, 8);
-
- // Added from mao
- AddHashRoutine("lmchall", HashLMCHALL, 24);
- AddHashRoutine("ntlmchall", HashNTLMCHALL, 24);
- AddHashRoutine("oracle", HashORACLE, 8);
-}
-
-CHashRoutine::~CHashRoutine()
-{
-}
-
-void CHashRoutine::AddHashRoutine(string sHashRoutineName, HASHROUTINE pHashRoutine, int nHashLen)
-{
- vHashRoutineName.push_back(sHashRoutineName);
- vHashRoutine.push_back(pHashRoutine);
- vHashLen.push_back(nHashLen);
-}
-
-string CHashRoutine::GetAllHashRoutineName()
-{
- string sRet;
- UINT4 i;
- for (i = 0; i < vHashRoutineName.size(); i++)
- sRet += vHashRoutineName[i] + " ";
-
- return sRet;
-}
-
-void CHashRoutine::GetHashRoutine(string sHashRoutineName, HASHROUTINE& pHashRoutine, int& nHashLen)
-{
- UINT4 i;
- for (i = 0; i < vHashRoutineName.size(); i++)
- {
- if (sHashRoutineName == vHashRoutineName[i])
- {
- pHashRoutine = vHashRoutine[i];
- nHashLen = vHashLen[i];
- return;
- }
- }
-
- pHashRoutine = NULL;
- nHashLen = 0;
-}
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright (C) Zhu Shuanglei <shuanglei@hotmail.com>
- * Copyright Martin Westergaard Jørgensen <martinwj2005@gmail.com>
- * Copyright 2009, 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2009, 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _HASHROUTINE_H
-#define _HASHROUTINE_H
-
-#include <string>
-#include <vector>
-
-#include "global.h"
-
-using namespace std;
-
-typedef void (*HASHROUTINE)(unsigned char* pPlain, int nPlainLen, unsigned char* pHash);
-
-class CHashRoutine
-{
-public:
- CHashRoutine();
- virtual ~CHashRoutine();
-
-private:
- vector<string> vHashRoutineName;
- vector<HASHROUTINE> vHashRoutine;
- vector<int> vHashLen;
- void AddHashRoutine(string sHashRoutineName, HASHROUTINE pHashRoutine, int nHashLen);
-
-public:
- string GetAllHashRoutineName();
- void GetHashRoutine(string sHashRoutineName, HASHROUTINE& pHashRoutine, int& nHashLen);
-};
-
-#endif
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright 2010 Martin Westergaard Jørgensen <martinwj2005@gmail.com>
- * Copyright 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "RTI2Reader.h"
-
-#include <math.h>
-
-RTI2Header *RTI2Reader::m_pHeader = NULL;
-RTI2Reader::RTI2Reader(string Filename)
-{
- //m_pIndexPos = NULL, m_pChainPos = NULL;;
- m_pIndex = NULL;
- m_pFile = fopen(Filename.c_str(), "rb");
- if(m_pFile == NULL)
- {
- printf("Unable to open file %s", Filename.c_str());
- exit(1);
- }
- FILE *pFileIndex = fopen(Filename.append(".index").c_str(), "rb");
- if(pFileIndex == NULL)
- {
- printf("Unable to open file %s", Filename.append(".index").c_str());
- exit(1);
- }
- m_chainPosition = 0;
-
- unsigned int len = GetFileLen(pFileIndex);
- fseek(pFileIndex, 0, SEEK_SET);
-
- m_pIndex = new unsigned char[len];
- if(fread(m_pIndex, 1, len, pFileIndex) != len)
- {
- printf("Error while reading index file");
- exit(1);
- }
- fclose(pFileIndex);
- m_pHeader = new RTI2Header();
- memcpy(m_pHeader, m_pIndex, sizeof(RTI2Header));
- m_pHeader->m_cppos = (unsigned int*)(m_pIndex + 8);
- m_pHeader->prefixstart = *(uint64*)(m_pIndex + 8 + (m_pHeader->rti_cplength * 4));
- m_chainsizebytes = (UINT4)ceil((float)(m_pHeader->rti_startptlength + m_pHeader->rti_endptlength + m_pHeader->rti_cplength) / 8); // Get the size of each chain in bytes
- m_indexrowsizebytes = (UINT4)ceil((float)m_pHeader->rti_index_numchainslength / 8);
- // Check the filesize
- fseek(m_pFile, 0, SEEK_END);
- len = ftell(m_pFile);
- fseek(m_pFile, 0, SEEK_SET);
- if(len % m_chainsizebytes > 0)
- {
- printf("Invalid filesize %u\n", len);
- return;
- }
-
-
-}
-
-RTI2Reader::~RTI2Reader(void)
-{
- if(m_pIndex != NULL) delete m_pIndex;
- if(m_pFile != NULL) fclose(m_pFile);
-
-}
-
-unsigned int RTI2Reader::GetChainsLeft()
-{
- int len = GetFileLen(m_pFile);
- return len / m_chainsizebytes - m_chainPosition;
-}
-
-int RTI2Reader::ReadChains(unsigned int &numChains, RainbowChainO *pData)
-{
- if(strncmp(m_pHeader->header, "RTI2", 4) != 0)
- {
- numChains = 0;
- return -1;
- }
- unsigned char *pNumChains = m_pIndex + (m_pHeader->rti_cplength * 4) + 16; // Pointer into the index containing info about how many numbers are in the first chain prefix
- unsigned int i = 0;
- unsigned int indexRow = 0; // Current offset into the index
- unsigned int curRowPosition = 0;
-
- while(true) // Fast forward to current position
- {
- // ALERT: Possible problem here if m_indexrowsizebytes > 1 as pNumChains is a unsigned char.
- unsigned int NumChainsInRow = (unsigned int)*(pNumChains + indexRow * m_indexrowsizebytes);
- if(m_indexrowsizebytes > 1)
- {
- //XXX Have to find a solution to this problem
- printf( "FATAL: m_indexrowsizebytes > 1: %d\n", m_indexrowsizebytes );
- exit(2);
- }
- if(i + NumChainsInRow > m_chainPosition)
- {
- curRowPosition = m_chainPosition - i;
- break; // The current position is somewhere within this prefix
- }
- indexRow++;
- i += NumChainsInRow;
- }
-
- uint64 chainrow = 0; // Buffer to store a single read chain
- unsigned int chainsProcessed = 0; // Number of chains processed
-
- // XXX: same problem with unsigned char here.
- unsigned int NumChainsInRow = *(pNumChains + indexRow);
- while(chainsProcessed < numChains && fread(&chainrow, 1, m_chainsizebytes, m_pFile) == m_chainsizebytes)
- {
- if(curRowPosition >= NumChainsInRow)
- { // Skip to next index row position
- indexRow++;
- curRowPosition = 0;
- NumChainsInRow = *(pNumChains + indexRow);
- }
- while(NumChainsInRow == 0) // We skip forward until we hit a index with > 0 chains
- {
- indexRow++;
- NumChainsInRow = *(pNumChains + indexRow);
- curRowPosition = 0;
- }
- // Load the starting point from the data
- pData[chainsProcessed].nIndexS = chainrow << ( 64 - m_pHeader->rti_startptlength );
- pData[chainsProcessed].nIndexS = pData[chainsProcessed].nIndexS >> ( 64 - m_pHeader->rti_startptlength );
-
- // Load the ending point prefix
- pData[chainsProcessed].nIndexE = ( m_pHeader->prefixstart + indexRow ) << m_pHeader->rti_endptlength;
- // Append the ending point suffix
-#if defined(_WIN32) && !defined(__GNUC__)
- pData[chainsProcessed].nIndexE |= (chainrow & (0xFFFFFFFFFFFFFFFFI64 >> m_pHeader->rti_cplength)) >> m_pHeader->rti_startptlength;
-#else
- pData[chainsProcessed].nIndexE |= (chainrow & (0xFFFFFFFFFFFFFFFFllu >> m_pHeader->rti_cplength)) >> m_pHeader->rti_startptlength;
-#endif
- //pData[chainsProcessed].nCheckPoint = (chainrow >> m_pHeader->rti_startptlength + m_pHeader->rti_endptlength);
- curRowPosition++;
- chainsProcessed++;
- }
- numChains = chainsProcessed;
- m_chainPosition += numChains;
- return 0;
-}
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright 2010 Martin Westergaard Jørgensen <martinwj2005@gmail.com>
- * Copyright 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __RTI2READER_H__
-#define __RTI2READER_H__
-
-#include "Public.h"
-#include <string>
-
-#if defined(_WIN32) && !defined(__GNUC__)
- #include <io.h>
-#endif
-
-#include <vector>
-#include "BaseRTReader.h"
-
-using namespace std;
-
-typedef struct
-{
- char header[4];
- unsigned char rti_startptlength, rti_endptlength, rti_cplength, rti_index_numchainslength;
- uint64 prefixstart;
- unsigned int *m_cppos;
-} RTI2Header;
-
-class RTI2Reader : BaseRTReader
-{
-private:
- FILE *m_pFile;
- UINT4 m_chainPosition;
- unsigned char *m_pPos, *m_pChainPos;
- static RTI2Header *m_pHeader;
- unsigned char *m_pIndex;
- UINT4 m_chainsizebytes;
- UINT4 m_indexrowsizebytes;
-
-
-public:
- RTI2Reader(string Filename);
- ~RTI2Reader(void);
- int ReadChains(unsigned int &numChains, RainbowChainO *pData);
- unsigned int GetChainsLeft();
- static RTI2Header *GetHeader() { return m_pHeader; }
-};
-
-
-#endif
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright Bitweasil
- * Copyright 2009, 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2009, 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- *
- * This code implements the MD4 message-digest algorithm.
- * "Just the reference implementation, single stage. Hardly "optimized." Though a good bit faster than libssl's MD4, as it isn't doing nearly the same amount of work." - Bitweasil
- *
- * little bit optimized (or at least attempted) for NTLM (unicode) by neinbrucke
- */
-
-
-//#include <cstdlib>
-//#include <cstring>
-#include "md4.h"
-
-/* MD4 Defines as per RFC reference implementation */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-#define FF(a, b, c, d, x, s) { \
- (a) += F ((b), (c), (d)) + (x); \
- (a) = ROTATE_LEFT ((a), (s)); \
- }
-#define GG(a, b, c, d, x, s) { \
- (a) += G ((b), (c), (d)) + (x) + (UINT4)0x5a827999; \
- (a) = ROTATE_LEFT ((a), (s)); \
- }
-#define HH(a, b, c, d, x, s) { \
- (a) += H ((b), (c), (d)) + (x) + (UINT4)0x6ed9eba1; \
- (a) = ROTATE_LEFT ((a), (s)); \
- }
-#define S11 3
-#define S12 7
-#define S13 11
-#define S14 19
-#define S21 3
-#define S22 5
-#define S23 9
-#define S24 13
-#define S31 3
-#define S32 9
-#define S33 11
-#define S34 15
-/* End MD4 Defines */
-
-void MD4_NEW( unsigned char * pData, int length, unsigned char * pDigest)
-{
- // access data as 4-byte word
- #define uData ((UINT4 *)pData)
- #define uDigest ((UINT4 *)pDigest)
-
- // pad word and append bit at appropriate location
- #define MD4_pad_w0() (0x00000080)
- #define MD4_pad_w1(data) (((data) & 0x000000FF) | 0x00008000)
- #define MD4_pad_w2(data) (((data) & 0x0000FFFF) | 0x00800000)
- #define MD4_pad_w3(data) (((data) & 0x00FFFFFF) | 0x80000000)
-
- // For the hash working space
- //__attribute__((aligned(16))) UINT4 data[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- //__declspec(align(16)) UINT4 data[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- UINT4 data[MD4_DIGEST_LENGTH] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
- // For the output result
- UINT4 a,b,c,d;
-
- switch (length)
- {
- case 0:
- {
- data[ 0] = MD4_pad_w0();
-
- data[14] = 0;
- }
- break;
- case 1:
- {
- data[ 0] = MD4_pad_w1(uData[0]);
-
- data[14] = 1 << 3;
- }
- break;
- case 2:
- {
- data[ 0] = MD4_pad_w2(uData[0]);
-
- data[14] = 2 << 3;
- }
- break;
- case 3:
- {
- data[ 0] = MD4_pad_w3(uData[0]);
-
- data[14] = 3 << 3;
- }
- break;
- case 4:
- {
- data[ 0] = uData[0];
- data[ 1] = MD4_pad_w0();
-
- data[14] = 4 << 3;
- }
- break;
- case 5:
- {
- data[ 0] = uData[0];
- data[ 1] = MD4_pad_w1(uData[1]);
-
- data[14] = 5 << 3;
- }
- break;
- case 6:
- {
- data[ 0] = uData[0];
- data[ 1] = MD4_pad_w2(uData[1]);
-
- data[14] = 6 << 3;
- }
- break;
- case 7:
- {
- data[ 0] = uData[0];
- data[ 1] = MD4_pad_w3(uData[1]);
-
- data[14] = 7 << 3;
- }
- break;
- case 8:
- {
- data[ 0] = uData[0];
- data[ 1] = uData[1];
- data[ 2] = MD4_pad_w0();
-
- data[14] = 8 << 3;
- }
- break;
- case 9:
- {
- data[ 0] = uData[0];
- data[ 1] = uData[1];
- data[ 2] = MD4_pad_w1(uData[2]);
-
- data[14] = 9 << 3;
- }
- break;
- case 10:
- {
- data[ 0] = uData[0];
- data[ 1] = uData[1];
- data[ 2] = MD4_pad_w2(uData[2]);
-
- data[14] = 10 << 3;
- }
- break;
- case 11:
- {
- data[ 0] = uData[0];
- data[ 1] = uData[1];
- data[ 2] = MD4_pad_w3(uData[2]);
-
- data[14] = 11 << 3;
- }
- break;
- case 12:
- {
- data[ 0] = uData[0];
- data[ 1] = uData[1];
- data[ 2] = uData[2];
- data[ 3] = MD4_pad_w0();
-
- data[14] = 12 << 3;
- }
- break;
- case 13:
- {
- data[ 0] = uData[0];
- data[ 1] = uData[1];
- data[ 2] = uData[2];
- data[ 3] = MD4_pad_w1(uData[3]);
-
- data[14] = 13 << 3;
- }
- break;
- case 14:
- {
- data[ 0] = uData[0];
- data[ 1] = uData[1];
- data[ 2] = uData[2];
- data[ 3] = MD4_pad_w2(uData[3]);
-
- data[14] = 14 << 3;
- }
- break;
- case 15:
- {
- data[ 0] = uData[0];
- data[ 1] = uData[1];
- data[ 2] = uData[2];
- data[ 3] = MD4_pad_w3(uData[3]);
-
- data[14] = 15 << 3;
- }
- break;
-
- default:
- {
- length = length % 32; // lenght >= 32 not suported
-
- int word = length >> 2;
-
- int i = 0;
- while (i < word) {
- data[i] = uData[i];
- i++;
- }
-
- switch (length & 0x3) {
- case 0:
- {
- data[word] = MD4_pad_w0();
- }
- break;
- case 1:
- {
- data[word] = MD4_pad_w1(uData[word]);
- }
- break;
- case 2:
- {
- data[word] = MD4_pad_w2(uData[word]);
- }
- break;
- case 3:
- {
- data[word] = MD4_pad_w3(uData[word]);
- }
- break;
- }
-
- data[14] = length << 3;
- }
- break;
- }
-
- a = 0x67452301;
- b = 0xefcdab89;
- c = 0x98badcfe;
- d = 0x10325476;
-
- /* Round 1 */
- FF (a, b, c, d, data[ 0], S11); /* 1 */
- FF (d, a, b, c, data[ 1], S12); /* 2 */
- FF (c, d, a, b, data[ 2], S13); /* 3 */
- FF (b, c, d, a, data[ 3], S14); /* 4 */
- FF (a, b, c, d, data[ 4], S11); /* 5 */
- FF (d, a, b, c, data[ 5], S12); /* 6 */
- FF (c, d, a, b, data[ 6], S13); /* 7 */
- FF (b, c, d, a, data[ 7], S14); /* 8 */
- FF (a, b, c, d, 0, S11); /* 9 */
- FF (d, a, b, c, 0, S12); /* 10 */
- FF (c, d, a, b, 0, S13); /* 11 */
- FF (b, c, d, a, 0, S14); /* 12 */
- FF (a, b, c, d, 0, S11); /* 13 */
- FF (d, a, b, c, 0, S12); /* 14 */
- FF (c, d, a, b, data[14], S13); /* 15 */
- FF (b, c, d, a, 0, S14); /* 16 */
-
- /* Round 2 */
- GG (a, b, c, d, data[ 0], S21); /* 17 */
- GG (d, a, b, c, data[ 4], S22); /* 18 */
- GG (c, d, a, b, 0, S23); /* 19 */
- GG (b, c, d, a, 0, S24); /* 20 */
- GG (a, b, c, d, data[ 1], S21); /* 21 */
- GG (d, a, b, c, data[ 5], S22); /* 22 */
- GG (c, d, a, b, 0, S23); /* 23 */
- GG (b, c, d, a, 0, S24); /* 24 */
- GG (a, b, c, d, data[ 2], S21); /* 25 */
- GG (d, a, b, c, data[ 6], S22); /* 26 */
- GG (c, d, a, b, 0, S23); /* 27 */
- GG (b, c, d, a, data[14], S24); /* 28 */
- GG (a, b, c, d, data[ 3], S21); /* 29 */
- GG (d, a, b, c, data[ 7], S22); /* 30 */
- GG (c, d, a, b, 0, S23); /* 31 */
- GG (b, c, d, a, 0, S24); /* 32 */
-
- /* Round 3 */
- HH (a, b, c, d, data[ 0], S31); /* 33 */
- HH (d, a, b, c, 0, S32); /* 34 */
- HH (c, d, a, b, data[ 4], S33); /* 35 */
- HH (b, c, d, a, 0, S34); /* 36 */
- HH (a, b, c, d, data[ 2], S31); /* 37 */
- HH (d, a, b, c, 0, S32); /* 38 */
- HH (c, d, a, b, data[ 6], S33); /* 39 */
- HH (b, c, d, a, data[14], S34); /* 40 */
- HH (a, b, c, d, data[ 1], S31); /* 41 */
- HH (d, a, b, c, 0, S32); /* 42 */
- HH (c, d, a, b, data[ 5], S33); /* 43 */
- HH (b, c, d, a, 0, S34); /* 44 */
- HH (a, b, c, d, data[ 3], S31); /* 45 */
- HH (d, a, b, c, 0, S32); /* 46 */
- HH (c, d, a, b, data[ 7], S33); /* 47 */
- HH (b, c, d, a, 0, S34); /* 48 */
-
- // Finally, add initial values, as this is the only pass we make.
- a += 0x67452301;
- b += 0xefcdab89;
- c += 0x98badcfe;
- d += 0x10325476;
-
- uDigest[0] = a;
- uDigest[1] = b;
- uDigest[2] = c;
- uDigest[3] = d;
-}
+++ /dev/null
-/*
- * rcracki_mt is a multithreaded implementation and fork of the original
- * RainbowCrack
- *
- * Copyright Bitweasil
- * Copyright 2009, 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
- * Copyright 2009, 2010 James Nobis <frt@quelrod.net>
- *
- * This file is part of rcracki_mt.
- *
- * rcracki_mt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * rcracki_mt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef MD4_H
-#define MD4_H
-
-#include "global.h"
-
-#define MD4_DIGEST_LENGTH 16
-
-//Main function
-void MD4_NEW( unsigned char * buf, int len, unsigned char * pDigest);
-
-#endif /* !MD4_H */