blob: 5cc85cdfbcfe7ff65afc5ed69784c89c701ab2e9 [file] [log] [blame]
package org.bouncycastle.asn1.x509;
import org.bouncycastle.asn1.ASN1Choice;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1String;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DERBMPString;
import org.bouncycastle.asn1.DERIA5String;
import org.bouncycastle.asn1.DERUTF8String;
import org.bouncycastle.asn1.DERVisibleString;
/**
* <code>DisplayText</code> class, used in
* <code>CertificatePolicies</code> X509 V3 extensions (in policy qualifiers).
*
* <p>It stores a string in a chosen encoding.
* <pre>
* DisplayText ::= CHOICE {
* ia5String IA5String (SIZE (1..200)),
* visibleString VisibleString (SIZE (1..200)),
* bmpString BMPString (SIZE (1..200)),
* utf8String UTF8String (SIZE (1..200)) }
* </pre>
* @see PolicyQualifierInfo
* @see PolicyInformation
*/
public class DisplayText
extends ASN1Object
implements ASN1Choice
{
/**
* Constant corresponding to ia5String encoding.
*
*/
public static final int CONTENT_TYPE_IA5STRING = 0;
/**
* Constant corresponding to bmpString encoding.
*
*/
public static final int CONTENT_TYPE_BMPSTRING = 1;
/**
* Constant corresponding to utf8String encoding.
*
*/
public static final int CONTENT_TYPE_UTF8STRING = 2;
/**
* Constant corresponding to visibleString encoding.
*
*/
public static final int CONTENT_TYPE_VISIBLESTRING = 3;
/**
* Describe constant <code>DISPLAY_TEXT_MAXIMUM_SIZE</code> here.
*
*/
public static final int DISPLAY_TEXT_MAXIMUM_SIZE = 200;
int contentType;
ASN1String contents;
/**
* Creates a new <code>DisplayText</code> instance.
*
* @param type the desired encoding type for the text.
* @param text the text to store. Strings longer than 200
* characters are truncated.
*/
public DisplayText(int type, String text)
{
if (text.length() > DISPLAY_TEXT_MAXIMUM_SIZE)
{
// RFC3280 limits these strings to 200 chars
// truncate the string
text = text.substring (0, DISPLAY_TEXT_MAXIMUM_SIZE);
}
contentType = type;
switch (type)
{
case CONTENT_TYPE_IA5STRING:
contents = new DERIA5String(text);
break;
case CONTENT_TYPE_UTF8STRING:
contents = new DERUTF8String(text);
break;
case CONTENT_TYPE_VISIBLESTRING:
contents = new DERVisibleString(text);
break;
case CONTENT_TYPE_BMPSTRING:
contents = new DERBMPString(text);
break;
default:
contents = new DERUTF8String(text);
break;
}
}
/**
* Creates a new <code>DisplayText</code> instance.
*
* @param text the text to encapsulate. Strings longer than 200
* characters are truncated.
*/
public DisplayText(String text)
{
// by default use UTF8String
if (text.length() > DISPLAY_TEXT_MAXIMUM_SIZE)
{
text = text.substring(0, DISPLAY_TEXT_MAXIMUM_SIZE);
}
contentType = CONTENT_TYPE_UTF8STRING;
contents = new DERUTF8String(text);
}
/**
* Creates a new <code>DisplayText</code> instance.
* <p>Useful when reading back a <code>DisplayText</code> class
* from it's ASN1Encodable/DEREncodable form.
*
* @param de a <code>DEREncodable</code> instance.
*/
private DisplayText(ASN1String de)
{
contents = de;
if (de instanceof DERUTF8String)
{
contentType = CONTENT_TYPE_UTF8STRING;
}
else if (de instanceof DERBMPString)
{
contentType = CONTENT_TYPE_BMPSTRING;
}
else if (de instanceof DERIA5String)
{
contentType = CONTENT_TYPE_IA5STRING;
}
else if (de instanceof DERVisibleString)
{
contentType = CONTENT_TYPE_VISIBLESTRING;
}
else
{
throw new IllegalArgumentException("unknown STRING type in DisplayText");
}
}
public static DisplayText getInstance(Object obj)
{
if (obj instanceof ASN1String)
{
return new DisplayText((ASN1String)obj);
}
else if (obj == null || obj instanceof DisplayText)
{
return (DisplayText)obj;
}
throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
}
public static DisplayText getInstance(
ASN1TaggedObject obj,
boolean explicit)
{
return getInstance(obj.getObject()); // must be explicitly tagged
}
public ASN1Primitive toASN1Primitive()
{
return (ASN1Primitive)contents;
}
/**
* Returns the stored <code>String</code> object.
*
* @return the stored text as a <code>String</code>.
*/
public String getString()
{
return contents.getString();
}
}