95 lines
3.0 KiB
Java
95 lines
3.0 KiB
Java
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;
|
|
}
|
|
|
|
}
|