001: package org.bouncycastle.jce.provider;
002:
003: import org.bouncycastle.asn1.ASN1Sequence;
004: import org.bouncycastle.asn1.DEREncodable;
005: import org.bouncycastle.asn1.DERInteger;
006: import org.bouncycastle.asn1.DERObjectIdentifier;
007: import org.bouncycastle.asn1.oiw.ElGamalParameter;
008: import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
009: import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
010: import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
011: import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
012: import org.bouncycastle.jce.interfaces.ElGamalPrivateKey;
013: import org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier;
014: import org.bouncycastle.jce.spec.ElGamalParameterSpec;
015: import org.bouncycastle.jce.spec.ElGamalPrivateKeySpec;
016:
017: import javax.crypto.interfaces.DHPrivateKey;
018: import javax.crypto.spec.DHParameterSpec;
019: import javax.crypto.spec.DHPrivateKeySpec;
020: import java.io.IOException;
021: import java.io.ObjectInputStream;
022: import java.io.ObjectOutputStream;
023: import java.math.BigInteger;
024: import java.util.Enumeration;
025:
026: public class JCEElGamalPrivateKey implements ElGamalPrivateKey,
027: DHPrivateKey, PKCS12BagAttributeCarrier {
028: static final long serialVersionUID = 4819350091141529678L;
029:
030: BigInteger x;
031:
032: ElGamalParameterSpec elSpec;
033:
034: private PKCS12BagAttributeCarrierImpl attrCarrier = new PKCS12BagAttributeCarrierImpl();
035:
036: protected JCEElGamalPrivateKey() {
037: }
038:
039: JCEElGamalPrivateKey(ElGamalPrivateKey key) {
040: this .x = key.getX();
041: this .elSpec = key.getParameters();
042: }
043:
044: JCEElGamalPrivateKey(DHPrivateKey key) {
045: this .x = key.getX();
046: this .elSpec = new ElGamalParameterSpec(key.getParams().getP(),
047: key.getParams().getG());
048: }
049:
050: JCEElGamalPrivateKey(ElGamalPrivateKeySpec spec) {
051: this .x = spec.getX();
052: this .elSpec = new ElGamalParameterSpec(spec.getParams().getP(),
053: spec.getParams().getG());
054: }
055:
056: JCEElGamalPrivateKey(DHPrivateKeySpec spec) {
057: this .x = spec.getX();
058: this .elSpec = new ElGamalParameterSpec(spec.getP(), spec.getG());
059: }
060:
061: JCEElGamalPrivateKey(PrivateKeyInfo info) {
062: ElGamalParameter params = new ElGamalParameter(
063: (ASN1Sequence) info.getAlgorithmId().getParameters());
064: DERInteger derX = (DERInteger) info.getPrivateKey();
065:
066: this .x = derX.getValue();
067: this .elSpec = new ElGamalParameterSpec(params.getP(), params
068: .getG());
069: }
070:
071: JCEElGamalPrivateKey(ElGamalPrivateKeyParameters params) {
072: this .x = params.getX();
073: this .elSpec = new ElGamalParameterSpec(params.getParameters()
074: .getP(), params.getParameters().getG());
075: }
076:
077: public String getAlgorithm() {
078: return "ElGamal";
079: }
080:
081: /**
082: * return the encoding format we produce in getEncoded().
083: *
084: * @return the string "PKCS#8"
085: */
086: public String getFormat() {
087: return "PKCS#8";
088: }
089:
090: /**
091: * Return a PKCS8 representation of the key. The sequence returned
092: * represents a full PrivateKeyInfo object.
093: *
094: * @return a PKCS8 representation of the key.
095: */
096: public byte[] getEncoded() {
097: PrivateKeyInfo info = new PrivateKeyInfo(
098: new AlgorithmIdentifier(
099: OIWObjectIdentifiers.elGamalAlgorithm,
100: new ElGamalParameter(elSpec.getP(), elSpec
101: .getG()).getDERObject()),
102: new DERInteger(getX()));
103:
104: return info.getDEREncoded();
105: }
106:
107: public ElGamalParameterSpec getParameters() {
108: return elSpec;
109: }
110:
111: public DHParameterSpec getParams() {
112: return new DHParameterSpec(elSpec.getP(), elSpec.getG());
113: }
114:
115: public BigInteger getX() {
116: return x;
117: }
118:
119: private void readObject(ObjectInputStream in) throws IOException,
120: ClassNotFoundException {
121: x = (BigInteger) in.readObject();
122:
123: this .elSpec = new ElGamalParameterSpec((BigInteger) in
124: .readObject(), (BigInteger) in.readObject());
125: }
126:
127: private void writeObject(ObjectOutputStream out) throws IOException {
128: out.writeObject(this .getX());
129: out.writeObject(elSpec.getP());
130: out.writeObject(elSpec.getG());
131: }
132:
133: public void setBagAttribute(DERObjectIdentifier oid,
134: DEREncodable attribute) {
135: attrCarrier.setBagAttribute(oid, attribute);
136: }
137:
138: public DEREncodable getBagAttribute(DERObjectIdentifier oid) {
139: return attrCarrier.getBagAttribute(oid);
140: }
141:
142: public Enumeration getBagAttributeKeys() {
143: return attrCarrier.getBagAttributeKeys();
144: }
145: }
|