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 + -
显示快捷键?