Переглянути джерело

2004-07-08 Sebastien Pouliot <[email protected]>

	* ContentInfo.cs: Added finalizer.
	* CmsRecipient.cs: New. Replace Pkcs7Recipient (from 1.2).
	* CmsRecipientCollection.cs: New. Replace Pkcs7RecipientCollection
	(from 1.2).
	* CmsRecipientEnumerator.cs: New. Replace Pkcs7RecipientEnumerator
	(from 1.2).
	* CmsSigner.cs: New. Replace Pkcs7Signer (from 1.2).
	* EnvelopedCms.cs: New. Replace EnvelopedPkcs7 (from 1.2).
	* KeyAgreeRecipientInfo.cs: Fixed internal constructor.
	* Pkcs9Attribute.cs: Now inherit from AsnEncodedData. Fixed
	constructors.
	* Pkcs9DocumentDescription.cs: Sealed class and fixed API.
	* Pkcs9DocumentName.cs: Sealed class and fixed API.
	* Pkcs9SigningTime.cs: Sealed class and fixed API.
	* PublicKeyInfo.cs: Sealed class.
	* RecipientInfo.cs: Removed protected constructor.
	* RecipientInfoCollection.cs: Sealed class.
	* RecipientInfoEnumerator.cs: Sealed class.
	* SignedCms.cs: New. Replace SignedPkcs7 (from 1.2).
	* SignerInfo.cs: Sealed class and fixed API.
	* SignerInfoCollection.cs: Sealed class and fixed CopyTo.
	* SignerInfoEnumerator.cs: Sealed class.
	* SubjectIdentifier.cs: Sealed class.
	* SubjectIdentifierOrKey.cs: Sealed class.
	* SubjectIdentifierType.cs: Fixed enum and added [Serializable].

svn path=/trunk/mcs/; revision=30907
Sebastien Pouliot 21 роки тому
батько
коміт
5639cacb2c
22 змінених файлів з 1161 додано та 96 видалено
  1. 28 0
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/ChangeLog
  2. 77 0
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/CmsRecipient.cs
  3. 114 0
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/CmsRecipientCollection.cs
  4. 72 0
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/CmsRecipientEnumerator.cs
  5. 130 0
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/CmsSigner.cs
  6. 5 1
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/ContentInfo.cs
  7. 246 0
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/EnvelopedCms.cs
  8. 8 6
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/KeyAgreeRecipientInfo.cs
  9. 25 8
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/Pkcs9Attribute.cs
  10. 28 6
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/Pkcs9DocumentDescription.cs
  11. 28 6
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/Pkcs9DocumentName.cs
  12. 28 8
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/Pkcs9SigningTime.cs
  13. 3 7
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/RecipientInfo.cs
  14. 4 5
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/RecipientInfoCollection.cs
  15. 4 5
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/RecipientInfoEnumerator.cs
  16. 297 0
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/SignedCms.cs
  17. 37 18
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/SignerInfo.cs
  18. 8 6
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/SignerInfoCollection.cs
  19. 4 5
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/SignerInfoEnumerator.cs
  20. 4 5
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/SubjectIdentifier.cs
  21. 3 4
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/SubjectIdentifierOrKey.cs
  22. 8 6
      mcs/class/System.Security/System.Security.Cryptography.Pkcs/SubjectIdentifierType.cs

+ 28 - 0
mcs/class/System.Security/System.Security.Cryptography.Pkcs/ChangeLog

@@ -1,3 +1,31 @@
+2004-07-08  Sebastien Pouliot  <[email protected]>
+
+	* ContentInfo.cs: Added finalizer.
+	* CmsRecipient.cs: New. Replace Pkcs7Recipient (from 1.2).
+	* CmsRecipientCollection.cs: New. Replace Pkcs7RecipientCollection
+	(from 1.2).
+	* CmsRecipientEnumerator.cs: New. Replace Pkcs7RecipientEnumerator
+	(from 1.2).
+	* CmsSigner.cs: New. Replace Pkcs7Signer (from 1.2).
+	* EnvelopedCms.cs: New. Replace EnvelopedPkcs7 (from 1.2).
+	* KeyAgreeRecipientInfo.cs: Fixed internal constructor.
+	* Pkcs9Attribute.cs: Now inherit from AsnEncodedData. Fixed 
+	constructors.
+	* Pkcs9DocumentDescription.cs: Sealed class and fixed API.
+	* Pkcs9DocumentName.cs: Sealed class and fixed API.
+	* Pkcs9SigningTime.cs: Sealed class and fixed API.
+	* PublicKeyInfo.cs: Sealed class.
+	* RecipientInfo.cs: Removed protected constructor.
+	* RecipientInfoCollection.cs: Sealed class.
+	* RecipientInfoEnumerator.cs: Sealed class.
+	* SignedCms.cs: New. Replace SignedPkcs7 (from 1.2).
+	* SignerInfo.cs: Sealed class and fixed API.
+	* SignerInfoCollection.cs: Sealed class and fixed CopyTo.
+	* SignerInfoEnumerator.cs: Sealed class.
+	* SubjectIdentifier.cs: Sealed class.
+	* SubjectIdentifierOrKey.cs: Sealed class.
+	* SubjectIdentifierType.cs: Fixed enum and added [Serializable].
+
 2004-07-07  Sebastien Pouliot  <[email protected]>
 
 	* AlgorithmIdentifier.cs: Added missing #if NET_2_0.

+ 77 - 0
mcs/class/System.Security/System.Security.Cryptography.Pkcs/CmsRecipient.cs

