From efec85a59c9f84fb0d68437dc6e83a28720777c3 Mon Sep 17 00:00:00 2001 From: liulu Date: Tue, 10 Mar 2026 16:16:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E7=AE=A1=E7=90=86=E5=AF=86?= =?UTF-8?q?=E9=92=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/mk/controller/LmkController.java | 45 +++++++++++++++ .../tms/modules/mk/service/LmkService.java | 57 +++++++++++++++++++ 2 files changed, 102 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 4537eb7..30e8735 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,6 +3,8 @@ 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.MasterKeyRestoreDTO; +import com.cisd.tms.modules.mk.dto.RecoveryResult; import com.cisd.tms.modules.mk.dto.UKeySignDTO; import com.cisd.tms.modules.mk.dto.UKeySignEntity; import com.cisd.tms.modules.mk.dto.UKeySignResult; @@ -15,6 +17,12 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; +import java.io.StreamCorruptedException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + /** * @author liulu * @since 2026/3/4 @@ -60,4 +68,41 @@ public class LmkController { return ApiResponse.success(UKeySignResult.builder().sign(signValue).extra(components).build()); } + /** + * 恢复主密钥 + * @param masterKeyRestoreDTO + * @return + * @throws IOException + * @throws ClassNotFoundException + */ + @PostMapping("/recoveryMasterKey") + public ApiResponse recoveryMasterKey(@RequestBody MasterKeyRestoreDTO masterKeyRestoreDTO) + throws IOException, ClassNotFoundException { + RecoveryResult result; + String mac; + try { + Collection keyComponents = masterKeyRestoreDTO.getComponents().values(); + List keyComponentsList = new ArrayList<>(keyComponents); + mac = lmkService.recoveryLMK(keyComponentsList); + result = RecoveryResult.getInstance(false, mac); + } catch (StreamCorruptedException streamCorruptedException) { + String masterKey = lmkService.masterKeyCompose(masterKeyRestoreDTO.getComponents()); + mac = lmkService.recoveryLMKAndGenIK(masterKey); + result = RecoveryResult.getInstance(true, mac); + } + return ApiResponse.success(result); + } + + /** + * 分量合成恢复主密钥 + * @param masterKeyRestoreDTO + * @return + */ + @PostMapping("/masterKeyRecovery") + public ApiResponse masterKeyRecovery(@RequestBody MasterKeyRestoreDTO masterKeyRestoreDTO) { + String masterKey = lmkService.masterKeyCompose(masterKeyRestoreDTO.getComponents()); + LMK lmk = lmkService.recoveryLMK1(LMK.getInstance(masterKey, masterKeyRestoreDTO)); + return ApiResponse.success(lmk); + } + } 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 9901691..eac7654 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 @@ -10,12 +10,15 @@ 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; import com.cisd.tms.modules.mk.dto.LMK; +import com.cisd.tms.modules.mk.dto.LMKAndIK; import com.cisd.tms.modules.mk.enums.IKEnums; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; import org.springframework.stereotype.Service; +import java.io.IOException; +import java.io.StreamCorruptedException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; @@ -143,4 +146,58 @@ public class LmkService { return keyComponentList.get(index); } + public String masterKeyCompose(Map componentMap) { + StringBuilder lmk = new StringBuilder(); + for (int i = 0; i < LMKConstant.COMPONENT_NUM; i++) { + lmk.append(componentMap.get(String.valueOf(LMKConstant.KEY_ORDER[i]))); + } + return lmk.toString(); + } + + public String recoveryLMK(List keyComponents) throws IOException, ClassNotFoundException { + List componentList = new ArrayList<>(); + for (String component : keyComponents) { + byte[] raw; + try { + raw = Base64.getDecoder().decode(component); + } catch (IllegalArgumentException e) { + StreamCorruptedException ex = new StreamCorruptedException("invalid component encoding"); + ex.initCause(e); + throw ex; + } + try { + Object obj = SerializationUtil.deserializationObject(raw); + componentList.add((KeyComponent) obj); + } catch (ClassCastException e) { + StreamCorruptedException ex = new StreamCorruptedException("invalid component payload"); + ex.initCause(e); + throw ex; + } catch (StreamCorruptedException e) { + throw e; + } + } + LMKAndIK lmkAndIK = LMKAndIK.getInstance(componentList); + pcieCryptoService.recoverLmkEx(Hex.decode(lmkAndIK.getLmk())); + pcieCryptoService.loadLmk(); + byte[] seedMac = pcieCryptoService.exportLmkSeedMac(); + return Hex.toHexString(seedMac); + } + + public String recoveryLMKAndGenIK(String lmkComponentHex) { + pcieCryptoService.recoverLmkEx(Hex.decode(lmkComponentHex)); + pcieCryptoService.generateIk(IKEnums.KEY_TYPE_AUTH.getCode()); + pcieCryptoService.generateIk(IKEnums.KEY_TYPE_DEVICE.getCode()); + pcieCryptoService.loadLmk(); + byte[] seedMac = pcieCryptoService.exportLmkSeedMac(); + return Hex.toHexString(seedMac); + } + + public LMK recoveryLMK1(LMK lmk) { + pcieCryptoService.recoverLmkEx(Hex.decode(lmk.getPcLmk())); + pcieCryptoService.loadLmk(); + byte[] seedMac = pcieCryptoService.exportLmkSeedMac(); + lmk.setUcSessionKey(Hex.toHexString(seedMac)); + return lmk; + } + }