Refine search
@Override public String getAlgorithm() { return this.getKey().getAlgorithm();
@Override public byte[] getEncoded() { return this.getKey().getEncoded();
return (T) new ECPublicKeySpec(ecKey.getW(), ecKey.getParams());
} else if (key instanceof PublicKey && ECPublicKeySpec.class.isAssignableFrom(keySpec)) {
final byte[] encoded = key.getEncoded();
return (T) new ECPublicKeySpec(ecKey.getW(), ecKey.getParams());
} else if (key instanceof ECPrivateKey
&& ECPrivateKeySpec.class.isAssignableFrom(keySpec)) {
ECPrivateKey ecKey = (ECPrivateKey) key;
return (T) new ECPrivateKeySpec(ecKey.getS(), ecKey.getParams());
} else if (key instanceof PrivateKey && ECPrivateKeySpec.class.isAssignableFrom(keySpec)) {
final byte[] encoded = key.getEncoded();
return (T) new ECPrivateKeySpec(ecKey.getS(), ecKey.getParams());
} else if (key instanceof PrivateKey
&& PKCS8EncodedKeySpec.class.isAssignableFrom(keySpec)) {
public void init(int key_size) throws Exception {
String name=null;
if(key_size==256) name="secp256r1";
else if(key_size==384) name="secp384r1";
else if(key_size==521) name="secp521r1";
else throw new JSchException("unsupported key size: "+key_size);
for(int i = 0; i<1000; i++) {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec ecsp = new ECGenParameterSpec(name);
kpg.initialize(ecsp);
KeyPair kp = kpg.genKeyPair();
prvKey = (ECPrivateKey)kp.getPrivate();
pubKey = (ECPublicKey)kp.getPublic();
params=pubKey.getParams();
d=((ECPrivateKey)prvKey).getS().toByteArray();
ECPoint w = pubKey.getW();
r = w.getAffineX().toByteArray();
s = w.getAffineY().toByteArray();
if(r.length!=s.length) continue;
if(key_size==256 && r.length==32) break;
if(key_size==384 && r.length==48) break;
if(key_size==521 && r.length==66) break;
if(d.length<r.length){
d=insert0(d);
public byte[] getD(){return d;}
public BCECPrivateKey(
ECPrivateKey key,
ProviderConfiguration configuration)
this.d = key.getS();
this.algorithm = key.getAlgorithm();
this.ecSpec = key.getParams();
this.configuration = configuration;
/**
* Checks that the public key's params is the same as the private key's params, and the public key
* is a valid point on the private key's curve.
* @since 1.1.0
public static void validatePublicKey(ECPublicKey publicKey, ECPrivateKey privateKey)
throws GeneralSecurityException {
validatePublicKeySpec(publicKey, privateKey);
checkPointOnCurve(publicKey.getW(), privateKey.getParams().getCurve());
@Override public BigInteger getS() { return this.getKey().getS();
AlgorithmParameterSpec spec = k.getParams();
SigType type;
if (spec.equals(SigType.ECDSA_SHA256_P256.getParams()))
if (k.getParams() != null)
return new java.security.spec.ECPublicKeySpec(k.getW(), k.getParams());
if (k.getParams() != null)
return new java.security.spec.ECPrivateKeySpec(k.getS(), k.getParams());
return
new java.security.spec.ECPrivateKeySpec(k.getS(), EC5Util.convertSpec(EC5Util.convertCurve(implicitSpec.getCurve(), implicitSpec.getSeed()), implicitSpec));
if (k.getParams() != null)
return new com.bugvm.bouncycastle.jce.spec.ECPrivateKeySpec(k.getS(), EC5Util.convertSpec(k.getParams(), false));
return new com.bugvm.bouncycastle.jce.spec.ECPrivateKeySpec(k.getS(), implicitSpec);
public void init(int key_size) throws Exception {
String name=null;
if(key_size==256) name="secp256r1";
else if(key_size==384) name="secp384r1";
else if(key_size==521) name="secp521r1";
else throw new JSchException("unsupported key size: "+key_size);
for(int i = 0; i<1000; i++) {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec ecsp = new ECGenParameterSpec(name);
kpg.initialize(ecsp);
KeyPair kp = kpg.genKeyPair();
prvKey = (ECPrivateKey)kp.getPrivate();
pubKey = (ECPublicKey)kp.getPublic();
params=pubKey.getParams();
d=((ECPrivateKey)prvKey).getS().toByteArray();
ECPoint w = pubKey.getW();
r = w.getAffineX().toByteArray();
s = w.getAffineY().toByteArray();
if(r.length!=s.length) continue;
if(key_size==256 && r.length==32) break;
if(key_size==384 && r.length==48) break;
if(key_size==521 && r.length==66) break;
if(d.length<r.length){
d=insert0(d);
public byte[] getD(){return d;}
public BCECPrivateKey(
ECPrivateKey key,
ProviderConfiguration configuration)
this.d = key.getS();
this.algorithm = key.getAlgorithm();
this.ecSpec = key.getParams();
this.configuration = configuration;
private void checkPointIsOnCurve(ECPublicKey ephemeralPublicKey, ECPrivateKey privateKey) throws JoseException
// to prevent 'Invalid Curve Attack': for NIST curves, check whether public key is on the private key's curve.
// from https://www.cs.bris.ac.uk/Research/CryptographySecurity/RWC/2017/nguyen.quan.pdf
// there appear to be similar checks in the JVM starting with 1.8.0_51 but
// doing it here explicitly seems prudent
// (y^2) mod p = (x^3 + ax + b) mod p
// thanks to Antonio Sanso for guidance on how to do this check
ECParameterSpec ecParameterSpec = privateKey.getParams();
EllipticCurve curve = ecParameterSpec.getCurve();
ECPoint point = ephemeralPublicKey.getW();
BigInteger x = point.getAffineX();
BigInteger y = point.getAffineY();
BigInteger a = curve.getA();
BigInteger b = curve.getB();
BigInteger p = ((ECFieldFp) curve.getField()).getP();
BigInteger leftSide = (y.pow(2)).mod(p);
BigInteger rightSide = (x.pow(
3).add(a.multiply(x)).add(b)).mod(p);
boolean onCurve = leftSide.equals(rightSide);
if (!onCurve)
throw new JoseException(HeaderParameterNames.EPHEMERAL_PUBLIC_KEY + " is invalid for " + EllipticCurves.getName(curve));
public
static SigningPrivateKey fromJavaKey(ECPrivateKey pk, SigType type)
throws GeneralSecurityException {
BigInteger s = pk.getS();
int len = type.getPrivkeyLen();
byte[] bs = rectify(s, len);
return new SigningPrivateKey(type, bs);
static OpenSSLKey wrapPlatformKey(ECPrivateKey ecPrivateKey) throws InvalidKeyException {
OpenSSLECGroupContext group;
try {
group = OpenSSLECGroupContext.getInstance(ecPrivateKey.getParams());
} catch (InvalidAlgorithmParameterException e) {
throw new InvalidKeyException("Unknown group parameters", e);
return wrapPlatformKey(ecPrivateKey, group);
if
(k.getParams() != null)
return new java.security.spec.ECPublicKeySpec(k.getW(), k.getParams());
if (k.getParams() != null)
return new java.security.spec.ECPrivateKeySpec(k.getS(), k.getParams());
return new java.security.spec.ECPrivateKeySpec(k.getS(), EC5Util.convertSpec(EC5Util.convertCurve(implicitSpec.getCurve(), implicitSpec.getSeed()), implicitSpec));
if (k.getParams() != null)
return new org.ripple.bouncycastle.jce.spec.ECPrivateKeySpec(k.getS(), EC5Util.convertSpec(k.getParams(), false));
return new org.ripple.bouncycastle.jce.spec.ECPrivateKeySpec(k.getS(), implicitSpec);