/// <summary> /// Initializes the Skein hash instance. /// </summary> /// <param name="stateSize">The internal state size of the hash in bits. /// Supported values are 256, 512, and 1024.</param> /// <param name="outputSize">The output size of the hash in bits. /// Output size must be divisible by 8 and greater than zero.</param> public Skein(int stateSize, int outputSize) { if (outputSize <= 0) { throw new CryptographicException("Output bit size must be greater than zero."); } if (outputSize % 8 != 0) { throw new CryptographicException("Output bit size must be divisible by 8."); } cipherStateBits = stateSize; cipherStateBytes = stateSize / 8; cipherStateWords = stateSize / 64; HashSizeValue = outputSize; outputBytes = (outputSize + 7) / 8; cipher = ThreefishCipher.CreateCipher(stateSize); if (cipher == null) { throw new CryptographicException("Unsupported state size."); } inputBuffer = new byte[cipherStateBytes]; cipherInput = new ulong[cipherStateWords]; state = new ulong[cipherStateWords]; UbiParameters = new UbiTweak(); Configuration = new SkeinConfig(this); Configuration.SetSchema(83, 72, 65, 51); // "SHA3" Configuration.SetVersion(1); Configuration.GenerateConfiguration(); Initialize(); }
public void GenerateConfiguration() { var cipher = ThreefishCipher.CreateCipher(stateSize); var tweak = new UbiTweak(); tweak.StartNewBlockType(UbiType.Config); tweak.IsFinalBlock = true; tweak.BitsProcessed = 32; cipher.SetTweak(tweak.Tweak); cipher.Encrypt(ConfigString, ConfigValue); ConfigValue[0] ^= ConfigString[0]; ConfigValue[1] ^= ConfigString[1]; ConfigValue[2] ^= ConfigString[2]; }