1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System; 6 using System.Diagnostics; 7 8 using Internal.Cryptography; 9 10 namespace System.Security.Cryptography.Pkcs 11 { 12 public sealed class Pkcs9DocumentDescription : Pkcs9AttributeObject 13 { 14 // 15 // Constructors. 16 // 17 Pkcs9DocumentDescription()18 public Pkcs9DocumentDescription() 19 : base(new Oid(Oids.DocumentDescription)) 20 { 21 // CAPI doesn't have an OID mapping for szOID_CAPICOM_documentDescription, so we cannot use the faster 22 // FromOidValue factory 23 } 24 Pkcs9DocumentDescription(string documentDescription)25 public Pkcs9DocumentDescription(string documentDescription) 26 : base(Oids.DocumentDescription, Encode(documentDescription)) 27 { 28 _lazyDocumentDescription = documentDescription; 29 } 30 Pkcs9DocumentDescription(byte[] encodedDocumentDescription)31 public Pkcs9DocumentDescription(byte[] encodedDocumentDescription) 32 : base(Oids.DocumentDescription, encodedDocumentDescription) 33 { 34 } 35 36 // 37 // Public methods. 38 // 39 40 public string DocumentDescription 41 { 42 get 43 { 44 return _lazyDocumentDescription ?? (_lazyDocumentDescription = Decode(RawData)); 45 } 46 } 47 CopyFrom(AsnEncodedData asnEncodedData)48 public override void CopyFrom(AsnEncodedData asnEncodedData) 49 { 50 base.CopyFrom(asnEncodedData); 51 _lazyDocumentDescription = null; 52 } 53 54 // 55 // Private methods. 56 // 57 Decode(byte[] rawData)58 private static string Decode(byte[] rawData) 59 { 60 if (rawData == null) 61 return null; 62 63 byte[] octets = PkcsPal.Instance.DecodeOctetString(rawData); 64 return octets.OctetStringToUnicode(); 65 } 66 Encode(string documentDescription)67 private static byte[] Encode(string documentDescription) 68 { 69 if (documentDescription == null) 70 throw new ArgumentNullException(nameof(documentDescription)); 71 72 byte[] octets = documentDescription.UnicodeToOctetString(); 73 return PkcsPal.Instance.EncodeOctetString(octets); 74 } 75 76 private volatile string _lazyDocumentDescription = null; 77 } 78 } 79 80 81