📄 jceecpublickey.java
字号:
package org.bouncycastle.jce.provider;import org.bouncycastle.asn1.ASN1Encodable;import org.bouncycastle.asn1.ASN1Object;import org.bouncycastle.asn1.ASN1OctetString;import org.bouncycastle.asn1.ASN1Sequence;import org.bouncycastle.asn1.DERBitString;import org.bouncycastle.asn1.DERNull;import org.bouncycastle.asn1.DERObject;import org.bouncycastle.asn1.DERObjectIdentifier;import org.bouncycastle.asn1.DEROctetString;import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;import org.bouncycastle.asn1.cryptopro.GOST3410PublicKeyAlgParameters;import org.bouncycastle.asn1.x509.AlgorithmIdentifier;import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;import org.bouncycastle.asn1.x9.X962Parameters;import org.bouncycastle.asn1.x9.X9ECParameters;import org.bouncycastle.asn1.x9.X9ECPoint;import org.bouncycastle.asn1.x9.X9IntegerConverter;import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;import org.bouncycastle.crypto.params.ECDomainParameters;import org.bouncycastle.crypto.params.ECPublicKeyParameters;import org.bouncycastle.jce.ECGOST3410NamedCurveTable;import org.bouncycastle.jce.provider.asymmetric.ec.EC5Util;import org.bouncycastle.jce.provider.asymmetric.ec.ECUtil;import org.bouncycastle.jce.interfaces.ECPointEncoder;import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;import org.bouncycastle.jce.spec.ECNamedCurveSpec;import org.bouncycastle.math.ec.ECCurve;import java.io.IOException;import java.math.BigInteger;import java.security.interfaces.ECPublicKey;import java.security.spec.ECParameterSpec;import java.security.spec.ECPoint;import java.security.spec.ECPublicKeySpec;import java.security.spec.EllipticCurve;public class JCEECPublicKey implements ECPublicKey, org.bouncycastle.jce.interfaces.ECPublicKey, ECPointEncoder{ private String algorithm = "EC"; private org.bouncycastle.math.ec.ECPoint q; private ECParameterSpec ecSpec; private boolean withCompression; private GOST3410PublicKeyAlgParameters gostParams; public JCEECPublicKey( String algorithm, JCEECPublicKey key) { this.algorithm = algorithm; this.q = key.q; this.ecSpec = key.ecSpec; this.withCompression = key.withCompression; this.gostParams = key.gostParams; } public JCEECPublicKey( String algorithm, ECPublicKeySpec spec) { this.algorithm = algorithm; this.ecSpec = spec.getParams(); this.q = EC5Util.convertPoint(ecSpec, spec.getW(), false); } public JCEECPublicKey( String algorithm, org.bouncycastle.jce.spec.ECPublicKeySpec spec) { this.algorithm = algorithm; this.q = spec.getQ(); if (spec.getParams() != null) // can be null if implictlyCa { ECCurve curve = spec.getParams().getCurve(); EllipticCurve ellipticCurve = EC5Util.convertCurve(curve, spec.getParams().getSeed()); this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec.getParams()); } else { if (q.getCurve() == null) { org.bouncycastle.jce.spec.ECParameterSpec s = ProviderUtil.getEcImplicitlyCa(); q = s.getCurve().createPoint(q.getX().toBigInteger(), q.getY().toBigInteger(), false); } this.ecSpec = null; } } public JCEECPublicKey( String algorithm, ECPublicKeyParameters params, ECParameterSpec spec) { ECDomainParameters dp = params.getParameters(); this.algorithm = algorithm; this.q = params.getQ(); if (spec == null) { EllipticCurve ellipticCurve = EC5Util.convertCurve(dp.getCurve(), dp.getSeed()); this.ecSpec = createSpec(ellipticCurve, dp); } else { this.ecSpec = spec; } } public JCEECPublicKey( String algorithm, ECPublicKeyParameters params, org.bouncycastle.jce.spec.ECParameterSpec spec) { ECDomainParameters dp = params.getParameters(); this.algorithm = algorithm; this.q = params.getQ(); if (spec == null) { EllipticCurve ellipticCurve = EC5Util.convertCurve(dp.getCurve(), dp.getSeed()); this.ecSpec = createSpec(ellipticCurve, dp); } else { EllipticCurve ellipticCurve = EC5Util.convertCurve(spec.getCurve(), spec.getSeed()); this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec); } } /* * called for implicitCA */ public JCEECPublicKey( String algorithm, ECPublicKeyParameters params) { this.algorithm = algorithm; this.q = params.getQ(); this.ecSpec = null; } private ECParameterSpec createSpec(EllipticCurve ellipticCurve, ECDomainParameters dp) { return new ECParameterSpec( ellipticCurve, new ECPoint( dp.getG().getX().toBigInteger(), dp.getG().getY().toBigInteger()), dp.getN(), dp.getH().intValue()); } public JCEECPublicKey( ECPublicKey key) { this.algorithm = key.getAlgorithm(); this.ecSpec = key.getParams(); this.q = EC5Util.convertPoint(this.ecSpec, key.getW(), false); } JCEECPublicKey( SubjectPublicKeyInfo info) { if (info.getAlgorithmId().getObjectId().equals(CryptoProObjectIdentifiers.gostR3410_2001)) { DERBitString bits = info.getPublicKeyData(); ASN1OctetString key; this.algorithm = "ECGOST3410"; try { key = (ASN1OctetString) ASN1Object.fromByteArray(bits.getBytes()); } catch (IOException ex) { throw new IllegalArgumentException("error recovering public key"); } byte[] keyEnc = key.getOctets(); byte[] x = new byte[32]; byte[] y = new byte[32]; for (int i = 0; i != x.length; i++) { x[i] = keyEnc[32 - 1 - i]; } for (int i = 0; i != y.length; i++) { y[i] = keyEnc[64 - 1 - i]; } gostParams = new GOST3410PublicKeyAlgParameters((ASN1Sequence)info.getAlgorithmId().getParameters()); ECNamedCurveParameterSpec spec = ECGOST3410NamedCurveTable.getParameterSpec(ECGOST3410NamedCurves.getName(gostParams.getPublicKeyParamSet())); ECCurve curve = spec.getCurve(); EllipticCurve ellipticCurve = EC5Util.convertCurve(curve, spec.getSeed()); this.q = curve.createPoint(new BigInteger(1, x), new BigInteger(1, y), false); ecSpec = new ECNamedCurveSpec( ECGOST3410NamedCurves.getName(gostParams.getPublicKeyParamSet()), ellipticCurve, new ECPoint( spec.getG().getX().toBigInteger(), spec.getG().getY().toBigInteger()), spec.getN(), spec.getH()); } else { X962Parameters params = new X962Parameters((DERObject)info.getAlgorithmId().getParameters()); ECCurve curve; EllipticCurve ellipticCurve; if (params.isNamedCurve()) { DERObjectIdentifier oid = (DERObjectIdentifier)params.getParameters(); X9ECParameters ecP = ECUtil.getNamedCurveByOid(oid); curve = ecP.getCurve(); ellipticCurve = EC5Util.convertCurve(curve, ecP.getSeed()); ecSpec = new ECNamedCurveSpec(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -