public void EnhancedMemoryStream_Bytes() { var es = new EnhancedMemoryStream(); byte[] read, write; es.WriteBytes16(null); es.Seek(0, SeekOrigin.Begin); read = es.ReadBytes16(); Assert.IsNull(read); write = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; es.Seek(0, SeekOrigin.Begin); es.WriteBytes16(write); es.Seek(0, SeekOrigin.Begin); read = es.ReadBytes16(); CollectionAssert.AreEqual(write, read); write = new byte[40000]; for (int i = 0; i < write.Length; i++) { write[i] = (byte)i; } es.Seek(0, SeekOrigin.Begin); es.WriteBytes16(write); es.Seek(0, SeekOrigin.Begin); read = es.ReadBytes16(); CollectionAssert.AreEqual(write, read); }
public void EnhancedMemoryStream_VerifyBufLength() { var es = new EnhancedMemoryStream(); es.WriteInt16(5000); es.Seek(0, SeekOrigin.Begin); try { es.ReadBytes16(); Assert.Fail(); } catch { } es.Seek(0, SeekOrigin.Begin); try { es.ReadString16(); Assert.Fail(); } catch { } es.Seek(0, SeekOrigin.Begin); es.WriteInt32(500000); try { es.ReadBytes32(); Assert.Fail(); } catch { } es.Seek(0, SeekOrigin.Begin); try { es.ReadString32(); Assert.Fail(); } catch { } }
/// <summary> /// Decrypts and deserializes a message from a byte buffer. /// </summary> /// <param name="buffer">The buffer.</param> /// <param name="sharedKey">The shared encryption key.</param> /// <exception cref="FormatException">Thrown if the buffer does not contain a valid message.</exception> public UdpBroadcastMessage(byte[] buffer, SymmetricKey sharedKey) { try { using (var ms = new EnhancedMemoryStream(Crypto.Decrypt(buffer, sharedKey))) { if (ms.ReadInt32Le() != Magic) { throw new Exception(); } this.TimeStampUtc = new DateTime(ms.ReadInt64Le()); this.SourceAddress = new IPAddress(ms.ReadBytes(4)); this.MessageType = (UdpBroadcastMessageType)ms.ReadByte(); this.BroadcastGroup = ms.ReadByte(); this.Payload = ms.ReadBytes16(); } } catch (Exception e) { throw new FormatException("Invalid UDP broadcast message.", e); } }
/// <summary> /// Decrypts a byte array encrypted using <see cref="Encrypt(string ,byte[],string,int,int,out SymmetricKey)" />. /// </summary> /// <param name="rsaKey">The decrypting RSA key as XML or as a secure key container name.</param> /// <param name="cipherText">The encrypted data.</param> /// <param name="symmetricKey">Returns as the symmetric encryption algorithm arguments.</param> /// <returns>The decrypted data.</returns> /// <exception cref="CryptographicException">Thrown is the encrypted data block is incorrectly formatted.</exception> /// <remarks> /// Note that applications should take some care to ensure that the <paramref name="symmetricKey" /> /// value return is disposed so that the symmetric encryption key will be cleared. /// </remarks> public static byte[] Decrypt(string rsaKey, byte[] cipherText, out SymmetricKey symmetricKey) { EnhancedMemoryStream input = new EnhancedMemoryStream(cipherText); EnhancedMemoryStream ms = new EnhancedMemoryStream(cipherText.Length); BlockDecryptor decryptor = null; byte[] symKey; byte[] symIV; string algorithm; try { // Read the header fields if (input.ReadInt32() != Magic) { throw new CryptographicException(BadFormatMsg); } if (input.ReadInt32() != 0) { throw new CryptographicException("Unsupported secure data format version."); } // Decrypt the encryption info ms.WriteBytesNoLen(AsymmetricCrypto.Decrypt(CryptoAlgorithm.RSA, rsaKey, input.ReadBytes16())); ms.Position = 0; algorithm = ms.ReadString16(); symKey = ms.ReadBytes16(); symIV = ms.ReadBytes16(); symmetricKey = new SymmetricKey(algorithm, symKey, symIV); decryptor = new BlockDecryptor(algorithm, symKey, symIV); // Decrypt the contents ms.SetLength(0); ms.WriteBytesNoLen(decryptor.Decrypt(input.ReadBytes32())); ms.Position = 0; if (ms.ReadInt32() != Magic) { throw new CryptographicException("Secure data content is corrupt."); } ms.Position += 8; // Skip over the salt return(ms.ReadBytes32()); } finally { if (decryptor != null) { decryptor.Dispose(); } input.Close(); ms.Close(); } }