package com.sunyard.ssp.modules.sdk;

import com.sunyard.ssp.UnionMessage;
import com.sunyard.ssp.constv.Alg;
import com.sunyard.ssp.constv.KeyPairType;
import com.sunyard.ssp.constv.KeyType;
import com.sunyard.ssp.constv.PublicKeyType;

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

    /**
     * @param :
     * @return :
     * @date :2020/05/21 15:10
     * @description : 生成临时用的密钥对 未实现
     */
    UnionMessage genTempKeyPair(KeyPairType keypairType, Alg alg, int keylenMultiple);

    /**
     * @param :
     * @return :
     * @date :2020/05/21 15:11
     * @description : 生成密钥对 未实现
     */
    boolean genKeyPair(String pk, String sk, KeyType keyType, Alg alg, int keylenMultiple);

    /**
     * @param : pk 公钥的名字
     * @param : type RAW 裸公钥,DER 格式,Base64 格式
     * @param : pkv 公钥值
     * @param : startTime 开始时间
     * @param : period 有效期
     * @return :
     * @date :2020/05/21 15:12
     * @description : 导入 生成公钥
     */
    void importPk(String pk, PublicKeyType type, byte[] pkv, Long startTime, Long period);

    /**
     * @param : pk 公钥的名字
     * @param : type RAW 裸公钥,DER 格式,Base64 格式
     * @param : pkv 公钥值
     * @return :
     * @date :2020/05/21 15:12
     * @description : 导入 更新公钥
     */
    void importPk(String pk, PublicKeyType type, byte[] pkv);

    /**
     * @param : pk 公钥的名字
     * @param : type RAW 裸公钥,DER 格式,Base64 格式
     * @return :
     * @date :2020/05/21 15:14
     * @description : 导出公钥
     */
    byte[] outputPk(String pk, PublicKeyType type);

    /**
     * @param :alg  非对称算法
     * @param :key  加密用的密钥的名字，可以是公钥可以是私钥
     * @param :data 原始数据
     * @date :2020/06/22 14:25
     * @description : 非对称公钥加密
     */
    byte[] ASYMPKEncryptData(Alg alg, String pk, byte[] data);

    /**
     * @param : alg 非对称算法
     * @param : key 加密用的密钥的名字，可以是公钥可以是私钥 公钥加密则对方用私钥解密，私钥加密则对方用公钥解密。
     * @param : data 原始数据
     * @date :2020/06/22 14:27
     * @description : 非对称私钥解密
     */
    byte[] ASYMSKDecryptData(Alg alg, String sk, byte[] data);


    /**
     * @author wp
     * @Description: p1验签
     * @date 2021/9/22
     * @param alg 非对称算法
     * @param orgData 原始数据
     * @param sign  签名数据
     * @return boolean
     */
    boolean PKCS1Verify(Alg alg, byte[] orgData, byte[] sign);


    /**
     * @param alg  非对称算法
     * @param pk   外部公钥
     * @param data 原始数据
     * @return byte[]
     * @author wp
     * @Description: 外部公钥加密
     * @date 2021/9/22
     */
    byte[] ASYMEncryptDataByOutPK(Alg alg, String pk, String data);

    /**
     * @author wp
     * @Description: p1签名
     * @date 2021/9/22
     * @param alg 非对称算法
     * @param data 原始数据
     * @return byte[]
     */
    byte[] PKCS1Sign(Alg alg, byte[] data);
}
