验签失败,入参数据长度错误。

This commit is contained in:
cheney 2026-05-12 17:11:25 +08:00
parent caf29a3084
commit aa538ee1d7
3 changed files with 17 additions and 5 deletions

View File

@ -32,6 +32,7 @@ public final class Gm0018AlgorithmIds {
public static final int RSA_ENCRYPT = 0x00010002; public static final int RSA_ENCRYPT = 0x00010002;
public static final int SM2_SIGN = 0x00020100; public static final int SM2_SIGN = 0x00020100;
public static final int SM2_SIGN_1 = 0x00020200;
public static final int SM2_KEY_EXCHANGE = 0x00020200; public static final int SM2_KEY_EXCHANGE = 0x00020200;
public static final int SM2_ENCRYPT = 0x00020400; public static final int SM2_ENCRYPT = 0x00020400;

View File

@ -27,6 +27,15 @@ public class EccRefPublicKey extends Structure {
protected List<String> getFieldOrder() { protected List<String> getFieldOrder() {
return List.of("bits", "x", "y"); return List.of("bits", "x", "y");
} }
public static byte[] fromPublicKeyToBlob(PublicKey publicKey){
EccRefPublicKey eccRefPublicKey = EccRefPublicKey.fromPublicKey(publicKey);
return toBytes(eccRefPublicKey);
}
private static byte[] toBytes(Structure structure) {
structure.read();
return structure.getPointer().getByteArray(0, structure.size());
}
public static EccRefPublicKey fromPublicKey(PublicKey publicKey) { public static EccRefPublicKey fromPublicKey(PublicKey publicKey) {
try { try {

View File

@ -4,6 +4,7 @@ import com.cisd.tms.common.enums.ErrorCode;
import com.cisd.tms.common.exception.BizException; import com.cisd.tms.common.exception.BizException;
import com.cisd.tms.integration.crypto.pcie.Gm0018AlgorithmIds; import com.cisd.tms.integration.crypto.pcie.Gm0018AlgorithmIds;
import com.cisd.tms.integration.crypto.pcie.PcieSessionTemplate; import com.cisd.tms.integration.crypto.pcie.PcieSessionTemplate;
import com.cisd.tms.integration.crypto.pcie.jna.EccRefPublicKey;
import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult; import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult;
import com.cisd.tms.integration.crypto.pcie.model.EccExternalVerifyRequest; import com.cisd.tms.integration.crypto.pcie.model.EccExternalVerifyRequest;
import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest; import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest;
@ -15,6 +16,7 @@ import com.cisd.tms.modules.openapi.service.IOpenApiService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
@ -125,9 +127,9 @@ public class OpenApiService implements IOpenApiService {
log.info("找到证书: {}", cert.getSubjectDN()); log.info("找到证书: {}", cert.getSubjectDN());
// 获取证书中的公钥 // 将证书中的公钥转换为 EccRefPublicKey 结构
byte[] publicKeyBytes = cert.getPublicKey().getEncoded(); byte[] publicKeyBlob = EccRefPublicKey.fromPublicKeyToBlob(cert.getPublicKey());
log.info("公钥数据长度: {} bytes", publicKeyBytes.length); log.info("公钥Blob长度: {} bytes", publicKeyBlob.length);
// 解码签名 // 解码签名
byte[] sign = java.util.Base64.getDecoder().decode(signature); byte[] sign = java.util.Base64.getDecoder().decode(signature);
@ -135,8 +137,8 @@ public class OpenApiService implements IOpenApiService {
// 使用外部公钥验签 // 使用外部公钥验签
EccExternalVerifyRequest request = new EccExternalVerifyRequest(); EccExternalVerifyRequest request = new EccExternalVerifyRequest();
request.setAlgId(Gm0018AlgorithmIds.SM2_SIGN); request.setAlgId(Gm0018AlgorithmIds.SM2_SIGN_1);
request.setPublicKeyBlob(publicKeyBytes); request.setPublicKeyBlob(publicKeyBlob);
request.setData(origBytes); request.setData(origBytes);
request.setSignature(sign); request.setSignature(sign);