protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, BitArray value) { var unusedLowerBitsInLastByte = (byte)(7 - ((value.Length + 7) % 8)); yield return(unusedLowerBitsInLastByte); var data = new byte[(value.Length + 7) / 8]; value.CopyTo(data, 0); if (unusedLowerBitsInLastByte > 0) { byte rest = 0; for (int i = 0; i < data.Length; i++) { var @byte = data[i]; data[i] = (byte)(@byte << unusedLowerBitsInLastByte | rest); rest = (byte)(@byte >> (8 - unusedLowerBitsInLastByte)); } } foreach (var @byte in data.Reverse()) { yield return(@byte); } }
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, int[] value) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (value.Length < 2) { throw new ArgumentException("At least two values are required", nameof(value)); } if (value[0] > 5) { throw new ArgumentOutOfRangeException(nameof(value), "First value should not be greater than 5"); } if (value[1] > 39) { throw new ArgumentOutOfRangeException(nameof(value), "Second value should not be greater than 39"); } yield return((byte)(value[0] * 40 + value[1])); foreach (var node in value.Skip(2)) { foreach (var b in EnqueueNode(node)) { yield return(b); } } }
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, DerAsnType[] value) { return(value .Select(x => encoder.Encode(x)) .SelectMany(x => x) .ToArray()); }
/// <summary> /// Creates the CRL envelope and includes the RSA signature with it. /// </summary> /// <param name="signingKey"></param> /// <param name="encoder"></param> /// <returns></returns> public byte[] SignAndSerialize(RSA signingKey, IDerAsnEncoder encoder = null) { var data = DerConverter.DerConvert.Encode(this); var signature = signingKey.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); var container = new DerAsnSequence(new DerAsnType[] { this, new DerAsnSequence(new DerAsnType[] { new DerAsnObjectIdentifier(DerAsnIdentifiers.Primitive.ObjectIdentifier, Oid_sha256RSA.OidToArray()), new DerAsnNull() }), new DerAsnBitString(new BitArray(signature)) }); return(DerConverter.DerConvert.Encode(container)); }
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, DateTimeOffset value) { DateTime dateTime = value.DateTime; int year = dateTime.Year % 100; int month = dateTime.Month; int day = dateTime.Day; int hour = dateTime.Hour; int minute = dateTime.Minute; int second = dateTime.Second; var sb = new StringBuilder(); sb.Append($"{year:00}{month:00}{day:00}{hour:00}{minute:00}"); if (second > 0) { sb.Append($"{second:00}"); } TimeSpan offset = value.Offset; if (offset != TimeSpan.Zero) { if (offset < TimeSpan.Zero) { sb.Append("-"); offset = offset.Negate(); } else { sb.Append("+"); } int offsetHours = offset.Hours; int offsetMinutes = offset.Minutes; sb.Append($"{offsetHours:00}{offsetMinutes:00}"); } else { sb.Append("Z"); } return(Encoding.ASCII.GetBytes(sb.ToString())); }
public abstract byte[] Encode(IDerAsnEncoder encoder);
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, string value) { return(Encoding.ASCII.GetBytes(value)); }
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, bool value) { yield return(value ? (byte)0xFF : (byte)0x00); }
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, byte value) { return(new[] { value }); }
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, BigInteger value) { var littleEndianData = value.ToByteArray(); return(littleEndianData.Reverse()); }
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, byte[] value) { return(value); }
protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, object value) { return(Enumerable.Empty <byte>()); }