package com.sunyard.chsm.sdf.adapter;

import com.sunyard.chsm.sdf.model.DeviceInfo;
import com.sunyard.chsm.sdf.model.EccKey;

/**
 * @author liulu
 * @since 2024/11/4
 */
public interface SdfApiAdapter {

    /**
     * 打开设备
     *
     * @return 设 备 句 柄
     */
    String openDevice();

    /**
     * 关闭设备
     *
     * @param deviceHandle 已打开的设备句柄
     * @return 0 成功;   非0 失败,返回错误代码
     */
    boolean closeDevice(String deviceHandle);

    /**
     * 创建会话
     *
     * @return 与密码设备建立的新会话句柄
     */
    String openSession(String deviceHandle);

    void closeSession(String sessionHandle);

    /**
     * 获取设备信息
     *
     * @param sessionHandle 与设备建立的会话句柄
     * @return 设备能力描述信息，内容及格式见设备信息定义
     */
    DeviceInfo getDeviceInfo(String sessionHandle);

    /**
     * 产生随机数
     *
     * @param uiLength 随机数长度
     * @return pucRandom 返回随机数
     */
    byte[] generateRandom(String sessionHandle, int uiLength);
    
    /**
     * 导出ECC加密公钥
     *
     * @param uiKeyIndex 密码设备存储的ECC密钥对索引值
     * @return pucPublicKeyEcc 返回ECC加密公钥x+y
     */
    byte[] exportEncPublicKeyECC(String sessionHandle, int uiKeyIndex);

    /**
     * 产生ECC密钥对并输出
     *
     * @param alg       指定算法标识 SGD_SM2_1
     * @param uiKeyBits 指定密钥模长
     * @return pucPublicKeyEcc 返回公钥 | pucPrivateKeyEcc 返回私钥
     */
    EccKey generateKeyPairECC(String sessionHandle, String alg, int uiKeyBits);


    byte[] exchangeDigitEnvelopeBaseOnECC(String sessionHandle, int uiKeyIndex, byte[] pubKey, byte[] pucEncDateIn);


    byte[] externalEncryptECC(String sessionHandle, byte[] pubKey, byte[] pucData);


}
