private unsafe bool LoopComp() { var cartesian = CartesianProduct.Create(Enumerable.Repeat(Enumerable.Range(0, 58), missCount)); using Sha256 sha = new Sha256(); bool success = false; uint[] temp = new uint[precomputed.Length]; fixed(uint *hPt = &sha.hashState[0], wPt = &sha.w[0]) fixed(uint *pow = &powers58[0], res = &precomputed[0], tmp = &temp[0]) fixed(int *mi = &missingIndexes[0]) { foreach (var item in cartesian) { Buffer.MemoryCopy(res, tmp, 40, 40); int mis = 0; foreach (var keyItem in item) { ulong carry = 0; for (int k = 9, j = 0; k >= 0; k--, j++) { ulong result = (pow[(mi[mis] * 10) + j] * (ulong)keyItem) + tmp[k] + carry; tmp[k] = (uint)result; carry = (uint)(result >> 32); } mis++; } wPt[0] = (tmp[0] << 16) | (tmp[1] >> 16); wPt[1] = (tmp[1] << 16) | (tmp[2] >> 16); wPt[2] = (tmp[2] << 16) | (tmp[3] >> 16); wPt[3] = (tmp[3] << 16) | (tmp[4] >> 16); wPt[4] = (tmp[4] << 16) | (tmp[5] >> 16); wPt[5] = (tmp[5] << 16) | (tmp[6] >> 16); wPt[6] = (tmp[6] << 16) | (tmp[7] >> 16); wPt[7] = (tmp[7] << 16) | (tmp[8] >> 16); wPt[8] = (tmp[8] << 16) | 0b00000000_00000000_10000000_00000000U; // from 9 to 14 =0 wPt[15] = 272; // 34 *8 = 272 sha.Init(hPt); sha.CompressDouble34(hPt, wPt); if (hPt[0] == tmp[9]) { SetAddrResult(item); success = true; } } } return(success); }
public unsafe void CompressDouble34Test() { int dataLen = 34; byte[] data = GetRandomBytes(dataLen); byte[] expected = ComputeDoubleSha(data); using Sha256 sha = new Sha256(); uint *hPt = sha.GethPt(); uint *wPt = sha.GetwPt(); int dIndex = 0; for (int i = 0; i < 8; i++, dIndex += 4) { wPt[i] = (uint)((data[dIndex] << 24) | (data[dIndex + 1] << 16) | (data[dIndex + 2] << 8) | data[dIndex + 3]); } wPt[8] = (uint)((data[32] << 24) | (data[33] << 16) | 0b00000000_00000000_10000000_00000000U); wPt[15] = (uint)dataLen * 8; sha.Init(hPt); sha.CompressDouble34(hPt, wPt); byte[] actual = sha.GetBytes(hPt); Assert.Equal(expected, actual); }