@@ -0,0 +1,77 @@
+//
+// System.Security.Cryptography.Pkcs.CmsRecipient
+//
+// Author:
+//	Sebastien Pouliot  <[email protected]>
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Collections;
+using System.Security.Cryptography.X509Certificates;
+
+namespace System.Security.Cryptography.Pkcs {
+
+	public sealed class CmsRecipient {
+
+		private SubjectIdentifierType _recipient;
+		private X509CertificateEx _certificate;
+
+		// constructor
+
+		public CmsRecipient (X509CertificateEx certificate)
+		{
+			if (certificate == null)
+				throw new ArgumentNullException ("certificate");
+			_recipient = SubjectIdentifierType.IssuerAndSerialNumber;
+			_certificate = certificate;
+		}
+
+		public CmsRecipient (SubjectIdentifierType recipientIdentifierType, X509CertificateEx certificate)
+		{
+			if (certificate == null)
+				throw new ArgumentNullException ("certificate");
+
+			if (recipientIdentifierType == SubjectIdentifierType.Unknown)
+				_recipient = SubjectIdentifierType.IssuerAndSerialNumber;
+			else
+				_recipient = recipientIdentifierType;
+			_certificate = certificate;
+		}
+
+		// properties
+
+		public X509CertificateEx Certificate {
+			get { return _certificate; }
+		}
+
+		public SubjectIdentifierType RecipientIdentifierType {
+			get { return _recipient; }
+		}
+	}
+}
+
+#endif

+ 114 - 0
mcs/class/System.Security/System.Security.Cryptography.Pkcs/CmsRecipientCollection.cs

@@ -0,0 +1,114 @@
+//
+// System.Security.Cryptography.Pkcs.CmsRecipientCollection
+//
+// Author:
+//	Sebastien Pouliot  <[email protected]>
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Collections;
+using System.Security.Cryptography.X509Certificates;
+
+namespace System.Security.Cryptography.Pkcs {
+
+	public sealed class CmsRecipientCollection : ICollection, IEnumerable {
+
+		private ArrayList _list;
+
+		// constructors
+
+		public CmsRecipientCollection () 
+		{
+			_list = new ArrayList ();
+		}
+
+		public CmsRecipientCollection (CmsRecipient recipient) : base () 
+		{
+			_list.Add (recipient);
+		}
+
+		public CmsRecipientCollection (SubjectIdentifierType recipientIdentifierType, X509CertificateExCollection certificates) : base () 
+		{
+			foreach (X509CertificateEx x509 in certificates) {
+				CmsRecipient p7r = new CmsRecipient (recipientIdentifierType, x509);
+				_list.Add (p7r);
+			}
+		}
+
+		// properties
+
+		public int Count {
+			get { return _list.Count; }
+		}
+
+		public bool IsSynchronized {
+			get { return _list.IsSynchronized; }
+		}
+
+		public CmsRecipient this [int index] {
+			get { return (CmsRecipient) _list [index]; }
+		}
+
+		public object SyncRoot {
+			get { return _list.SyncRoot; }
+		}
+
+		// methods
+
+		public int Add (CmsRecipient recipient) 
+		{
+			return _list.Add (recipient);
+		}
+
+		public void CopyTo (Array array, int index) 
+		{
+			_list.CopyTo (array, index);
+		}
+
+		public void CopyTo (CmsRecipient[] array, int index) 
+		{
+			_list.CopyTo (array, index);
+		}
+
+		public CmsRecipientEnumerator GetEnumerator () 
+		{
+			return new CmsRecipientEnumerator (_list);
+		}
+
+		IEnumerator IEnumerable.GetEnumerator ()
+		{
+			return new CmsRecipientEnumerator (_list);
+		}
+
+		public void Remove (CmsRecipient recipient) 
+		{
+			_list.Remove (recipient);
+		}
+	}
+}
+
+#endif

+ 72 - 0
mcs/class/System.Security/System.Security.Cryptography.Pkcs/CmsRecipientEnumerator.cs

@@ -0,0 +1,72 @@
+//
+// System.Security.Cryptography.Pkcs.CmsRecipientEnumerator
+//
+// Author:
+//	Sebastien Pouliot  <[email protected]>
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Collections;
+
+namespace System.Security.Cryptography.Pkcs {
+
+	public sealed class CmsRecipientEnumerator : IEnumerator {
+
+		private IEnumerator enumerator;
+
+		// constructors
+
+		internal CmsRecipientEnumerator (IEnumerable enumerable) 
+		{
+			enumerator = enumerable.GetEnumerator ();
+		}
+
+		// properties
+
+		public CmsRecipient Current {
+			get { return (CmsRecipient) enumerator.Current; }
+		}
+
+		object IEnumerator.Current {
+			get { return enumerator.Current; }
+		}
+
+		// methods
+
+		public bool MoveNext () 
+		{
+			return enumerator.MoveNext ();
+		}
+
+		public void Reset ()
+		{
+			enumerator.Reset ();
+		}
+	}
+}
+
+#endif

+ 130 - 0
mcs/class/System.Security/System.Security.Cryptography.Pkcs/CmsSigner.cs

