生成超级管理员

This commit is contained in:
liulu 2026-03-10 16:04:32 +08:00
parent 1a05ed3c0e
commit 16fb6fa04e
2 changed files with 58 additions and 0 deletions

View File

@ -3,9 +3,15 @@ package com.cisd.tms.modules.mk.controller;
import com.cisd.tms.common.api.ApiResponse;
import com.cisd.tms.integration.crypto.pcie.service.PcieCryptoService;
import com.cisd.tms.modules.mk.dto.LMK;
import com.cisd.tms.modules.mk.dto.UKeySignDTO;
import com.cisd.tms.modules.mk.dto.UKeySignEntity;
import com.cisd.tms.modules.mk.dto.UKeySignResult;
import com.cisd.tms.modules.mk.service.LmkService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -21,6 +27,8 @@ public class LmkController {
private PcieCryptoService pcieCryptoService;
@Resource
private LmkService lmkService;
@Resource
private ObjectMapper objectMapper;
/**
* 生成主密钥
@ -32,5 +40,24 @@ public class LmkController {
return ApiResponse.success(lmk);
}
/**
* UKey签名并获取主密钥组件
* @param uKeySignDTO
* @return
*/
@PostMapping("/masterkey/uKeySignAndKeyComponent")
public ApiResponse<UKeySignResult> signAndKeyComponent(@RequestBody UKeySignDTO uKeySignDTO) {
String iPubKey = lmkService.exportIkPublicKeyHex();
String payload;
try {
payload = objectMapper.writeValueAsString(UKeySignEntity.getInstance(uKeySignDTO, iPubKey));
} catch (JsonProcessingException e) {
throw new IllegalStateException("serialize sign payload failed", e);
}
String signValue = lmkService.signIk(payload);
int uid = Integer.parseInt(uKeySignDTO.getUid());
String components = lmkService.getComponent(uid);
return ApiResponse.success(UKeySignResult.builder().sign(signValue).extra(components).build());
}
}

View File

@ -2,7 +2,10 @@ package com.cisd.tms.modules.mk.service;
import com.cisd.tms.common.util.DivisionUtils;
import com.cisd.tms.common.util.SerializationUtil;
import com.cisd.tms.integration.crypto.pcie.jna.EccRefPublicKey;
import com.cisd.tms.integration.crypto.pcie.jna.EccSignature;
import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult;
import com.cisd.tms.integration.crypto.pcie.model.EccInternalSignRequest;
import com.cisd.tms.integration.crypto.pcie.service.PcieCryptoService;
import com.cisd.tms.modules.mk.common.LMKConstant;
import com.cisd.tms.modules.mk.dto.KeyComponent;
@ -13,6 +16,7 @@ import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.util.encoders.Hex;
import org.springframework.stereotype.Service;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
@ -31,6 +35,7 @@ public class LmkService {
private List<String> keyComponentList;
private static final int AUTH_SIGN_KEY_INDEX = IKEnums.KEY_TYPE_AUTH.getCode();
@Resource
private PcieCryptoService pcieCryptoService;
@ -112,4 +117,30 @@ public class LmkService {
this.keyComponentList = result;
}
public String exportIkPublicKeyHex() {
int outBufferSize = new EccRefPublicKey().size();
BackupDataResult result = pcieCryptoService.exportSignPublicKeyEcc(AUTH_SIGN_KEY_INDEX, outBufferSize);
return Hex.toHexString(result.getData());
}
public String signIk(String rawData) {
EccInternalSignRequest request = new EccInternalSignRequest();
request.setKeyIndex(AUTH_SIGN_KEY_INDEX);
request.setData(rawData.getBytes(StandardCharsets.UTF_8));
request.setSignatureBufferSize(new EccSignature().size());
BackupDataResult result = pcieCryptoService.eccInternalSign(request);
return Hex.toHexString(result.getData());
}
public String getComponent(int uid) {
if (keyComponentList == null || keyComponentList.isEmpty()) {
throw new IllegalStateException("key components not initialized");
}
int index = uid - 1;
if (index < 0 || index >= keyComponentList.size()) {
throw new IllegalArgumentException("invalid component index: " + uid);
}
return keyComponentList.get(index);
}
}