对称运算类接口

This commit is contained in:
liulu
2024-12-18 09:25:41 +08:00
parent bd099ba04e
commit 9cb9b43052
39 changed files with 891 additions and 119 deletions
@@ -0,0 +1,36 @@
package com.sunyard.chsm.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
/**
* 算法的轮模式
* @author Cheney
*/
@Getter
@AllArgsConstructor
public enum AlgMode {
ECB("ECB", "ECB"),
CBC( "CBC", "CBC"),
;
private final String code;
private final String desc;
public static AlgMode of(String code) {
if (code == null || code.trim().isEmpty()) {
return null;
}
return Arrays.stream(AlgMode.values())
.filter(it -> Objects.equals(it.getCode(), code))
.findFirst()
.orElse(null);
}
}
@@ -0,0 +1,10 @@
package com.sunyard.chsm.enums;
/**
* @author liulu
* @since 2024/10/22
*/
public enum HashAlg {
SM3,
;
}
@@ -0,0 +1,37 @@
package com.sunyard.chsm.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
/**
* @author liulu
* @since 2024/10/22
*/
@Getter
@AllArgsConstructor
public enum KeyAlg {
SM1(KeyCategory.SYM_KEY, "SM1", "SM1"),
SM4(KeyCategory.SYM_KEY, "SM4", "SM4"),
SM2(KeyCategory.ASYM_KEY, "SM2", "SM2"),
RSA(KeyCategory.ASYM_KEY, "RSA", "RSA"),
;
private final KeyCategory category;
private final String code;
private final String desc;
public static KeyAlg of(String code) {
if (code == null || code.trim().isEmpty()) {
return null;
}
return Arrays.stream(KeyAlg.values())
.filter(it -> Objects.equals(it.code, code))
.findFirst()
.orElse(null);
}
}
@@ -0,0 +1,38 @@
package com.sunyard.chsm.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
/**
* @author liulu
* @since 2024/10/22
*/
@Getter
@AllArgsConstructor
public enum KeyCategory {
// 对称密钥
SYM_KEY("sym_key", "对称密钥"),
// 非对称密钥
ASYM_KEY("asym_key", "非对称密钥"),
;
private final String code;
private final String desc;
public static KeyCategory of(String code) {
if (code == null || code.trim().isEmpty()) {
return null;
}
return Arrays.stream(KeyCategory.values())
.filter(it -> Objects.equals(it.code, code))
.findFirst()
.orElse(null);
}
}
@@ -0,0 +1,38 @@
package com.sunyard.chsm.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
/**
* @author liulu
* @since 2024/10/23
*/
@Getter
@AllArgsConstructor
public enum KeyStatus {
WAIT_ENABLED("wait_enabled", "待生效"),
ENABLED("enabled", "已启用"),
DISABLED("disabled", "已停用"),
ARCHIVED("archived", "已归档"),
EXPIRED("expired", "已过期"),
DESTROY("destroy", "已销毁"),
;
private final String code;
private final String desc;
public static KeyStatus of(String code) {
if (code == null || code.trim().isEmpty()) {
return null;
}
return Arrays.stream(KeyStatus.values())
.filter(it -> Objects.equals(it.code, code))
.findFirst()
.orElse(null);
}
}
@@ -0,0 +1,36 @@
package com.sunyard.chsm.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
/**
* 数据的填充模式
*
* @author Cheney
*/
@Getter
@AllArgsConstructor
public enum Padding {
NOPadding("NoPadding", "NoPadding"),
PCKS5Padding("PKCS5Padding", "PKCS5Padding"),
PCKS7Padding("PKCS7Padding", "PKCS7Padding"),
;
private final String code;
private final String desc;
public static Padding of(String code) {
if (code == null || code.trim().isEmpty()) {
return null;
}
return Arrays.stream(Padding.values())
.filter(it -> Objects.equals(it.getCode(), code))
.findFirst()
.orElse(null);
}
}
@@ -0,0 +1,33 @@
package com.sunyard.chsm.param;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* @author liulu
* @since 2024/11/13
*/
@Data
public class AppTokenReq {
/**
* 平台分配的appKey
*/
@NotBlank
@Size(min = 16, max = 64, message = "appKey长度必须为16-64")
private String appKey;
/**
* 时间戳毫秒数,与服务器时间不能超过5分钟
*/
@NotNull
private Long random;
/**
* 使用appKey+random+appSecret作为原文,使用appSecret作为key,根据HmacSM3算法计算得到hmac值,转为Hex编码
*/
@NotBlank
@Size(min = 32, max = 64, message = "hmac长度在60-64之间")
private String hmac;
}
@@ -0,0 +1,15 @@
package com.sunyard.chsm.param;
import lombok.Data;
/**
* @author liulu
* @since 2024/11/13
*/
@Data
public class AppTokenResp {
/**
* 获取的token的值
*/
private String token;
}
@@ -0,0 +1,26 @@
package com.sunyard.chsm.param;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
/**
* @author liulu
* @since 2024/12/17
*/
@Data
public class KeyCreateReq {
/**
* 密钥模版编码
*/
@NotNull(message = "密钥模版不能为空")
private String keyTemplateCode;
/**
* 生成数量
*/
@NotNull(message = "生成数量不能为空")
@Max(value = 100, message = "一次最多生成100个密钥")
private Integer genNumber;
}
@@ -0,0 +1,32 @@
package com.sunyard.chsm.param;
import com.sunyard.chsm.enums.KeyCategory;
import com.sunyard.chsm.enums.KeyStatus;
import lombok.Data;
/**
* @author liulu
* @since 2024/12/17
*/
@Data
public class KeyInfoQuery {
/**
* 当前页
*/
private int pageNumber = 1;
/**
* 每页大小
*/
private int pageSize = 10;
/**
* 密钥状态
*/
private KeyStatus status;
/**
* 密钥类型
*/
private KeyCategory keyType;
}
@@ -0,0 +1,56 @@
package com.sunyard.chsm.param;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author liulu
* @since 2024/12/17
*/
@Data
public class KeyInfoResp {
/**
* 密钥ID
*/
private Long KeyId;
/**
* 密钥算法
*/
private String keyAlg;
/**
* 密钥类型
*/
private String keyType;
private String keyTypeText;
/**
* 密钥用途
*/
private List<String> keyUsages;
private String keyUsageText;
/**
* 校验算法
*/
private String checkAlg;
/**
* 校验值
*/
private String checkValue;
/**
* 密钥状态
*/
private String status;
private String statusText;
/**
* 生效时间
*/
private LocalDateTime effectiveTime;
/**
* 过期时间
*/
private LocalDateTime expiredTime;
private LocalDateTime createTime;
}
@@ -0,0 +1,22 @@
package com.sunyard.chsm.param;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
/**
* @author liulu
* @since 2024/12/17
*/
@Data
public class KeyManageReq {
/**
* 密钥id列表
*/
@Size(min = 1, max = 100, message = "密钥id列表长度在1-100之间")
@NotNull(message = "密钥id列表不能为空")
private List<Long> ids;
}
@@ -0,0 +1,28 @@
package com.sunyard.chsm.param;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDate;
import java.util.List;
/**
* @author liulu
* @since 2024/12/17
*/
@Data
public class KeyUpdateReq {
/**
* 密钥id列表
*/
@Size(min = 1, max = 100, message = "密钥id列表长度在1-100之间")
@NotNull(message = "密钥id列表不能为空")
private List<Long> ids;
/**
* 新密钥生效时间 yyyy-MM-dd
*/
private LocalDate effectiveTime;
}
@@ -0,0 +1,37 @@
package com.sunyard.chsm.param;
import com.sunyard.chsm.enums.AlgMode;
import com.sunyard.chsm.enums.Padding;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Data
public class SymDecryptReq {
// 密钥ID
@NotNull(message = "密钥ID不能为空")
private Long keyId;
// 密钥索引
@NotEmpty(message = "密钥索引不能为空")
@Size(min = 15, max = 24, message = "密钥索引长度在15-24")
private String keyIndex;
// 密文,使用Base64编码
@NotBlank(message = "密文不能为空")
private String cipherData;
// 填充方式, 默认PCKS7
@NotNull(message = "填充方式不能为空")
private Padding padding = Padding.PCKS7Padding;
// 加密模式, 默认ECB
@NotNull(message = "加密模式不能为空")
private AlgMode mode = AlgMode.ECB;
// iv,CBC模式下不能为空,Base64编码
private String iv;
}
@@ -0,0 +1,13 @@
package com.sunyard.chsm.param;
import lombok.Data;
@Data
public class SymDecryptResp {
// 密钥ID
private Long keyId;
// 密钥索引
private String keyIndex;
// 明文,使用Base64编码
private String plainData;
}
@@ -0,0 +1,30 @@
package com.sunyard.chsm.param;
import com.sunyard.chsm.enums.AlgMode;
import com.sunyard.chsm.enums.Padding;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class SymEncryptReq {
// 密钥ID
@NotNull(message = "密钥ID不能为空")
private Long keyId;
// 待加密明文,使用Base64编码
@NotBlank(message = "明文不能为空")
private String plainData;
// 填充方式, 默认PCKS7
private Padding padding = Padding.PCKS7Padding;
// 加密模式, 默认ECB
@NotNull(message = "加密模式不能为空")
private AlgMode mode = AlgMode.ECB;
// iv, CBC模式下不能为空,Base64编码
private String iv;
}
@@ -0,0 +1,14 @@
package com.sunyard.chsm.param;
import lombok.Data;
@Data
public class SymEncryptResp {
// 密钥ID
private Long keyId;
// 密钥索引
private String keyIndex;
// 密文,使用Base64编码
private String cipherData;
}
@@ -0,0 +1,33 @@
package com.sunyard.chsm.param;
import com.sunyard.chsm.enums.HashAlg;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Data
public class SymHmacCheckReq {
// 密钥ID
@NotNull(message = "密钥ID不能为空")
private Long keyId;
// 密钥索引
@NotEmpty(message = "密钥索引不能为空")
@Size(min = 15, max = 24, message = "密钥索引长度在15-24")
private String keyIndex;
// Hash算法,默认SM3
private HashAlg hashAlg = HashAlg.SM3;
// 明文,使用Base64编码
@NotBlank(message = "明文不能为空")
private String plainData;
// hmac值,使用Base64编码
@NotBlank(message = "hmac不能为空")
private String hmac;
}
@@ -0,0 +1,10 @@
package com.sunyard.chsm.param;
import lombok.Data;
@Data
public class SymHmacCheckResp {
private Boolean valid;
}
@@ -0,0 +1,22 @@
package com.sunyard.chsm.param;
import com.sunyard.chsm.enums.HashAlg;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class SymHmacReq {
// 密钥ID
@NotNull(message = "密钥ID不能为空")
private Long keyId;
// 明文,使用Base64编码
@NotBlank(message = "明文不能为空")
private String plainData;
// Hash算法,默认SM3
private HashAlg hashAlg = HashAlg.SM3;
}
@@ -0,0 +1,15 @@
package com.sunyard.chsm.param;
import lombok.Data;
@Data
public class SymHmacResp {
// 密钥ID
private Long keyId;
// 密钥索引
private String keyIndex;
// hmac值,使用Base64编码
private String hmac;
}
@@ -0,0 +1,37 @@
package com.sunyard.chsm.param;
import com.sunyard.chsm.enums.Padding;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Data
public class SymMacCheckReq {
// 密钥ID
@NotNull(message = "密钥ID不能为空")
private Long keyId;
// 密钥索引
@NotEmpty(message = "密钥索引不能为空")
@Size(min = 15, max = 24, message = "密钥索引长度在15-24")
private String keyIndex;
// 填充方式, 默认PCKS7
private Padding padding = Padding.PCKS7Padding;
// iv,Base64编码
@NotBlank(message = "iv不能为空")
private String iv;
// 明文,使用Base64编码
@NotBlank(message = "明文不能为空")
private String plainData;
// mac值,使用Base64编码
@NotBlank(message = "mac不能为空")
private String mac;
}
@@ -0,0 +1,10 @@
package com.sunyard.chsm.param;
import lombok.Data;
@Data
public class SymMacCheckResp {
private Boolean valid;
}
@@ -0,0 +1,26 @@
package com.sunyard.chsm.param;
import com.sunyard.chsm.enums.Padding;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class SymMacReq {
// 密钥ID
@NotNull(message = "密钥ID不能为空")
private Long keyId;
// 明文,使用Base64编码
@NotBlank(message = "明文不能为空")
private String plainData;
// 填充方式, 默认PCKS7
private Padding padding = Padding.PCKS7Padding;
// iv,Base64编码
@NotBlank(message = "iv不能为空")
private String iv;
}
@@ -0,0 +1,15 @@
package com.sunyard.chsm.param;
import lombok.Data;
@Data
public class SymMacResp {
// 密钥ID
private Long keyId;
// 密钥索引
private String keyIndex;
// mac值,使用Base64编码
private String mac;
}