示例#1
0
        /// <summary>
        /// Deserializes a SerializedBiscuit from a byte array
        /// </summary>
        /// <param name="slice"></param>
        /// <returns></returns>
        static public Either <Error, SerializedBiscuit> FromBytes(byte[] slice)
        {
            try
            {
                Format.Schema.Biscuit data = Format.Schema.Biscuit.Parser.ParseFrom(slice);

                List <RistrettoElement> keys = data.Keys
                                               .Select(key => new CompressedRistretto(key.ToByteArray()).Decompress())
                                               .ToList();

                byte[] authority = data.Authority.ToByteArray();

                List <byte[]> blocks = data.Blocks.Select(block => block.ToByteArray()).ToList();

                Either <Error, TokenSignature> signatureRes = TokenSignature.Deserialize(data.Signature);

                if (signatureRes.IsLeft)
                {
                    return(signatureRes.Left);
                }

                TokenSignature signature = signatureRes.Right;

                SerializedBiscuit biscuitResult = new SerializedBiscuit(authority, blocks, keys, signature);

                Either <Error, Void> res = biscuitResult.Verify();
                if (res.IsLeft)
                {
                    return(res.Left);
                }
                else
                {
                    return(biscuitResult);
                }
            }
            catch (InvalidProtocolBufferException e)
            {
                return(new DeserializationError(e.ToString()));
            }
            catch (InvalidEncodingException e)
            {
                return(new DeserializationError(e.ToString()));
            }
        }