NKalkan 0.3.0
See the version list below for details.
dotnet add package NKalkan --version 0.3.0
NuGet\Install-Package NKalkan -Version 0.3.0
<PackageReference Include="NKalkan" Version="0.3.0" />
paket add NKalkan --version 0.3.0
#r "nuget: NKalkan, 0.3.0"
// Install NKalkan as a Cake Addin #addin nuget:?package=NKalkan&version=0.3.0 // Install NKalkan as a Cake Tool #tool nuget:?package=NKalkan&version=0.3.0
NKalcan
Библиотека для работы с криптопровайдером АО "НУЦ" KalkanCrypt
Данная библиотека использует C API, в том числе на Windows. KalkanCryptCOM.dll не используется.
Особенности работы с Windows.
В настройках Windows надо установить системную локаль на Kazakh (Kazakhstan). Это позволит прочитать названия организаций корректно.
Так как НУЦ не разрешает распространять бинарники, то надо самостоятельно положить SDK 2.0\C\Windows\KalkanCrypt_С\lib\x64\KalkanCrypt.dll
в папку с конечным исполняемым файлом.
Как например NKalcan.TestBed\bin\Debug\net7.0
.
Тестовые ключи находятся в папке SDK 2.0\Keys and Certs\Gost2004 and RSA\2023.02.01_valid\Физическое лицо\ДЕЙСТВУЮЩИЕ
.
Дополнительные тестовые файлы используемые в проэкте TestBed можно найти в папке SDK 2.0\C\Linux\C\test\example
Особенности настройки Linux
Эта библиотека требует чтобы стандартные механизмы загрузки SO файлов на Linux заработали для libkalkancryptwr-64.so
Или настройте в соответсвии с инструкциями в файле C/Linux/C/README.txt
или можете выполнить следующие операции
- скопируйте файлы
setup.sh
иld.kalkan.conf
в папкуC/Linux/C/
вашего SDK - перейдите в папку
C/Linux/C/
- запустите
setup.sh
Поддержка MacOS
У меня нету Мака, потому есть вероятность что какие то проблемы есть. Если обнаружите баг, то создайте тикет в Гитхабе.
Примеры использования
Работа с казахскими символами
Для работы с XML содержащим кириллицу или казахские символы надо делать XML-эскейпинг. Пример функции и использования:
[return: NotNullIfNotNull(nameof(s))]
static string? XmlEscape(string? s)
{
if (string.IsNullOrEmpty(s))
return s;
return string.Join("", s.Select(c => c < 127 ? c.ToString() : "&#" + (short)c + ";"));
}
var messageBody = $"""
<?xml version="1.0" encoding="UTF-8"?>
<sendMessageRequest>
<request>
<requestInfo>
<messageId>0f3d8368-215a-4a20-a306-5222548f5e87</messageId>
<serviceId>ServiceID</serviceId>
<sessionId>4958523f-423a-45bb-1aa1-5222548f5e87</sessionId>
<messageDate>2018-12-11T11:45:12.574+06:00</messageDate>
<sender>
<senderId>login</senderId>
<password>password</password>
</sender>
</requestInfo>
<requestData>
<data>
<uin>810918350135</uin>
<company>{XmlEscape("ЗАО Складские решения")}</company>
<company_bin>12345678</company_bin>
<expiresIn>600000</expiresIn>
<omit-sms>false</omit-sms>
</data>
</requestData>
</request>
</sendMessageRequest>
""";
Подпись XML документа
using NKalkan;
var certificatePath = "GOSTKNCA_60e31061cedbcc9f917a2be0fb8ec3c04eb4b598.p12";
var certificatePassword = "Qwerty12";
var documentToSign = "<xml><MyData /></xml>";
var client = new KalkanApi();
client.LoadKeyStore(KalkanStorageType.PKCS12, certificatePath, certificatePassword);
var signedXml = client.SignXml(documentToSign);
Console.WriteLine(signedXml);
Проверка XML документа
try
{
api.VerifyXml(signedXml);
Console.WriteLine("XML verified successfully!");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Формирование CMS
using NKalkan;
var certificatePath = "GOSTKNCA_60e31061cedbcc9f917a2be0fb8ec3c04eb4b598.p12";
var certificatePassword = "Qwerty12";
var documentToSign = "<xml><MyData /></xml>";
var data = Encoding.UTF8.GetBytes(documentToSign);
var client = new KalkanApi();
client.LoadKeyStore(KalkanStorageType.PKCS12, certificatePath, certificatePassword);
var signedData = client.SignData(documentToSign, KalkanSignType.Cms, KalkanInputFormat.Pem, KalkanOutputFormat.Pem);
Console.WriteLine(signedData);
Проверка CMS
try
{
api.VerifyData(data, signedData, KalkanSignType.Cms, KalkanInputFormat.Pem, KalkanOutputFormat.Pem);
Console.WriteLine("Data verified successfully!");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Загрузка ключа из памяти
Загрузка из массива байт
var certificateBytes = File.ReadAllBytes(certificatePath);
api.LoadKeyStore(KalkanStorageType.PKCS12, certificateBytes, certificatePassword);
Загрузка из потока
using var stream = File.OpenRead(certificatePath);
api.LoadKeyStore(KalkanStorageType.PKCS12, stream, certificatePassword);
Загрузка из массива байт
var base64Content = Convert.ToBase64String(File.ReadAllBytes(certificatePath));
api.LoadKeyStoreFromBase64(KalkanStorageType.PKCS12, base64Content, certificatePassword);
Реализованные API методы
Если вам нужны определенные методы прямо сейчас, создайте задачу в Гитхабе, и с большой вероятностью вы увидите это в следующем релизе.
Метод | Статус |
---|---|
KC_GetTokens | ⬜ |
KC_GetCertificatesList | ⬜ |
KC_LoadKeyStore | ✅ |
X509LoadCertificateFromFile | ⬜ |
X509LoadCertificateFromBuffer | ⬜ |
X509ExportCertificateFromStore | ⬜ |
X509CertificateGetInfo | ⬜ |
X509ValidateCertificate | ⬜ |
HashData | ✅ |
SignHash | ✅ |
SignData | ✅ |
SignXML | ✅ |
VerifyData | ✅ |
VerifyXML | ✅ |
KC_getCertFromXML | ⬜ |
KC_getSigAlgFromXML | ⬜ |
KC_GetLastError | ✅ |
KC_GetLastErrorString | ✅ |
KC_XMLFinalize | ⬜ |
KC_Finalize | ⬜ |
KC_TSASetUrl | ⬜ |
KC_GetTimeFromSig | ⬜ |
KC_SetProxy | ⬜ |
KC_GetCertFromCMS | ⬜ |
SignWSSE | ✅ |
ZipConVerify | ⬜ |
ZipConSign | ⬜ |
Лицензия
Данное ПО опубликовано под MIT лицензией.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. |
.NET Framework | net472 is compatible. net48 was computed. net481 was computed. |
-
.NETFramework 4.7.2
- No dependencies.
-
net6.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.