Skip to content

Библиотека для работы с криптопровайдером АО "НУЦ" KalkanCrypt

License

Notifications You must be signed in to change notification settings

kant2002/NKalkan

Repository files navigation

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 лицензией.

About

Библиотека для работы с криптопровайдером АО "НУЦ" KalkanCrypt

Topics

Resources

License

Stars

Watchers

Forks