Библиотека "Java интерфейс" (Java Native Interface) - это динамическая библиотека (dll) Windows, предназначення для выполнения из программ на языке Java криптографических операций, реализованных в криптопровайдерах Windows (Cryptography Service Provider, CSP). Поддерживаются все криптопровайдеры, установленные в Windows XP/ 2003/ 7/ 2008. Библиотека скомпилирована как 32-bit и 64-bit динамическая библиотека.
Условие лицензирования: для использования физическими лицами - свободное; для использования юридическими лицами - коммерческое.
Библиотека включена в пакет ambapi.jar и загружается в папку пользователя при вызове конструктора:
JCSRJNI dll = new JCSRJNI();
Краткое описание
1. Общие сведения
Криптопровайдер CSP — это независимый модуль, позволяющий осуществлять криптографические операции в операционных системах Microsoft, управление которым происходит с помощью функций CryptoAPI.
Любой криптопровайдер должен экспортировать набор обязательных функций, которые формируют системный программный интерфейс CryptoAPI, при этом каждая из этих функций соответствует некоторой функции CryptoAPI. Также криптопровайдер должен обеспечивать:
Приложения не работают напрямую с криптопровайдером, вместо этого они вызывают функции CryptoAPI из библиотек Advapi32.dll и Crypt32.dll, которые непосредственно работают с криптопровайдером. |
Java Native Interface (JNI) — стандартный механизм для запуска кода, под управлением виртуальной машины Java (JVM), который написан на языках С/С++ или Ассемблера, и скомпонован в виде динамических библиотек, позволяет не использовать статическое связывание. Это даёт возможность вызова функции С/С++ из программы на Java.
2. Список функций
Все функции возвращают коды ошибки в public переменных lastError (ошибки провайдера), lastWindowsError (ошибки Windows). Если ошибок нет, то lastError = 0 и lastWindowsError = 0.
№ п/п |
Функция | Назначение | Параметры |
---|---|---|---|
1 |
byte[] getCertByThumbprint(String storeName, String thumbprint) | Получить сертификат по его отпечатку |
storeName
- имя хранилища Windows ("MY", "CA", "ROOT"); thumbprint - отпечаток (хеш SHA-1) сертификата в Hex формате. Возвращает сертификат как байт массив. |
2 |
byte[] getCertByKeyIdentifier(String storeName, byte[] keyIdentifier) | Получить сертификат по SubjectKeyIdentifier |
storeName
- имя хранилища Windows ("MY", "CA", "ROOT"); keyIdentifier - значение SubjectKeyIdentifier. Возвращает сертификат как байт массив. |
3 |
byte[] getCertByKeyIdentifier2(String storeName, int location, byte[] keyIdentifier) | Получить сертификат по SubjectKeyIdentifier |
storeName - имя хранилища Windows ("MY", "CA", "ROOT");
location - размещение хранилища (CERT_SYSTEM_STORE_CURRENT_USER = 0x10000; CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x20000; CERT_SYSTEM_STORE_CURRENT_SERVICE = 0x40000; CERT_SYSTEM_STORE_SERVICE = 0x50000; CERT_SYSTEM_STORE_USERS = 0x60000; CERT_SYSTEM_CURRENT_USER_GROUP_POLICY = 0x70000; CERT_SYSTEM_LOCAL_MACHINE_GROUP_POLICY = 0x80000; CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 0x90000;); keyIdentifier - значение SubjectKeyIdentifier. Возвращает сертификат как байт массив. |
4 |
byte[] getListCert(String storeName, String caption, String text, int notUseColumn) | Получить окно списка сертификатов и выбрать в нем сертификат |
storeName
- имя хранилища Windows ("MY", "CA", "ROOT"); caption - текст заголовка окна; text - текст заголовка таблицы сертификатов в окне; notUseColumn - флаг использования столбцов таблицы сертификатов (CRYPTUI_SELECT_ISSUEDTO_COLUMN = 0x000000001; CRYPTUI_SELECT_ISSUEDBY_COLUMN = 0x000000002; CRYPTUI_SELECT_INTENDEDUSE_COLUMN = 0x000000004; CRYPTUI_SELECT_FRIENDLYNAME_COLUMN = 0x000000008; CRYPTUI_SELECT_LOCATION_COLUMN = 0x000000010; CRYPTUI_SELECT_EXPIRATION_COLUMN = 0x000000020;). Возвращает сертификат как байт массив. |
5 |
byte[] hash(byte[] certificate, byte[] data) | Вычислить хэш-функцию данных; алгоритм хэш берется из алгоритма подписи сертификата |
certificate
- сертификат (выбор хэш алгоритма: если алгоритм подписи sha1RSA, то алгоритм хэш SHA1; если ДСТУ 4145, то алгоритм хэш ГОСТ 34311-95; и т.д.);
data - данные. Возвращает хэш значение как байт массив. |
6 |
byte[] sign(byte[] certificate, byte[] data, String password) | Вычислить подпись данных; алгоритм хэш берется из алгоритма подписи сертификата |
certificate
- сертификат, на закрытом ключе которого требуется подписать данные (выбор хэш алгоритма: если алгоритм подписи sha1RSA, то алгоритм хэш SHA1; если ДСТУ 4145, то алгоритм хэш ГОСТ 34311-95; и т.д.);
data - данные; password - пароль доступа к закрытому ключу или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает значение подписи как байт массив (в виде, который определен соответсвующим стандартом). |
7 |
byte[] sign2(byte[] certificate, byte[] data, int hashType, String password) | Вычислить подпись данных с заданным алгоритмом хэш |
certificate
- сертификат, на закрытом ключе которого требуется подписать данные;
data - данные; hashType - хэш алгоритм (HASH_TYPE_G34311 = 32850; HASH_TYPE_SHA1 = 32772; HASH_TYPE_SHA_256 = 32780; HASH_TYPE_SHA_384 = 32781; HASH_TYPE_SHA_512 = 32782;); password - пароль доступа к закрытому ключу или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает значение подписи как байт массив (в виде, который определен соответсвующим стандартом). |
8 |
boolean verify(byte[] certificate, byte[] data, byte[] signature) | Проверить подпись данных; алгоритм хэш берется из алгоритма подписи сертификата |
certificate
- сертификат, на открытом ключе которого требуется проверить подпись данных (выбор хэш алгоритма: если алгоритм подписи sha1RSA, то алгоритм хэш SHA1; если ДСТУ 4145, то алгоритм хэш ГОСТ 34311-95; и т.д.);
data - данные; signature - значение подписи. Возвращает булевский результат проверки подписи. |
9 |
boolean verify2(byte[] certificate, byte[] data, byte[] signature, int hashType) | Проверить подпись данных с заданным алгоритмом хэш |
certificate
- сертификат, на открытом ключе которого требуется проверить подпись данных;
data - данные; signature - значение подписи; hashType - хэш алгоритм (HASH_TYPE_G34311 = 32850; HASH_TYPE_SHA1 = 32772; HASH_TYPE_SHA_256 = 32780; HASH_TYPE_SHA_384 = 32781; HASH_TYPE_SHA_512 = 32782;). Возвращает булевский результат проверки подписи. |
10 |
byte[] signPKCS7(byte[] certificate, byte[] data, int hashType, String password) | Подпись данных в формате PKCS#7 отсоединенная подпись (SignedData detached signature) с заданным алгоритмом хэш |
certificate
- сертификат, на закрытом ключе которого требуется подписать данные; data - данные; hashType - хэш алгоритм (HASH_TYPE_G34311 = 32850; HASH_TYPE_SHA1 = 32772; HASH_TYPE_SHA_256 = 32780; HASH_TYPE_SHA_384 = 32781; HASH_TYPE_SHA_512 = 32782;); password - пароль доступа к закрытому ключу или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает значение подписи как байт массив формате PKCS#7 отсоединенная подпись (SignedData detached signature). |
11 |
byte[] signPKCS7(byte[] certificate, byte[] data, String password) | Подпись данных в формате PKCS#7 отсоединенная подпись (SignedData detached signature) с алгоритмом хэш из сертификата |
certificate
- сертификат, на закрытом ключе которого требуется подписать данные (выбор хэш алгоритма: если алгоритм подписи sha1RSA, то алгоритм хэш SHA1; если ДСТУ 4145, то алгоритм хэш ГОСТ 34311-95; и т.д.);
data - данные; password - пароль доступа к закрытому ключу или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает значение подписи как байт массив формате PKCS#7 отсоединенная подпись (SignedData detached signature). |
12 |
byte[] signPKCS7(byte[] certificate, byte[] data, int hashType, String password) | Подпись данных в формате PKCS#7 отсоединенная подпись (SignedData detached signature) с заданным алгоритмом хэш |
certificate
- сертификат, на закрытом ключе которого требуется подписать данные;
data - данные; hashType - хэш алгоритм (HASH_TYPE_G34311 = 32850; HASH_TYPE_SHA1 = 32772; HASH_TYPE_SHA_256 = 32780; HASH_TYPE_SHA_384 = 32781; HASH_TYPE_SHA_512 = 32782;); password - пароль доступа к закрытому ключу или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает значение подписи как байт массив формате PKCS#7 отсоединенная подпись (SignedData detached signature). |
13 |
byte[] signPKCS7(byte[] certificate, byte[] data, String password, boolean isDetached) | Подпись данных в формате PKCS#7 отсоединенная или присединенная подпись (SignedData detached/attached signature) с алгоритмом хэш из сертификата |
certificate
- сертификат, на закрытом ключе которого требуется подписать данные (выбор хэш алгоритма: если алгоритм подписи sha1RSA, то алгоритм хэш SHA1; если ДСТУ 4145, то алгоритм хэш ГОСТ 34311-95; и т.д.);
data - данные; password - пароль доступа к закрытому ключу или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе); isDetached - флаг отсоединенной подписи (true) или присоединенной (false). Возвращает значение подписи как байт массив формате PKCS#7 (SignedData). |
14 |
byte[] signPKCS7(byte[] certificate, byte[] data, String password, boolean isDetached, int hashType) | Подпись данных в формате PKCS#7 отсоединенная или присединенная подпись (SignedData detached/attached signature) с заданным алгоритмом хэш |
certificate - сертификат, на закрытом ключе которого требуется подписать данные;
data - данные; isDetached - флаг отсоединенной подписи (true) или присоединенной (false); hashType - хэш алгоритм (HASH_TYPE_G34311 = 32850; HASH_TYPE_SHA1 = 32772; HASH_TYPE_SHA_256 = 32780; HASH_TYPE_SHA_384 = 32781; HASH_TYPE_SHA_512 = 32782;); password - пароль доступа к закрытому ключу или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает значение подписи как байт массив формате PKCS#7 (SignedData). |
15 |
boolean verifyPKCS7(byte[] data, byte[] signature) | Проверить подпись данных в формате PKCS#7 отсоединенная подпись (SignedData detached signature) | data - данные, которые были подписаны;
signature - значение подписи в формате PKCS#7 отсоединенная подпись. Возвращает булевское значение проверки подписи. |
16 |
boolean verifyPKCS7(byte[] data, byte[] signature) | Проверить подпись данных в формате PKCS#7 отсоединенная или присоединенная подпись (SignedData detached/ attached signature) | data - null для присоединенной подписи, или данные, которые были подписаны, для отсоединенной подписи;
signature - значение подписи в формате PKCS#7 (SignedData). Возвращает булевское значение проверки подписи. |
17 |
boolean importPFX(String storeName, byte[] pfx, String password, int flags) | Импортировать ключи и сертификаты из PKCS#12 (PFX) файла в заданное хранилище | storeName
- имя хранилища ("MY", "CA", "ROOT"), куда требуется выполнить импорт;
pfx - байт массив pfx файла; password - пароль доступа к pfx файлу; flags - комбинация флагов (определены в Wincrypt.h), которые будут применяться к закрытому ключу. Могут быть использованы следующие флаги через OR-операцию: CRYPT_EXPORTABLE, CRYPT_USER_PROTECTED, CRYPT_MACHINE_KEYSET, CRYPT_USER_KEYSET. Возвращает булевское значение результата импорта. |
18 |
boolean ImportPFX(String storeName, int location, String fileName, String password) | Импортировать ключи и сертификаты из PKCS#12 (PFX) файла в заданное хранилище | storeName
- имя хранилища ("MY", "CA", "ROOT"), куда требуется выполнить импорт;
location - размещение хранилища (CERT_SYSTEM_STORE_CURRENT_USER = 0x10000; CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x20000; CERT_SYSTEM_STORE_CURRENT_SERVICE = 0x40000; CERT_SYSTEM_STORE_SERVICE = 0x50000; CERT_SYSTEM_STORE_USERS = 0x60000; CERT_SYSTEM_CURRENT_USER_GROUP_POLICY = 0x70000; CERT_SYSTEM_LOCAL_MACHINE_GROUP_POLICY = 0x80000; CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 0x90000;); fileName - имя pfx файла; password - пароль доступа к pfx файлу. Возвращает булевское значение результата импорта. |
19 |
int ExportPFX(String storeName, int location, String fileName, String password) | Экспортировать ключ и сертификат из заданного хранилища в файл PKCS#12 (PFX) | storeName
- имя хранилища ("MY", "CA", "ROOT"), куда требуется выполнить импорт;
location - размещение хранилища (CERT_SYSTEM_STORE_CURRENT_USER = 0x10000; CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x20000; CERT_SYSTEM_STORE_CURRENT_SERVICE = 0x40000; CERT_SYSTEM_STORE_SERVICE = 0x50000; CERT_SYSTEM_STORE_USERS = 0x60000; CERT_SYSTEM_CURRENT_USER_GROUP_POLICY = 0x70000; CERT_SYSTEM_LOCAL_MACHINE_GROUP_POLICY = 0x80000; CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 0x90000;); fileName - путь и имя создаваемого pfx файла; password - пароль доступа к pfx файлу. Возвращает 0 значение, если успешно. |
20 |
byte[] encryptPkcs7(byte[] certificate, byte[] plainData) | Зашифровать данные в формате PKCS#7 защищенные данные (EnvelopedData), RSA | certificate - сертификат получателя, на открытом ключе которого защищаются данные (только для RSA алгоритма ключа);
plainData - байт массив данных, которые требуется зашифровать. Возвращает байт массив зашифрованных данных в формате PKCS#7 защищенные данные (EnvelopedData). |
21 |
byte[] decryptPkcs7(byte[] certificate, byte[] encData, String password) | Расшифровать данные в формате PKCS#7 защищенные данные (EnvelopedData), RSA алгоритм ключа | certificate - сертификат получателя, на закрытом ключе которого необходимо расшифровать данные (только для RSA алгоритма ключа);
encData - байт массив зашифрованных данных в формате PKCS#7 защищенные данные (EnvelopedData); password - пароль доступа к закрытому ключу или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает байт массив расшифрованных данных. |
22 |
byte[] encryptDH(byte[] senderCert, byte[] recieverCert, byte[] data, String password) | Зашифровать данные в формате PKCS#7 защищенные данные (EnvelopedData), Диффи-Хеллман (Diffie-Hellman), алгоритм ключа: ДСТУ 4145-2002, ГОСТ 34.310-95, ГОСТ 34.310-2004, ECDSA, DSA | senderCert - сертификат отправителя, закрытый ключ которого используется протоколом согласования ключей Диффи-Хеллмана;
recieverCert - сертификат получателя, открытый ключ которого используется протоколом согласования ключей Диффи-Хеллмана;
data - байт массив данных, которые требуется зашифровать; password - пароль доступа к закрытому ключу отправителя или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает байт массив зашифрованных данных в формате PKCS#7 защищенные данные (EnvelopedData). |
23 |
byte[] decryptDH(byte[] senderCert, byte[] recieverCert, byte[] data, String password) | Расшифровать данные в формате PKCS#7 защищенные данные (EnvelopedData), Диффи-Хеллман (Diffie-Hellman), алгоритм ключа: ДСТУ 4145-2002, ГОСТ 34.310-95, ГОСТ 34.310-2004, ECDSA, DSA | senderCert - сертификат отправителя, открытый ключ которого используется протоколом согласования ключей Диффи-Хеллмана;
recieverCert - сертификат получателя, закрытый ключ которого используется протоколом согласования ключей Диффи-Хеллмана;
data - байт массив данных, которые требуется зашифровать; password - пароль доступа к закрытому ключу получателя или null; если пароль не задан, то провайдер CSP запросит пароль при необходимости (провайдеры Microdoft не запрашивают пароль, т.к. используют механизм аутентификации пользователя в системе). Возвращает байт массив расшифрованных данных. |
24 |
String ngetMSProviders() | Получить список криптопровадеров CSP, усановленных в системе Windows | Возвращает строку списка имен провадеров, разделенных символом "|". |
25 |
String getSCCspProviders() | Получить список смарт-карт (е-токенов) криптопровадеров CSP, усановленных в системе Windows | Возвращает строку списка имен провадеров, разделенных символом "|". |
26 |
String createRequest(String cspName, int keySize, String dName, String friendlyName, String certTemplate, boolean isExportable, boolean forEncrypt) | Сгенерировать ключевую пару и запрос PKCS#10 на получение сертификата | cspName - имя криптопровайдера CSP;
keySize - длина ключа в битах; dName - имя Subject DN; friendlyName - дружественное имя сертификата; certTemplate - шаблон сертификата (для ЦСК, который порддерживает шаблоны) или null; isExportable - флаг экспортируемости закрытого ключа (если false - ключ не может быть экспортирован из хранилища); forEncrypt - флаг назнечения ключа для шифрования; если false - ключ может применяться для подписи, но не может применяться для шифрования; если true - ключ может применяться для шифрования; Возвращает BER-кодированный запрос PKCS#10. |
27 |
String createRequest2(String cspName, int cspType, int keySpec, int keySize, String DNname, String friendlyName, String certTemplate, boolean isPublish, boolean isCodeEDRPUO, boolean isKeySecurity, boolean isExportable) | Сгенерировать ключевую пару и запрос PKCS#10 на получение сертификата | cspName - имя криптопровайдера CSP;
cspType - тип криптопровайдера CSP, опциональный, может быть 0; keySpec - спецификация ключа AT_KEYEXCHANGE (для шифрования) или AT_SIGNATURE (для подписи); keySize - длина ключа в битах; DNname - имя Subject DN; friendlyName - дружественное имя сертификата; certTemplate - шаблон сертификата (для ЦСК, который порддерживает шаблоны) или null; isPublish - флаг разрешения на публикацию сертификата; isCodeEDRPUO - флаг добавлять код ЕДРПУО; isKeySecurity - флаг усиленной защиты ключа (требуется дополнительный пароль на доступ ключу, а не только к хранилищу ключей); isExportable - флаг экспортируемости закрытого ключа (если false - ключ не может быть экспортирован из хранилища); Возвращает BER-кодированный запрос PKCS#10. |
28 |
boolean installCertificate(String cert) | Установить сертификат в системе Windows | cert - BER-кодированный сертификат; устанавливается в хранилище, определяемое криптопровайдера CSP.
Возвращает булевскую переменную результата установки. |
29 |
boolean installCertificate2(byte[] cert, int location, String storeName) | Установить сертификат в системе Windows в заданное хранилище | cert - DER-кодированный сертификат;
location - размещение хранилища (CERT_SYSTEM_STORE_CURRENT_USER = 0x10000; CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x20000; CERT_SYSTEM_STORE_CURRENT_SERVICE = 0x40000; CERT_SYSTEM_STORE_SERVICE = 0x50000; CERT_SYSTEM_STORE_USERS = 0x60000; CERT_SYSTEM_CURRENT_USER_GROUP_POLICY = 0x70000; CERT_SYSTEM_LOCAL_MACHINE_GROUP_POLICY = 0x80000; CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 0x90000;); storeName - имя хранилища Windows ("MY", "CA", "ROOT"); Возвращает булевскую переменную результата установки. |
30 |
boolean deleteCertificate(String storeName, String cert) | Удалить сертификат и его закрытый ключ (если есть) из заданного храшилища Windows | storeName - имя хранилища Windows ("MY", "CA", "ROOT");
cert - BER-кодированный сертификат. Возвращает булевскую переменную результата удаления. |
Разработчик: ООО "Базис"; 03049, Украина, г.Киев, ул. Платоновская 18; Тел.: +38 044 244-06-38; tech@itsway.kiev.ua