internal Asn1Tag ReadTagAndLength(out int?contentsLength, out int bytesRead) { if (Asn1Tag.TryDecode(_data.Span, out Asn1Tag tag, out int tagBytesRead) && TryReadLength(_data.Slice(tagBytesRead).Span, RuleSet, out int?length, out int lengthBytesRead)) { int allBytesRead = tagBytesRead + lengthBytesRead; if (tag.IsConstructed) { // T-REC-X.690-201508 sec 9.1 (CER: Length forms) says constructed is always indefinite. if (RuleSet == AsnEncodingRules.CER && length != null) { throw new CryptographicException(SR.Resource("Cryptography_Der_Invalid_Encoding")); } } else if (length == null) { // T-REC-X.690-201508 sec 8.1.3.2 says primitive encodings must use a definite form. throw new CryptographicException(SR.Resource("Cryptography_Der_Invalid_Encoding")); } bytesRead = allBytesRead; contentsLength = length; return(tag); } throw new CryptographicException(SR.Resource("Cryptography_Der_Invalid_Encoding")); }
/// <summary> /// Read the encoded tag at the next data position, without advancing the reader. /// </summary> /// <returns> /// The decoded <see cref="Asn1Tag"/> value. /// </returns> /// <exception cref="CryptographicException"> /// a tag could not be decoded at the reader's current position. /// </exception> public Asn1Tag PeekTag() { if (Asn1Tag.TryDecode(_data.Span, out Asn1Tag tag, out int bytesRead)) { return(tag); } throw new CryptographicException(SR.Resource("Cryptography_Der_Invalid_Encoding")); }
internal void Encode(AsnWriter writer) { bool wroteValue = false; if (TeletexString != null) { if (wroteValue) { throw new CryptographicException(); } writer.WriteCharacterString(UniversalTagNumber.T61String, TeletexString); wroteValue = true; } if (PrintableString != null) { if (wroteValue) { throw new CryptographicException(); } writer.WriteCharacterString(UniversalTagNumber.PrintableString, PrintableString); wroteValue = true; } if (UniversalString.HasValue) { if (wroteValue) { throw new CryptographicException(); } // Validator for tag constraint for UniversalString { if (!Asn1Tag.TryDecode(UniversalString.Value.Span, out Asn1Tag validateTag, out _) || !validateTag.HasSameClassAndValue(new Asn1Tag((UniversalTagNumber)28))) { throw new CryptographicException(); } } try { writer.WriteEncodedValue(UniversalString.Value.Span); } catch (ArgumentException e) { throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding, e); } wroteValue = true; } if (Utf8String != null) { if (wroteValue) { throw new CryptographicException(); } writer.WriteCharacterString(UniversalTagNumber.UTF8String, Utf8String); wroteValue = true; } if (BmpString != null) { if (wroteValue) { throw new CryptographicException(); } writer.WriteCharacterString(UniversalTagNumber.BMPString, BmpString); wroteValue = true; } if (!wroteValue) { throw new CryptographicException(); } }
internal void Encode(AsnWriter writer) { bool wroteValue = false; if (OtherName.HasValue) { if (wroteValue) { throw new CryptographicException(); } OtherName.Value.Encode(writer, new Asn1Tag(TagClass.ContextSpecific, 0)); wroteValue = true; } if (Rfc822Name != null) { if (wroteValue) { throw new CryptographicException(); } writer.WriteCharacterString(new Asn1Tag(TagClass.ContextSpecific, 1), UniversalTagNumber.IA5String, Rfc822Name); wroteValue = true; } if (DnsName != null) { if (wroteValue) { throw new CryptographicException(); } writer.WriteCharacterString(new Asn1Tag(TagClass.ContextSpecific, 2), UniversalTagNumber.IA5String, DnsName); wroteValue = true; } if (X400Address.HasValue) { if (wroteValue) { throw new CryptographicException(); } // Validator for tag constraint for X400Address { if (!Asn1Tag.TryDecode(X400Address.Value.Span, out Asn1Tag validateTag, out _) || !validateTag.HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 3))) { throw new CryptographicException(); } } writer.WriteEncodedValue(X400Address.Value.Span); wroteValue = true; } if (DirectoryName.HasValue) { if (wroteValue) { throw new CryptographicException(); } writer.PushSequence(new Asn1Tag(TagClass.ContextSpecific, 4)); writer.WriteEncodedValue(DirectoryName.Value.Span); writer.PopSequence(new Asn1Tag(TagClass.ContextSpecific, 4)); wroteValue = true; } if (EdiPartyName.HasValue) { if (wroteValue) { throw new CryptographicException(); } EdiPartyName.Value.Encode(writer, new Asn1Tag(TagClass.ContextSpecific, 5)); wroteValue = true; } if (Uri != null) { if (wroteValue) { throw new CryptographicException(); } writer.WriteCharacterString(new Asn1Tag(TagClass.ContextSpecific, 6), UniversalTagNumber.IA5String, Uri); wroteValue = true; } if (IPAddress.HasValue) { if (wroteValue) { throw new CryptographicException(); } writer.WriteOctetString(new Asn1Tag(TagClass.ContextSpecific, 7), IPAddress.Value.Span); wroteValue = true; } if (RegisteredId != null) { if (wroteValue) { throw new CryptographicException(); } writer.WriteObjectIdentifier(new Asn1Tag(TagClass.ContextSpecific, 8), RegisteredId); wroteValue = true; } if (!wroteValue) { throw new CryptographicException(); } }