public virtual void Init( bool forEncryption, ICipherParameters parameters) { this.forEncryption = forEncryption; KeyParameter keyParam; if (parameters is AeadParameters) { AeadParameters param = (AeadParameters)parameters; nonce = param.GetNonce(); initialAssociatedText = param.GetAssociatedText(); keyParam = param.Key; } else if (parameters is ParametersWithIV) { ParametersWithIV param = (ParametersWithIV)parameters; nonce = param.GetIV(); initialAssociatedText = null; keyParam = (KeyParameter)param.Parameters; } else { throw new ArgumentException("invalid parameters passed to ChaCha20Poly1305"); } if (nonce == null || nonce.Length < 1) { throw new ArgumentException("IV must be at least 1 byte"); } // Geneate the key ChaChaX tmpCypher = new ChaChaX(); byte[] zero = new byte[32]; byte[] polyKey = new byte[32]; ParametersWithIV tmpKey = new ParametersWithIV(keyParam, nonce); tmpCypher.Init(true, tmpKey); tmpCypher.ProcessBytes(zero, 0, zero.Length, polyKey, 0); poly = new Poly1305(); KeyParameter tmpKey2 = new KeyParameter(polyKey); poly.Init(tmpKey2); chacha20 = new ChaChaX(); chacha20.Init(forEncryption, tmpKey); InitCipher(); }