| File: System\Security\Cryptography\Pkcs\Asn1\Rfc3161TimeStampReq.xml.cs | Web Access |
| Project: src\runtime\src\libraries\System.Security.Cryptography.Pkcs\src\System.Security.Cryptography.Pkcs.csproj (System.Security.Cryptography.Pkcs) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #pragma warning disable SA1028 // ignore whitespace warnings for generated code using System; using System.Collections.Generic; using System.Formats.Asn1; using System.Runtime.InteropServices; namespace System.Security.Cryptography.Pkcs.Asn1 { file static class SharedRfc3161TimeStampReq { internal static ReadOnlySpan<byte> DefaultCertReq => [0x01, 0x01, 0x00]; #if DEBUG static SharedRfc3161TimeStampReq() { Rfc3161TimeStampReq decoded = default; ValueAsnReader reader; reader = new ValueAsnReader(SharedRfc3161TimeStampReq.DefaultCertReq, AsnEncodingRules.DER); decoded.CertReq = reader.ReadBoolean(); reader.ThrowIfNotEmpty(); } #endif } [StructLayout(LayoutKind.Sequential)] internal partial struct Rfc3161TimeStampReq { internal int Version; internal System.Security.Cryptography.Pkcs.Asn1.MessageImprint MessageImprint; internal string? ReqPolicy; internal ReadOnlyMemory<byte>? Nonce; internal bool CertReq; internal System.Security.Cryptography.Asn1.X509ExtensionAsn[]? Extensions; internal readonly void Encode(AsnWriter writer) { Encode(writer, Asn1Tag.Sequence); } internal readonly void Encode(AsnWriter writer, Asn1Tag tag) { writer.PushSequence(tag); writer.WriteInteger(Version); MessageImprint.Encode(writer); if (ReqPolicy != null) { try { writer.WriteObjectIdentifier(ReqPolicy); } catch (ArgumentException e) { throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding, e); } } if (Nonce.HasValue) { writer.WriteInteger(Nonce.Value.Span); } // DEFAULT value handler for CertReq. { const int AsnBoolDerEncodeSize = 3; AsnWriter tmp = new AsnWriter(AsnEncodingRules.DER, initialCapacity: AsnBoolDerEncodeSize); tmp.WriteBoolean(CertReq); if (!tmp.EncodedValueEquals(SharedRfc3161TimeStampReq.DefaultCertReq)) { tmp.CopyTo(writer); } } if (Extensions != null) { writer.PushSequence(new Asn1Tag(TagClass.ContextSpecific, 0)); for (int i = 0; i < Extensions.Length; i++) { Extensions[i].Encode(writer); } writer.PopSequence(new Asn1Tag(TagClass.ContextSpecific, 0)); } writer.PopSequence(tag); } internal static Rfc3161TimeStampReq Decode(ReadOnlyMemory<byte> encoded, AsnEncodingRules ruleSet) { return Decode(Asn1Tag.Sequence, encoded, ruleSet); } internal static Rfc3161TimeStampReq Decode(Asn1Tag expectedTag, ReadOnlyMemory<byte> encoded, AsnEncodingRules ruleSet) { try { ValueAsnReader reader = new ValueAsnReader(encoded.Span, ruleSet); DecodeCore(ref reader, expectedTag, encoded, out Rfc3161TimeStampReq decoded); reader.ThrowIfNotEmpty(); return decoded; } catch (AsnContentException e) { throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding, e); } } internal static void Decode(ref ValueAsnReader reader, ReadOnlyMemory<byte> rebind, out Rfc3161TimeStampReq decoded) { Decode(ref reader, Asn1Tag.Sequence, rebind, out decoded); } internal static void Decode(ref ValueAsnReader reader, Asn1Tag expectedTag, ReadOnlyMemory<byte> rebind, out Rfc3161TimeStampReq decoded) { try { DecodeCore(ref reader, expectedTag, rebind, out decoded); } catch (AsnContentException e) { throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding, e); } } private static void DecodeCore(ref ValueAsnReader reader, Asn1Tag expectedTag, ReadOnlyMemory<byte> rebind, out Rfc3161TimeStampReq decoded) { decoded = default; ValueAsnReader sequenceReader = reader.ReadSequence(expectedTag); ValueAsnReader defaultReader; ValueAsnReader collectionReader; ReadOnlySpan<byte> rebindSpan = rebind.Span; int offset; ReadOnlySpan<byte> tmpSpan; if (!sequenceReader.TryReadInt32(out decoded.Version)) { sequenceReader.ThrowIfNotEmpty(); } System.Security.Cryptography.Pkcs.Asn1.MessageImprint.Decode(ref sequenceReader, rebind, out decoded.MessageImprint); if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(Asn1Tag.ObjectIdentifier)) { decoded.ReqPolicy = sequenceReader.ReadObjectIdentifier(); } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(Asn1Tag.Integer)) { tmpSpan = sequenceReader.ReadIntegerBytes(); decoded.Nonce = rebindSpan.Overlaps(tmpSpan, out offset) ? rebind.Slice(offset, tmpSpan.Length) : tmpSpan.ToArray(); } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(Asn1Tag.Boolean)) { decoded.CertReq = sequenceReader.ReadBoolean(); } else { defaultReader = new ValueAsnReader(SharedRfc3161TimeStampReq.DefaultCertReq, AsnEncodingRules.DER); decoded.CertReq = defaultReader.ReadBoolean(); } if (sequenceReader.HasData && sequenceReader.PeekTag().HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0))) { // Decode SEQUENCE OF for Extensions { collectionReader = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 0)); var tmpList = new List<System.Security.Cryptography.Asn1.X509ExtensionAsn>(); System.Security.Cryptography.Asn1.X509ExtensionAsn tmpItem; while (collectionReader.HasData) { System.Security.Cryptography.Asn1.X509ExtensionAsn.Decode(ref collectionReader, rebind, out tmpItem); tmpList.Add(tmpItem); } decoded.Extensions = tmpList.ToArray(); } } sequenceReader.ThrowIfNotEmpty(); } } }