1 package org.bouncycastle.asn1.pkcs; 2 3 import java.math.BigInteger; 4 import java.util.Enumeration; 5 6 import org.bouncycastle.asn1.ASN1EncodableVector; 7 import org.bouncycastle.asn1.ASN1Integer; 8 import org.bouncycastle.asn1.ASN1Object; 9 import org.bouncycastle.asn1.ASN1Primitive; 10 import org.bouncycastle.asn1.ASN1Sequence; 11 import org.bouncycastle.asn1.ASN1TaggedObject; 12 import org.bouncycastle.asn1.DERSequence; 13 14 public class RSAPrivateKey 15 extends ASN1Object 16 { 17 private BigInteger version; 18 private BigInteger modulus; 19 private BigInteger publicExponent; 20 private BigInteger privateExponent; 21 private BigInteger prime1; 22 private BigInteger prime2; 23 private BigInteger exponent1; 24 private BigInteger exponent2; 25 private BigInteger coefficient; 26 private ASN1Sequence otherPrimeInfos = null; 27 getInstance( ASN1TaggedObject obj, boolean explicit)28 public static RSAPrivateKey getInstance( 29 ASN1TaggedObject obj, 30 boolean explicit) 31 { 32 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 33 } 34 getInstance( Object obj)35 public static RSAPrivateKey getInstance( 36 Object obj) 37 { 38 if (obj instanceof RSAPrivateKey) 39 { 40 return (RSAPrivateKey)obj; 41 } 42 43 if (obj != null) 44 { 45 return new RSAPrivateKey(ASN1Sequence.getInstance(obj)); 46 } 47 48 return null; 49 } 50 RSAPrivateKey( BigInteger modulus, BigInteger publicExponent, BigInteger privateExponent, BigInteger prime1, BigInteger prime2, BigInteger exponent1, BigInteger exponent2, BigInteger coefficient)51 public RSAPrivateKey( 52 BigInteger modulus, 53 BigInteger publicExponent, 54 BigInteger privateExponent, 55 BigInteger prime1, 56 BigInteger prime2, 57 BigInteger exponent1, 58 BigInteger exponent2, 59 BigInteger coefficient) 60 { 61 this.version = BigInteger.valueOf(0); 62 this.modulus = modulus; 63 this.publicExponent = publicExponent; 64 this.privateExponent = privateExponent; 65 this.prime1 = prime1; 66 this.prime2 = prime2; 67 this.exponent1 = exponent1; 68 this.exponent2 = exponent2; 69 this.coefficient = coefficient; 70 } 71 RSAPrivateKey( ASN1Sequence seq)72 private RSAPrivateKey( 73 ASN1Sequence seq) 74 { 75 Enumeration e = seq.getObjects(); 76 77 ASN1Integer v = (ASN1Integer)e.nextElement(); 78 int versionValue = v.intValueExact(); 79 if (versionValue < 0 || versionValue > 1) 80 { 81 throw new IllegalArgumentException("wrong version for RSA private key"); 82 } 83 84 version = v.getValue(); 85 modulus = ((ASN1Integer)e.nextElement()).getValue(); 86 publicExponent = ((ASN1Integer)e.nextElement()).getValue(); 87 privateExponent = ((ASN1Integer)e.nextElement()).getValue(); 88 prime1 = ((ASN1Integer)e.nextElement()).getValue(); 89 prime2 = ((ASN1Integer)e.nextElement()).getValue(); 90 exponent1 = ((ASN1Integer)e.nextElement()).getValue(); 91 exponent2 = ((ASN1Integer)e.nextElement()).getValue(); 92 coefficient = ((ASN1Integer)e.nextElement()).getValue(); 93 94 if (e.hasMoreElements()) 95 { 96 otherPrimeInfos = (ASN1Sequence)e.nextElement(); 97 } 98 } 99 getVersion()100 public BigInteger getVersion() 101 { 102 return version; 103 } 104 getModulus()105 public BigInteger getModulus() 106 { 107 return modulus; 108 } 109 getPublicExponent()110 public BigInteger getPublicExponent() 111 { 112 return publicExponent; 113 } 114 getPrivateExponent()115 public BigInteger getPrivateExponent() 116 { 117 return privateExponent; 118 } 119 getPrime1()120 public BigInteger getPrime1() 121 { 122 return prime1; 123 } 124 getPrime2()125 public BigInteger getPrime2() 126 { 127 return prime2; 128 } 129 getExponent1()130 public BigInteger getExponent1() 131 { 132 return exponent1; 133 } 134 getExponent2()135 public BigInteger getExponent2() 136 { 137 return exponent2; 138 } 139 getCoefficient()140 public BigInteger getCoefficient() 141 { 142 return coefficient; 143 } 144 145 /** 146 * This outputs the key in PKCS1v2 format. 147 * <pre> 148 * RSAPrivateKey ::= SEQUENCE { 149 * version Version, 150 * modulus INTEGER, -- n 151 * publicExponent INTEGER, -- e 152 * privateExponent INTEGER, -- d 153 * prime1 INTEGER, -- p 154 * prime2 INTEGER, -- q 155 * exponent1 INTEGER, -- d mod (p-1) 156 * exponent2 INTEGER, -- d mod (q-1) 157 * coefficient INTEGER, -- (inverse of q) mod p 158 * otherPrimeInfos OtherPrimeInfos OPTIONAL 159 * } 160 * 161 * Version ::= INTEGER { two-prime(0), multi(1) } 162 * (CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --}) 163 * </pre> 164 * <p> 165 * This routine is written to output PKCS1 version 2.1, private keys. 166 */ toASN1Primitive()167 public ASN1Primitive toASN1Primitive() 168 { 169 ASN1EncodableVector v = new ASN1EncodableVector(10); 170 171 v.add(new ASN1Integer(version)); // version 172 v.add(new ASN1Integer(getModulus())); 173 v.add(new ASN1Integer(getPublicExponent())); 174 v.add(new ASN1Integer(getPrivateExponent())); 175 v.add(new ASN1Integer(getPrime1())); 176 v.add(new ASN1Integer(getPrime2())); 177 v.add(new ASN1Integer(getExponent1())); 178 v.add(new ASN1Integer(getExponent2())); 179 v.add(new ASN1Integer(getCoefficient())); 180 181 if (otherPrimeInfos != null) 182 { 183 v.add(otherPrimeInfos); 184 } 185 186 return new DERSequence(v); 187 } 188 } 189