sdf api
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
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;
|
||||
import com.sunyard.chsm.sdf.adapter.BcSdfApiAdaptor;
|
||||
import com.sunyard.chsm.sdf.adapter.SdfApiAdapter;
|
||||
import com.sunyard.chsm.sdf.adapter.SdfApiAdapterFactory;
|
||||
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.service.TmkService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author liulu
|
||||
* @since 2024/12/11
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class SingleSdfApiService implements SdfApiService, InitializingBean {
|
||||
|
||||
private String tmkHandle;
|
||||
private String sessionHandle;
|
||||
private SdfApiAdapter sdfApiAdapter;
|
||||
private final TmkService tmkService;
|
||||
private final SpDeviceMapper spDeviceMapper;
|
||||
|
||||
@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];
|
||||
}
|
||||
|
||||
@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];
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] symDecrypt(AlgId alg, byte[] key, byte[] iv, byte[] data) {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public EccKey genKeyPairEcc() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] calculateMAC(byte[] symKey, byte[] pucIv, byte[] pucData) {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] hmac(byte[] key, byte[] srcData) {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] hash(byte[] pucData) {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] encryptByTMK(byte[] data) {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] decryptByTMK(byte[] data) {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
private void changeDevice(boolean tmkInit) {
|
||||
DeviceTmkStatus status = tmkInit ? DeviceTmkStatus.finished : DeviceTmkStatus.available;
|
||||
Device device = spDeviceMapper.selectOneByStatus(status);
|
||||
if (Objects.nonNull(device)) {
|
||||
DeviceCheckRes checkRes = tmkService.checkDevice(device);
|
||||
if (!checkRes.isHasError()) {
|
||||
this.sdfApiAdapter = checkRes.getSdfApiAdapter();
|
||||
String hd = sdfApiAdapter.openDevice();
|
||||
this.sessionHandle = sdfApiAdapter.openSession(hd);
|
||||
if (tmkInit) {
|
||||
sdfApiAdapter.getPrivateKeyAccessRight(sessionHandle, device.getEncKeyIdx(), device.getAccessCredentials().getBytes());
|
||||
this.tmkHandle = sdfApiAdapter.importKeyWithISKECC(sessionHandle, device.getEncKeyIdx(), EccCipher.fromHex(device.getEncTmk()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (tmkService.isEnableSoftDevice()) {
|
||||
this.sdfApiAdapter = SdfApiAdapterFactory.getBcAdapter();
|
||||
this.sessionHandle = sdfApiAdapter.openSession("");
|
||||
if (tmkInit) {
|
||||
byte[] encTmk = tmkService.getSoftDeviceEncTmk();
|
||||
this.tmkHandle = sdfApiAdapter.importKeyWithISKECC(sessionHandle, device.getEncKeyIdx(), EccCipher.fromBytes(encTmk));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
Executors.newSingleThreadScheduledExecutor()
|
||||
.scheduleWithFixedDelay(() -> {
|
||||
boolean tmkInit = tmkService.isTmkInit();
|
||||
if (sdfApiAdapter != null) {
|
||||
if (sdfApiAdapter instanceof BcSdfApiAdaptor) {
|
||||
changeDevice(tmkInit);
|
||||
return;
|
||||
}
|
||||
if (tmkInit && StringUtils.isEmpty(tmkHandle)) {
|
||||
changeDevice(tmkInit);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
DeviceInfo deviceInfo = sdfApiAdapter.getDeviceInfo(sessionHandle);
|
||||
} catch (Exception ex) {
|
||||
changeDevice(tmkInit);
|
||||
}
|
||||
} else {
|
||||
changeDevice(tmkInit);
|
||||
}
|
||||
}, 0L, 5L, TimeUnit.MINUTES);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user