public static KeysHeader Deserialize(Stream stream)
        {
            KeysHeader instance = new KeysHeader();

            Deserialize(stream, instance);
            return(instance);
        }
 public static byte[] SerializeToBytes(KeysHeader instance)
 {
     using (MemoryStream ms = new MemoryStream()) {
         Serialize(ms, instance);
         return(ms.ToArray());
     }
 }
 public static void Serialize(Stream stream, KeysHeader instance)
 {
     if (instance.IV == null)
     {
         throw new ArgumentNullException("IV", "Required by proto specification.");
     }
     ProtocolParser.WriteKey(stream, new ProtocolBuffers.Key(1, Wire.LengthDelimited));
     ProtocolParser.WriteBytes(stream, instance.IV);
     if (instance.EncryptedKeys != null)
     {
         foreach (byte[] i2 in instance.EncryptedKeys)
         {
             ProtocolParser.WriteKey(stream, new ProtocolBuffers.Key(2, Wire.LengthDelimited));
             ProtocolParser.WriteBytes(stream, i2);
         }
     }
 }
예제 #4
0
        /// <summary>
        /// Encrypt chunk data into a new chunk
        /// </summary>
        Chunk Encrypt(Chunk chunk)
        {
            KeysHeader kh = new KeysHeader ();
            //Generate key
            kh.RM.GenerateIV ();
            kh.RM.GenerateKey ();

            //Add recipient keys
            foreach (PublicKey pubkey in recipientKeys) {
                byte[] bk = pubkey.Encrypt (kh.RM.Key);
                kh.EncryptedKeys.Add (bk);
            }

            //Encrypt data
            using (MemoryStream ms = new MemoryStream()) {
                //Headers
                ProtocolBuffers.ProtocolParser.WriteBytes (ms, KeysHeader.SerializeToBytes (kh));
                //Encrypted data
                using (CryptoStream cs = new CryptoStream(ms, kh.RM.CreateEncryptor(), CryptoStreamMode.Write)) {
                    cs.Write (chunk.Data, 0, chunk.Data.Length);
                }
                return new Chunk (ms.ToArray ());
            }
        }