2 // X520.cs: X.520 related stuff (attributes, RDN)
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
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:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
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.
31 using System
.Globalization
;
36 namespace Mono
.Security
.X509
{
39 // 1. Information technology - Open Systems Interconnection - The Directory: Selected attribute types
40 // http://www.itu.int/rec/recommendation.asp?type=folders&lang=e&parent=T-REC-X.520
41 // 2. Internet X.509 Public Key Infrastructure Certificate and CRL Profile
42 // http://www.ietf.org/rfc/rfc3280.txt
43 // 3. A Summary of the X.500(96) User Schema for use with LDAPv3
44 // http://www.faqs.org/rfcs/rfc2256.html
45 // 4. RFC 2247 - Using Domains in LDAP/X.500 Distinguished Names
46 // http://www.faqs.org/rfcs/rfc2247.html
49 * AttributeTypeAndValue ::= SEQUENCE {
51 * value AttributeValue
54 * AttributeType ::= OBJECT IDENTIFIER
56 * AttributeValue ::= ANY DEFINED BY AttributeType
65 public abstract class AttributeTypeAndValue
{
67 private string attrValue
;
68 private int upperBound
;
69 private byte encoding
;
71 protected AttributeTypeAndValue (string oid
, int upperBound
)
74 this.upperBound
= upperBound
;
78 protected AttributeTypeAndValue (string oid
, int upperBound
, byte encoding
)
81 this.upperBound
= upperBound
;
82 this.encoding
= encoding
;
86 get { return attrValue; }
88 if ((attrValue
!= null) && (attrValue
.Length
> upperBound
)) {
89 string msg
= Locale
.GetText ("Value length bigger than upperbound ({0}).");
90 throw new FormatException (String
.Format (msg
, upperBound
));
97 get { return GetASN1 (); }
100 internal ASN1
GetASN1 (byte encoding
)
102 byte encode
= encoding
;
104 encode
= SelectBestEncoding ();
106 ASN1 asn1
= new ASN1 (0x30);
107 asn1
.Add (ASN1Convert
.FromOid (oid
));
111 asn1
.Add (new ASN1 (0x13, Encoding
.ASCII
.GetBytes (attrValue
)));
115 asn1
.Add (new ASN1 (0x16, Encoding
.ASCII
.GetBytes (attrValue
)));
119 asn1
.Add (new ASN1 (0x1E, Encoding
.BigEndianUnicode
.GetBytes (attrValue
)));
125 internal ASN1
GetASN1 ()
127 return GetASN1 (encoding
);
130 public byte[] GetBytes (byte encoding
)
132 return GetASN1 (encoding
) .GetBytes ();
135 public byte[] GetBytes ()
137 return GetASN1 () .GetBytes ();
140 private byte SelectBestEncoding ()
142 foreach (char c
in attrValue
) {
146 return 0x1E; // BMPSTRING
149 return 0x1E; // BMPSTRING
153 return 0x13; // PRINTABLESTRING
157 public class Name
: AttributeTypeAndValue
{
159 public Name () : base ("2.5.4.41", 32768)
164 public class CommonName
: AttributeTypeAndValue
{
166 public CommonName () : base ("2.5.4.3", 64)
171 // RFC2256, Section 5.6
172 public class SerialNumber
: AttributeTypeAndValue
{
174 // max length 64 bytes, Printable String only
175 public SerialNumber ()
176 : base ("2.5.4.5", 64, 0x13)
181 public class LocalityName
: AttributeTypeAndValue
{
183 public LocalityName () : base ("2.5.4.7", 128)
188 public class StateOrProvinceName
: AttributeTypeAndValue
{
190 public StateOrProvinceName () : base ("2.5.4.8", 128)
195 public class OrganizationName
: AttributeTypeAndValue
{
197 public OrganizationName () : base ("2.5.4.10", 64)
202 public class OrganizationalUnitName
: AttributeTypeAndValue
{
204 public OrganizationalUnitName () : base ("2.5.4.11", 64)
209 // NOTE: Not part of RFC2253
210 public class EmailAddress
: AttributeTypeAndValue
{
212 public EmailAddress () : base ("1.2.840.113549.1.9.1", 128, 0x16)
217 // RFC2247, Section 4
218 public class DomainComponent
: AttributeTypeAndValue
{
220 // no maximum length defined
221 public DomainComponent ()
222 : base ("0.9.2342.19200300.100.1.25", Int32
.MaxValue
, 0x16)
227 // RFC1274, Section 9.3.1
228 public class UserId
: AttributeTypeAndValue
{
231 : base ("0.9.2342.19200300.100.1.1", 256)
236 public class Oid
: AttributeTypeAndValue
{
238 public Oid (string oid
)
239 : base (oid
, Int32
.MaxValue
)
244 /* -- Naming attributes of type X520Title
245 * id-at-title AttributeType ::= { id-at 12 }
247 * X520Title ::= CHOICE {
248 * teletexString TeletexString (SIZE (1..ub-title)),
249 * printableString PrintableString (SIZE (1..ub-title)),
250 * universalString UniversalString (SIZE (1..ub-title)),
251 * utf8String UTF8String (SIZE (1..ub-title)),
252 * bmpString BMPString (SIZE (1..ub-title))
255 public class Title
: AttributeTypeAndValue
{
257 public Title () : base ("2.5.4.12", 64)
262 public class CountryName
: AttributeTypeAndValue
{
264 // (0x13) PRINTABLESTRING
265 public CountryName () : base ("2.5.4.6", 2, 0x13)
270 public class DnQualifier
: AttributeTypeAndValue
{
272 // (0x13) PRINTABLESTRING
273 public DnQualifier () : base ("2.5.4.46", 2, 0x13)
278 public class Surname
: AttributeTypeAndValue
{
280 public Surname () : base ("2.5.4.4", 32768)
285 public class GivenName
: AttributeTypeAndValue
{
287 public GivenName () : base ("2.5.4.42", 16)
292 public class Initial
: AttributeTypeAndValue
{
294 public Initial () : base ("2.5.4.43", 5)
302 * -- specifications of Upper Bounds MUST be regarded as mandatory
303 * -- from Annex B of ITU-T X.411 Reference Definition of MTS Parameter
307 * ub-name INTEGER ::= 32768
308 * ub-common-name INTEGER ::= 64
309 * ub-locality-name INTEGER ::= 128
310 * ub-state-name INTEGER ::= 128
311 * ub-organization-name INTEGER ::= 64
312 * ub-organizational-unit-name INTEGER ::= 64
313 * ub-title INTEGER ::= 64
314 * ub-serial-number INTEGER ::= 64
315 * ub-match INTEGER ::= 128
316 * ub-emailaddress-length INTEGER ::= 128
317 * ub-common-name-length INTEGER ::= 64
318 * ub-country-name-alpha-length INTEGER ::= 2
319 * ub-country-name-numeric-length INTEGER ::= 3
320 * ub-domain-defined-attributes INTEGER ::= 4
321 * ub-domain-defined-attribute-type-length INTEGER ::= 8
322 * ub-domain-defined-attribute-value-length INTEGER ::= 128
323 * ub-domain-name-length INTEGER ::= 16
324 * ub-extension-attributes INTEGER ::= 256
325 * ub-e163-4-number-length INTEGER ::= 15
326 * ub-e163-4-sub-address-length INTEGER ::= 40
327 * ub-generation-qualifier-length INTEGER ::= 3
328 * ub-given-name-length INTEGER ::= 16
329 * ub-initials-length INTEGER ::= 5
330 * ub-integer-options INTEGER ::= 256
331 * ub-numeric-user-id-length INTEGER ::= 32
332 * ub-organization-name-length INTEGER ::= 64
333 * ub-organizational-unit-name-length INTEGER ::= 32
334 * ub-organizational-units INTEGER ::= 4
335 * ub-pds-name-length INTEGER ::= 16
336 * ub-pds-parameter-length INTEGER ::= 30
337 * ub-pds-physical-address-lines INTEGER ::= 6
338 * ub-postal-code-length INTEGER ::= 16
339 * ub-pseudonym INTEGER ::= 128
340 * ub-surname-length INTEGER ::= 40
341 * ub-terminal-id-length INTEGER ::= 24
342 * ub-unformatted-address-length INTEGER ::= 180
343 * ub-x121-address-length INTEGER ::= 16
345 * -- Note - upper bounds on string types, such as TeletexString, are
346 * -- measured in characters. Excepting PrintableString or IA5String, a
347 * -- significantly greater number of octets will be required to hold
348 * -- such a value. As a minimum, 16 octets, or twice the specified
349 * -- upper bound, whichever is the larger, should be allowed for
350 * -- TeletexString. For UTF8String or UniversalString at least four
351 * -- times the upper bound should be allowed.