annotate src/main/java/christie/blockchain/ECKey.java @ 121:8949d0ecf1f6

refactor Topology
author akahori
date Tue, 11 Dec 2018 15:46:09 +0900
parents eab161e557bd
children 0ef25958ac04
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
110
eab161e557bd fix Refactor
akahori
parents:
diff changeset
1 package christie.blockchain;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
2
eab161e557bd fix Refactor
akahori
parents:
diff changeset
3 import org.bouncycastle.asn1.sec.SECNamedCurves;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
4 import org.bouncycastle.asn1.x9.X9ECParameters;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
5 import org.bouncycastle.crypto.params.ECDomainParameters;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
6 import org.bouncycastle.jce.provider.BouncyCastleProvider;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
7 import org.bouncycastle.jce.spec.ECParameterSpec;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
8 import org.bouncycastle.math.ec.ECPoint;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
9
eab161e557bd fix Refactor
akahori
parents:
diff changeset
10 import java.math.BigInteger;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
11 import java.security.*;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
12 import java.security.interfaces.ECPublicKey;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
13 import java.security.spec.ECGenParameterSpec;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
14
eab161e557bd fix Refactor
akahori
parents:
diff changeset
15
eab161e557bd fix Refactor
akahori
parents:
diff changeset
16 public class ECKey {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
17
eab161e557bd fix Refactor
akahori
parents:
diff changeset
18 public static final ECDomainParameters CURVE;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
19 public static final ECParameterSpec CURVE_SPEC;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
20
eab161e557bd fix Refactor
akahori
parents:
diff changeset
21 public static final BigInteger HALF_CURVE_ORDER;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
22 private static final SecureRandom secureRandom;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
23
eab161e557bd fix Refactor
akahori
parents:
diff changeset
24 private final PrivateKey privateKey;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
25 private final PublicKey publicKey;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
26 private final Provider provider;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
27
eab161e557bd fix Refactor
akahori
parents:
diff changeset
28 static {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
29 X9ECParameters params = SECNamedCurves.getByName("secp256k1");
eab161e557bd fix Refactor
akahori
parents:
diff changeset
30 CURVE = new ECDomainParameters(params.getCurve(), params.getG(), params.getN(), params.getH());
eab161e557bd fix Refactor
akahori
parents:
diff changeset
31 CURVE_SPEC = new ECParameterSpec(params.getCurve(), params.getG(), params.getN(), params.getH());
eab161e557bd fix Refactor
akahori
parents:
diff changeset
32 HALF_CURVE_ORDER = params.getN().shiftRight(1);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
33 secureRandom = new SecureRandom();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
34 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
35
eab161e557bd fix Refactor
akahori
parents:
diff changeset
36 public ECKey() {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
37 this(secureRandom);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
38 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
39
eab161e557bd fix Refactor
akahori
parents:
diff changeset
40 public ECKey(SecureRandom secureRandom) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
41 this(new BouncyCastleProvider(), secureRandom);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
42 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
43
eab161e557bd fix Refactor
akahori
parents:
diff changeset
44
eab161e557bd fix Refactor
akahori
parents:
diff changeset
45 public ECKey(Provider provider, SecureRandom secureRandom) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
46 this.provider = provider;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
47
eab161e557bd fix Refactor
akahori
parents:
diff changeset
48 KeyPairGenerator keyGen;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
49 try {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
50 keyGen = KeyPairGenerator.getInstance("EC");
eab161e557bd fix Refactor
akahori
parents:
diff changeset
51 ECGenParameterSpec SECP256K1_CURVE = new ECGenParameterSpec("secp256k1");
eab161e557bd fix Refactor
akahori
parents:
diff changeset
52 keyGen.initialize(SECP256K1_CURVE);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
53 } catch (NoSuchAlgorithmException ex) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
54 throw new AssertionError(ex);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
55 } catch (InvalidAlgorithmParameterException ex) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
56 throw new AssertionError(ex);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
57 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
58
eab161e557bd fix Refactor
akahori
parents:
diff changeset
59 KeyPair keyPair = keyGen.generateKeyPair();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
60
eab161e557bd fix Refactor
akahori
parents:
diff changeset
61 this.privateKey = keyPair.getPrivate();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
62 this.publicKey = keyPair.getPublic();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
63
eab161e557bd fix Refactor
akahori
parents:
diff changeset
64 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
65
eab161e557bd fix Refactor
akahori
parents:
diff changeset
66 private static ECPoint extractPublicKey(final ECPublicKey ecPublicKey) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
67 final java.security.spec.ECPoint publicPointW = ecPublicKey.getW();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
68 final BigInteger xCoord = publicPointW.getAffineX();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
69 final BigInteger yCoord = publicPointW.getAffineY();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
70
eab161e557bd fix Refactor
akahori
parents:
diff changeset
71 return CURVE.getCurve().createPoint(xCoord, yCoord);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
72 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
73
eab161e557bd fix Refactor
akahori
parents:
diff changeset
74 public byte[] applyECDSASig(byte[] input) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
75 Signature dsa;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
76 byte[] output;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
77
eab161e557bd fix Refactor
akahori
parents:
diff changeset
78 if (privateKey == null)
eab161e557bd fix Refactor
akahori
parents:
diff changeset
79 throw new RuntimeException();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
80 try {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
81 dsa = Signature.getInstance("ECDSA", "BC");
eab161e557bd fix Refactor
akahori
parents:
diff changeset
82 dsa.initSign(privateKey);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
83 dsa.update(input);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
84 output = dsa.sign();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
85 } catch (Exception e) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
86 throw new RuntimeException(e);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
87 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
88 return output;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
89 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
90
eab161e557bd fix Refactor
akahori
parents:
diff changeset
91 public static boolean verifyECDSASig(byte[] data, byte[] signature, PublicKey publicKey) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
92 try {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
93 Signature ecdsaVerify = Signature.getInstance("ECDSA", "BC");
eab161e557bd fix Refactor
akahori
parents:
diff changeset
94 ecdsaVerify.initVerify(publicKey);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
95 ecdsaVerify.update(data);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
96 return ecdsaVerify.verify(signature);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
97 }catch(Exception e) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
98 throw new RuntimeException(e);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
99 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
100 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
101
eab161e557bd fix Refactor
akahori
parents:
diff changeset
102 }