From 16fb6fa04e5923d7e7805500f2bff16c5a5213ce Mon Sep 17 00:00:00 2001 From: liulu Date: Tue, 10 Mar 2026 16:04:32 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E8=B6=85=E7=BA=A7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/mk/controller/LmkController.java | 27 ++++++++++++++++ .../tms/modules/mk/service/LmkService.java | 31 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/main/java/com/cisd/tms/modules/mk/controller/LmkController.java b/src/main/java/com/cisd/tms/modules/mk/controller/LmkController.java index 57d8e99..4537eb7 100644 --- a/src/main/java/com/cisd/tms/modules/mk/controller/LmkController.java +++ b/src/main/java/com/cisd/tms/modules/mk/controller/LmkController.java @@ -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 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()); + } } diff --git a/src/main/java/com/cisd/tms/modules/mk/service/LmkService.java b/src/main/java/com/cisd/tms/modules/mk/service/LmkService.java index a031526..9901691 100644 --- a/src/main/java/com/cisd/tms/modules/mk/service/LmkService.java +++ b/src/main/java/com/cisd/tms/modules/mk/service/LmkService.java @@ -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 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); + } + }