package com.sunyard.chsm.sdf; import com.sunyard.chsm.sdf.model.EccKey; import com.sunyard.chsm.sdf.model.EccPriKey; import com.sunyard.chsm.sdf.model.EccPubKey; import lombok.SneakyThrows; import org.bouncycastle.asn1.gm.GMNamedCurves; import org.bouncycastle.asn1.gm.GMObjectIdentifiers; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.crypto.macs.HMac; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECParameterSpec; import org.bouncycastle.util.BigIntegers; import org.springframework.stereotype.Service; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; /** * @author liulu * @since 2024/10/23 */ @Service public class BCSdfApiService implements SdfApiService { @Override public byte[] generateRandom(int len) { byte[] res = new byte[len]; new SecureRandom().nextBytes(res); return res; } @SneakyThrows @Override public EccKey genKeyPairEcc() { // 获取SM2参数 X9ECParameters sm2Params = GMNamedCurves.getByOID(GMObjectIdentifiers.sm2p256v1); ECParameterSpec sm2Spec = new ECParameterSpec(sm2Params.getCurve(), sm2Params.getG(), sm2Params.getN(), sm2Params.getH()); // 创建密钥对生成器 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME); keyPairGenerator.initialize(sm2Spec); // 生成密钥对 KeyPair keyPair = keyPairGenerator.generateKeyPair(); BCECPublicKey pubKey = (BCECPublicKey) keyPair.getPublic(); BCECPrivateKey priKey = (BCECPrivateKey) keyPair.getPrivate(); byte[] x = pubKey.getQ().getXCoord().getEncoded(); byte[] y = pubKey.getQ().getYCoord().getEncoded(); byte[] d = BigIntegers.asUnsignedByteArray(64, priKey.getD()); return new EccKey(new EccPubKey(256, x, y), new EccPriKey(256, d)); } @Override public EccKey genEccKeyPairAndEncByKek() { return null; } @Override public byte[] calculateMAC(byte[] symKey, byte[] pucIv, byte[] pucData) { return new byte[0]; } @Override public byte[] hmac(byte[] key, byte[] srcData) { KeyParameter keyParameter = new KeyParameter(key); SM3Digest digest = new SM3Digest(); HMac mac = new HMac(digest); mac.init(keyParameter); mac.update(srcData, 0, srcData.length); byte[] result = new byte[mac.getMacSize()]; mac.doFinal(result, 0); return result; } @Override public byte[] hash(byte[] pucData) { SM3Digest digest = new SM3Digest(); digest.update(pucData, 0, pucData.length); byte[] hash = new byte[digest.getDigestSize()]; digest.doFinal(hash, 0); return hash; } }