14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.asn1.pkcs; 24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.math.BigInteger; 44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Enumeration; 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive; 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence; 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject; 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERSequence; 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class RSAPublicKey 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Object 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{ 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private BigInteger modulus; 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private BigInteger publicExponent; 194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public static RSAPublicKey getInstance( 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1TaggedObject obj, 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean explicit) 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return getInstance(ASN1Sequence.getInstance(obj, explicit)); 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public static RSAPublicKey getInstance( 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Object obj) 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (obj instanceof RSAPublicKey) 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return (RSAPublicKey)obj; 334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (obj != null) 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new RSAPublicKey(ASN1Sequence.getInstance(obj)); 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return null; 414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public RSAPublicKey( 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom BigInteger modulus, 454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom BigInteger publicExponent) 464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.modulus = modulus; 484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.publicExponent = publicExponent; 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private RSAPublicKey( 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Sequence seq) 534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (seq.size() != 2) 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IllegalArgumentException("Bad sequence size: " 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom + seq.size()); 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Enumeration e = seq.getObjects(); 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom modulus = ASN1Integer.getInstance(e.nextElement()).getPositiveValue(); 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom publicExponent = ASN1Integer.getInstance(e.nextElement()).getPositiveValue(); 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public BigInteger getModulus() 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return modulus; 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public BigInteger getPublicExponent() 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return publicExponent; 744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom /** 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * This outputs the key in PKCS1v2 format. 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <pre> 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * RSAPublicKey ::= SEQUENCE { 804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * modulus INTEGER, -- n 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * publicExponent INTEGER, -- e 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * } 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * </pre> 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <p> 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Primitive toASN1Primitive() 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1EncodableVector v = new ASN1EncodableVector(); 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getModulus())); 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom v.add(new ASN1Integer(getPublicExponent())); 924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new DERSequence(v); 944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom} 96