/// <inheritdoc /> public int UntransformBlock(ReadOnlySpan <byte> input, Span <byte> block) { using var hmac = new HMACSHA256(macKey); var hash = hmac.ComputeHash(input.Slice(32).ToArray()); if (!input.Slice(0, 32).SequenceEqual(hash)) { throw new IOException("Invalid MAC"); } using var aes = new AesCounterMode(); using var enc = aes.CreateDecryptor(cryptoKey, Array.Empty <byte>()); var dec = enc.TransformFinalBlock(input.Slice(32).ToArray(), 0, input.Length - 32); dec.CopyTo(block); return(dec.Length); }
public override void init(int mode, byte[] key, byte[] iv) { this.mode = mode; aes_ctr = new AesCounterMode(); //String pad="NoPadding"; byte[] tmp; int ivsize = getIVSize(); if (iv.Length > ivsize) { tmp = new byte[ivsize]; Array.Copy(iv, 0, tmp, 0, tmp.Length); iv = tmp; } int bsize = getBlockSize(); if (key.Length > bsize) { tmp = new byte[bsize]; Array.Copy(key, 0, tmp, 0, tmp.Length); key = tmp; } try { // SecretKeySpec keyspec=new SecretKeySpec(key, "AES"); // cipher=javax.crypto.Cipher.getInstance("AES/CBC/"+pad); // cipher.init((mode==ENCRYPT_MODE? // javax.crypto.Cipher.ENCRYPT_MODE: // javax.crypto.Cipher.DECRYPT_MODE), // keyspec, new IvParameterSpec(iv)); cipher = (mode == ENCRYPT_MODE? aes_ctr.CreateEncryptor(key, iv): aes_ctr.CreateDecryptor(key, iv)); } catch (Exception e) { Console.WriteLine(e); cipher = null; } }