package com.sunyard.chsm.sdf;


import com.sunyard.chsm.enums.AlgMode;
import com.sunyard.chsm.enums.KeyAlg;
import com.sunyard.chsm.enums.Padding;
import com.sunyard.chsm.sdf.model.EccKey;


/**
 * @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 mode 轮模式
     * @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);

    /**
     * 对称解密
     * @param alg 算法，只支持对称算法
     * @param key 密钥值，明文
     * @param mode 轮模式
     * @param padding 填充模式
     * @param data 密文数据
     */
    byte[] symDecrypt(KeyAlg alg, AlgMode mode, Padding padding, byte[] key, byte[] data);
    byte[] symDecrypt(KeyAlg alg, byte[] key, byte[] data);




    /**
     * 产生ECC密钥对并输出
     *
     * @return pubKey 返回公钥 | priKey 返回私钥
     */
    EccKey genKeyPairEcc();

    /**
     * 计算MAC
     *
     * @param symKey  用户指定的密钥
     * @param pucIv   缓冲区指针，用于存放输入和返回的IV数据
     * @param pucData 缓冲区指针，用于存放输入的数据明文
     * @return pucEncData 返回MAC值 | puiLength 返回MAC值长度
     */
    byte[] calculateMAC(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);
}
