internal static void Decode <T>(AsnReader reader, Asn1Tag expectedTag, out T decoded) where T : KrbExternalPrincipalIdentifier, new() { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = new T(); AsnReader sequenceReader = reader.ReadSequence(expectedTag); if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0))) { if (sequenceReader.TryReadPrimitiveOctetStringBytes(new Asn1Tag(TagClass.ContextSpecific, 0), out ReadOnlyMemory <byte> tmpSubjectName)) { decoded.SubjectName = tmpSubjectName; } else { decoded.SubjectName = sequenceReader.ReadOctetString(new Asn1Tag(TagClass.ContextSpecific, 0)); } } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 1))) { if (sequenceReader.TryReadPrimitiveOctetStringBytes(new Asn1Tag(TagClass.ContextSpecific, 1), out ReadOnlyMemory <byte> tmpIssuerAndSerialNumber)) { decoded.IssuerAndSerialNumber = tmpIssuerAndSerialNumber; } else { decoded.IssuerAndSerialNumber = sequenceReader.ReadOctetString(new Asn1Tag(TagClass.ContextSpecific, 1)); } } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 2))) { if (sequenceReader.TryReadPrimitiveOctetStringBytes(new Asn1Tag(TagClass.ContextSpecific, 2), out ReadOnlyMemory <byte> tmpSubjectKeyIdentifier)) { decoded.SubjectKeyIdentifier = tmpSubjectKeyIdentifier; } else { decoded.SubjectKeyIdentifier = sequenceReader.ReadOctetString(new Asn1Tag(TagClass.ContextSpecific, 2)); } } sequenceReader.ThrowIfNotEmpty(); }
internal static KrbAuthenticator DecodeApplication <T>(AsnReader reader, out T decoded) where T : KrbAuthenticator, new() { var sequence = reader.ReadSequence(ApplicationTag); Decode(sequence, Asn1Tag.Sequence, out decoded); sequence.ThrowIfNotEmpty(); reader.ThrowIfNotEmpty(); return(decoded); }
internal static byte[] DecodeX509SubjectKeyIdentifierExtension(byte[] encoded) { AsnReader reader = new AsnReader(encoded, AsnEncodingRules.BER); ReadOnlyMemory <byte> contents; if (!reader.TryReadPrimitiveOctetStringBytes(out contents)) { throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding); } reader.ThrowIfNotEmpty(); return(contents.ToArray()); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out EncryptedDataAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader collectionReader; if (!sequenceReader.TryReadInt32(out decoded.Version)) { sequenceReader.ThrowIfNotEmpty(); } System.Security.Cryptography.Pkcs.Asn1.EncryptedContentInfoAsn.Decode(sequenceReader, out decoded.EncryptedContentInfo); if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 1))) { // Decode SEQUENCE OF for UnprotectedAttributes { collectionReader = sequenceReader.ReadSetOf(new Asn1Tag(TagClass.ContextSpecific, 1)); var tmpList = new List <System.Security.Cryptography.Asn1.AttributeAsn>(); System.Security.Cryptography.Asn1.AttributeAsn tmpItem; while (collectionReader.HasData) { System.Security.Cryptography.Asn1.AttributeAsn.Decode(collectionReader, out tmpItem); tmpList.Add(tmpItem); } decoded.UnprotectedAttributes = tmpList.ToArray(); } } sequenceReader.ThrowIfNotEmpty(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out Asn1LdapMessage decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = new Asn1LdapMessage(); AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader collectionReader; if (!sequenceReader.TryReadInt32(out decoded.MessageID)) { sequenceReader.ThrowIfNotEmpty(); } Asn1ProtocolOp.Decode(sequenceReader, out decoded.ProtocolOp); if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0))) { // Decode SEQUENCE OF for Controls { collectionReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 0)); var tmpList = new List <Asn1Control>(); Asn1Control tmpItem; while (collectionReader.HasData) { Asn1Control.Decode(collectionReader, out tmpItem); tmpList.Add(tmpItem); } decoded.Controls = tmpList.ToArray(); } } sequenceReader.ThrowIfNotEmpty(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out OriginatorInfoAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader collectionReader; if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0))) { // Decode SEQUENCE OF for CertificateSet { collectionReader = sequenceReader.ReadSetOf(new Asn1Tag(TagClass.ContextSpecific, 0)); var tmpList = new List <System.Security.Cryptography.Pkcs.Asn1.CertificateChoiceAsn>(); System.Security.Cryptography.Pkcs.Asn1.CertificateChoiceAsn tmpItem; while (collectionReader.HasData) { System.Security.Cryptography.Pkcs.Asn1.CertificateChoiceAsn.Decode(collectionReader, out tmpItem); tmpList.Add(tmpItem); } decoded.CertificateSet = tmpList.ToArray(); } } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 1))) { // Decode SEQUENCE OF for RevocationInfoChoices { collectionReader = sequenceReader.ReadSetOf(new Asn1Tag(TagClass.ContextSpecific, 1)); var tmpList = new List <ReadOnlyMemory <byte> >(); ReadOnlyMemory <byte> tmpItem; while (collectionReader.HasData) { tmpItem = collectionReader.GetEncodedValue(); tmpList.Add(tmpItem); } decoded.RevocationInfoChoices = tmpList.ToArray(); } } sequenceReader.ThrowIfNotEmpty(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out PolicyConstraintsAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0))) { if (sequenceReader.TryReadInt32(new Asn1Tag(TagClass.ContextSpecific, 0), out int tmpRequireExplicitPolicyDepth)) { decoded.RequireExplicitPolicyDepth = tmpRequireExplicitPolicyDepth; } else { sequenceReader.ThrowIfNotEmpty(); } } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 1))) { if (sequenceReader.TryReadInt32(new Asn1Tag(TagClass.ContextSpecific, 1), out int tmpInhibitMappingDepth)) { decoded.InhibitMappingDepth = tmpInhibitMappingDepth; } else { sequenceReader.ThrowIfNotEmpty(); } } sequenceReader.ThrowIfNotEmpty(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out DistributionPointAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader explicitReader; AsnReader collectionReader; if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0))) { explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 0)); System.Security.Cryptography.X509Certificates.Asn1.DistributionPointNameAsn tmpDistributionPoint; System.Security.Cryptography.X509Certificates.Asn1.DistributionPointNameAsn.Decode(explicitReader, out tmpDistributionPoint); decoded.DistributionPoint = tmpDistributionPoint; explicitReader.ThrowIfNotEmpty(); } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 1))) { decoded.Reasons = sequenceReader.GetNamedBitListValue <System.Security.Cryptography.X509Certificates.Asn1.ReasonFlagsAsn>(new Asn1Tag(TagClass.ContextSpecific, 1)); } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 2))) { // Decode SEQUENCE OF for CRLIssuer { collectionReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 2)); var tmpList = new List <System.Security.Cryptography.Asn1.GeneralNameAsn>(); System.Security.Cryptography.Asn1.GeneralNameAsn tmpItem; while (collectionReader.HasData) { System.Security.Cryptography.Asn1.GeneralNameAsn.Decode(collectionReader, out tmpItem); tmpList.Add(tmpItem); } decoded.CRLIssuer = tmpList.ToArray(); } } sequenceReader.ThrowIfNotEmpty(); }
public override byte[] DecodeOctetString(byte[] encodedOctets) { // Read using BER because the CMS specification says the encoding is BER. AsnReader reader = new AsnReader(encodedOctets, AsnEncodingRules.BER); const int ArbitraryStackLimit = 256; Span <byte> tmp = stackalloc byte[ArbitraryStackLimit]; // Use stackalloc 0 so data can later hold a slice of tmp. ReadOnlySpan <byte> data = stackalloc byte[0]; byte[] poolBytes = null; try { if (!reader.TryReadPrimitiveOctetStringBytes(out var contents)) { if (reader.TryCopyOctetStringBytes(tmp, out int bytesWritten)) { data = tmp.Slice(0, bytesWritten); } else { poolBytes = ArrayPool <byte> .Shared.Rent(reader.PeekContentBytes().Length); if (!reader.TryCopyOctetStringBytes(poolBytes, out bytesWritten)) { Debug.Fail("TryCopyOctetStringBytes failed with a provably-large-enough buffer"); throw new CryptographicException(); } data = new ReadOnlySpan <byte>(poolBytes, 0, bytesWritten); } } else { data = contents.Span; } reader.ThrowIfNotEmpty(); return(data.ToArray()); } finally { if (poolBytes != null) { Array.Clear(poolBytes, 0, data.Length); ArrayPool <byte> .Shared.Return(poolBytes); } } }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out BasicConstraintsAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader defaultReader; if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(Asn1Tag.Boolean)) { decoded.CA = sequenceReader.ReadBoolean(); } else { defaultReader = new AsnReader(s_defaultCA, AsnEncodingRules.DER); decoded.CA = defaultReader.ReadBoolean(); } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(Asn1Tag.Integer)) { if (sequenceReader.TryReadInt32(out int tmpPathLengthConstraint)) { decoded.PathLengthConstraint = tmpPathLengthConstraint; } else { sequenceReader.ThrowIfNotEmpty(); } } sequenceReader.ThrowIfNotEmpty(); }
internal static void Decode <T>(AsnReader reader, Asn1Tag expectedTag, out T decoded) where T : KrbETypeInfo2Entry, new() { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = new T(); AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader explicitReader; explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 0)); if (!explicitReader.TryReadInt32(out decoded.EType)) { explicitReader.ThrowIfNotEmpty(); } explicitReader.ThrowIfNotEmpty(); if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 1))) { explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 1)); decoded.Salt = explicitReader.ReadCharacterString(UniversalTagNumber.GeneralString); explicitReader.ThrowIfNotEmpty(); } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 2))) { explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 2)); if (explicitReader.TryReadPrimitiveOctetStringBytes(out ReadOnlyMemory <byte> tmpS2kParams)) { decoded.S2kParams = tmpS2kParams; } else { decoded.S2kParams = explicitReader.ReadOctetString(); } explicitReader.ThrowIfNotEmpty(); } sequenceReader.ThrowIfNotEmpty(); }
public static SignerIdentifier Decode(AsnReader reader, bool validateEmpty = true) { /* SignerIdentifier ::= CHOICE { * issuerAndSerialNumber IssuerAndSerialNumber, * subjectKeyIdentifier [0] SubjectKeyIdentifier } */ var tag = reader.PeekTag(); if (tag.HasSameClassAndValue(Asn1Tag.Sequence)) { var result = new SignerIdentifier() { IssuerAndSerialNumber = IssuerAndSerialNumber.Decode(reader), }; if (validateEmpty) { reader.ThrowIfNotEmpty(); } return(result); } if (tag.HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0))) { var result = new SignerIdentifier() { SubjectKeyIdentifier = reader.ReadPrimitiveOrNotOctetString(tag), }; if (validateEmpty) { reader.ThrowIfNotEmpty(); } return(result); } throw new CryptographicException(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out SigningCertificateAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader collectionReader; // Decode SEQUENCE OF for Certs { collectionReader = sequenceReader.ReadSequence(); var tmpList = new List <System.Security.Cryptography.Pkcs.Asn1.EssCertId>(); System.Security.Cryptography.Pkcs.Asn1.EssCertId tmpItem; while (collectionReader.HasData) { System.Security.Cryptography.Pkcs.Asn1.EssCertId.Decode(collectionReader, out tmpItem); tmpList.Add(tmpItem); } decoded.Certs = tmpList.ToArray(); } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(Asn1Tag.Sequence)) { // Decode SEQUENCE OF for Policies { collectionReader = sequenceReader.ReadSequence(); var tmpList = new List <System.Security.Cryptography.Pkcs.Asn1.PolicyInformation>(); System.Security.Cryptography.Pkcs.Asn1.PolicyInformation tmpItem; while (collectionReader.HasData) { System.Security.Cryptography.Pkcs.Asn1.PolicyInformation.Decode(collectionReader, out tmpItem); tmpList.Add(tmpItem); } decoded.Policies = tmpList.ToArray(); } } sequenceReader.ThrowIfNotEmpty(); }
private static string GetCdpUrl(SafeX509Handle cert) { ArraySegment <byte> crlDistributionPoints = OpenSslX509CertificateReader.FindFirstExtension(cert, Oids.CrlDistributionPoints); if (crlDistributionPoints.Array == null) { return(null); } try { AsnReader reader = new AsnReader(crlDistributionPoints, AsnEncodingRules.DER); AsnReader sequenceReader = reader.ReadSequence(); reader.ThrowIfNotEmpty(); while (sequenceReader.HasData) { DistributionPointAsn.Decode(sequenceReader, out DistributionPointAsn distributionPoint); // Only distributionPoint is supported // Only fullName is supported, nameRelativeToCRLIssuer is for LDAP-based lookup. if (distributionPoint.DistributionPoint.HasValue && distributionPoint.DistributionPoint.Value.FullName != null) { foreach (GeneralNameAsn name in distributionPoint.DistributionPoint.Value.FullName) { if (name.Uri != null && Uri.TryCreate(name.Uri, UriKind.Absolute, out Uri uri) && uri.Scheme == "http") { return(name.Uri); } } } } } catch (CryptographicException) { // Treat any ASN errors as if the extension was missing. } finally { // The data came from a certificate, so it's public. CryptoPool.Return(crlDistributionPoints.Array, clearSize: 0); } return(null); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out ValidityAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); System.Security.Cryptography.X509Certificates.Asn1.TimeAsn.Decode(sequenceReader, out decoded.NotBefore); System.Security.Cryptography.X509Certificates.Asn1.TimeAsn.Decode(sequenceReader, out decoded.NotAfter); sequenceReader.ThrowIfNotEmpty(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out Asn1Change decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = new Asn1Change(); AsnReader sequenceReader = reader.ReadSequence(expectedTag); decoded.Operation = sequenceReader.GetEnumeratedValue <ChangeOperation>(); Asn1PartialAttribute.Decode(sequenceReader, out decoded.Modification); sequenceReader.ThrowIfNotEmpty(); }
private static int ReadInhibitAnyPolicyExtension(byte[] rawData) { try { AsnReader reader = new AsnReader(rawData, AsnEncodingRules.DER); int inhibitAnyPolicy; reader.TryReadInt32(out inhibitAnyPolicy); reader.ThrowIfNotEmpty(); return(inhibitAnyPolicy); } catch (AsnContentException e) { throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding, e); } }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out PolicyQualifierInfo decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); decoded.PolicyQualifierId = sequenceReader.ReadObjectIdentifierAsString(); decoded.Qualifier = sequenceReader.GetEncodedValue(); sequenceReader.ThrowIfNotEmpty(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out AccessDescriptionAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); decoded.AccessMethod = sequenceReader.ReadObjectIdentifierAsString(); System.Security.Cryptography.Asn1.GeneralNameAsn.Decode(sequenceReader, out decoded.AccessLocation); sequenceReader.ThrowIfNotEmpty(); }
/// <summary> /// Decode the algorithm that was used for encoding. /// </summary> /// <param name="oid">The ASN.1 encoded algorithm oid.</param> /// <returns></returns> private string DecodeAlgorithm(byte[] oid) { var seqReader = new AsnReader(oid, AsnEncodingRules.DER); var sigOid = seqReader.ReadSequence(); seqReader.ThrowIfNotEmpty(); var result = sigOid.ReadObjectIdentifier(); if (sigOid.HasData) { sigOid.ReadNull(); } sigOid.ThrowIfNotEmpty(); return(result); }
public static KrbApReq DecodeApplication(ReadOnlyMemory <byte> encoded) { AsnReader reader = new AsnReader(encoded, AsnEncodingRules.DER); var sequence = reader.ReadSequence(ApplicationTag); KrbApReq decoded; Decode(sequence, Asn1Tag.Sequence, out decoded); sequence.ThrowIfNotEmpty(); reader.ThrowIfNotEmpty(); return(decoded); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out CertificatePolicyMappingAsn decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = default; AsnReader sequenceReader = reader.ReadSequence(expectedTag); decoded.IssuerDomainPolicy = sequenceReader.ReadObjectIdentifierAsString(); decoded.SubjectDomainPolicy = sequenceReader.ReadObjectIdentifierAsString(); sequenceReader.ThrowIfNotEmpty(); }
public static string DecodeOid(byte[] encodedOid) { // Windows compat. if (s_invalidEmptyOid.AsSpan().SequenceEqual(encodedOid)) { return(string.Empty); } // Read using BER because the CMS specification says the encoding is BER. AsnReader reader = new AsnReader(encodedOid, AsnEncodingRules.BER); string value = reader.ReadObjectIdentifierAsString(); reader.ThrowIfNotEmpty(); return(value); }
internal static void Decode <T>(AsnReader reader, Asn1Tag expectedTag, out T decoded) where T : KrbFastFinished, new() { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = new T(); AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader explicitReader; explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 0)); decoded.Timestamp = explicitReader.ReadGeneralizedTime(); explicitReader.ThrowIfNotEmpty(); explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 1)); if (!explicitReader.TryReadInt32(out int tmpUSec)) { explicitReader.ThrowIfNotEmpty(); } decoded.USec = tmpUSec; explicitReader.ThrowIfNotEmpty(); explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 2)); decoded.CRealm = explicitReader.ReadCharacterString(UniversalTagNumber.GeneralString); explicitReader.ThrowIfNotEmpty(); explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 3)); KrbPrincipalName.Decode <KrbPrincipalName>(explicitReader, out KrbPrincipalName tmpCName); decoded.CName = tmpCName; explicitReader.ThrowIfNotEmpty(); explicitReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 4)); KrbChecksum.Decode <KrbChecksum>(explicitReader, out KrbChecksum tmpTicketChecksum); decoded.TicketChecksum = tmpTicketChecksum; explicitReader.ThrowIfNotEmpty(); sequenceReader.ThrowIfNotEmpty(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out Asn1PartialAttribute decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = new Asn1PartialAttribute(); AsnReader sequenceReader = reader.ReadSequence(expectedTag); AsnReader collectionReader; if (sequenceReader.TryGetPrimitiveOctetStringBytes(out ReadOnlyMemory <byte> tmpType)) { decoded.Type = tmpType; } else { decoded.Type = sequenceReader.ReadOctetString(); } // Decode SEQUENCE OF for Values { collectionReader = sequenceReader.ReadSetOf(); var tmpList = new List <ReadOnlyMemory <byte> >(); ReadOnlyMemory <byte> tmpItem; while (collectionReader.HasData) { if (collectionReader.TryGetPrimitiveOctetStringBytes(out ReadOnlyMemory <byte> tmp)) { tmpItem = tmp; } else { tmpItem = collectionReader.ReadOctetString(); } tmpList.Add(tmpItem); } decoded.Values = tmpList.ToArray(); } sequenceReader.ThrowIfNotEmpty(); }
private static string GetCdpUrl(X509Certificate2 cert) { byte[] crlDistributionPoints = null; foreach (X509Extension extension in cert.Extensions) { if (StringComparer.Ordinal.Equals(extension.Oid.Value, Oids.CrlDistributionPoints)) { // If there's an Authority Information Access extension, it might be used for // looking up additional certificates for the chain. crlDistributionPoints = extension.RawData; break; } } if (crlDistributionPoints == null) { return(null); } AsnReader reader = new AsnReader(crlDistributionPoints, AsnEncodingRules.DER); AsnReader sequenceReader = reader.ReadSequence(); reader.ThrowIfNotEmpty(); while (sequenceReader.HasData) { DistributionPointAsn.Decode(sequenceReader, out DistributionPointAsn distributionPoint); // Only distributionPoint is supported // Only fullName is supported, nameRelativeToCRLIssuer is for LDAP-based lookup. if (distributionPoint.DistributionPoint.HasValue && distributionPoint.DistributionPoint.Value.FullName != null) { foreach (GeneralNameAsn name in distributionPoint.DistributionPoint.Value.FullName) { if (name.Uri != null && Uri.TryCreate(name.Uri, UriKind.Absolute, out Uri uri) && uri.Scheme == "http") { return(name.Uri); } } } } return(null); }
public DigestAlgorithmIdentifier(AsnReader asnReader) { asnReader = asnReader.ReadSequence(); this.algorithm = asnReader.ReadObjectIdentifier(); if (asnReader.PeekTag() == Asn1Tag.Null) { asnReader.ReadNull(); this.parameters = null; } else { this.parameters = asnReader.ReadEncodedValue().ToArray(); }; asnReader.ThrowIfNotEmpty(); }
protected Pkcs12SafeBag(string bagIdValue, ReadOnlyMemory <byte> encodedBagValue, bool skipCopy = false) { if (string.IsNullOrEmpty(bagIdValue)) { throw new ArgumentNullException(nameof(bagIdValue)); } // Read to ensure that there is precisely one legally encoded value. AsnReader reader = new AsnReader(encodedBagValue, AsnEncodingRules.BER); reader.ReadEncodedValue(); reader.ThrowIfNotEmpty(); _bagIdValue = bagIdValue; EncodedBagValue = skipCopy ? encodedBagValue : encodedBagValue.ToArray(); }
internal static void Decode(AsnReader reader, Asn1Tag expectedTag, out Asn1ModifyDNRequest decoded) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } decoded = new Asn1ModifyDNRequest(); AsnReader sequenceReader = reader.ReadSequence(expectedTag); if (sequenceReader.TryGetPrimitiveOctetStringBytes(out ReadOnlyMemory <byte> tmpEntry)) { decoded.Entry = tmpEntry; } else { decoded.Entry = sequenceReader.ReadOctetString(); } if (sequenceReader.TryGetPrimitiveOctetStringBytes(out ReadOnlyMemory <byte> tmpNewRDN)) { decoded.NewRDN = tmpNewRDN; } else { decoded.NewRDN = sequenceReader.ReadOctetString(); } decoded.DeleteOldRDN = sequenceReader.ReadBoolean(); if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0))) { if (sequenceReader.TryGetPrimitiveOctetStringBytes(new Asn1Tag(TagClass.ContextSpecific, 0), out ReadOnlyMemory <byte> tmpNewSuperior)) { decoded.NewSuperior = tmpNewSuperior; } else { decoded.NewSuperior = sequenceReader.ReadOctetString(new Asn1Tag(TagClass.ContextSpecific, 0)); } } sequenceReader.ThrowIfNotEmpty(); }
private static List <CertificatePolicyMappingAsn> ReadCertPolicyMappingsExtension(byte[] rawData) { AsnReader reader = new AsnReader(rawData, AsnEncodingRules.DER); AsnReader sequenceReader = reader.ReadSequence(); reader.ThrowIfNotEmpty(); List <CertificatePolicyMappingAsn> mappings = new List <CertificatePolicyMappingAsn>(); while (sequenceReader.HasData) { CertificatePolicyMappingAsn.Decode(sequenceReader, out CertificatePolicyMappingAsn mapping); mappings.Add(mapping); } return(mappings); }