1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.pkcs; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.math.BigInteger; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Enumeration; 5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive; 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence; 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject; 12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERSequence; 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/** 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @deprecated use RSAPrivateKey 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class RSAPrivateKeyStructure 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Object 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private int version; 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private BigInteger modulus; 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private BigInteger publicExponent; 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private BigInteger privateExponent; 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private BigInteger prime1; 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private BigInteger prime2; 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private BigInteger exponent1; 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private BigInteger exponent2; 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private BigInteger coefficient; 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private ASN1Sequence otherPrimeInfos = null; 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static RSAPrivateKeyStructure getInstance( 32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return getInstance(ASN1Sequence.getInstance(obj, explicit)); 36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static RSAPrivateKeyStructure getInstance( 39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj instanceof RSAPrivateKeyStructure) 42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (RSAPrivateKeyStructure)obj; 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam else if (obj instanceof ASN1Sequence) 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new RSAPrivateKeyStructure((ASN1Sequence)obj); 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 50c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public RSAPrivateKeyStructure( 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger modulus, 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger publicExponent, 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger privateExponent, 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger prime1, 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger prime2, 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger exponent1, 60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger exponent2, 61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger coefficient) 62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.version = 0; 64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.modulus = modulus; 65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.publicExponent = publicExponent; 66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.privateExponent = privateExponent; 67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.prime1 = prime1; 68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.prime2 = prime2; 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.exponent1 = exponent1; 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.exponent2 = exponent2; 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.coefficient = coefficient; 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public RSAPrivateKeyStructure( 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1Sequence seq) 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Enumeration e = seq.getObjects(); 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom BigInteger v = ((ASN1Integer)e.nextElement()).getValue(); 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (v.intValue() != 0 && v.intValue() != 1) 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("wrong version for RSA private key"); 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam version = v.intValue(); 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom modulus = ((ASN1Integer)e.nextElement()).getValue(); 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom publicExponent = ((ASN1Integer)e.nextElement()).getValue(); 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom privateExponent = ((ASN1Integer)e.nextElement()).getValue(); 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom prime1 = ((ASN1Integer)e.nextElement()).getValue(); 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom prime2 = ((ASN1Integer)e.nextElement()).getValue(); 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom exponent1 = ((ASN1Integer)e.nextElement()).getValue(); 924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom exponent2 = ((ASN1Integer)e.nextElement()).getValue(); 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom coefficient = ((ASN1Integer)e.nextElement()).getValue(); 94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (e.hasMoreElements()) 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam otherPrimeInfos = (ASN1Sequence)e.nextElement(); 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int getVersion() 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return version; 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getModulus() 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return modulus; 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getPublicExponent() 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return publicExponent; 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getPrivateExponent() 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return privateExponent; 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getPrime1() 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return prime1; 124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getPrime2() 127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return prime2; 129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getExponent1() 132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return exponent1; 134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getExponent2() 137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return exponent2; 139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getCoefficient() 142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return coefficient; 144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * This outputs the key in PKCS1v2 format. 148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <pre> 149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * RSAPrivateKey ::= SEQUENCE { 150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * version Version, 151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * modulus INTEGER, -- n 152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * publicExponent INTEGER, -- e 153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * privateExponent INTEGER, -- d 154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * prime1 INTEGER, -- p 155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * prime2 INTEGER, -- q 156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * exponent1 INTEGER, -- d mod (p-1) 157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * exponent2 INTEGER, -- d mod (q-1) 158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * coefficient INTEGER, -- (inverse of q) mod p 159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * otherPrimeInfos OtherPrimeInfos OPTIONAL 160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * } 161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 162b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * Version ::= INTEGER { two-prime(0), multi(1) } 163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * (CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --}) 164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * </pre> 165b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <p> 166b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * This routine is written to output PKCS1 version 2.1, private keys. 167b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Primitive toASN1Primitive() 169b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 170b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1EncodableVector v = new ASN1EncodableVector(); 171b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(version)); // version 1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getModulus())); 1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getPublicExponent())); 1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getPrivateExponent())); 1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getPrime1())); 1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getPrime2())); 1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getExponent1())); 1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getExponent2())); 1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getCoefficient())); 181b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 182b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (otherPrimeInfos != null) 183b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 184b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(otherPrimeInfos); 185b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 186b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 187b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new DERSequence(v); 188b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 189b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 190