Mercurial > hg > Database > Christie
view 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 |
line wrap: on
line source
package christie.blockchain; import org.bouncycastle.asn1.sec.SECNamedCurves; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.params.ECDomainParameters; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECParameterSpec; import org.bouncycastle.math.ec.ECPoint; import java.math.BigInteger; import java.security.*; import java.security.interfaces.ECPublicKey; import java.security.spec.ECGenParameterSpec; public class ECKey { public static final ECDomainParameters CURVE; public static final ECParameterSpec CURVE_SPEC; public static final BigInteger HALF_CURVE_ORDER; private static final SecureRandom secureRandom; private final PrivateKey privateKey; private final PublicKey publicKey; private final Provider provider; static { X9ECParameters params = SECNamedCurves.getByName("secp256k1"); CURVE = new ECDomainParameters(params.getCurve(), params.getG(), params.getN(), params.getH()); CURVE_SPEC = new ECParameterSpec(params.getCurve(), params.getG(), params.getN(), params.getH()); HALF_CURVE_ORDER = params.getN().shiftRight(1); secureRandom = new SecureRandom(); } public ECKey() { this(secureRandom); } public ECKey(SecureRandom secureRandom) { this(new BouncyCastleProvider(), secureRandom); } public ECKey(Provider provider, SecureRandom secureRandom) { this.provider = provider; KeyPairGenerator keyGen; try { keyGen = KeyPairGenerator.getInstance("EC"); ECGenParameterSpec SECP256K1_CURVE = new ECGenParameterSpec("secp256k1"); keyGen.initialize(SECP256K1_CURVE); } catch (NoSuchAlgorithmException ex) { throw new AssertionError(ex); } catch (InvalidAlgorithmParameterException ex) { throw new AssertionError(ex); } KeyPair keyPair = keyGen.generateKeyPair(); this.privateKey = keyPair.getPrivate(); this.publicKey = keyPair.getPublic(); } private static ECPoint extractPublicKey(final ECPublicKey ecPublicKey) { final java.security.spec.ECPoint publicPointW = ecPublicKey.getW(); final BigInteger xCoord = publicPointW.getAffineX(); final BigInteger yCoord = publicPointW.getAffineY(); return CURVE.getCurve().createPoint(xCoord, yCoord); } public byte[] applyECDSASig(byte[] input) { Signature dsa; byte[] output; if (privateKey == null) throw new RuntimeException(); try { dsa = Signature.getInstance("ECDSA", "BC"); dsa.initSign(privateKey); dsa.update(input); output = dsa.sign(); } catch (Exception e) { throw new RuntimeException(e); } return output; } public static boolean verifyECDSASig(byte[] data, byte[] signature, PublicKey publicKey) { try { Signature ecdsaVerify = Signature.getInstance("ECDSA", "BC"); ecdsaVerify.initVerify(publicKey); ecdsaVerify.update(data); return ecdsaVerify.verify(signature); }catch(Exception e) { throw new RuntimeException(e); } } }