@@ -0,0 +1,130 @@
+//
+// System.Security.Cryptography.Pkcs.CmsSigner
+//
+// Author:
+//	Sebastien Pouliot  <[email protected]>
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Security.Cryptography.X509Certificates;
+
+namespace System.Security.Cryptography.Pkcs {
+
+	public sealed class CmsSigner {
+
+		private SubjectIdentifierType _signer;
+		private X509CertificateEx _certificate;
+		private X509CertificateExCollection _coll;
+		private Oid _digest;
+		private X509IncludeOption _options;
+		private CryptographicAttributeCollection _signed;
+		private CryptographicAttributeCollection _unsigned;
+
+		// constructors
+
+		public CmsSigner () 
+		{
+			_signer = SubjectIdentifierType.IssuerAndSerialNumber;
+			_digest = new Oid ("1.3.14.3.2.26");
+			_options = X509IncludeOption.ExcludeRoot;
+			_signed = new CryptographicAttributeCollection ();
+			_unsigned = new CryptographicAttributeCollection ();
+			_coll = new X509CertificateExCollection ();
+		}
+
+		public CmsSigner (SubjectIdentifierType signerIdentifierType) : this ()
+		{
+			if (signerIdentifierType == SubjectIdentifierType.Unknown)
+				_signer = SubjectIdentifierType.IssuerAndSerialNumber;
+			else
+				_signer = signerIdentifierType;
+		}
+
+		public CmsSigner (SubjectIdentifierType signerIdentifierType, X509CertificateEx certificate) 
+			: this (signerIdentifierType)
+		{
+// FIXME: compatibility with fx 1.2.3400.0
+//			if (certificate == null)
+//				throw new ArgumentNullException ("certificate");
+			_certificate = certificate;
+		}
+
+		public CmsSigner (X509CertificateEx certificate) : this ()
+		{
+// FIXME: compatibility with fx 1.2.3400.0
+//			if (certificate == null)
+//				throw new ArgumentNullException ("certificate");
+			_certificate = certificate;
+		}
+
+		[MonoTODO]
+		public CmsSigner (CspParameters parameters) : this ()
+		{
+		}		
+
+		// properties
+
+		public CryptographicAttributeCollection SignedAttributes {
+			get { return _signed; }
+		}
+
+		public X509CertificateEx Certificate {
+			get { return _certificate; }
+			set { _certificate = value; }
+		}
+
+		public X509CertificateExCollection Certificates {
+			get { return _coll; }
+		}
+
+		public Oid DigestAlgorithm {
+			get { return _digest; }
+			set { _digest = value; }
+		} 
+
+		public X509IncludeOption IncludeOption {
+			get { return _options; }
+			set { _options = value; }
+		} 
+
+		public SubjectIdentifierType SignerIdentifierType {
+			get { return _signer; }
+			set { 
+				if (value == SubjectIdentifierType.Unknown)
+					throw new ArgumentException ("value");
+
+				_signer = value;
+			}
+		}
+
+		public CryptographicAttributeCollection UnsignedAttributes {
+			get { return _unsigned; }
+		}
+	}
+}
+
+#endif

+ 5 - 1
mcs/class/System.Security/System.Security.Cryptography.Pkcs/ContentInfo.cs

@@ -1,5 +1,5 @@
 //
-// ContentInfo.cs - System.Security.Cryptography.Pkcs.ContentInfo
+// System.Security.Cryptography.Pkcs.ContentInfo
 //
 // Author:
 //	Sebastien Pouliot  <[email protected]>
@@ -67,6 +67,10 @@ namespace System.Security.Cryptography.Pkcs {
 			_content = content;
 		}
 
