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