asn1builder.cs
来自「没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没」· CS 代码 · 共 663 行 · 第 1/2 页
CS
663 行
{ return 3; } else if(value >= -0x8000 && value < 0x8000) { return 4; } else if(value >= -0x800000 && value < 0x800000) { return 5; } else { return 6; } } // Encode this builder in a byte array as DER. Returns the length. protected override int Encode(byte[] result, int offset) { if(value >= -0x80 && value < 0x80) { result[offset] = (byte)type; result[offset + 1] = (byte)1; result[offset + 2] = (byte)value; return 3; } else if(value >= -0x8000 && value < 0x8000) { result[offset] = (byte)type; result[offset + 1] = (byte)2; result[offset + 2] = (byte)(value >> 8); result[offset + 3] = (byte)value; return 4; } else if(value >= -0x800000 && value < 0x800000) { result[offset] = (byte)type; result[offset + 1] = (byte)3; result[offset + 2] = (byte)(value >> 16); result[offset + 3] = (byte)(value >> 8); result[offset + 4] = (byte)value; return 5; } else { result[offset] = (byte)type; result[offset + 1] = (byte)4; result[offset + 2] = (byte)(value >> 24); result[offset + 3] = (byte)(value >> 16); result[offset + 4] = (byte)(value >> 8); result[offset + 5] = (byte)value; return 6; } } }; // class ASN1Int32Builder // Builder node that stores a 64-bit integer. private class ASN1Int64Builder : ASN1Builder { // Internal state. private long value; // Constructor. public ASN1Int64Builder(ASN1Type type, long value) : base(type, 0) { this.value = value; } // Get the length of this builder when it is encoded using DER. protected override int GetLength() { if(value >= -0x80L && value < 0x80L) { return 3; } else if(value >= -0x8000L && value < 0x8000L) { return 4; } else if(value >= -0x800000L && value < 0x800000L) { return 5; } else if(value >= -0x80000000L && value < 0x80000000L) { return 6; } else if(value >= -0x8000000000L && value < 0x8000000000L) { return 7; } else if(value >= -0x800000000000L && value < 0x800000000000L) { return 8; } else if(value >= -0x80000000000000L && value < 0x80000000000000L) { return 9; } else { return 10; } } // Encode this builder in a byte array as DER. Returns the length. protected override int Encode(byte[] result, int offset) { if(value >= -0x80L && value < 0x80L) { result[offset] = (byte)type; result[offset + 1] = (byte)1; result[offset + 2] = (byte)value; return 3; } else if(value >= -0x8000L && value < 0x8000L) { result[offset] = (byte)type; result[offset + 1] = (byte)2; result[offset + 2] = (byte)(value >> 8); result[offset + 3] = (byte)value; return 4; } else if(value >= -0x800000L && value < 0x800000L) { result[offset] = (byte)type; result[offset + 1] = (byte)3; result[offset + 2] = (byte)(value >> 16); result[offset + 3] = (byte)(value >> 8); result[offset + 4] = (byte)value; return 5; } else if(value >= -0x80000000L && value < 0x80000000L) { result[offset] = (byte)type; result[offset + 1] = (byte)4; result[offset + 2] = (byte)(value >> 24); result[offset + 3] = (byte)(value >> 16); result[offset + 4] = (byte)(value >> 8); result[offset + 5] = (byte)value; return 6; } else if(value >= -0x8000000000L && value < 0x8000000000L) { result[offset] = (byte)type; result[offset + 1] = (byte)5; result[offset + 2] = (byte)(value >> 32); result[offset + 3] = (byte)(value >> 24); result[offset + 4] = (byte)(value >> 16); result[offset + 5] = (byte)(value >> 8); result[offset + 6] = (byte)value; return 7; } else if(value >= -0x800000000000L && value < 0x800000000000L) { result[offset] = (byte)type; result[offset + 1] = (byte)6; result[offset + 2] = (byte)(value >> 40); result[offset + 3] = (byte)(value >> 32); result[offset + 4] = (byte)(value >> 24); result[offset + 5] = (byte)(value >> 16); result[offset + 6] = (byte)(value >> 8); result[offset + 7] = (byte)value; return 8; } else if(value >= -0x80000000000000L && value < 0x80000000000000L) { result[offset] = (byte)type; result[offset + 1] = (byte)7; result[offset + 2] = (byte)(value >> 48); result[offset + 3] = (byte)(value >> 40); result[offset + 4] = (byte)(value >> 32); result[offset + 5] = (byte)(value >> 24); result[offset + 6] = (byte)(value >> 16); result[offset + 7] = (byte)(value >> 8); result[offset + 8] = (byte)value; return 9; } else { result[offset] = (byte)type; result[offset + 1] = (byte)8; result[offset + 2] = (byte)(value >> 56); result[offset + 3] = (byte)(value >> 48); result[offset + 4] = (byte)(value >> 40); result[offset + 5] = (byte)(value >> 32); result[offset + 6] = (byte)(value >> 24); result[offset + 7] = (byte)(value >> 16); result[offset + 8] = (byte)(value >> 8); result[offset + 9] = (byte)value; return 10; } } }; // class ASN1Int64Builder // Builder node that stores a big integer. private class ASN1BigIntBuilder : ASN1Builder { // Internal state. private byte[] value; // Constructor. public ASN1BigIntBuilder(ASN1Type type, byte[] value) : base(type, 0) { this.value = value; } // Get the length of this builder when it is encoded using DER. protected override int GetLength() { if((value[0] & 0x80) != 0) { // We need to add an extra leading zero byte. return 2 + GetBytesForLength(value.Length) + value.Length; } else { // No leading zero required. return 1 + GetBytesForLength(value.Length) + value.Length; } } // Encode this builder in a byte array as DER. Returns the length. protected override int Encode(byte[] result, int offset) { int start = offset; result[offset++] = (byte)type; if((value[0] & 0x80) != 0) { // We need to add an extra leading zero byte. offset += EncodeLength(result, offset, value.Length + 1); result[offset] = (byte)0; Array.Copy(value, 0, result, offset + 1, value.Length); offset += value.Length + 1; } else { // No leading zero required. offset += EncodeLength(result, offset, value.Length); Array.Copy(value, 0, result, offset, value.Length); offset += value.Length; } return (offset - start); } }; // class ASN1BigIntBuilder // Builder node that stores a bit string. private class ASN1BitStringBuilder : ASN1Builder { // Internal state. private byte[] value; // Constructor. public ASN1BitStringBuilder(ASN1Type type, byte[] value) : base(type, 0) { this.value = value; } // Get the length of this builder when it is encoded using DER. protected override int GetLength() { return 2 + GetBytesForLength(value.Length) + value.Length; } // Encode this builder in a byte array as DER. Returns the length. protected override int Encode(byte[] result, int offset) { int start = offset; result[offset++] = (byte)type; offset += EncodeLength(result, offset, value.Length + 1); result[offset] = (byte)0; Array.Copy(value, 0, result, offset + 1, value.Length); offset += value.Length + 1; return (offset - start); } }; // class ASN1BitStringBuilder // Builder node that stores a bit string in "contents" mode. private class ASN1BitStringContentsBuilder : ASN1Builder { // Constructor. public ASN1BitStringContentsBuilder(ASN1Type type) : base(type) {} // Get the length of this builder when it is encoded using DER. protected override int GetLength() { int len = 1; foreach(ASN1Builder builder in list) { len += builder.GetLength(); } return 1 + GetBytesForLength(len) + len; } // Encode this builder in a byte array as DER. Returns the length. protected override int Encode(byte[] result, int offset) { int start = offset; int len = 1; foreach(ASN1Builder builder in list) { len += builder.GetLength(); } result[offset++] = (byte)type; offset += EncodeLength(result, offset, len); result[offset++] = (byte)0; foreach(ASN1Builder builder in list) { offset += builder.Encode(result, offset); } return offset - start; } }; // class ASN1BitStringContentsBuilder}; // class ASN1Builder#endif // CONFIG_CRYPTO}; // namespace System.Security.Cryptography
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?