package com.sunyard.chsm.sdf; import com.sunyard.chsm.enums.Padding; import com.sunyard.chsm.sdf.context.AlgId; import com.sunyard.chsm.sdf.model.EccCipher; import com.sunyard.chsm.sdf.model.EccKey; import com.sunyard.chsm.sdf.model.EccSignature; /** * @author liulu * @since 2024/10/23 */ public interface SdfApiService { /** * 产生随机数 * * @param len 随机数长度 * @return 返回随机数 */ byte[] generateRandom(int len); /** * 生成对称密钥 * * @param alg 算法,只支持对称算法 * @param keyLen 密钥长度(bit),只针对密钥长度可变的算法。 * 禁止传 null * @return 对称密钥 */ // byte[] genSymKey(KeyAlg alg, Integer keyLen); // // byte[] genSymKey(KeyAlg alg); /** * 对称加密 * * @param alg 算法,只支持对称算法 * @param padding * @param key 密钥值,明文 * @param data 原始数据 */ // byte[] symEncrypt(KeyAlg alg, AlgMode mode, Padding padding, byte[] key, byte[] data); // // byte[] symEncrypt(KeyAlg alg, byte[] key, byte[] data); byte[] symEncrypt(AlgId alg, Padding padding, byte[] key, byte[] iv, byte[] data); /** * 对称解密 * * @param mode 轮模式 * @param alg 算法,只支持对称算法 * @param padding 填充模式 * @param key 密钥值,明文 * @param data 密文数据 */ // byte[] symDecrypt(KeyAlg alg, AlgMode mode, Padding padding, byte[] key, byte[] data); // // byte[] symDecrypt(KeyAlg alg, byte[] key, byte[] data); byte[] symDecrypt(AlgId alg, Padding padding, byte[] key, byte[] iv, byte[] data); /** * 产生ECC密钥对并输出 * * @return pubKey 返回公钥 | priKey 返回私钥 */ EccKey genKeyPairEcc(); /** * 外部密钥ECC签名 * * @param privateKey ECC私钥 * @param pucData 缓冲区指针,用于存放外部输入的数据 * @param userId 签名者id * @return pucSignature 返回签名值数据 */ EccSignature externalSignWithIdECC(byte[] privateKey, byte[] pucData, byte[] userId); EccSignature externalSignECC(byte[] privateKey, byte[] pucData); /** * 外部密钥ECC验证 * * @param publicKey ECC公钥 * @param pubData 原文 * @param userId 签名者id * @param signData 外部签名数据 * @return 0 成功; 非0 失败,返回错误代码 */ boolean externalVerifyWithIdECC(byte[] publicKey, byte[] pubData, byte[] signData, byte[] userId); boolean externalVerifyECC(byte[] publicKey, byte[] pubData, byte[] signData); /** * 外部密钥ECC公钥加密 * * @param publicKey 外部ECC公钥结构 * @param pucData 缓冲区指针,用于存放外部输入的数据 * @return pucEncData 返回数据密文 */ EccCipher externalEncryptECC(byte[] publicKey, byte[] pucData); /** * 外部密钥ECC私钥解密 * * @param privateKey 外部ECC私钥结构 * @param encData 缓冲区指针,用于存放输入的数据密文 * @return pucData 返回数据明文 */ byte[] externalDecryptECC(byte[] privateKey, byte[] encData); /** * 计算MAC * * @param algId algId * @param padding padding * @param symKey 用户指定的密钥 * @param pucIv 缓冲区指针,用于存放输入和返回的IV数据 * @param pucData 缓冲区指针,用于存放输入的数据明文 * @return pucEncData 返回MAC值 | puiLength 返回MAC值长度 */ byte[] calculateMAC(AlgId algId, Padding padding, byte[] symKey, byte[] pucIv, byte[] pucData); byte[] hmac(byte[] key, byte[] srcData); /** * 杂凑运算 * * @param pucData 缓冲区指针,用于存放输入的数据明文 * @return hash值 */ byte[] hash(byte[] pucData); byte[] encryptByTMK(byte[] data); byte[] decryptByTMK(byte[] data); }