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());
 }
Exemple #4
0
        /// <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));
        }
Exemple #5
0
        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));
 }
Exemple #8
0
 protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, bool value)
 {
     yield return(value ? (byte)0xFF : (byte)0x00);
 }
Exemple #9
0
 protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, byte value)
 {
     return(new[] { value });
 }
Exemple #10
0
        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);
 }
Exemple #12
0
 protected override IEnumerable <byte> EncodeValue(IDerAsnEncoder encoder, object value)
 {
     return(Enumerable.Empty <byte>());
 }