[w32file] Move MonoIO.Find{First,Next,Close} to managed
[mono.git] / mcs / class / System.Security / System.Security.Cryptography.Pkcs / ContentInfo.cs
1 //
2 // System.Security.Cryptography.Pkcs.ContentInfo
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 #if SECURITY_DEP
31
32 using Mono.Security;
33
34 namespace System.Security.Cryptography.Pkcs {
35
36         /*
37         * ContentInfo ::= SEQUENCE {
38         *       contentType ContentType,
39         *       content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL 
40         * }
41         * ContentType ::= OBJECT IDENTIFIER
42         */
43
44         public sealed class ContentInfo {
45
46                 private Oid _oid;
47                 private byte[] _content;
48
49                 // constructors
50
51                 public ContentInfo (byte[] content) 
52                         : this (new Oid ("1.2.840.113549.1.7.1"), content)
53                 {
54                 } 
55
56                 public ContentInfo (Oid contentType, byte[] content) 
57                 {
58                         if (contentType == null)
59                                 throw new ArgumentNullException ("contentType");
60                         if (content == null)
61                                 throw new ArgumentNullException ("content");
62
63                         _oid = contentType;
64                         _content = content;
65                 }
66
67                 ~ContentInfo () 
68                 {
69                 }
70
71                 // properties
72
73                 public byte[] Content { 
74                         get { return (byte[]) _content.Clone (); }
75                 }
76
77                 public Oid ContentType { 
78                         get { return _oid; }
79                 }
80
81                 // static methods
82
83                 [MonoTODO ("MS is stricter than us about the content structure")]
84                 public static Oid GetContentType (byte[] encodedMessage)
85                 {
86                         if (encodedMessage == null)
87                                 throw new ArgumentNullException ("algorithm");
88
89                         try {
90                                 PKCS7.ContentInfo ci = new PKCS7.ContentInfo (encodedMessage);
91                                 switch (ci.ContentType) {
92                                 case PKCS7.Oid.data:
93                                 case PKCS7.Oid.signedData:              // see SignedCms class
94                                 case PKCS7.Oid.envelopedData:           // see EnvelopedCms class
95                                 case PKCS7.Oid.digestedData:
96                                 case PKCS7.Oid.encryptedData:
97                                         return new Oid (ci.ContentType);
98                                 default:
99                                         // Note: the constructor will accept any "valid" OID (but that 
100                                         // doesn't mean it's a valid ContentType structure - ASN.1 wise).
101                                         string msg = Locale.GetText ("Bad ASN1 - invalid OID '{0}'");
102                                         throw new CryptographicException (String.Format (msg, ci.ContentType));
103                                 }
104                         }
105                         catch (Exception e) {
106                                 throw new CryptographicException (Locale.GetText ("Bad ASN1 - invalid structure"), e);
107                         }
108                 }
109         }
110 }
111
112 #endif