package com.sunyard.ssp.modules.sdk;

import com.sunyard.ssp.UnionMessage;
import com.sunyard.ssp.constv.Alg;
import com.sunyard.ssp.constv.KeyType;
import com.sunyard.ssp.constv.SplitMode;

/**
 * @author:tsz
 * @date:2020/5/21
 * @description: 对称密钥工具类
 */
public interface SymmetricKeyToolService {

    /**
     * @param :len 随机数长度
     * @return :
     * @date :2020/05/21 14:27
     * @description : 生成指定长度的真随机数
     */
    String genRandom(int len);

    /**
     * @param : keyType 密钥类型
     * @param : alg 指定此密钥用于什么算法
     * @param : keylenMultiple 密钥长度的倍数
     * @return :
     * @date :2020/05/21 14:29
     * @description : 生成临时用的密钥
     */
    UnionMessage genTempKey(KeyType keyType, Alg alg, int keylenMultiple);

    /**
     * @param :
     * @return :
     * @date :2020/05/21 14:31
     * @description : 暂时没实现的接口
     */
    boolean genKey(String key, KeyType keyType, Alg alg, int keylenMultiple);

    /**
     * @param : sln 密钥方案
     * @param : tmpl 密钥模板
     * @param : node 密钥节点
     * @param : startTime 开始时间
     * @param : period 有效期
     * @return :
     * @date :2020/05/21 14:32
     * @description : 根据密钥方案密钥模板生成指定节点密钥 并打印
     */
    UnionMessage genKeyByTmplAndPrint(String sln, String tmpl, String node, Long startTime, Long period);

    /**
     * @param : sln 密钥方案
     * @param : tmpl 密钥模板
     * @param : node 密钥节点
     * @return :
     * @date :2020/05/21 14:36
     * @description : 根据密钥方案密钥模板更新指定节点密钥
     */
    UnionMessage genKeyByTmplAndPrint(String sln, String tmpl, String node);

    /**
     * @param : key 指定密钥名，例如 XXX.000000.T001.ZMK
     * @param : splitMode XOR('异或模式', 1),SEG( '拼接模式', 2)
     * @param : splits 所有的密钥分量 HEX格式
     * @param : kcv 密钥校验值 HEX 格式可选，如果没有 kcv 则不对密钥进行校验
     * @param : startTime 开始时间
     * @param : period 有效期
     * @return :
     * @date :2020/05/21 14:39
     * @description : 分量导入 生成密钥
     */
    UnionMessage synthKeyInput(String key, SplitMode splitMode, String[] splits, String kcv, Long startTime, Long period);

    /**
     * @param : key 指定密钥名，例如 XXX.000000.T001.ZMK
     * @param : splitMode XOR('异或模式', 1),SEG( '拼接模式', 2)
     * @param : splits 所有的密钥分量 HEX格式
     * @param : kcv 密钥校验值 HEX 格式可选，如果没有 kcv 则不对密钥进行校验
     * @return :
     * @date :2020/05/21 14:39
     * @description : 分量导入 更新密钥
     */
    UnionMessage synthKeyInput(String key, SplitMode splitMode, String[] splits, String kcv);

    /**
     * @param : key 指定密钥名，例如 XXX.000000.T001.ZMK
     * @param : kek 保护密钥的名字
     * @return :
     * @date :2020/05/21 14:43
     * @description : 通过保护密钥加密并导出密钥
     */
    UnionMessage encryptionKeyOutput(String key, String kek);

    /**
     * @param : key 指定密钥名，例如 XXX.000000.T001.ZMK
     * @param : keyvalue 密钥值
     * @param : kcv 密钥校验值，可选，如果为 null 则不进行校验
     * @param : kek 保护密钥的名字
     * @param : startTime 开始时间
     * @param : period 有效期
     * @return :
     * @date :2020/05/21 14:44
     * @description : 通过保护密钥加密并导入 生成密钥
     */
    UnionMessage decryptKeyInput(String key, String keyvalue, String kcv, String kek, Long startTime, Long period);

    /**
     * @param : key 指定密钥名，例如 XXX.000000.T001.ZMK
     * @param : keyvalue 密钥值
     * @param : kcv 密钥校验值，可选，如果为 null 则不进行校验
     * @param : kek 保护密钥的名字
     * @return :
     * @date :2020/05/21 14:43
     * @description : 通过保护密钥加密并导入 更新密钥
     */
    UnionMessage decryptKeyInput(String key, String keyvalue, String kcv, String kek);

    /**
    *@date   :2020/05/21 14:47
    *@description : 通过公钥保护导出密钥 未实现
    * @param :
    * @return :
    */
    UnionMessage encryptionKeyByPkOutput(String key, Alg alg, String pk);

    /**
    *@date   :2020/05/21 14:47
    *@description : 未实现接口
    * @param :
    * @return :
    */
    UnionMessage encryptionKeyByPkvOutput(String key, Alg alg, String pkv);

    /**
    *@date   :2020/05/21 14:48
    *@description : 通过私钥解密导入 生成密钥 未实现
    * @param :
    * @return :
    */
    void decryptKeyBySkInput(String key, String kcv, String sk);

    /**
    *@date   :2020/05/21 14:48
    *@description : 通过私钥解密导入 更新密钥 未实现
    * @param :
    * @return :
    */
    void decryptKeyBySkInput(String key, String kcv, String sk, Long startTime, Long period);
}