+		~ContentInfo () 
+		{
+		}
+
 		// properties
 
 		public byte[] Content { 

+ 246 - 0
mcs/class/System.Security/System.Security.Cryptography.Pkcs/EnvelopedCms.cs

@@ -0,0 +1,246 @@
+//
+// System.Security.Cryptography.Pkcs.EnvelopedCms
+//
+// Author:
+//	Sebastien Pouliot  <[email protected]>
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Collections;
+using System.Security.Cryptography.X509Certificates;
+using System.Security.Cryptography.Xml;
+using System.Text;
+
+using Mono.Security;
+
+namespace System.Security.Cryptography.Pkcs {
+
+	// References
+	// a.	PKCS #7: Cryptographic Message Syntax, Version 1.5, Section 10
+	//	http://www.faqs.org/rfcs/rfc2315.html
+
+	public sealed class EnvelopedCms {
+
+		private ContentInfo _content;
+		private AlgorithmIdentifier _identifier;
+		private X509CertificateExCollection _certs;
+		private RecipientInfoCollection _recipients;
+		private CryptographicAttributeCollection _uattribs;
+		private SubjectIdentifierType _idType;
+		private int _version;
+
+		// constructors
+
+		public EnvelopedCms () 
+		{
+			_certs = new X509CertificateExCollection ();
+			_recipients = new RecipientInfoCollection ();
+			_uattribs = new CryptographicAttributeCollection ();
+		}
+
+		public EnvelopedCms (ContentInfo content) : this ()
+		{
+			if (content == null)
+				throw new ArgumentNullException ("content");
+
+			_content = content;
+		}
+
+		public EnvelopedCms (ContentInfo contentInfo,	AlgorithmIdentifier encryptionAlgorithm)
+			: this (contentInfo) 
+		{
+			if (encryptionAlgorithm == null)
+				throw new ArgumentNullException ("encryptionAlgorithm");
+
+			_identifier = encryptionAlgorithm;
+		}
+
+		public EnvelopedCms (SubjectIdentifierType recipientIdentifierType, ContentInfo contentInfo) 
+			: this (contentInfo) 
+		{
+			_idType = recipientIdentifierType;
+			_version = ((_idType == SubjectIdentifierType.SubjectKeyIdentifier) ? 2 : 0);
+		}
+
+		public EnvelopedCms (SubjectIdentifierType recipientIdentifierType, ContentInfo contentInfo, AlgorithmIdentifier encryptionAlgorithm)
+			: this (contentInfo, encryptionAlgorithm) 
+		{
+			_idType = recipientIdentifierType;
+			_version = ((_idType == SubjectIdentifierType.SubjectKeyIdentifier) ? 2 : 0);
+		}
+
+		// properties
+
+		public X509CertificateExCollection Certificates {
+			get { return _certs; }
+		}
+
+		public AlgorithmIdentifier ContentEncryptionAlgorithm {
+			get { 
+				if (_identifier == null)
+					_identifier = new AlgorithmIdentifier ();
+				return _identifier; 
+			}
+		} 
+
+		public ContentInfo ContentInfo {
+			get { 
+				if (_content == null) {
+					Oid oid = new Oid (PKCS7.Oid.data);
+					_content = new ContentInfo (oid, new byte [0]);
+				}
+				return _content; 
+			}
+		}
+
+		public RecipientInfoCollection RecipientInfos {
+			get { return _recipients; }
+		}
+
+		public CryptographicAttributeCollection UnprotectedAttributes { 
+			get { return _uattribs; }
+		}
+
+		public int Version {
+			get { return _version; }
+		}
+
+		// methods
+
+		private X509IssuerSerial GetIssuerSerial (string issuer, byte[] serial) 
+		{
+			X509IssuerSerial xis = new X509IssuerSerial ();
+			xis.IssuerName = issuer;
+			StringBuilder sb = new StringBuilder ();
+			foreach (byte b in serial)
+				sb.Append (b.ToString ("X2"));
+			xis.SerialNumber = sb.ToString ();
+			return xis;
+		}
+
+		[MonoTODO]
+		public void Decode (byte[] encodedMessage)
+		{
+			if (encodedMessage == null)
+				throw new ArgumentNullException ("encodedMessage");
+
+			PKCS7.ContentInfo ci = new PKCS7.ContentInfo (encodedMessage);
+			if (ci.ContentType != PKCS7.Oid.envelopedData)
+				throw new Exception ("");
+
+			PKCS7.EnvelopedData ed = new PKCS7.EnvelopedData (ci.Content);
+
+			Oid oid = new Oid (ed.ContentInfo.ContentType);
+			_content = new ContentInfo (oid, new byte [0]); //ed.ContentInfo.Content.Value);
+
+			foreach (PKCS7.RecipientInfo ri in ed.RecipientInfos) {
+				Oid o = new Oid (ri.Oid);
+				AlgorithmIdentifier ai = new AlgorithmIdentifier (o);
+				SubjectIdentifier si = null;
+				if (ri.SubjectKeyIdentifier != null) {
+					si = new SubjectIdentifier (SubjectIdentifierType.SubjectKeyIdentifier, ri.SubjectKeyIdentifier);
+				}
+				else if ((ri.Issuer != null) && (ri.Serial != null)) {
+					X509IssuerSerial xis = GetIssuerSerial (ri.Issuer, ri.Serial);
+					si = new SubjectIdentifier (SubjectIdentifierType.IssuerAndSerialNumber, (object)xis);
+				}
+				
+				KeyTransRecipientInfo _keyTrans = new KeyTransRecipientInfo (ri.Key, ai, si, ri.Version);
+				_recipients.Add (_keyTrans);
+			}
+
+			// TODO - Certificates
+			// TODO - UnprotectedAttributes 
+
+			_version = ed.Version;
+		}
+
+		[MonoTODO]
+		public void Decrypt () 
+		{
+			throw new InvalidOperationException ("not encrypted");
+		}
+
+		[MonoTODO]
+		public void Decrypt (RecipientInfo recipientInfo) 
+		{
+			if (recipientInfo == null)
+				throw new ArgumentNullException ("recipientInfo");
+			Decrypt ();
+		}
+
+		[MonoTODO]
+		public void Decrypt (RecipientInfo recipientInfo, X509CertificateExCollection extraStore)
+		{
+			if (recipientInfo == null)
+				throw new ArgumentNullException ("recipientInfo");
+			if (extraStore == null)
+				throw new ArgumentNullException ("extraStore");
+			Decrypt ();
+		}
+
+		[MonoTODO]
+		public void Decrypt (X509CertificateExCollection extraStore) 
+		{
+			if (extraStore == null)
+				throw new ArgumentNullException ("extraStore");
+			Decrypt ();
+		}
+
+		[MonoTODO]
+		public byte[] Encode ()
+		{
+			throw new InvalidOperationException ("not encrypted");
+		}
+
+		[MonoTODO]
+		public void Encrypt () 
+		{
+			if ((_content.Content == null) || (_content.Content.Length == 0))
+				throw new CryptographicException ("no content to encrypt");
+		}
+
+		[MonoTODO]
+		public void Encrypt (CmsRecipient recipient)
+		{
+			if (recipient == null)
+				throw new ArgumentNullException ("recipient");
+			// TODO
+			Encrypt ();
+		}
+
+		[MonoTODO]
+		public void Encrypt (CmsRecipientCollection recipients)
+		{
+			if (recipients == null)
+				throw new ArgumentNullException ("recipients");
+			// ? foreach on Encrypt CmsRecipient ?
+		}
+	}
+}
+
+#endif

+ 8 - 6
mcs/class/System.Security/System.Security.Cryptography.Pkcs/KeyAgreeRecipientInfo.cs

@@ -2,11 +2,10 @@
 // KeyAgreeRecipientInfo.cs - System.Security.Cryptography.Pkcs.KeyAgreeRecipientInfo
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -37,8 +36,11 @@ namespace System.Security.Cryptography.Pkcs {
 	[MonoTODO]
 	public sealed class KeyAgreeRecipientInfo : RecipientInfo {
 
-		// only accessible from EnvelopedPkcs7.RecipientInfos
-		internal KeyAgreeRecipientInfo () {}
+		// only accessible from EnvelopedCms.RecipientInfos
+		internal KeyAgreeRecipientInfo () 
+			: base (RecipientInfoType.KeyAgreement) 
+		{
+		}
 
 		public DateTime Date {
 			get { return DateTime.MinValue; }
@@ -70,4 +72,4 @@ namespace System.Security.Cryptography.Pkcs {
 	}
 }
 
-#endif
+#endif

+ 25 - 8
mcs/class/System.Security/System.Security.Cryptography.Pkcs/Pkcs9Attribute.cs

@@ -2,11 +2,10 @@
 // Pkcs9Attribute.cs - System.Security.Cryptography.Pkcs.Pkcs9Attribute
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -35,16 +34,34 @@ using System.Collections;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class Pkcs9Attribute : CryptographicAttribute {
+	public class Pkcs9Attribute : AsnEncodedData {
 
 		// constructors
 
-		public Pkcs9Attribute (Oid oid) : base (oid) {}
+		public Pkcs9Attribute () 
+			: base ()
+		{
+		}
+
+		public Pkcs9Attribute (AsnEncodedData asnEncodedData)
+			: base (asnEncodedData)
+		{
+		}
+
+		public Pkcs9Attribute (Oid oid, byte[] encodedData) 
+			: base (oid, encodedData)
+		{
+		}
 
-		public Pkcs9Attribute (Oid oid, ArrayList values) : base (oid, values) {}
+		public Pkcs9Attribute (string oid, byte[] encodedData)
+			: base (oid, encodedData) 
+		{
+		}
 
-		public Pkcs9Attribute (Oid oid, object value) : base (oid, value) {}
+		public new Oid Oid {
+			get { return base.Oid; }
+		}
 	}
 }
 
-#endif
+#endif

+ 28 - 6
mcs/class/System.Security/System.Security.Cryptography.Pkcs/Pkcs9DocumentDescription.cs

@@ -2,11 +2,10 @@
 // Pkcs9DocumentDescription.cs - System.Security.Cryptography.Pkcs.Pkcs9DocumentDescription
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -31,16 +30,39 @@
 #if NET_2_0
 
 using System;
+using System.Text;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class Pkcs9DocumentDescription : Pkcs9Attribute {
+	public sealed class Pkcs9DocumentDescription : Pkcs9Attribute {
 
 		private const string oid = "1.3.6.1.4.1.311.88.2.2";
 
+		private string _desc;
+
+		[MonoTODO ("encode for RawData using Mono.Security")]
+		public Pkcs9DocumentDescription ()
+			: base (new Oid (oid), null)
+		{
+		}
+
+		[MonoTODO ("encode for RawData using Mono.Security")]
 		public Pkcs9DocumentDescription (string documentDescription)
-			: base (new Oid (oid), documentDescription) {}
+			: base (new Oid (oid), Encoding.Unicode.GetBytes (documentDescription))
+		{
+			_desc = documentDescription;
+		}
+
+		[MonoTODO ("decode using Mono.Security")]
+		public Pkcs9DocumentDescription (byte[] encodedDocumentDescription)
+			: base (new Oid (oid), encodedDocumentDescription)
+		{
+		}
+
+		public string DocumentDescription {
+			get { return _desc; }
+		}
 	}
 }
 
-#endif
+#endif

+ 28 - 6
mcs/class/System.Security/System.Security.Cryptography.Pkcs/Pkcs9DocumentName.cs

@@ -2,11 +2,10 @@
 // Pkcs9DocumentName.cs - System.Security.Cryptography.Pkcs.Pkcs9DocumentName
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -31,16 +30,39 @@
 #if NET_2_0
 
 using System;
+using System.Text;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class Pkcs9DocumentName : Pkcs9Attribute	{
+	public sealed class Pkcs9DocumentName : Pkcs9Attribute	{
 
 		private const string oid = "1.3.6.1.4.1.311.88.2.1";
 
+		private string _name;
+
+		[MonoTODO ("encode for RawData using Mono.Security")]
+		public Pkcs9DocumentName () 
+			: base (new Oid (oid), null)
+		{
+		}
+
+		[MonoTODO ("encode for RawData using Mono.Security")]
 		public Pkcs9DocumentName (string documentName) 
-			: base (new Oid (oid), documentName) {}
+			: base (new Oid (oid), Encoding.Unicode.GetBytes (documentName))
+		{
+			_name = documentName;
+		}
+
+		[MonoTODO ("decode using Mono.Security")]
+		public Pkcs9DocumentName (byte[] encodedDocumentName)
+			: base (new Oid (oid), encodedDocumentName)
+		{
+		}
+
+		public string DocumentName {
+			get { return _name; }
+		}
 	}
 }
 
-#endif
+#endif

+ 28 - 8
mcs/class/System.Security/System.Security.Cryptography.Pkcs/Pkcs9SigningTime.cs

@@ -2,11 +2,10 @@
 // Pkcs9SigningTime.cs - System.Security.Cryptography.Pkcs.Pkcs9SigningTime
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -34,16 +33,37 @@ using System;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class Pkcs9SigningTime : Pkcs9Attribute {
+	public sealed class Pkcs9SigningTime : Pkcs9Attribute {
 
 		private const string oid = "1.2.840.113549.1.9.5";
 		private const string name = "Signing Time";
 
-		public Pkcs9SigningTime () : this (DateTime.Now) {}
+		private DateTime _signingTime;
+
+		[MonoTODO ("encode for RawData using Mono.Security")]
+		public Pkcs9SigningTime () 
+			: base (new Oid (oid, name), null)
+		{
+			_signingTime = DateTime.Now;
+		}
+
+		[MonoTODO ("encode for RawData using Mono.Security")]
+		public Pkcs9SigningTime (DateTime signingTime)
+			: base (new Oid (oid, name), null)
+		{
+			_signingTime = signingTime;
+		}
+
+		[MonoTODO ("decode using Mono.Security")]
+		public Pkcs9SigningTime (byte[] encodedSigningTime)
+			: base (new Oid (oid, name), null)
+		{
+		}
 
-		public Pkcs9SigningTime (DateTime signingTime) 
-			: base (new Oid (oid, name), signingTime)  {}
+		public DateTime SigningTime {
+			get { return _signingTime; }
+		}
 	}
 }
 
-#endif
+#endif

+ 3 - 7
mcs/class/System.Security/System.Security.Cryptography.Pkcs/RecipientInfo.cs

@@ -2,11 +2,10 @@
 // RecipientInfo.cs - System.Security.Cryptography.Pkcs.RecipientInfo
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -40,9 +39,6 @@ namespace System.Security.Cryptography.Pkcs {
 
 		// constructors
 
-		protected RecipientInfo () {}
-
-
 		// documented as protected at http://longhorn.msdn.microsoft.com
 		// but not present in the 1.2 beta SDK
 		internal RecipientInfo (RecipientInfoType recipInfoType) 
@@ -66,4 +62,4 @@ namespace System.Security.Cryptography.Pkcs {
 	}
 }
 
-#endif
+#endif

+ 4 - 5
mcs/class/System.Security/System.Security.Cryptography.Pkcs/RecipientInfoCollection.cs

@@ -2,11 +2,10 @@
 // RecipientInfoCollection.cs - System.Security.Cryptography.Pkcs.RecipientInfoCollection
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -35,7 +34,7 @@ using System.Collections;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class RecipientInfoCollection : ICollection {
+	public sealed class RecipientInfoCollection : ICollection {
 
 		private ArrayList _list;
 
@@ -92,4 +91,4 @@ namespace System.Security.Cryptography.Pkcs {
 	}
 }
 
-#endif
+#endif

+ 4 - 5
mcs/class/System.Security/System.Security.Cryptography.Pkcs/RecipientInfoEnumerator.cs

@@ -2,11 +2,10 @@
 // RecipientInfoEnumerator.cs - System.Security.Cryptography.Pkcs.RecipientInfoEnumerator
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -35,7 +34,7 @@ using System.Collections;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class RecipientInfoEnumerator : IEnumerator {
+	public sealed class RecipientInfoEnumerator : IEnumerator {
 
 		private IEnumerator enumerator;
 
@@ -70,4 +69,4 @@ namespace System.Security.Cryptography.Pkcs {
 	}
 }
 
-#endif
+#endif

+ 297 - 0
mcs/class/System.Security/System.Security.Cryptography.Pkcs/SignedCms.cs

@@ -0,0 +1,297 @@
+//
+// System.Security.Cryptography.Pkcs.SignedCms
+//
+// Author:
+//	Sebastien Pouliot  <[email protected]>
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Security.Cryptography.X509Certificates;
+using System.Security.Cryptography.Xml;
+using System.Text;
+
+using Mono.Security;
+using Mono.Security.X509;
+
+namespace System.Security.Cryptography.Pkcs {
+
+	public sealed class SignedCms {
+
+		private ContentInfo _content;
+		private bool _detached;
+		private SignerInfoCollection _info;
+		private X509CertificateExCollection _certs;
+		private SubjectIdentifierType _type;
+		private int _version;
+
+		// constructors
+
+		public SignedCms () 
+		{
+			_certs = new X509CertificateExCollection ();
+			_info = new SignerInfoCollection ();
+		}
+
+		public SignedCms (ContentInfo content) 
+			: this (content, false)
+		{
+		}
+
+		public SignedCms (ContentInfo content, bool detached) 
+			: this ()
+		{
+			if (content == null)
+				throw new ArgumentNullException ("content");
+
+			_content = content;
+			_detached = detached;
+		}
+
+		public SignedCms (SubjectIdentifierType signerIdentifierType) : this ()
+		{
+			_type = signerIdentifierType;
+			_version = ((_type == SubjectIdentifierType.SubjectKeyIdentifier) ? 2 : 0);
+		}
+
+		public SignedCms (SubjectIdentifierType signerIdentifierType, ContentInfo content) 
+			: this (content, false) 
+		{
+			_type = signerIdentifierType;
+			_version = ((_type == SubjectIdentifierType.SubjectKeyIdentifier) ? 2 : 0);
+		}
+
+		public SignedCms (SubjectIdentifierType signerIdentifierType, ContentInfo content, bool detached) 
+			: this (content, detached) 
+		{
+			_type = signerIdentifierType;
+			_version = ((_type == SubjectIdentifierType.SubjectKeyIdentifier) ? 2 : 0);
+		}
+
+		// properties
+
+		public X509CertificateExCollection Certificates { 
+			get { return _certs; }
+		}
+
+		public ContentInfo ContentInfo { 
+			get { 
+				if (_content == null) {
+					Oid oid = new Oid (PKCS7.Oid.data);
+					_content = new ContentInfo (oid, new byte [0]);
+				}
+				return _content; 
+			}
+		}
+
+		public bool Detached { 
+			get { return _detached; }
+		}
+
+		public SignerInfoCollection SignerInfos {
+			get { return _info; }
+		}
+
+		public int Version { 
+			get { return _version; }
+		}
+
+		// methods
+
+		public void CheckSignature (bool verifySignatureOnly)
+		{
+			foreach (SignerInfo si in _info) {
+				si.CheckSignature (verifySignatureOnly);
+			}
+		}
+
+		public void CheckSignature (X509CertificateExCollection extraStore, bool verifySignatureOnly) 
+		{
+			foreach (SignerInfo si in _info) {
+				si.CheckSignature (extraStore, verifySignatureOnly);
+			}
+		}
+
+		[MonoTODO]
+		public void CheckHash () 
+		{
+			throw new InvalidOperationException ("");
+		}
+
+		[MonoTODO]
+		public void ComputeSignature () 
+		{
+			throw new CryptographicException ("");
+		}
+
+		[MonoTODO]
+		public void ComputeSignature (CmsSigner signer)
+		{
+			ComputeSignature ();
+		}
+
+		[MonoTODO]
+		public void ComputeSignature (CmsSigner signer, bool silent)
+		{
+			ComputeSignature ();
+		}
+
+		private string ToString (byte[] array) 
+		{
+			StringBuilder sb = new StringBuilder ();
+			foreach (byte b in array)
+				sb.Append (b.ToString ("X2"));
+			return sb.ToString ();
+		}
+
+		private byte[] GetKeyIdentifier (Mono.Security.X509.X509Certificate x509) 
+		{
+			// if present in certificate return value of the SubjectKeyIdentifier
+			Mono.Security.X509.X509Extension extn = x509.Extensions ["2.5.29.14"];
+			if (extn != null) {
+				ASN1 bs = new ASN1 (extn.Value.Value);
+				return bs.Value;
+			}
+			// strangely DEPRECATED keyAttributes isn't used here (like KeyUsage)
+
+			// if not then we must calculate the SubjectKeyIdentifier ourselve
+			// Note: MS does that hash on the complete subjectPublicKeyInfo (unlike PKIX)
+			// http://groups.google.ca/groups?selm=e7RqM%24plCHA.1488%40tkmsftngp02&oe=UTF-8&output=gplain
+			ASN1 subjectPublicKeyInfo = new ASN1 (0x30);
+			ASN1 algo = subjectPublicKeyInfo.Add (new ASN1 (0x30));
+			algo.Add (new ASN1 (CryptoConfig.EncodeOID (x509.KeyAlgorithm)));
+			// FIXME: does it work for DSA certs (without an 2.5.29.14 extension ?)
+			algo.Add (new ASN1 (x509.KeyAlgorithmParameters)); 
+			byte[] pubkey = x509.PublicKey;
+			byte[] bsvalue = new byte [pubkey.Length + 1]; // add unused bits (0) before the public key
+			Array.Copy (pubkey, 0, bsvalue, 1, pubkey.Length);
+			subjectPublicKeyInfo.Add (new ASN1 (0x03, bsvalue));
+			SHA1 sha = SHA1.Create ();
+			return sha.ComputeHash (subjectPublicKeyInfo.GetBytes ());
+		}
+
+		[MonoTODO("incomplete - missing attributes")]
+		public void Decode (byte[] encodedMessage) 
+		{
+			PKCS7.ContentInfo ci = new PKCS7.ContentInfo (encodedMessage);
+			if (ci.ContentType != PKCS7.Oid.signedData) 
+				throw new Exception ("");
+
+			PKCS7.SignedData sd = new PKCS7.SignedData (ci.Content);
+			SubjectIdentifierType type = SubjectIdentifierType.Unknown;
+			object o = null;
+
+			X509CertificateEx x509 = null;
+			if (sd.SignerInfo.Certificate != null) {
+				x509 = new X509CertificateEx (sd.SignerInfo.Certificate.RawData);
+			}
+			else if ((sd.SignerInfo.IssuerName != null) && (sd.SignerInfo.SerialNumber != null)) {
+				byte[] serial = sd.SignerInfo.SerialNumber;
+				Array.Reverse (serial); // ???
+				type = SubjectIdentifierType.IssuerAndSerialNumber;
+				X509IssuerSerial xis = new X509IssuerSerial ();
+				xis.IssuerName = sd.SignerInfo.IssuerName;
+				xis.SerialNumber = ToString (serial);
+				o = xis;
+				// TODO: move to a FindCertificate (issuer, serial, collection)
+				foreach (Mono.Security.X509.X509Certificate x in sd.Certificates) {
+					if (x.IssuerName == sd.SignerInfo.IssuerName) {
+						if (ToString (x.SerialNumber) == xis.SerialNumber) {
+							x509 = new X509CertificateEx (x.RawData);
+							break;
+						}
+					}
+				}
+			}
+			else if (sd.SignerInfo.SubjectKeyIdentifier != null) {
+				string ski = ToString (sd.SignerInfo.SubjectKeyIdentifier);
+				type = SubjectIdentifierType.SubjectKeyIdentifier;
+				o = (object) ski;
+				// TODO: move to a FindCertificate (ski, collection)
+				foreach (Mono.Security.X509.X509Certificate x in sd.Certificates) {
+					if (ToString (GetKeyIdentifier (x)) == ski) {
+						x509 = new X509CertificateEx (x.RawData);
+						break;
+					}
+				}
+			}
+
+			SignerInfo si = new SignerInfo (sd.SignerInfo.HashName, x509, type, o, sd.SignerInfo.Version);
+			// si.AuthenticatedAttributes
+			// si.UnauthenticatedAttributes
+			_info.Add (si);
+
+			ASN1 content = sd.ContentInfo.Content;
+			Oid oid = new Oid (sd.ContentInfo.ContentType);
+			_content = new ContentInfo (oid, content[0].Value);
+
+			foreach (Mono.Security.X509.X509Certificate x in sd.Certificates) {
+				_certs.Add (new X509CertificateEx (x.RawData));
+			}
+
+			_version = sd.Version;
+		}
+
+		[MonoTODO]
+		public byte[] Encode ()
+		{
+			Mono.Security.X509.X509Certificate x509 = null;
+/*			Cms.SignerInfo si = new Cms.SignerInfo ();
+			switch (_type) {
+				case SubjectIdentifierType.SubjectKeyIdentifier:
+					si.SubjectKeyIdentifier = GetKeyIdentifier (x509);
+					break;
+				default: 
+					// SubjectIdentifierType.IssuerAndSerialNumber 
+					si.IssuerName = x509.IssuerName;
+					si.SerialNumber = x509.SerialNumber;
+					break;
+			}
+
+			Cms.SignedData sd = new Cms.SignedData ();
+			sd.Version = _version;
+			sd.SignerInfo = si;
+
+			Cms.ContentInfo ci = new Cms.ContentInfo (Cms.signedData);
+			ci.Content = sd.ASN1;
+			return ci.GetBytes ();*/
+			return null;
+		}
+
+		// counterSsignerInfo -> counterSignerInfo
+		[MonoTODO]
+		public void RemoveSignature (SignerInfo counterSsignerInfo)
+		{
+		}
+
+		[MonoTODO]
+		public void RemoveSignature (int index)
+		{
+		}
+	}
+}
+
+#endif

+ 37 - 18
mcs/class/System.Security/System.Security.Cryptography.Pkcs/SignerInfo.cs

@@ -2,11 +2,10 @@
 // SignerInfo.cs - System.Security.Cryptography.Pkcs.SignerInfo
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -35,14 +34,14 @@ using System.Security.Cryptography.X509Certificates;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class SignerInfo {
+	public sealed class SignerInfo {
 
 		private SubjectIdentifier _signer;
 		private X509CertificateEx _certificate;
 		private Oid _digest;
 		private SignerInfoCollection _counter;
-		private Pkcs9AttributeCollection _auth;
-		private Pkcs9AttributeCollection _unauth;
+		private CryptographicAttributeCollection _signed;
+		private CryptographicAttributeCollection _unsigned;
 		private int _version;
 
 		// only accessible from SignedPkcs7.SignerInfos
@@ -51,16 +50,16 @@ namespace System.Security.Cryptography.Pkcs {
 			_digest = new Oid (hashOid);
 			_certificate = certificate;
 			_counter = new SignerInfoCollection ();
-			_auth = new Pkcs9AttributeCollection ();
-			_unauth = new Pkcs9AttributeCollection ();
+			_signed = new CryptographicAttributeCollection ();
+			_unsigned = new CryptographicAttributeCollection ();
 			_signer = new SubjectIdentifier (type, o);
 			_version = version;
 		}
 
 		// properties
 
-		public Pkcs9AttributeCollection AuthenticatedAttributes {
-			get { return _auth; }
+		public CryptographicAttributeCollection SignedAttributes {
+			get { return _signed; }
 		} 
 
 		public X509CertificateEx Certificate {
@@ -79,8 +78,8 @@ namespace System.Security.Cryptography.Pkcs {
 			get { return _signer; }
 		}
 
-		public Pkcs9AttributeCollection UnauthenticatedAttributes {
-			get { return _unauth; }
+		public CryptographicAttributeCollection UnsignedAttributes {
+			get { return _unsigned; }
 		}
 
 		public int Version {
@@ -90,20 +89,40 @@ namespace System.Security.Cryptography.Pkcs {
 		// methods
 
 		[MonoTODO]
-		public void CheckSignature (bool verifySignatureOnly) {}
+		public void CheckHash ()
+		{
+		}
+
+		[MonoTODO]
+		public void CheckSignature (bool verifySignatureOnly)
+		{
+		}
+
+		[MonoTODO]
+		public void CheckSignature (X509CertificateExCollection extraStore, bool verifySignatureOnly)
+		{
+		}
 
 		[MonoTODO]
-		public void CheckSignature (X509CertificateExCollection extraStore, bool verifySignatureOnly) {}
+		public void ComputeCounterSignature ()
+		{
+		}
 
 		[MonoTODO]
-		public void ComputeCounterSignature () {}
+		public void ComputeCounterSignature (CmsSigner signer)
+		{
+		}
 
 		[MonoTODO]
-		public void ComputeCounterSignature (Pkcs7Signer signer) {}
+		public void RemoveCounterSignature (SignerInfo counterSignerInfo)
+		{
+		}
 
 		[MonoTODO]
-		public void RemoveCounterSignature (SignerInfo counterSignerInfo) {}
+		public void RemoveCounterSignature (int index)
+		{
+		}
 	}
 }
 
-#endif
+#endif

+ 8 - 6
mcs/class/System.Security/System.Security.Cryptography.Pkcs/SignerInfoCollection.cs

@@ -2,11 +2,10 @@
 // SignerInfoCollection.cs - System.Security.Cryptography.Pkcs.SignerInfoCollection
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -35,7 +34,7 @@ using System.Collections;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class SignerInfoCollection : ICollection {
+	public sealed class SignerInfoCollection : ICollection {
 
 		private ArrayList _list;
 
@@ -75,7 +74,10 @@ namespace System.Security.Cryptography.Pkcs {
 			_list.CopyTo (array, index);
 		}
 
-		public void CopyTo (RecipientInfo[] array, int index) {}
+		[MonoTODO]
+		public void CopyTo (SignerInfo[] array, int index)
+		{
+		}
 
 		public SignerInfoEnumerator GetEnumerator ()
 		{
@@ -89,4 +91,4 @@ namespace System.Security.Cryptography.Pkcs {
 	}
 }
 
-#endif
+#endif

+ 4 - 5
mcs/class/System.Security/System.Security.Cryptography.Pkcs/SignerInfoEnumerator.cs

@@ -2,11 +2,10 @@
 // SignerInfoEnumerator.cs - System.Security.Cryptography.Pkcs.SignerInfoEnumerator
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -35,7 +34,7 @@ using System.Collections;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class SignerInfoEnumerator : IEnumerator {
+	public sealed class SignerInfoEnumerator : IEnumerator {
 
 		private IEnumerator enumerator;
 
@@ -70,4 +69,4 @@ namespace System.Security.Cryptography.Pkcs {
 	}
 }
 
-#endif
+#endif

+ 4 - 5
mcs/class/System.Security/System.Security.Cryptography.Pkcs/SubjectIdentifier.cs

@@ -2,11 +2,10 @@
 // SubjectIdentifier.cs - System.Security.Cryptography.Pkcs.SubjectIdentifier
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -34,7 +33,7 @@ using System;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class SubjectIdentifier {
+	public sealed class SubjectIdentifier {
 
 		private SubjectIdentifierType _type;
 		private object _value;
@@ -57,4 +56,4 @@ namespace System.Security.Cryptography.Pkcs {
 	}
 }
 
-#endif
+#endif

+ 3 - 4
mcs/class/System.Security/System.Security.Cryptography.Pkcs/SubjectIdentifierOrKey.cs

@@ -2,11 +2,10 @@
 // SubjectIdentifierOrKey.cs - System.Security.Cryptography.Pkcs.SubjectIdentifierOrKey
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -34,7 +33,7 @@ using System;
 
 namespace System.Security.Cryptography.Pkcs {
 
-	public class SubjectIdentifierOrKey {
+	public sealed class SubjectIdentifierOrKey {
 
 		private SubjectIdentifierOrKeyType _type;
 		private object _value;

+ 8 - 6
mcs/class/System.Security/System.Security.Cryptography.Pkcs/SubjectIdentifierType.cs

@@ -1,12 +1,11 @@
 //
-// SubjectIdentifierType.cs - System.Security.Cryptography.Pkcs.SubjectIdentifierType
+// System.Security.Cryptography.Pkcs.SubjectIdentifierType
 //
 // Author:
-//	Sebastien Pouliot ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
-//
-
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -34,11 +33,14 @@ using System;
 
 namespace System.Security.Cryptography.Pkcs {
 
+	[Serializable]
 	public enum SubjectIdentifierType {
 		Unknown,
 		IssuerAndSerialNumber,
-		SubjectKeyIdentifier
+		SubjectKeyIdentifier,
+		[Obsolete] HashOnly,
+		NoSignature = 3
 	}
 }
 
-#endif
+#endif