public void ArrayInArrayTest() { var val = new GTXValue(); val.Choice = GTXValueChoice.Array; val.Array = new System.Collections.Generic.List <GTXValue>(); var innerVal = new GTXValue(); innerVal.Choice = GTXValueChoice.Array; innerVal.Array = new System.Collections.Generic.List <GTXValue>(); var innerInnerVal = new GTXValue(); innerInnerVal.Choice = GTXValueChoice.Integer; innerInnerVal.Integer = Int64.MinValue; innerVal.Array.Add(innerInnerVal); val.Array.Add(innerVal); if (PRINT_CONTENT) { var str = PostchainUtil.ByteArrayToString(val.Encode()); System.Console.WriteLine("ArrayInArrayTest: " + str.ToUpper()); } var decoded = GTXValue.Decode(new AsnReader(val.Encode())); Assert.Equal(val.Choice, decoded.Choice); Assert.Equal(val.Array, decoded.Array); Assert.Equal(val, decoded); }
public static DictPair Decode(ASN1.AsnReader sequence) { var dict = new DictPair(); var dictSequence = sequence.ReadSequence(); dict.Name = dictSequence.ReadUTF8String(); dict.Value = GTXValue.Decode(dictSequence); return(dict); }
private byte[] CalculateHashOfValueInternal(GTXValue gtxValue) { var buf = new List <byte>() { (byte)HashPrefix.Leaf }; buf.AddRange(gtxValue.Encode()); return(HashingFun(buf.ToArray())); }
public DictPair(string name = "", GTXValue value = null) { this.Name = name; if (value == null) { this.Value = new GTXValue(); } else { this.Value = value; } }
public void FullArrayTest() { var val = new GTXValue(); val.Choice = GTXValueChoice.Array; val.Array = new System.Collections.Generic.List <GTXValue>(); var innerVal1 = new GTXValue(); innerVal1.Choice = GTXValueChoice.String; innerVal1.String = "test"; val.Array.Add(innerVal1); var innerVal2 = new GTXValue(); innerVal2.Choice = GTXValueChoice.Null; val.Array.Add(innerVal2); var innerVal3 = new GTXValue(); innerVal3.Choice = GTXValueChoice.Integer; innerVal3.Integer = Int64.MaxValue; val.Array.Add(innerVal3); var innerVal4 = new GTXValue(); innerVal4.Choice = GTXValueChoice.ByteArray; innerVal4.ByteArray = new byte[] { 0xde, 0xad, 0xbe, 0xef }; val.Array.Add(innerVal4); var innerVal5 = new GTXValue(); innerVal5.Choice = GTXValueChoice.Array; innerVal5.Array = new System.Collections.Generic.List <GTXValue>(); val.Array.Add(innerVal5); if (PRINT_CONTENT) { var str = PostchainUtil.ByteArrayToString(val.Encode()); System.Console.WriteLine("FullArrayTest: " + str.ToUpper()); } var decoded = GTXValue.Decode(new AsnReader(val.Encode())); Assert.Equal(val.Choice, decoded.Choice); Assert.Equal(val.Array, decoded.Array); Assert.Equal(val, decoded); }
public void SimpleNullTest() { var val = new GTXValue(); val.Choice = GTXValueChoice.Null; if (PRINT_CONTENT) { var str = PostchainUtil.ByteArrayToString(val.Encode()); System.Console.WriteLine("SimpleNullTest: " + str.ToUpper()); } var decoded = GTXValue.Decode(new AsnReader(val.Encode())); Assert.Equal(val.Choice, decoded.Choice); Assert.Equal(val, decoded); }
public void MinIntegerTest() { var val = new GTXValue(); val.Choice = GTXValueChoice.Integer; val.Integer = Int64.MinValue; if (PRINT_CONTENT) { var str = PostchainUtil.ByteArrayToString(val.Encode()); System.Console.WriteLine("MinIntegerTest: " + str.ToUpper()); } var decoded = GTXValue.Decode(new AsnReader(val.Encode())); Assert.Equal(val.Choice, decoded.Choice); Assert.Equal(val.Integer, decoded.Integer); Assert.Equal(val, decoded); }
public void LongStringTest() { var val = new GTXValue(); val.Choice = GTXValueChoice.String; val.String = new string('x', 2048); if (PRINT_CONTENT) { var str = PostchainUtil.ByteArrayToString(val.Encode()); System.Console.WriteLine("LongStringTest: " + str.ToUpper()); } var decoded = GTXValue.Decode(new AsnReader(val.Encode())); Assert.Equal(val.Choice, decoded.Choice); Assert.Equal(val.String, decoded.String); Assert.Equal(val, decoded); }
public static GTXValue ArgToGTXValue(object arg) { var gtxValue = new GTXValue(); if (arg is null) { gtxValue.Choice = GTXValueChoice.Null; } else if (arg.IsNumericType()) { try { gtxValue.Choice = GTXValueChoice.Integer; gtxValue.Integer = Convert.ToInt64(arg); } catch { throw new System.Exception("Chromia.PostchainClient.GTX Gtx.ArgToGTXValue() Integer overflow."); } } else if (arg is byte[]) { gtxValue.Choice = GTXValueChoice.ByteArray; gtxValue.ByteArray = (byte[])arg; } else if (arg is string) { gtxValue.Choice = GTXValueChoice.String; gtxValue.String = (string)arg; } else if (arg is object[]) { var array = (object[])arg; gtxValue.Choice = GTXValueChoice.Array; gtxValue.Array = new List <GTXValue>(); foreach (var subArg in array) { gtxValue.Array.Add(ArgToGTXValue(subArg)); } } else if (arg is Dictionary <string, object> ) { gtxValue.Choice = GTXValueChoice.Dict; var dict = (Dictionary <string, object>)arg; gtxValue.Dict = new List <DictPair>(); foreach (var dictPair in dict) { gtxValue.Dict.Add(new DictPair(dictPair.Key, ArgToGTXValue(dictPair.Value))); } } else { throw new System.Exception("Chromia.PostchainClient.GTX Gtx.ArgToGTXValue() Can't create GTXValue out of type " + arg.GetType()); } return(gtxValue); }
public static GTXValue Deserialize(byte[] encodedMessage) { if (encodedMessage[0] >> 4 != 0xa) { return(new GTXValue()); } var messageLength = GetLength(encodedMessage); int messageOctetLength = GetOctetLength(encodedMessage); var newObject = new GTXValue(); switch (encodedMessage[0] & 0xF) { case (0x1): { // ByteArray if (encodedMessage[1 + messageOctetLength] != 0x04) { throw new System.Exception("Chromia.Postchain.Client.GTX Gtx.Deserialize() ByteArray case. Not octet string."); } int length = encodedMessage[3]; newObject.Choice = GTXValueChoice.ByteArray; newObject.ByteArray = encodedMessage.Skip(4).Take(length).ToArray(); break; } case (0x2): { // String if (encodedMessage[1 + messageOctetLength] != 0x0c) { throw new System.Exception("Chromia.Postchain.Client.GTX Gtx.Deserialize() String case. Not UTF8String."); } int length = encodedMessage[1 + messageOctetLength + 1]; newObject.Choice = GTXValueChoice.String; newObject.String = System.Text.Encoding.UTF8.GetString(encodedMessage.Skip(4).Take(length).ToArray()); break; } case (0x3): { // Integer if (encodedMessage[1 + messageOctetLength] != 0x02) { throw new System.Exception("Chromia.Postchain.Client.GTX Gtx.Deserialize() Integer case. Not primitive integer type."); } int length = encodedMessage[3]; int newInteger = 0; for (int i = 4; i < length + 4; i++) { newInteger = (newInteger << 8) | encodedMessage[i]; } newObject.Choice = GTXValueChoice.Integer; newObject.Integer = newInteger; break; } case (0x4): { // DictPair throw new System.Exception("Chromia.Postchain.Client.GTX Gtx.Deserialize() Dict case. Not implemented yet."); // newObject.Choice = GTXValueChoice.Dict; // break; } case (0x5): { // Array if (encodedMessage[1 + messageOctetLength] != 0x30) { throw new System.Exception("Chromia.Postchain.Client.GTX Gtx.Deserialize() Array case. Not sequence of."); } byte[] sequence = encodedMessage.Skip(1 + messageOctetLength).ToArray(); int sequenceLength = GetLength(sequence); int sequenceOctetLength = GetOctetLength(sequence); int startIndex = 2 + messageOctetLength + sequenceOctetLength; newObject.Choice = GTXValueChoice.Array; newObject.Array = new List <GTXValue>(); while (startIndex < sequenceLength) { byte[] newElement = encodedMessage.Skip(startIndex).ToArray(); int elementLength = GetLength(newElement) + GetOctetLength(newElement) + 1; newElement = newElement.Take(elementLength).ToArray(); newObject.Array.Add(Deserialize(newElement)); startIndex += elementLength; } break; } default: { throw new System.Exception("Chromia.Postchain.Client.GTX Gtx.Deserialize() Default case. Unknown tag " + (encodedMessage[0] & 0xF).ToString("X1")); } } return(newObject); }