功能自测通过
This commit is contained in:
parent
a89fd0c116
commit
7ea0325283
@ -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>
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user