PhraseSet.FillPhraseSet moved out to unmanaged code

master
Inga 🏳‍🌈 8 years ago
parent c5e129ffd9
commit 9866d8ef7f
  1. 45
      dotnet/WhiteRabbit.UnmanagedBridge/WhiteRabbit.UnmanagedBridge.cpp
  2. 1
      dotnet/WhiteRabbit.UnmanagedBridge/WhiteRabbit.UnmanagedBridge.h
  3. 43
      dotnet/WhiteRabbit/PhraseSet.cs

@ -25,3 +25,48 @@ void WhiteRabbitUnmanagedBridge::MD5Unmanaged::ComputeMD5(unsigned __int32 * inp
} }
#endif #endif
} }
void WhiteRabbitUnmanagedBridge::MD5Unmanaged::FillPhraseSet(__int64* bufferPointer, __int64* allWordsPointer, __int32* wordIndexes, unsigned __int64* permutationsPointer, int permutationOffset, int numberOfCharacters, int numberOfWords)
{
long* longBuffer = (long*)bufferPointer;
auto currentPermutationPointer = permutationsPointer + permutationOffset;
for (auto i = 0; i < WhiteRabbitUnmanagedBridge::MD5Unmanaged::PhrasesPerSet; i++, currentPermutationPointer++)
{
auto permutation = *currentPermutationPointer;
if (permutation == 0)
{
continue;
}
auto cumulativeWordOffsetX4 = 0;
for (auto j = 0; j < numberOfWords; j++)
{
auto currentWord = allWordsPointer + wordIndexes[permutation & 15] * 128;
permutation = permutation >> 4;
longBuffer[0] |= currentWord[cumulativeWordOffsetX4 + 0];
longBuffer[1] |= currentWord[cumulativeWordOffsetX4 + 1];
longBuffer[2] ^= currentWord[cumulativeWordOffsetX4 + 2];
longBuffer[3] ^= currentWord[cumulativeWordOffsetX4 + 3];
cumulativeWordOffsetX4 += (int)currentWord[127];
}
longBuffer += 4;
}
auto length = numberOfCharacters + numberOfWords - 1;
unsigned char* byteBuffer = ((unsigned char*)bufferPointer) + length;
for (auto i = 0; i < WhiteRabbitUnmanagedBridge::MD5Unmanaged::PhrasesPerSet; i++)
{
*byteBuffer = 128;
byteBuffer += 32;
}
auto lengthInBits = (unsigned int)(length << 3);
unsigned int* uintBuffer = ((unsigned int*)bufferPointer) + 7;
for (auto i = 0; i < WhiteRabbitUnmanagedBridge::MD5Unmanaged::PhrasesPerSet; i++)
{
*uintBuffer = lengthInBits;
uintBuffer += 8;
}
}

@ -11,5 +11,6 @@ namespace WhiteRabbitUnmanagedBridge {
public: public:
literal int PhrasesPerSet = 16; literal int PhrasesPerSet = 16;
static void ComputeMD5(unsigned int* input, unsigned int* output); static void ComputeMD5(unsigned int* input, unsigned int* output);
static void FillPhraseSet(__int64* bufferPointer, __int64* allWordsPointer, __int32* wordIndexes, unsigned __int64* permutationsPointer, int permutationOffset, int numberOfCharacters, int numberOfWords);
}; };
} }

@ -21,7 +21,7 @@
{ {
fixed (Word* allWordsPointer = allWords) fixed (Word* allWordsPointer = allWords)
{ {
FillPhraseSet(bufferPointer, (long*)allWordsPointer, wordIndexesPointer, permutationsPointer, permutationOffset, numberOfCharacters, wordIndexes.Length); WhiteRabbitUnmanagedBridge.MD5Unmanaged.FillPhraseSet(bufferPointer, (long*)allWordsPointer, wordIndexesPointer, permutationsPointer, permutationOffset, numberOfCharacters, wordIndexes.Length);
} }
} }
} }
@ -30,47 +30,6 @@
private static unsafe void FillPhraseSet(long* bufferPointer, long* allWordsPointer, int* wordIndexes, ulong* permutationsPointer, int permutationOffset, int numberOfCharacters, int numberOfWords) private static unsafe void FillPhraseSet(long* bufferPointer, long* allWordsPointer, int* wordIndexes, ulong* permutationsPointer, int permutationOffset, int numberOfCharacters, int numberOfWords)
{ {
long* longBuffer = (long*)bufferPointer;
var currentPermutationPointer = permutationsPointer + permutationOffset;
for (var i = 0; i < Constants.PhrasesPerSet; i++, currentPermutationPointer++)
{
var permutation = *currentPermutationPointer;
if (permutation == 0)
{
continue;
}
var cumulativeWordOffsetX4 = 0;
for (var j = 0; j < numberOfWords; j++)
{
var currentWord = allWordsPointer + wordIndexes[permutation & 15] * 128;
permutation = permutation >> 4;
longBuffer[0] |= currentWord[cumulativeWordOffsetX4 + 0];
longBuffer[1] |= currentWord[cumulativeWordOffsetX4 + 1];
longBuffer[2] ^= currentWord[cumulativeWordOffsetX4 + 2];
longBuffer[3] ^= currentWord[cumulativeWordOffsetX4 + 3];
cumulativeWordOffsetX4 += unchecked((int)currentWord[127]);
}
longBuffer += 4;
}
var length = numberOfCharacters + numberOfWords - 1;
byte* byteBuffer = ((byte*)bufferPointer) + length;
for (var i = 0; i < Constants.PhrasesPerSet; i++)
{
*byteBuffer = 128;
byteBuffer += 32;
}
var lengthInBits = (uint)(length << 3);
uint* uintBuffer = ((uint*)bufferPointer) + 7;
for (var i = 0; i < Constants.PhrasesPerSet; i++)
{
*uintBuffer = lengthInBits;
uintBuffer += 8;
}
} }
public unsafe byte[] GetBytes(int number) public unsafe byte[] GetBytes(int number)

Loading…
Cancel
Save