This commit is contained in:
liulu
2024-12-12 10:05:37 +08:00
parent 2250a6234b
commit 44161e70bb
10 changed files with 166 additions and 264 deletions
@@ -1,9 +1,6 @@
package com.sunyard.chsm.sdf;
import com.sunyard.chsm.enums.AlgMode;
import com.sunyard.chsm.enums.DeviceTmkStatus;
import com.sunyard.chsm.enums.KeyAlg;
import com.sunyard.chsm.enums.Padding;
import com.sunyard.chsm.mapper.SpDeviceMapper;
import com.sunyard.chsm.model.dto.DeviceCheckRes;
import com.sunyard.chsm.model.entity.Device;
@@ -14,12 +11,16 @@ import com.sunyard.chsm.sdf.context.AlgId;
import com.sunyard.chsm.sdf.model.DeviceInfo;
import com.sunyard.chsm.sdf.model.EccCipher;
import com.sunyard.chsm.sdf.model.EccKey;
import com.sunyard.chsm.sdf.util.PaddingUtil;
import com.sunyard.chsm.service.TmkService;
import lombok.RequiredArgsConstructor;
import com.sunyard.chsm.utils.gm.BCSM3Utils;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.util.Objects;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@@ -29,88 +30,103 @@ import java.util.concurrent.TimeUnit;
* @since 2024/12/11
*/
@Service
@RequiredArgsConstructor
@NoArgsConstructor
public class SingleSdfApiService implements SdfApiService, InitializingBean {
private String tmkHandle;
private String deviceHandle;
private String sessionHandle;
private SdfApiAdapter sdfApiAdapter;
private final TmkService tmkService;
private final SpDeviceMapper spDeviceMapper;
@Resource
public TmkService tmkService;
@Resource
private SpDeviceMapper spDeviceMapper;
public SingleSdfApiService(SdfApiAdapter sdfApiAdapter) {
this.sdfApiAdapter = sdfApiAdapter;
this.deviceHandle = sdfApiAdapter.openDevice();
this.sessionHandle = sdfApiAdapter.openSession(deviceHandle);
}
@Override
public byte[] generateRandom(int len) {
return new byte[0];
}
@Override
public byte[] genSymKey(KeyAlg alg, Integer keyLen) {
return new byte[0];
}
@Override
public byte[] genSymKey(KeyAlg alg) {
return new byte[0];
}
@Override
public byte[] symEncrypt(KeyAlg alg, AlgMode mode, Padding padding, byte[] key, byte[] data) {
return new byte[0];
}
@Override
public byte[] symEncrypt(KeyAlg alg, byte[] key, byte[] data) {
return new byte[0];
checkStatus();
return sdfApiAdapter.generateRandom(sessionHandle, len);
}
@Override
public byte[] symEncrypt(AlgId alg, byte[] key, byte[] iv, byte[] data) {
return new byte[0];
}
@Override
public byte[] symDecrypt(KeyAlg alg, AlgMode mode, Padding padding, byte[] key, byte[] data) {
return new byte[0];
}
@Override
public byte[] symDecrypt(KeyAlg alg, byte[] key, byte[] data) {
return new byte[0];
checkStatus();
byte[] pad = PaddingUtil.PKCS7Padding(data);
String hk = sdfApiAdapter.importKey(sessionHandle, key);
byte[] encrypt = sdfApiAdapter.symEncrypt(sessionHandle, hk, alg, iv, pad);
sdfApiAdapter.destroyKey(sessionHandle, hk);
return encrypt;
}
@Override
public byte[] symDecrypt(AlgId alg, byte[] key, byte[] iv, byte[] data) {
return new byte[0];
checkStatus();
String hk = sdfApiAdapter.importKey(sessionHandle, key);
byte[] decrypt = sdfApiAdapter.symDecrypt(sessionHandle, hk, alg, iv, data);
sdfApiAdapter.destroyKey(sessionHandle, hk);
return PaddingUtil.PKCS7Unpadding(decrypt);
}
@Override
public EccKey genKeyPairEcc() {
return null;
checkStatus();
return sdfApiAdapter.generateKeyPairECC(sessionHandle, AlgId.SGD_SM2_1);
}
@Override
public byte[] calculateMAC(byte[] symKey, byte[] pucIv, byte[] pucData) {
return new byte[0];
checkStatus();
String hk = sdfApiAdapter.importKey(sessionHandle, symKey);
byte[] mac = sdfApiAdapter.calculateMAC(sessionHandle, hk, AlgId.SGD_SM4_MAC, pucIv, pucData);
sdfApiAdapter.destroyKey(sessionHandle, hk);
return mac;
}
@Override
public byte[] hmac(byte[] key, byte[] srcData) {
return new byte[0];
return BCSM3Utils.hmac(key, srcData);
}
@Override
public byte[] hash(byte[] pucData) {
return new byte[0];
checkStatus();
String newSession = sdfApiAdapter.openSession(deviceHandle);
sdfApiAdapter.hashInit(newSession, AlgId.SGD_SM3, null, null);
sdfApiAdapter.hashUpdate(newSession, pucData);
byte[] hash = sdfApiAdapter.hashFinish(newSession);
sdfApiAdapter.closeSession(newSession);
return hash;
}
@Override
public byte[] encryptByTMK(byte[] data) {
checkKey();
byte[] pad = PaddingUtil.PKCS7Padding(data);
sdfApiAdapter.symEncrypt(sessionHandle, tmkHandle, AlgId.SGD_SM4_CBC, new byte[8], pad);
return new byte[0];
}
@Override
public byte[] decryptByTMK(byte[] data) {
return new byte[0];
checkKey();
byte[] decrypt = sdfApiAdapter.symDecrypt(sessionHandle, tmkHandle, AlgId.SGD_SM4_CBC, new byte[8], data);
return PaddingUtil.PKCS7Unpadding(decrypt);
}
private void checkStatus() {
Assert.notNull(sdfApiAdapter, "没有可用设备");
}
private void checkKey() {
checkStatus();
Assert.hasText(tmkHandle, "没有可用的主密钥设备");
}
private void changeDevice(boolean tmkInit) {
@@ -120,8 +136,8 @@ public class SingleSdfApiService implements SdfApiService, InitializingBean {
DeviceCheckRes checkRes = tmkService.checkDevice(device);
if (!checkRes.isHasError()) {
this.sdfApiAdapter = checkRes.getSdfApiAdapter();
String hd = sdfApiAdapter.openDevice();
this.sessionHandle = sdfApiAdapter.openSession(hd);
this.deviceHandle = sdfApiAdapter.openDevice();
this.sessionHandle = sdfApiAdapter.openSession(deviceHandle);
if (tmkInit) {
sdfApiAdapter.getPrivateKeyAccessRight(sessionHandle, device.getEncKeyIdx(), device.getAccessCredentials().getBytes());
this.tmkHandle = sdfApiAdapter.importKeyWithISKECC(sessionHandle, device.getEncKeyIdx(), EccCipher.fromHex(device.getEncTmk()));