Initial Commit
This commit is contained in:
178
iTechSharp/srcbc/asn1/x509/sigi/NameOrPseudonym.cs
Normal file
178
iTechSharp/srcbc/asn1/x509/sigi/NameOrPseudonym.cs
Normal file
@@ -0,0 +1,178 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
|
||||
using Org.BouncyCastle.Asn1.X500;
|
||||
|
||||
namespace Org.BouncyCastle.Asn1.X509.SigI
|
||||
{
|
||||
/**
|
||||
* Structure for a name or pseudonym.
|
||||
*
|
||||
* <pre>
|
||||
* NameOrPseudonym ::= CHOICE {
|
||||
* surAndGivenName SEQUENCE {
|
||||
* surName DirectoryString,
|
||||
* givenName SEQUENCE OF DirectoryString
|
||||
* },
|
||||
* pseudonym DirectoryString
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @see org.bouncycastle.asn1.x509.sigi.PersonalData
|
||||
*
|
||||
*/
|
||||
public class NameOrPseudonym
|
||||
: Asn1Encodable
|
||||
//, Asn1Choice
|
||||
{
|
||||
private readonly DirectoryString pseudonym;
|
||||
private readonly DirectoryString surname;
|
||||
private readonly Asn1Sequence givenName;
|
||||
|
||||
public static NameOrPseudonym GetInstance(
|
||||
object obj)
|
||||
{
|
||||
if (obj == null || obj is NameOrPseudonym)
|
||||
{
|
||||
return (NameOrPseudonym)obj;
|
||||
}
|
||||
|
||||
if (obj is IAsn1String)
|
||||
{
|
||||
return new NameOrPseudonym(DirectoryString.GetInstance(obj));
|
||||
}
|
||||
|
||||
if (obj is Asn1Sequence)
|
||||
{
|
||||
return new NameOrPseudonym((Asn1Sequence) obj);
|
||||
}
|
||||
|
||||
throw new ArgumentException("unknown object in factory: " + obj.GetType().Name, "obj");
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor from DERString.
|
||||
* <p/>
|
||||
* The sequence is of type NameOrPseudonym:
|
||||
* <p/>
|
||||
* <pre>
|
||||
* NameOrPseudonym ::= CHOICE {
|
||||
* surAndGivenName SEQUENCE {
|
||||
* surName DirectoryString,
|
||||
* givenName SEQUENCE OF DirectoryString
|
||||
* },
|
||||
* pseudonym DirectoryString
|
||||
* }
|
||||
* </pre>
|
||||
* @param pseudonym pseudonym value to use.
|
||||
*/
|
||||
public NameOrPseudonym(
|
||||
DirectoryString pseudonym)
|
||||
{
|
||||
this.pseudonym = pseudonym;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor from Asn1Sequence.
|
||||
* <p/>
|
||||
* The sequence is of type NameOrPseudonym:
|
||||
* <p/>
|
||||
* <pre>
|
||||
* NameOrPseudonym ::= CHOICE {
|
||||
* surAndGivenName SEQUENCE {
|
||||
* surName DirectoryString,
|
||||
* givenName SEQUENCE OF DirectoryString
|
||||
* },
|
||||
* pseudonym DirectoryString
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @param seq The ASN.1 sequence.
|
||||
*/
|
||||
private NameOrPseudonym(
|
||||
Asn1Sequence seq)
|
||||
{
|
||||
if (seq.Count != 2)
|
||||
throw new ArgumentException("Bad sequence size: " + seq.Count);
|
||||
|
||||
if (!(seq[0] is IAsn1String))
|
||||
throw new ArgumentException("Bad object encountered: " + seq[0].GetType().Name);
|
||||
|
||||
surname = DirectoryString.GetInstance(seq[0]);
|
||||
givenName = Asn1Sequence.GetInstance(seq[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor from a given details.
|
||||
*
|
||||
* @param pseudonym The pseudonym.
|
||||
*/
|
||||
public NameOrPseudonym(
|
||||
string pseudonym)
|
||||
: this(new DirectoryString(pseudonym))
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor from a given details.
|
||||
*
|
||||
* @param surname The surname.
|
||||
* @param givenName A sequence of directory strings making up the givenName
|
||||
*/
|
||||
public NameOrPseudonym(
|
||||
DirectoryString surname,
|
||||
Asn1Sequence givenName)
|
||||
{
|
||||
this.surname = surname;
|
||||
this.givenName = givenName;
|
||||
}
|
||||
|
||||
public DirectoryString Pseudonym
|
||||
{
|
||||
get { return pseudonym; }
|
||||
}
|
||||
|
||||
public DirectoryString Surname
|
||||
{
|
||||
get { return surname; }
|
||||
}
|
||||
|
||||
public DirectoryString[] GetGivenName()
|
||||
{
|
||||
DirectoryString[] items = new DirectoryString[givenName.Count];
|
||||
int count = 0;
|
||||
foreach (object o in givenName)
|
||||
{
|
||||
items[count++] = DirectoryString.GetInstance(o);
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Produce an object suitable for an Asn1OutputStream.
|
||||
* <p/>
|
||||
* Returns:
|
||||
* <p/>
|
||||
* <pre>
|
||||
* NameOrPseudonym ::= CHOICE {
|
||||
* surAndGivenName SEQUENCE {
|
||||
* surName DirectoryString,
|
||||
* givenName SEQUENCE OF DirectoryString
|
||||
* },
|
||||
* pseudonym DirectoryString
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @return an Asn1Object
|
||||
*/
|
||||
public override Asn1Object ToAsn1Object()
|
||||
{
|
||||
if (pseudonym != null)
|
||||
{
|
||||
return pseudonym.ToAsn1Object();
|
||||
}
|
||||
|
||||
return new DerSequence(surname, givenName);
|
||||
}
|
||||
}
|
||||
}
|
210
iTechSharp/srcbc/asn1/x509/sigi/PersonalData.cs
Normal file
210
iTechSharp/srcbc/asn1/x509/sigi/PersonalData.cs
Normal file
@@ -0,0 +1,210 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
|
||||
using Org.BouncyCastle.Asn1.X500;
|
||||
using Org.BouncyCastle.Math;
|
||||
|
||||
namespace Org.BouncyCastle.Asn1.X509.SigI
|
||||
{
|
||||
/**
|
||||
* Contains personal data for the otherName field in the subjectAltNames
|
||||
* extension.
|
||||
* <p/>
|
||||
* <pre>
|
||||
* PersonalData ::= SEQUENCE {
|
||||
* nameOrPseudonym NameOrPseudonym,
|
||||
* nameDistinguisher [0] INTEGER OPTIONAL,
|
||||
* dateOfBirth [1] GeneralizedTime OPTIONAL,
|
||||
* placeOfBirth [2] DirectoryString OPTIONAL,
|
||||
* gender [3] PrintableString OPTIONAL,
|
||||
* postalAddress [4] DirectoryString OPTIONAL
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @see org.bouncycastle.asn1.x509.sigi.NameOrPseudonym
|
||||
* @see org.bouncycastle.asn1.x509.sigi.SigIObjectIdentifiers
|
||||
*/
|
||||
public class PersonalData
|
||||
: Asn1Encodable
|
||||
{
|
||||
private readonly NameOrPseudonym nameOrPseudonym;
|
||||
private readonly BigInteger nameDistinguisher;
|
||||
private readonly DerGeneralizedTime dateOfBirth;
|
||||
private readonly DirectoryString placeOfBirth;
|
||||
private readonly string gender;
|
||||
private readonly DirectoryString postalAddress;
|
||||
|
||||
public static PersonalData GetInstance(
|
||||
object obj)
|
||||
{
|
||||
if (obj == null || obj is PersonalData)
|
||||
{
|
||||
return (PersonalData) obj;
|
||||
}
|
||||
|
||||
if (obj is Asn1Sequence)
|
||||
{
|
||||
return new PersonalData((Asn1Sequence) obj);
|
||||
}
|
||||
|
||||
throw new ArgumentException("unknown object in factory: " + obj.GetType().Name, "obj");
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor from Asn1Sequence.
|
||||
* <p/>
|
||||
* The sequence is of type NameOrPseudonym:
|
||||
* <p/>
|
||||
* <pre>
|
||||
* PersonalData ::= SEQUENCE {
|
||||
* nameOrPseudonym NameOrPseudonym,
|
||||
* nameDistinguisher [0] INTEGER OPTIONAL,
|
||||
* dateOfBirth [1] GeneralizedTime OPTIONAL,
|
||||
* placeOfBirth [2] DirectoryString OPTIONAL,
|
||||
* gender [3] PrintableString OPTIONAL,
|
||||
* postalAddress [4] DirectoryString OPTIONAL
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @param seq The ASN.1 sequence.
|
||||
*/
|
||||
private PersonalData(
|
||||
Asn1Sequence seq)
|
||||
{
|
||||
if (seq.Count < 1)
|
||||
throw new ArgumentException("Bad sequence size: " + seq.Count);
|
||||
|
||||
IEnumerator e = seq.GetEnumerator();
|
||||
e.MoveNext();
|
||||
|
||||
nameOrPseudonym = NameOrPseudonym.GetInstance(e.Current);
|
||||
|
||||
while (e.MoveNext())
|
||||
{
|
||||
Asn1TaggedObject o = Asn1TaggedObject.GetInstance(e.Current);
|
||||
int tag = o.TagNo;
|
||||
switch (tag)
|
||||
{
|
||||
case 0:
|
||||
nameDistinguisher = DerInteger.GetInstance(o, false).Value;
|
||||
break;
|
||||
case 1:
|
||||
dateOfBirth = DerGeneralizedTime.GetInstance(o, false);
|
||||
break;
|
||||
case 2:
|
||||
placeOfBirth = DirectoryString.GetInstance(o, true);
|
||||
break;
|
||||
case 3:
|
||||
gender = DerPrintableString.GetInstance(o, false).GetString();
|
||||
break;
|
||||
case 4:
|
||||
postalAddress = DirectoryString.GetInstance(o, true);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentException("Bad tag number: " + o.TagNo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor from a given details.
|
||||
*
|
||||
* @param nameOrPseudonym Name or pseudonym.
|
||||
* @param nameDistinguisher Name distinguisher.
|
||||
* @param dateOfBirth Date of birth.
|
||||
* @param placeOfBirth Place of birth.
|
||||
* @param gender Gender.
|
||||
* @param postalAddress Postal Address.
|
||||
*/
|
||||
public PersonalData(
|
||||
NameOrPseudonym nameOrPseudonym,
|
||||
BigInteger nameDistinguisher,
|
||||
DerGeneralizedTime dateOfBirth,
|
||||
DirectoryString placeOfBirth,
|
||||
string gender,
|
||||
DirectoryString postalAddress)
|
||||
{
|
||||
this.nameOrPseudonym = nameOrPseudonym;
|
||||
this.dateOfBirth = dateOfBirth;
|
||||
this.gender = gender;
|
||||
this.nameDistinguisher = nameDistinguisher;
|
||||
this.postalAddress = postalAddress;
|
||||
this.placeOfBirth = placeOfBirth;
|
||||
}
|
||||
|
||||
public NameOrPseudonym NameOrPseudonym
|
||||
{
|
||||
get { return nameOrPseudonym; }
|
||||
}
|
||||
|
||||
public BigInteger NameDistinguisher
|
||||
{
|
||||
get { return nameDistinguisher; }
|
||||
}
|
||||
|
||||
public DerGeneralizedTime DateOfBirth
|
||||
{
|
||||
get { return dateOfBirth; }
|
||||
}
|
||||
|
||||
public DirectoryString PlaceOfBirth
|
||||
{
|
||||
get { return placeOfBirth; }
|
||||
}
|
||||
|
||||
public string Gender
|
||||
{
|
||||
get { return gender; }
|
||||
}
|
||||
|
||||
public DirectoryString PostalAddress
|
||||
{
|
||||
get { return postalAddress; }
|
||||
}
|
||||
|
||||
/**
|
||||
* Produce an object suitable for an Asn1OutputStream.
|
||||
* <p/>
|
||||
* Returns:
|
||||
* <p/>
|
||||
* <pre>
|
||||
* PersonalData ::= SEQUENCE {
|
||||
* nameOrPseudonym NameOrPseudonym,
|
||||
* nameDistinguisher [0] INTEGER OPTIONAL,
|
||||
* dateOfBirth [1] GeneralizedTime OPTIONAL,
|
||||
* placeOfBirth [2] DirectoryString OPTIONAL,
|
||||
* gender [3] PrintableString OPTIONAL,
|
||||
* postalAddress [4] DirectoryString OPTIONAL
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @return an Asn1Object
|
||||
*/
|
||||
public override Asn1Object ToAsn1Object()
|
||||
{
|
||||
Asn1EncodableVector vec = new Asn1EncodableVector();
|
||||
vec.Add(nameOrPseudonym);
|
||||
if (nameDistinguisher != null)
|
||||
{
|
||||
vec.Add(new DerTaggedObject(false, 0, new DerInteger(nameDistinguisher)));
|
||||
}
|
||||
if (dateOfBirth != null)
|
||||
{
|
||||
vec.Add(new DerTaggedObject(false, 1, dateOfBirth));
|
||||
}
|
||||
if (placeOfBirth != null)
|
||||
{
|
||||
vec.Add(new DerTaggedObject(true, 2, placeOfBirth));
|
||||
}
|
||||
if (gender != null)
|
||||
{
|
||||
vec.Add(new DerTaggedObject(false, 3, new DerPrintableString(gender, true)));
|
||||
}
|
||||
if (postalAddress != null)
|
||||
{
|
||||
vec.Add(new DerTaggedObject(true, 4, postalAddress));
|
||||
}
|
||||
return new DerSequence(vec);
|
||||
}
|
||||
}
|
||||
}
|
49
iTechSharp/srcbc/asn1/x509/sigi/SigIObjectIdentifiers.cs
Normal file
49
iTechSharp/srcbc/asn1/x509/sigi/SigIObjectIdentifiers.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
|
||||
namespace Org.BouncyCastle.Asn1.X509.SigI
|
||||
{
|
||||
/**
|
||||
* Object Identifiers of SigI specifciation (German Signature Law
|
||||
* Interoperability specification).
|
||||
*/
|
||||
public sealed class SigIObjectIdentifiers
|
||||
{
|
||||
private SigIObjectIdentifiers()
|
||||
{
|
||||
}
|
||||
|
||||
public readonly static DerObjectIdentifier IdSigI = new DerObjectIdentifier("1.3.36.8");
|
||||
|
||||
/**
|
||||
* Key purpose IDs for German SigI (Signature Interoperability
|
||||
* Specification)
|
||||
*/
|
||||
public readonly static DerObjectIdentifier IdSigIKP = new DerObjectIdentifier(IdSigI + ".2");
|
||||
|
||||
/**
|
||||
* Certificate policy IDs for German SigI (Signature Interoperability
|
||||
* Specification)
|
||||
*/
|
||||
public readonly static DerObjectIdentifier IdSigICP = new DerObjectIdentifier(IdSigI + ".1");
|
||||
|
||||
/**
|
||||
* Other Name IDs for German SigI (Signature Interoperability Specification)
|
||||
*/
|
||||
public readonly static DerObjectIdentifier IdSigION = new DerObjectIdentifier(IdSigI + ".4");
|
||||
|
||||
/**
|
||||
* To be used for for the generation of directory service certificates.
|
||||
*/
|
||||
public static readonly DerObjectIdentifier IdSigIKPDirectoryService = new DerObjectIdentifier(IdSigIKP + ".1");
|
||||
|
||||
/**
|
||||
* ID for PersonalData
|
||||
*/
|
||||
public static readonly DerObjectIdentifier IdSigIONPersonalData = new DerObjectIdentifier(IdSigION + ".1");
|
||||
|
||||
/**
|
||||
* Certificate is conform to german signature law.
|
||||
*/
|
||||
public static readonly DerObjectIdentifier IdSigICPSigConform = new DerObjectIdentifier(IdSigICP + ".1");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user