Beispiel #1
0
        /// <summary>
        /// Serializes a SealedBiscuit to a byte array
        /// </summary>
        /// <returns></returns>
        public Either <FormatError, byte[]> Serialize()
        {
            Format.Schema.SealedBiscuit biscuit = new Format.Schema.SealedBiscuit()
            {
                Signature = ByteString.CopyFrom(signature),
                Authority = ByteString.CopyFrom(Authority)
            };

            foreach (var block in Blocks)
            {
                biscuit.Blocks.Add(ByteString.CopyFrom(block));
            }

            try
            {
                using MemoryStream stream = new MemoryStream();
                biscuit.WriteTo(stream);
                byte[] data = stream.ToArray();
                return(data);
            }
            catch (IOException e)
            {
                return(new SerializationError(e.ToString()));
            }
        }
Beispiel #2
0
        /// <summary>
        /// Deserializes a SealedBiscuit from a byte array
        /// </summary>
        /// <param name="slice"></param>
        /// <param name="secret"></param>
        /// <returns></returns>
        static public Either <Error, SealedBiscuit> FromBytes(byte[] slice, byte[] secret)
        {
            try
            {
                Format.Schema.SealedBiscuit data = Format.Schema.SealedBiscuit.Parser.ParseFrom(slice);
                using HMACSHA256 hmac = new HMACSHA256(secret);
                byte[] authority = data.Authority.ToByteArray();

                List <byte> toHash = new List <byte>(authority);

                List <byte[]> blocks = new List <byte[]>();
                foreach (ByteString block in data.Blocks)
                {
                    byte[] byteBlock = block.ToByteArray();
                    blocks.Add(byteBlock);
                    toHash.AddRange(byteBlock);
                }

                byte[] calculated = hmac.ComputeHash(toHash.ToArray());
                byte[] signature  = data.Signature.ToByteArray();

                if (calculated.Length != signature.Length)
                {
                    return(new InvalidFormat());
                }

                int result = 0;
                for (int i = 0; i < calculated.Length; i++)
                {
                    result |= calculated[i] ^ signature[i];
                }

                if (result != 0)
                {
                    return(new SealedSignature());
                }

                return(new SealedBiscuit(authority, blocks, signature));
            }
            catch (Exception e)
            {
                return(new DeserializationError(e.ToString()));
            }
        }