18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.asn1.sec; 28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger; 48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.util.Enumeration; 58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable; 78212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector; 88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1Object; 98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1OctetString; 108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence; 118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject; 128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERBitString; 138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DEREncodable; 148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERInteger; 158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERObject; 168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DEROctetString; 178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERSequence; 188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERTaggedObject; 198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.util.BigIntegers; 208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom/** 228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * the elliptic curve private key object from SEC 1 238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */ 248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompublic class ECPrivateKeyStructure 258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom extends ASN1Encodable 268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{ 278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private ASN1Sequence seq; 288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public ECPrivateKeyStructure( 308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1Sequence seq) 318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.seq = seq; 338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public ECPrivateKeyStructure( 368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom BigInteger key) 378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom byte[] bytes = BigIntegers.asUnsignedByteArray(key); 398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1EncodableVector v = new ASN1EncodableVector(); 418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom v.add(new DERInteger(1)); 438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom v.add(new DEROctetString(bytes)); 448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom seq = new DERSequence(v); 468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public ECPrivateKeyStructure( 498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom BigInteger key, 508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1Encodable parameters) 518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this(key, null, parameters); 538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public ECPrivateKeyStructure( 568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom BigInteger key, 578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom DERBitString publicKey, 588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1Encodable parameters) 598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom byte[] bytes = BigIntegers.asUnsignedByteArray(key); 618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1EncodableVector v = new ASN1EncodableVector(); 638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom v.add(new DERInteger(1)); 658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom v.add(new DEROctetString(bytes)); 668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (parameters != null) 688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom v.add(new DERTaggedObject(true, 0, parameters)); 708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (publicKey != null) 738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom v.add(new DERTaggedObject(true, 1, publicKey)); 758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom seq = new DERSequence(v); 788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public BigInteger getKey() 818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1OctetString octs = (ASN1OctetString)seq.getObjectAt(1); 838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return new BigInteger(1, octs.getOctets()); 858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public DERBitString getPublicKey() 888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return (DERBitString)getObjectInTag(1); 908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public ASN1Object getParameters() 938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return getObjectInTag(0); 958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private ASN1Object getObjectInTag(int tagNo) 988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom Enumeration e = seq.getObjects(); 1008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom while (e.hasMoreElements()) 1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom DEREncodable obj = (DEREncodable)e.nextElement(); 1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (obj instanceof ASN1TaggedObject) 1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ASN1TaggedObject tag = (ASN1TaggedObject)obj; 1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (tag.getTagNo() == tagNo) 1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return (ASN1Object)((DEREncodable)tag.getObject()).getDERObject(); 1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return null; 1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom /** 1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * ECPrivateKey ::= SEQUENCE { 1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), 1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * privateKey OCTET STRING, 1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * parameters [0] Parameters OPTIONAL, 1228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * publicKey [1] BIT STRING OPTIONAL } 1238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */ 1248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public DERObject toASN1Object() 1258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return seq; 1278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom} 129