/// <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())); } }