001: // CMP implementation copyright (c) 2003 NOVOSEC AG (http://www.novosec.com)
002: //
003: // Author: Maik Stohn
004: //
005: // Permission is hereby granted, free of charge, to any person obtaining a copy of this
006: // software and associated documentation files (the "Software"), to deal in the Software
007: // without restriction, including without limitation the rights to use, copy, modify, merge,
008: // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
009: // to whom the Software is furnished to do so, subject to the following conditions:
010: //
011: // The above copyright notice and this permission notice shall be included in all copies or
012: // substantial portions of the Software.
013: //
014: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
015: // BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
016: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
017: // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
018: // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
019:
020: package com.novosec.pkix.asn1.crmf;
021:
022: import org.bouncycastle.asn1.ASN1TaggedObject;
023: import org.bouncycastle.asn1.DEREncodable;
024: import org.bouncycastle.asn1.DERObject;
025: import org.bouncycastle.asn1.DERTaggedObject;
026: import org.bouncycastle.asn1.cms.EnvelopedData;
027:
028: /**
029: * ASN.1 structure DER En/DeCoder.
030: *
031: * <pre>
032: *
033: * EncryptedKey ::= CHOICE {
034: * encryptedValue EncryptedValue,
035: * envelopedData [0] EnvelopedData } -- The encrypted private key MUST be placed in the envelopedData encryptedContentInfo encryptedContent OCTET STRING.
036: *
037: * </pre>
038: */
039: public class EncryptedKey implements DEREncodable {
040: public static final int TAGNO_ENV_DATA = 0;
041: public static final int TAGNO_ENC_VALUE = 1;
042:
043: private int tagNo = -1;
044: private DEREncodable obj = null;
045: private EncryptedValue encryptedValue = null;
046:
047: public static EncryptedKey getInstance(DEREncodable derObj) {
048: if (derObj instanceof EnvelopedData)
049: return new EncryptedKey((EnvelopedData) derObj);
050: else if (derObj instanceof EncryptedValue)
051: return new EncryptedKey((EncryptedValue) derObj);
052: else if (derObj instanceof ASN1TaggedObject)
053: return getInstance((ASN1TaggedObject) derObj, false);
054: else
055: return new EncryptedKey(EncryptedValue.getInstance(derObj)); // last try ;-)
056: }
057:
058: public static EncryptedKey getInstance(ASN1TaggedObject tagObj,
059: boolean explicit) {
060: int tag = (tagObj == null ? -1 : tagObj.getTagNo());
061: switch (tag) {
062: case TAGNO_ENV_DATA:
063: return new EncryptedKey(EnvelopedData.getInstance(tagObj,
064: explicit));
065: default:
066: return new EncryptedKey(EncryptedValue.getInstance(tagObj,
067: explicit));
068: }
069: }
070:
071: public EncryptedKey(DEREncodable derObj, int tag) {
072: this .tagNo = tag;
073:
074: if (derObj instanceof EnvelopedData)
075: this .obj = (EnvelopedData) derObj;
076: else if (derObj instanceof EncryptedValue)
077: this .encryptedValue = (EncryptedValue) derObj;
078: else {
079: switch (this .tagNo) {
080: case TAGNO_ENV_DATA:
081: this .obj = EnvelopedData.getInstance(derObj);
082: break;
083: default:
084: this .encryptedValue = EncryptedValue
085: .getInstance(derObj);
086: break;
087: }
088: }
089: }
090:
091: public EncryptedKey(EnvelopedData envelopedData) {
092: this (envelopedData, TAGNO_ENV_DATA);
093: }
094:
095: public EncryptedKey(EncryptedValue encryptedValue) {
096: this (encryptedValue, TAGNO_ENC_VALUE);
097: }
098:
099: public void setEncryptedValue(EncryptedValue value) {
100: encryptedValue = value;
101: }
102:
103: public EncryptedValue getEncryptedValue() {
104: return encryptedValue;
105: }
106:
107: public void setTagNo(int tn) {
108: this .tagNo = tn;
109: }
110:
111: public int getTagNo() {
112: return this .tagNo;
113: }
114:
115: public EnvelopedData getEnvelopedData() {
116: return EnvelopedData.getInstance(obj);
117: }
118:
119: public DERObject getDERObject() {
120: if (this .encryptedValue != null)
121: return encryptedValue.getDERObject();
122: else if (this .obj != null)
123: return new DERTaggedObject(true, this .tagNo, this .obj); // choice is allways explictly tagged
124: else
125: return null;
126: }
127:
128: public String toString() {
129: StringBuffer sb = new StringBuffer(this .getClass().getName());
130: sb.append(" (");
131:
132: sb.append("tagNo: " + this .tagNo + ", ");
133:
134: if (this .encryptedValue != null)
135: sb.append("encryptedValue: " + this .encryptedValue + ", ");
136:
137: if (this .obj != null) {
138: sb.append("envelopedData: " + this .obj + ", ");
139: }
140:
141: sb.append("hashCode: " + Integer.toHexString(this .hashCode())
142: + ")");
143: return sb.toString();
144: }
145: }
|