功能自测通过

This commit is contained in:
cheney 2026-05-13 10:46:07 +08:00
parent a89fd0c116
commit 7ea0325283
3 changed files with 123 additions and 4 deletions

View File

@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.11</version> <version>2.7.18</version>
<relativePath/> <relativePath/>
</parent> </parent>
@ -18,7 +18,7 @@
<description>Device Activation Platform</description> <description>Device Activation Platform</description>
<properties> <properties>
<java.version>17</java.version> <java.version>8</java.version>
</properties> </properties>
<dependencies> <dependencies>

View File

@ -6,8 +6,12 @@ import org.bouncycastle.util.encoders.Hex;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PublicKey;
import java.security.Security; import java.security.Security;
import java.security.Signature; import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64; import java.util.Base64;
@Service @Service
@ -50,12 +54,39 @@ public class DeviceActivationService {
public String generateDeviceActivationPublicKey() { public String generateDeviceActivationPublicKey() {
try { try {
java.security.KeyPairGenerator keyGen = java.security.KeyPairGenerator.getInstance("EC", PROVIDER); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", PROVIDER);
keyGen.initialize(256); keyGen.initialize(256);
java.security.KeyPair keyPair = keyGen.generateKeyPair(); KeyPair keyPair = keyGen.generateKeyPair();
return Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded()); return Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("生成设备激活公钥失败", e); throw new RuntimeException("生成设备激活公钥失败", e);
} }
} }
public KeyPair generateKeyPair() {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", PROVIDER);
keyGen.initialize(256);
return keyGen.generateKeyPair();
} catch (Exception e) {
throw new RuntimeException("生成密钥对失败", e);
}
}
public boolean verifySm2Signature(String data, String signatureBase64, String publicKeyBase64) {
try {
byte[] keyBytes = Base64.getDecoder().decode(publicKeyBase64);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
java.security.KeyFactory keyFactory = java.security.KeyFactory.getInstance("EC", PROVIDER);
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGO, PROVIDER);
signature.initVerify(publicKey);
signature.update(data.getBytes(StandardCharsets.UTF_8));
byte[] signatureBytes = Base64.getDecoder().decode(signatureBase64);
return signature.verify(signatureBytes);
} catch (Exception e) {
throw new RuntimeException("SM2验签失败", e);
}
}
} }

View File

@ -0,0 +1,88 @@
package com.sunyar.cisd;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.util.Base64;
import static org.junit.jupiter.api.Assertions.*;
class DeviceActivationServiceTest {
private DeviceActivationService service;
@BeforeEach
void setUp() {
service = new DeviceActivationService();
}
@Test
void testCalculateSm3Hash() {
String input = "test data";
String hash = service.calculateSm3Hash(input);
assertNotNull(hash);
assertEquals(64, hash.length());
String hash2 = service.calculateSm3Hash(input);
assertEquals(hash, hash2);
}
@Test
void testSignAndVerifySm2Signature() {
String data = "device activation test data";
KeyPair keyPair = service.generateKeyPair();
String privateKeyBase64 = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
String publicKeyBase64 = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
String signature = service.signWithSm2Pkcs1(data, privateKeyBase64);
assertNotNull(signature);
assertFalse(signature.isEmpty());
boolean verified = service.verifySm2Signature(data, signature, publicKeyBase64);
assertTrue(verified, "签名验签应该通过");
}
@Test
void testVerifySm2SignatureWithWrongData() {
String data = "original data";
String wrongData = "modified data";
KeyPair keyPair = service.generateKeyPair();
String privateKeyBase64 = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
String publicKeyBase64 = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
String signature = service.signWithSm2Pkcs1(data, privateKeyBase64);
boolean verified = service.verifySm2Signature(wrongData, signature, publicKeyBase64);
assertFalse(verified, "数据被篡改后验签应该失败");
}
@Test
void testVerifySm2SignatureWithWrongKey() {
String data = "test data";
KeyPair keyPair1 = service.generateKeyPair();
KeyPair keyPair2 = service.generateKeyPair();
String privateKeyBase64 = Base64.getEncoder().encodeToString(keyPair1.getPrivate().getEncoded());
String wrongPublicKeyBase64 = Base64.getEncoder().encodeToString(keyPair2.getPublic().getEncoded());
String signature = service.signWithSm2Pkcs1(data, privateKeyBase64);
boolean verified = service.verifySm2Signature(data, signature, wrongPublicKeyBase64);
assertFalse(verified, "使用错误的公钥验签应该失败");
}
@Test
void testGenerateDeviceActivationPublicKey() {
String publicKey = service.generateDeviceActivationPublicKey();
assertNotNull(publicKey);
assertFalse(publicKey.isEmpty());
}
@Test
void testGenerateKeyPair() {
KeyPair keyPair = service.generateKeyPair();
assertNotNull(keyPair);
assertNotNull(keyPair.getPublic());
assertNotNull(keyPair.getPrivate());
}
}