|
|
@@ -0,0 +1,244 @@
|
|
|
+package cn.hutool.crypto;
|
|
|
+
|
|
|
+import org.bouncycastle.crypto.params.ECDomainParameters;
|
|
|
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
|
|
|
+import org.bouncycastle.crypto.params.ECPublicKeyParameters;
|
|
|
+import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
|
|
|
+import org.bouncycastle.math.ec.ECCurve;
|
|
|
+import org.bouncycastle.util.BigIntegers;
|
|
|
+
|
|
|
+import java.math.BigInteger;
|
|
|
+import java.security.InvalidKeyException;
|
|
|
+import java.security.PrivateKey;
|
|
|
+import java.security.PublicKey;
|
|
|
+
|
|
|
+/**
|
|
|
+ * EC密钥参数相关工具类封装
|
|
|
+ *
|
|
|
+ * @author looly
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+public class ECKeyUtil {
|
|
|
+
|
|
|
+ //--------------------------------------------------------------------------- Public Key
|
|
|
+ /**
|
|
|
+ * 转换为 ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param q 公钥Q值
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toSm2PublicParams(byte[] q) {
|
|
|
+ return toPublicParams(q, SmUtil.SM2_DOMAIN_PARAMS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为 ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param q 公钥Q值
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toSm2PublicParams(String q) {
|
|
|
+ return toPublicParams(q, SmUtil.SM2_DOMAIN_PARAMS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为SM2的ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param x 公钥X
|
|
|
+ * @param y 公钥Y
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toSm2PublicParams(String x, String y) {
|
|
|
+ return toPublicParams(x, y, SmUtil.SM2_DOMAIN_PARAMS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为SM2的ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param xBytes 公钥X
|
|
|
+ * @param yBytes 公钥Y
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toSm2PublicParams(byte[] xBytes, byte[] yBytes) {
|
|
|
+ return toPublicParams(xBytes, yBytes, SmUtil.SM2_DOMAIN_PARAMS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param x 公钥X
|
|
|
+ * @param y 公钥Y
|
|
|
+ * @param domainParameters ECDomainParameters
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toPublicParams(String x, String y, ECDomainParameters domainParameters) {
|
|
|
+ return toPublicParams(SecureUtil.decode(x), SecureUtil.decode(y), domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param xBytes 公钥X
|
|
|
+ * @param yBytes 公钥Y
|
|
|
+ * @param domainParameters ECDomainParameters曲线参数
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toPublicParams(byte[] xBytes, byte[] yBytes, ECDomainParameters domainParameters) {
|
|
|
+ return toPublicParams(BigIntegers.fromUnsignedByteArray(xBytes), BigIntegers.fromUnsignedByteArray(yBytes), domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param x 公钥X
|
|
|
+ * @param y 公钥Y
|
|
|
+ * @param domainParameters ECDomainParameters
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toPublicParams(BigInteger x, BigInteger y, ECDomainParameters domainParameters) {
|
|
|
+ if (null == x || null == y) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ final ECCurve curve = domainParameters.getCurve();
|
|
|
+ return toPublicParams(curve.createPoint(x, y), domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param pointEncoded 被编码的曲线坐标点
|
|
|
+ * @param domainParameters ECDomainParameters
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toPublicParams(String pointEncoded, ECDomainParameters domainParameters) {
|
|
|
+ final ECCurve curve = domainParameters.getCurve();
|
|
|
+ return toPublicParams(curve.decodePoint(SecureUtil.decode(pointEncoded)), domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param pointEncoded 被编码的曲线坐标点
|
|
|
+ * @param domainParameters ECDomainParameters
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toPublicParams(byte[] pointEncoded, ECDomainParameters domainParameters) {
|
|
|
+ final ECCurve curve = domainParameters.getCurve();
|
|
|
+ return toPublicParams(curve.decodePoint(pointEncoded), domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为ECPublicKeyParameters
|
|
|
+ *
|
|
|
+ * @param point 曲线坐标点
|
|
|
+ * @param domainParameters ECDomainParameters
|
|
|
+ * @return ECPublicKeyParameters
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toPublicParams(org.bouncycastle.math.ec.ECPoint point, ECDomainParameters domainParameters) {
|
|
|
+ return new ECPublicKeyParameters(point, domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 公钥转换为 {@link ECPublicKeyParameters}
|
|
|
+ *
|
|
|
+ * @param publicKey 公钥,传入null返回null
|
|
|
+ * @return {@link ECPublicKeyParameters}或null
|
|
|
+ */
|
|
|
+ public static ECPublicKeyParameters toPublicParams(PublicKey publicKey) {
|
|
|
+ if (null == publicKey) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return (ECPublicKeyParameters) ECUtil.generatePublicKeyParameter(publicKey);
|
|
|
+ } catch (InvalidKeyException e) {
|
|
|
+ throw new CryptoException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //--------------------------------------------------------------------------- Private Key
|
|
|
+ /**
|
|
|
+ * 转换为 ECPrivateKeyParameters
|
|
|
+ *
|
|
|
+ * @param d 私钥d值16进制字符串
|
|
|
+ * @return ECPrivateKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPrivateKeyParameters toSm2PrivateParams(String d) {
|
|
|
+ return toPrivateParams(d, SmUtil.SM2_DOMAIN_PARAMS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为 ECPrivateKeyParameters
|
|
|
+ *
|
|
|
+ * @param d 私钥d值
|
|
|
+ * @return ECPrivateKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPrivateKeyParameters toSm2PrivateParams(byte[] d) {
|
|
|
+ return toPrivateParams(d, SmUtil.SM2_DOMAIN_PARAMS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为 ECPrivateKeyParameters
|
|
|
+ *
|
|
|
+ * @param d 私钥d值
|
|
|
+ * @return ECPrivateKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPrivateKeyParameters toSm2PrivateParams(BigInteger d) {
|
|
|
+ return toPrivateParams(d, SmUtil.SM2_DOMAIN_PARAMS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为 ECPrivateKeyParameters
|
|
|
+ *
|
|
|
+ * @param d 私钥d值16进制字符串
|
|
|
+ * @param domainParameters ECDomainParameters
|
|
|
+ * @return ECPrivateKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPrivateKeyParameters toPrivateParams(String d, ECDomainParameters domainParameters) {
|
|
|
+ return toPrivateParams(BigIntegers.fromUnsignedByteArray(SecureUtil.decode(d)), domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为 ECPrivateKeyParameters
|
|
|
+ *
|
|
|
+ * @param d 私钥d值
|
|
|
+ * @param domainParameters ECDomainParameters
|
|
|
+ * @return ECPrivateKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPrivateKeyParameters toPrivateParams(byte[] d, ECDomainParameters domainParameters) {
|
|
|
+ return toPrivateParams(BigIntegers.fromUnsignedByteArray(d), domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为 ECPrivateKeyParameters
|
|
|
+ *
|
|
|
+ * @param d 私钥d值
|
|
|
+ * @param domainParameters ECDomainParameters
|
|
|
+ * @return ECPrivateKeyParameters
|
|
|
+ */
|
|
|
+ public static ECPrivateKeyParameters toPrivateParams(BigInteger d, ECDomainParameters domainParameters) {
|
|
|
+ if (null == d) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return new ECPrivateKeyParameters(d, domainParameters);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 私钥转换为 {@link ECPrivateKeyParameters}
|
|
|
+ *
|
|
|
+ * @param privateKey 私钥,传入null返回null
|
|
|
+ * @return {@link ECPrivateKeyParameters}或null
|
|
|
+ */
|
|
|
+ public static ECPrivateKeyParameters toPrivateParams(PrivateKey privateKey) {
|
|
|
+ if (null == privateKey) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return (ECPrivateKeyParameters) ECUtil.generatePrivateKeyParameter(privateKey);
|
|
|
+ } catch (InvalidKeyException e) {
|
|
|
+ throw new CryptoException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|