/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.company.security.csp;
import java.security.DigestException;
import java.security.InvalidKeyException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.ProviderException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Collection;
public class NativeCrypto {
//
// Работа с хранилищем ключей
//
/**
* Загрузить цепочку сертификатов
* @param hCryptProv native HCRYPTPROV
* @param hCertStore native HCERTSTORE
* @param calcHashPropId value CERT_HASH_PROP_ID (SHA1)
* @return цепочка сертификатов
*/
public static native X509Certificate[] loadCertificateChain(long hCryptProv, long hCertStore, byte[] calcHashPropId);
/**
* Загрузить сетрификаты из хранилища.
*
* @param keyStore заполняемое хранилище
* @param name название хранилища
* @param entries заполняемый список ключей
* @param system признак использования системного хранилища
* @param providerId идентификатор провайдера
* @throws KeyStoreException
*/
public static native void loadKeysOrCertificateChains(CSPKeyStore keyStore, String name,
Collection<CSPKeyStore.KeyEntry> entries,
boolean system, int providerId)
throws ProviderException, KeyStoreException;
public static native void storeCertificate(String name, String alias,
byte[] encoding, int encodingLength,
long hCryptProvider, long hCryptKey)
throws CertificateException, KeyStoreException;
public static native void removeCertificate(String name, String alias, byte[] encoding, int encodingLength)
throws CertificateException, KeyStoreException;
/**
* Убрать сведения о контейнере закрытого ключа из хранилища
* @param providerId идентификатор провайдера
* @param storeName название хранилища
* @param keyContainerName название конейнера закрытого ключа
* @throws KeyStoreException
*/
public static native void destroyKeyContainer(int providerId, String storeName, String keyContainerName) throws KeyStoreException;
@Deprecated
public static native long findCertificateUsingAlias(String certStoreName, String certAliasName);
@Deprecated
public static native long getKeyFromCert(long pCertContext, boolean usePrivateKey);
/**
* Получить числовой параметр ключа
* @param hCryptoKey
* @param param KP_ALGID,
* @return
*/
public static native int getKeyParam(long hCryptoKey, int param)
throws InvalidKeyException;
/**
* Получить OID идентификатор алгоритма ключа
* @param hCryptoKey
* @return
*/
public static native String getKeyAlgOID(long hCryptoKey)
throws InvalidKeyException;
/**
* Уничтожить ключ
*/
public static native void keyDestroy(long hProvider, long hKey);
/**
* Название контейнера ключей
* @param hCryptoProv native HCRYPTPROV
*/
public static native String getContainerName(long hCryptoProv)
throws KeyStoreException;
public static native byte[] getPublicKeyEncode(long hCryptoProvider, long hCryptoKey);
//
// Шифрование
//
/**
* шифровать/расшифровать данные буфера
* @param data буфер данных
* @param dataSize размер буфера данных
* @param hCryptProvider native HCRYPTPROV
* @param hCryptKey native HCRYPTKEY
* @param doEncrypt шифровать/расшифровать
* @param paddingLength размер выравнивания блока шифрования
* @return
*/
public static native byte[] encryptDecrypt(byte[] data, int dataOffset, int dataSize, long hCryptoKey,
boolean doEncrypt, boolean doFinal, int paddingLength)
throws InvalidKeyException;
//
// Работа с подписями
//
/**
* Подписать данные
* @param noHashOID признак не использования хеш функции
* @param hash значение ранее расчитанной хеш функции
* @param hashSize длина значения хеш функции
* @param messageDigestAlgorithm название алгоритма хеш функции
* @param signName название алгоритма подписи
* @param hCryptProvider native HCRYPTPROV
* @param hCryptKey native HCRYPTKEY
* @return
*/
public static native byte[] signHash(CSPSignature cspSignature, boolean noHashOID, byte[] hash, int hashSize,
String messageDigestAlgorithm,
long hCryptoProvider, long hCryptoKey);
public static native byte[] sign(CSPSignature cspSignature, boolean noHashOID, byte[] hash, int hashSize,
String messageDigestAlgorithm, int providerId, String context);
/**
* Проверить подпись
* @param hash значение ранее расчитанной хеш функции
* @param hashSize длина значения хеш функции
* @param messageDigestAlgorithm название алгоритма хеш функции
* @param signName название алгоритма подписи
* @param signature значение подписи
* @param signatureSize длина значения подписи
* @param hCryptProvider native HCRYPTPROV
* @param hCryptKey native HCRYPTKEY
* @param hCryptoProvider
* @param hCryptoKey
* @return
*/
public static native boolean verifySignedHash(byte[] hash, int hashSize,
String messageDigestAlgorithm, byte[] signature,
int signatureSize, long hCryptoProvider, long hCryptoKey);
public static native void digestInit(CSPDigest cspDigest, String algorithm)
throws DigestException, ProviderException, NoSuchAlgorithmException;
public static native void digestDestroy(long hCryptoProvider, long hCryptoHash);
public static native void digestEngineUpdateByte(long hCryptoHash, byte input)
throws DigestException;
public static native void digestEngineUpdateBytes(long hCryptoHash, byte[] input, int offset, int len)
throws DigestException;
public static native byte[] digestEngineDigest(long hCryptoHash)
throws DigestException;
/**
* Установить параметр для хеш функции. MS CryptoAPI функция CryptSetHashParam.
* @param hCryptoHash
* @param param идентификатор параметра
* @param bytes устанавливаемое значение
* @param offset смещение в массиве
* @param len длина данных
*/
public static native void digestSetParameter(long hCryptoHash, int param, byte[] bytes, int offset, int len);
/**
* Создать открытый ключ по идетификатору алгоритма и содержимому ключа
* @param keyEncoded содержимое ключа
* @param length размер содержимого ключа
* @return
*/
public static native CSPPublicKey initPublicKey(byte[] keyEncoded, int length)
throws InvalidKeyException, NoSuchAlgorithmException;
/**
* Формирование открытого ключа из X509 ASN1 (PKCS#8).
* То же самое, что и метод initPublicKey. Отличие - посылаемые типы исключений.
* @param algorithm
* @param encoded
* @param length
* @return
*/
public static native CSPPublicKey generatePublic(byte[] keyEncoded, int length);
}