public sbyte[] SignatureFragment(int[] normalizedBundleFragment, sbyte[] keyFragment) { var signatureFragment = keyFragment.ToArray(); var hash = new sbyte[0]; var kerl = new Kerl(); for (var i = 0; i < 27; i++) { hash = signatureFragment.Slice(i * 243, (i + 1) * 243); for (var j = 0; j < 13 - normalizedBundleFragment[i]; j++) { kerl.Initialize(); kerl.Reset(); kerl.Absorb(hash, 0, hash.Length); kerl.Squeeze(hash, 0, Curl.HASH_LENGTH); } for (var j = 0; j < 243; j++) { signatureFragment[i * 243 + j] = hash[j]; } } return(signatureFragment); }
public sbyte[] Key(sbyte[] seed, int index, int length) { if ((seed.Length % 243) != 0) { var listSeed = seed.ToList(); while ((listSeed.Count % 243) != 0) { listSeed.Add(0); } seed = listSeed.ToArray(); } var indexTrits = Converter.GetTritsFromInt(index); var subseed = Adder.Add(seed, indexTrits); var kerl = new Kerl(); kerl.Initialize(); kerl.Absorb(subseed, 0, subseed.Length); kerl.Squeeze(subseed, 0, subseed.Length); kerl.Reset(); kerl.Absorb(subseed, 0, subseed.Length); IList <sbyte> key = new List <sbyte>(); sbyte[] buffer = new sbyte[subseed.Length]; int offset = 0; while (length-- > 0) { for (int i = 0; i < 27; i++) { kerl.Squeeze(buffer, offset, buffer.Length); for (int j = 0; j < 243; j++) { key.Add(buffer[j]); } } } return(key.ToArray()); }