// пример по задаче rm#28498 пример импорта ключа pfx/p12 в существующий контейнер bin 

import kz.gamma.core.UtilCM;
import kz.gamma.jce.provider.GammaTechProvider;
import kz.gamma.tumarcsp.CSPUtil;
import kz.gamma.tumarcsp.LibraryWrapper;
import kz.gamma.tumarcsp.TumarCspFunctions;
import java.security.*;

public class ImportKey {
    /**
     *
     * @param profileFrom - полное имя профиля , откуда берем ключ
     * @param passExport - пароль для экспорта
     * @return возвращаем ключ и сертификат в PKCS12
     * @throws Exception
     */
    static byte[] exportKeyP12T(String profileFrom, String passExport) throws Exception {
        Number hProv = null;
        Number hKey = null;
        byte[] keyS = null;
        try {
            hProv = TumarCspFunctions.cpAcquireContext(profileFrom, LibraryWrapper.CRYPT_NEWKEYSET);

            //найдем первый ключ
            byte[] bt = TumarCspFunctions.cpGetProvParamByte(hProv,LibraryWrapper.PP_ENUM_CNT_PRIV_KEYS,LibraryWrapper.CRYPT_FIRST,LibraryWrapper.PK_KEY_ALGID);
            System.out.println(""+bt.length);

            int alg = UtilCM.byteToInt( bt,0,1);
            CSPUtil cspUtil = new CSPUtil();
            int keySpec = cspUtil.getTypeKey(alg);
            hKey = TumarCspFunctions.cpGetUserKey(hProv,keySpec);
            byte[] cert = TumarCspFunctions.cpGetKeyParamData(hProv,hKey,LibraryWrapper.KP_CERTIFICATE,0);
            if(cert != null && cert.length >0 )
               keyS = TumarCspFunctions.cpExportKeyData(hProv, hKey, passExport.getBytes(), LibraryWrapper.PRIVATEKEYBLOB_PKCS12, 0);
            else
               keyS = TumarCspFunctions.cpExportKeyData(hProv, hKey, passExport.getBytes(), LibraryWrapper.PRIVATEKEYBLOB_PKCS8, 0);
            return keyS;

        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            if(hKey != null && hKey.longValue() != 0)
                TumarCspFunctions.cpDestroyKey(hProv,hKey);
            if(hProv != null && hProv.longValue() != 0)
                TumarCspFunctions.cpReleaseContext(hProv,0);
        }
        return null;
    }

    /**
     *
     * @param profileTo  - полное имя профиля , куда кладем ключ
     * @param passExport - пароль для экспорта
     * @param keys       - ключ и сертификат в PKCS12
     * @throws Exception
     */
    static void importKeyT(String profileTo, String passExport,byte[] keys) throws Exception {
        Number hProv = null;
        Number hKey = null;
        try {
            hProv = TumarCspFunctions.cpAcquireContext(profileTo, LibraryWrapper.CRYPT_NEWKEYSET);
            hKey = TumarCspFunctions.cpImportKey(hProv, keys,keys.length, passExport.getBytes(),LibraryWrapper.ZERO);
        }finally{
            if(hKey != null && hKey.longValue() != 0)
                TumarCspFunctions.cpDestroyKey(hProv,hKey);
            if(hProv != null && hProv.longValue() != 0)
                TumarCspFunctions.cpReleaseContext(hProv,0);
        }
    }

    /**
     *
     * @param keyName   - имя файла контейнера
     * @param path      - путь к файлу контейнеру
     * @param pass      - пароль к к файлу контейнеру
     * @param ext       - расширение файла контейнера (p12,bin)
     * @return          - Полное наименование профиля
     */
    public static String createProfile(String keyName, String path, String pass, String ext) {
        String profile = "";
        Number hProvLocal = TumarCspFunctions.cpAcquireContext("", LibraryWrapper.CRYPT_VERIFYCONTEXT);
        profile = TumarCspFunctions.cpCreateUrl(keyName, "file", keyName, pass, path, ext, 0xA045, 0xAA3A, hProvLocal);
        TumarCspFunctions.cpReleaseContext(hProvLocal, 0);
        return profile;
    }


    public static void main(String[] args) {
        try {
            Security.addProvider(new GammaTechProvider());
            String sourcePath = "d:/**/";      //путь к файлу контейнеру , откуда берем ключ
            String sourceFile = "key*";       //имя файла контейнера, откуда берем ключ
            String sourcePass = "1*";          //пароль к к файлу контейнеру, откуда берем ключ
            String exportPass = "1*";          //пароль для экспорта
            String tagetPath = "d:/***/";     //путь к файлу контейнеру , куда кладем ключ
            String targetFile = "importKey*"; //имя файла контейнера, куда кладем ключ
            String targetPass = "1*";          //пароль к к файлу контейнеру, куда кладем ключ

            String profileFrom = createProfile(sourceFile, sourcePath, sourcePass, "p12");
            byte[] keyS = exportKeyP12T(profileFrom,exportPass);
            if(keyS != null && keyS.length > 0) {
                String profileTo = createProfile(targetFile, tagetPath, targetPass, "bin");
                importKeyT(profileTo, exportPass, keyS);
                System.out.println("Ok");
            } else
                System.out.println("Error export key");

        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
