NKalkan 0.4.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package NKalkan --version 0.4.0                
NuGet\Install-Package NKalkan -Version 0.4.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="NKalkan" Version="0.4.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add NKalkan --version 0.4.0                
#r "nuget: NKalkan, 0.4.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install NKalkan as a Cake Addin
#addin nuget:?package=NKalkan&version=0.4.0

// Install NKalkan as a Cake Tool
#tool nuget:?package=NKalkan&version=0.4.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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .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.

Version Downloads Last updated
0.6.1 136 10/29/2024
0.6.0 101 10/26/2024
0.5.0 1,362 1/18/2024
0.4.0 133 1/14/2024
0.3.0 180 10/3/2023
0.2.0 197 5/13/2023
0.1.1 187 4/6/2023
0.1.0 184 4/6/2023