package com.sunyard.chsm.sdf;

import com.sunyard.chsm.enums.AlgMode;
import com.sunyard.chsm.enums.KeyAlg;
import com.sunyard.chsm.enums.Padding;

import java.util.HashMap;
import java.util.Map;

import static com.sunyard.chsm.utils.gm.BCSM4Utils.DEFAULT_KEY_SIZE;

/**
 * 实现 SdfApiService 接口中的通用逻辑
 * 处理参数缺失时的默认参数，确保下层入参没有 null
 * @author Cheney
 */
public abstract class AbstractSdfApiService implements SdfApiService {

    private static final Map<KeyAlg, Integer> algKeyLen = new HashMap<>();
    static {
        algKeyLen.put( KeyAlg.SM4, DEFAULT_KEY_SIZE );
    }

    /**
     * 处理算法的默认密钥长度
     * @param alg 算法，只支持对称算法
     *            密钥长度根据 alg 指定的算法自动选择。
     * @return 密钥
     */
    @Override
    public byte[] genSymKey(KeyAlg alg) {
        return genSymKey( alg, algKeyLen.get( alg ) );
    }


    /**
     * 对称加密
     * 内部实现和解密共用逻辑
     * @param alg 算法，只支持对称算法
     * @param key 密钥值，明文
     * @param data 原始数据
     */
    @Override
    public byte[] symEncrypt(KeyAlg alg, byte[] key, byte[] data){
        return symEncrypt( alg, AlgMode.ECB, Padding.PCKS5Padding, key, data );
    }


    /**
     * 对称解密
     * 内部实现和加密共用逻辑
     * @param alg 算法，只支持对称算法
     * @param key 密钥值，明文
     * @param data 密文数据
     */
    @Override
    public byte[] symDecrypt(KeyAlg alg, byte[] key, byte[] data) {
        return symDecrypt( alg, AlgMode.ECB, Padding.PCKS5Padding, key, data );
    }

}
