Библиотека с криптографией
win, mac, linux (glibc)
Linux with musl work too
Installation
$ npm install lcryptowrap
or
$ yarn add lcryptowrap
$ yarn build
--arch=ia32
--target=9.0.5 --dist-url=https://atom.io/download/electron
Usage
const crypto = require('lcryptowrap');
Functions
CreateDigest, CreateMac, CreateHmac,
GenRandomCTR, GenRandomHMAC,
GenRandomIntel, GenRandomSystem,
CryptoRandom, CryptoPseudoRandom, RandomFIPS,
GenEncryptKey,
KeyExpansion, KeyConversion,
Encrypt, Decrypt,
CreateToken, DecodeToken,
CreateSignDigest, VerifySignDigest,
CreateSign, VerifySign,
EncryptData, DecryptData,
Protect, Unprotect,
EncryptP7S, DecryptP7S,
CreateSignP7S, VerifySignP7S, ConvertP7S,
GenPrivateKey, SetPrivateKey,
KeyProtect, KeyUnprotect, ChangePassword,
GetKeyBytes, GetPublicKey,
ConvertPrivateKey, ConvertPublicKey,
CreateRequest, VerifyRequest, ConvertRequest, GetRequestInfo,
CreateCertificate, VerifyCertificate, ConvertCertificate, RevokeCertificate,
CreateCRL, VerifyCRL, ConvertCRL,
CreateP7B, ConvertP7B,
BELS_shareKey, BELS_recoveKey
Реализация протокола BPACE двумя сторонами
BPACE_initA
BPACE_sideA_step1
BPACE_sideA_step2
BPACE_sideA_final
BPACE_initB
BPACE_sideB_step1
BPACE_sideB_step2
BPACE_sideB_final
API
CRYPTO.
- CreateDigest(algorithm, data) - вычисление хэш-значения от сообщения
- algorithm - [REQUIRED] - имя алгоритма
- bash256, bash384, bash512, belt-hash
- blake2b512, blake2s256
- md4, md5, mdc2
- sha1, sha224, sha256
- sha3-224, sha3-256, sha3-384, sha3-512
- sha384, sha512, sha512-224, sha512-256
- shake128, shake256
- sm3
- data - [REQUIRED] - данные
- CreateMac(data, key) - вычисление mac-значения
- data - [REQUIRED] - данные
- key - [REQUIRED] - 32байтовый ключ
- CreateHmac(data, key) - вычисление hmac-значения
- data - [REQUIRED] - данные
- key - [REQUIRED] - 32байтовый ключ
- GenRandomCTR(number, key, iv) - генерация псевдослучайных чисел в режиме CTR
- number - [REQUIRED] - кол-во 32байтовых случайных слов
- key - [REQUIRED] - 32байтовый ключ
- iv - [REQUIRED] - 32байтовая синхропосылка
- GenRandomHMAC(number, key, iv) - генерация псевдослучайных чисел в режиме HMAC
- number - [REQUIRED] - кол-во 32байтовых случайных слов
- key - [REQUIRED] - ключ
- iv - [REQUIRED] - синхропосылка
- GenRandomIntel(size) - генерация случайности Intel (если возможно)
- size - [REQUIRED] - число байт
- GenRandomSystem(size) - генерация случайности системной
- size - [REQUIRED] - число байт
- CryptoRandom(random) - генерация случайности на основе функции хэширования
- random - [REQUIRED] - байты случайности (33+)
- CryptoPseudoRandom(number, random) - генерация случайности на СТБ 34.101.47
- number - [REQUIRED] - кол-во 32байтовых случайных слов
- random - [OPTIONAL] - байты случайности (33+)
- RandomFIPS(random) - проверка FIPS 140-2 случайности 2500 байт (optimal)
- random - [OPTIONAL] - случайность байт для проверки
- GenEncryptKey(random) - генерация 32байтового ключа
- random - [OPTIONAL] - случайность байт
- KeyExpansion(key) - функция расширения ключа СТБ 34.101.31-2011 п 7.1
- key - [REQUIRED] - личный ключ [16, 24, 32]
- KeyConversion(key, newKeyCount, level, header) - функция преобразования ключа СТБ 34.101.31-2011 п 7.2
- key - [REQUIRED] - личный ключ [16, 24, 32]
- newKeyCount - [REQUIRED] - размер преобразованного ключа в байтах
- level - [OPTIONAL] - уровень ключа
- header - [OPTIONAL] - заголовок преобразованного ключа
- Encrypt(algorithm, data, key, iv) - зашифрование данных
- algorithm - [REQUIRED] - имя алгоритма
- belt-ctr256, belt-ecb256, belt-cbc256, belt-cfb256
- data - [REQUIRED] - данные
- key - [REQUIRED] - 32байтовый ключ
- iv - [OPTIONAL] - синхропосылка
- Decrypt(algorithm, data, key) - расшифрование данных
- algorithm - [REQUIRED] - имя алгоритма
- belt-ctr256, belt-ecb256, belt-cbc256, belt-cfb256
- data - [REQUIRED] - данные
- key - [REQUIRED] - 32байтовый ключ
- iv - [OPTIONAL] - синхропосылка
- CreateToken(key, pubKey) - установка защиты на ключ
- key - [REQUIRED] - защищаемый ключ
- pubKey - [REQUIRED] - открый ключ или сертификат получателя
- DecodeToken(token, private_token, password) - снятие защиты с ключа
- token - [REQUIRED] - токен ключа
- private_token - [REQUIRED] - токен личного ключа получателя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- CreateSignDigest(algorithm, digest, private_token, password) - подпись хэш-значения от сообщения
- algorithm - [REQUIRED] - имя алгоритма
- bash256, bash384, bash512, belt-hash
- digest - [REQUIRED] - хэш-значение
- private_token - [REQUIRED] - токен личного ключа отправителя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- VerifySignDigest(algorithm, digest, pubKey, sign) - подпись сообщения
- algorithm - [REQUIRED] - имя алгоритма
- bash256, bash384, bash512, belt-hash
- digest - [REQUIRED] - хэш-значение
- pubKey - [REQUIRED] - открытый ключ или сертификат отправителя
- sign - [REQUIRED] - подпись
- CreateSign(data, private_token, password) - подпись сообщения
- data - [REQUIRED] - данные
- private_token - [REQUIRED] - токен личного ключа отправителя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- VerifySign(data, pubKey, sign) - подпись сообщения
- data - [REQUIRED] - данные
- pubKey - [REQUIRED] - открытый ключ или сертификат отправителя
- sign - [REQUIRED] - подпись
- EncryptData(algorithm, data, pubKey) - зашифрование данных с установкой защиты на ключ шифрования для получателя
- algorithm - [REQUIRED] - имя алгоритма
- belt-ctr256, belt-ecb256, belt-cbc256, belt-cfb256
- data - [REQUIRED] - данные
- pubKey - [REQUIRED] - открый ключ или сертификат получателя
- DecryptData(algorithm, data, token, private_token, password) - расшифрование данных
- algorithm - [REQUIRED] - имя алгоритма
- belt-ctr256, belt-ecb256, belt-cbc256, belt-cfb256
- data - [REQUIRED] - данные
- token - [REQUIRED] - токен ключа
- private_token - [REQUIRED] - токен личного ключа получателя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- Protect(algorithm, data, private_token, password, pubKey) - зашифрование данных с установкой защиты на ключ шифрования для получателя и подписью отправителя
- algorithm - [REQUIRED] - имя алгоритма
- belt-ctr256, belt-ecb256, belt-cbc256, belt-cfb256
- data - [REQUIRED] - данные
- private_token - [REQUIRED] - токен личного ключа отправителя
- password - [REQUIRED] - пароль к токену личного ключа или null
- pubKey - [REQUIRED] - открый ключ или сертификат получателя
- Unprotect(algorithm, data, token, private_token, password, pubKey, sign) - снятие защиты с сообщения с проверкой подписи отправителя
- algorithm - [REQUIRED] - имя алгоритма
- belt-ctr256, belt-ecb256, belt-cbc256, belt-cfb256
- data - [REQUIRED] - данные
- token - [REQUIRED] - токен ключа
- private_token - [REQUIRED] - токен личного ключа получателя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- pubKey - [REQUIRED] - открытый ключ или сертификат отправителя
- sign - [REQUIRED] - подпись
- EncryptP7S(algorithm, data, certificate, format, params) - защита сообщения
- algorithm - [REQUIRED] - имя алгоритма
- belt-ctr256, belt-ecb256, belt-cbc256, belt-cfb256
- data - [REQUIRED] - данные
- pubKey - [REQUIRED] - сертификат получателя в байтах
- format - [OPTIONAL] - формат выходного сообщение
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- 2 - FORMAT_SMIME
- params - [OPTIONAL] - формат выходного сообщение
- FORMAT_PKCS7_USE_KEYID - использование subjectKeyIdentifier
- DecryptP7S(data, private_token, password) - снятие защиты с сообщения
- data - [REQUIRED] - данные
- private_token - [REQUIRED] - токен личного ключа получателя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- CreateSignP7S(data, private_token, password, certificate, format, params) - подпись сообщения с выходных форматом
- data - [REQUIRED] - данные
- private_token - [REQUIRED] - токен личного ключа отправителя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- certificate - [REQUIRED] - сертификат отправителя
- format - [REQUIRED] - выходной формат
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- 2 - FORMAT_SMIME
- params - [OPTIONAL] - формат выходного сообщение
- FORMAT_PKCS7_DETACHED - [OPTIONAL] - открепленная подпись
- FORMAT_PKCS7_USE_KEYID - [OPTIONAL] - использование subjectKeyIdentifier
- FORMAT_PKCS7_NOCERTS - [OPTIONAL] - исключение сертификата
- FORMAT_PKCS7_NOATTR - [OPTIONAL] - исключение атрибутов подписи ("Тип содержимого", "хэш-значение", "время подписания")
- VerifySignP7S(sign, data, certificate) - проверка подписи
- sign - [REQUIRED] - подпись
- data - [OPTIONAL] - данные при параметре FORMAT_PKCS7_DETACHED
- certificate - [OPTIONAL] - сертификат при параметре FORMAT_PKCS7_NOCERTS
- *ConvertP7S(format, data) - конвертирование подписанных данные
- format - [REQUIRED] - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- data - [REQUIRED] - подписанные данные
- GenPrivateKey(level, password, format) - генерация токена личного ключа (защищещнного или незащищенного)
- level - [REQUIRED] - уровень стойкости ключа с битах
- password - [OPTIONAL] - пароль к токену личного ключа или null
- format - [OPTIONAL] - выходной формат
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- SetPrivateKey(level, key, password, format) - установка личного ключа в токен
- level - [REQUIRED] - уровень стойкости ключа с битах
- key - [REQUIRED] - ключ требуемого размера под уровень стойкости (32, 48, 64 байта)
- password - [OPTIONAL] - пароль к токену личного ключа или null
- format - [OPTIONAL] - выходной формат
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- KeyProtect(private_key, password, format) - установка защиты на личный ключ
- private_key - [REQUIRED] - незащищенный токен личного ключа
- password - [REQUIRED] - пароль для установки защиты
- format - [OPTIONAL] - выходной формат
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- KeyUnprotect(private_key, password, format) - снятие защиты с личного ключа
- private_key - [REQUIRED] - защищенный токен личного ключа
- password - [REQUIRED] - пароль для снятия защиты
- format - [OPTIONAL] - выходной формат
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- ChangePassword(private_key, passwordOld, passwordNew, format) - изменение пароля
- private_key - [REQUIRED] - защищенный токен личного ключа
- passwordOld - [OPTIONAL] - старый пароль
- passwordNew - [OPTIONAL] - новый пароль
- format - [OPTIONAL] - выходной формат
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- GetKeyBytes(private_token, password) - получение байтов личного и открытого ключей
- private_token - [REQUIRED] - токен личного ключа
- password - [OPTIONAL] - пароль к токену личного ключа или null
- GetPublicKey(data, format) - получение открытого ключа из сертификата или запроса на выпуск сертификата
- data - [REQUIRED] - сертификат / запрос на сертификат
- format - [OPTIONAL] - выходной формат
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- *ConvertPrivateKey(format, key) - конвертирование личного ключа
- format - [REQUIRED] - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- key - [REQUIRED] - личный ключ
- *ConvertPublicKey(format, key) - конвертирование открытого ключа
- format - [REQUIRED] - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- key - [REQUIRED] - открытый ключ
- CreateRequest(private_token, password, data, config, format) - генерация запроса на выпуск сертификата
- private_token - [REQUIRED] - токен личного ключа
- password - [OPTIONAL] - пароль к токену личного ключа или null
- data - [OPTIONAL] - данные для запроса на выпуск сертификата. Заполнить RequestINFO требуемыми параметрами.
- config - [OPTIONAL] - дополнительный файл конфигурации,
- format - [OPTIONAL] - дополнительный файл конфигурации
- VerifyRequest(data) - проверка запроса на выпуска сертификата
- data - [REQUIRED] - запрос на выпуск сертификата
- *ConvertRequest(format, data) - конвертирование запроса на сертификат
- format - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- data - запроса на сертификат
- GetRequestInfo(data) - получение данных и запроса на выпуск сертификата
- data - [REQUIRED] - запрос на выпуск сертификата
- CreateCertificate(request, private_token, password, certificate, config, db, serial, selfsign, format) - выпуск сертификата
- request - [REQUIRED] - запрос на выпуск сертификата
- private_token - [REQUIRED] - токен личного ключа издателя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- certificate - [OPTIONAL] - сертификат издателя или null при самоподписанном сертификате
- config - [OPTIONAL] - файл дополнительной конфигурации или null
- db - [OPTIONAL] - файл БД или null при первоначальном старте
- serial - [OPTIONAL] - серийный номер в HEX или null если в файле конфигурации установлен параметр генерации
- selfsign - [OPTIONAL] - самоподписанный сертификат (true or false)
- format - [OPTIONAL] - выходной формат
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- VerifyCertificate(certificate, chain, crl) - проверка сертификата
- certificate - [REQUIRED] - проверяемый сертификат
- chain - [OPTIONAL] - байты цепочки сертификатов в P7B или null для самоподписанного сертификата
- crl - [REQUIRED] - список отзыва
- *ConvertCertificate(format, data) - конвертирование сертификата
- format - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- data - сертификат
- RevokeCertificate(certificate, db, reason, config) - отзыв сертификата
- certificate - [REQUIRED] - отзываемый сертификат
- db - [REQUIRED] - файл БД
- reason - причина отзыва сертификата
- ReasonUnspecified - "unspecified";
- ReasonKeyCompromise - "keyCompromise";
- ReasonCACompromise - "CACompromise";
- ReasonAffiliationChanged - "affiliationChanged";
- ReasonSuperseded - "superseded";
- ReasonCessationOfOperation - "cessationOfOperation";
- ReasonCertificateHold - "certificateHold";
- ReasonRemoveFromCRL - "removeFromCRL";
- config - [OPTIONAL] - файл дополнительной конфигурации или null
- CreateCRL(private_token, password, certificate, config, db, serial, format) - выпуск списка отозванных сертификатов
- private_token - [REQUIRED] - токен личного ключа издателя
- password - [OPTIONAL] - пароль к токену личного ключа или null
- certificate - [REQUIRED] - сертификат издателя
- config - [OPTIONAL] - файл дополнительной конфигурации или null
- db - [REQUIRED] - файл БД или null при пустой БД
- serial - [REQUIRED] - серийный номер по порядку
- format - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- *VerifyCRL(datam certificate) - проверка списка отозванных сертификатов
- data - [REQUIRED] - запроса на выпуск сертификата
- certificate - [REQUIRED] - сертификат издателя
- *ConvertCRL(format, data) - конвертирование списка отозванных сертификатов
- format - [REQUIRED] - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- data - [REQUIRED] - список отозванных сертификатов
- *CreateP7B(certificate, crl, format) - создание цепочки доверия
- certificate - массив сертификатов
- crl - массив списков отозванных сертификатов
- format - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- *ConvertP7B(format, data) - конвертирование цепочки доверия
- format - [REQUIRED] - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- data - [REQUIRED] - подписанные данные
- *BELS_shareKey(users, threshold, key, format) - разделение секрета
- users - [REQUIRED] - число пользователей
- threshold - [REQUIRED] - пороговое число
- key - [REQUIRED] - разделяемый ключ
- format - [REQUIRED] - вариант выходной кодировки
- 0 - FORMAT_PEM
- 1 - FORMAT_ASN1
- *BELS_recoveKey(secret) - восстановление секрета
- secret - [REQUIRED] - массив частичных секретов и паролей к ним
Примеры использования в example.js
CreateDigest
var incomeData = "some data";
var createDigest = crypto.CreateDigest("bash256", incomeData);
console.log(`CreateDigest: ${createDigest.digest.toString("hex")}`);
GenEncryptKey
var genEncryptKey = crypto.GenEncryptKey();
console.log(`GenEncryptKey ${genEncryptKey.privKey.toString("hex")}`);
CreateMac
var createMac = crypto.CreateMac(incomeData, genEncryptKey.privKey);
console.log(`CreateMac: ${createMac.digest.toString("hex")}`);
CreateHmac
var createHmac = crypto.CreateHmac(incomeData, genEncryptKey.privKey);
console.log(`CreateHmac: ${createHmac.digest.toString("hex")}`);
GenPrivateKey
var genPrivateKey = crypto.GenPrivateKey(128, "12345678");
console.log(`${genPrivateKey.privKey.toString()}`);
console.log(`${genPrivateKey.pubKey.toString()}`);
GetPrivateKey
var getPrivateKey = crypto.GetPrivateKey(genPrivateKey.privKey, "12345678");
console.log(`GetPrivateKey: ${getPrivateKey.privKey.toString("hex")}`);
Encrypt + CreateToken - DecodeToken + Decrypt
var encrypt = crypto.Encrypt("belt-ctr256", incomeData, genEncryptKey.privKey);
console.log(`Encrypt: ${encrypt.data.toString("hex")}`);
var createToken = crypto.CreateToken(
genEncryptKey.privKey,
genPrivateKey.pubKey
);
console.log(`CreateToken: ${createToken.token.toString("hex")}`);
var decodeToken = crypto.DecodeToken(
createToken.token,
genPrivateKey.privKey,
"12345678"
);
console.log(`DecodeToken: ${decodeToken.privKey.toString("hex")}`);
var decrypta = crypto.Decrypt("belt-ctr256", encrypt.data, decodeToken.privKey);
console.log(`Decrypt: ${decrypt.data.toString()}`);
EncryptData - DecryptData
var encryptData = crypto.EncryptData(
"belt-ctr256",
incomeData,
genPrivateKey.pubKey
);
console.log(`EncryptData: ${encryptData.data.toString("hex")}`);
console.log(`EncryptData: ${encryptData.token.toString("hex")}`);
var decryptData = crypto.DecryptData(
"belt-ctr256",
encryptData.data,
encryptData.token,
genPrivateKey.privKey,
"12345678"
);
console.log(`DecryptData: ${decryptData.data.toString()}`);
CreateSign - VerifySign
var createSign = crypto.CreateSign(
incomeData,
genPrivateKey.privKey,
"12345678"
);
console.log(`${createSign.sign.toString("hex")}`);
var verifySign = crypto.VerifySign(
incomeData,
genPrivateKey.pubKey,
createSign.sign
);
console.log(`VerifySign ... ${verifySign.status}`);
Configuration File
Readme config.md
RequestINFO
commonName = 2.5.4.3;
surname = 2.5.4.4;
serialNumber = 2.5.4.5;
countryName = 2.5.4.6;
localityName = 2.5.4.7;
stateOrProvinceName = 2.5.4.8;
streetAddress = 2.5.4.9;
organizationName = 2.5.4.10;
organizationalUnitName = 2.5.4.11;
title = 2.5.4.12;
description = 2.5.4.13;
searchGuide = 2.5.4.14;
businessCategory = 2.5.4.15;
postalAddress = 2.5.4.16;
postalCode = 2.5.4.17;
postOfficeBox = 2.5.4.18;
physicalDeliveryOfficeName = 2.5.4.19;
telephoneNumber = 2.5.4.20;
telexNumber = 2.5.4.21;
teletexTerminalIdentifier = 2.5.4.22;
facsimileTelephoneNumber = 2.5.4.23;
x121Address = 2.5.4.24;
internationaliSDNNumber = 2.5.4.25;
registeredAddress = 2.5.4.26;
destinationIndicator = 2.5.4.27;
preferredDeliveryMethod = 2.5.4.28;
presentationAddress = 2.5.4.29;
supportedApplicationContext = 2.5.4.30;
roleOccupant = 2.5.4.33;
seeAlso = 2.5.4.34;
userPassword = 2.5.4.35;
userCertificate = 2.5.4.36;
cACertificate = 2.5.4.37;
authorityRevocationList = 2.5.4.38;
certificateRevocationList = 2.5.4.39;
crossCertificatePair = 2.5.4.40;
name = 2.5.4.41;
givenName = 2.5.4.42;
initials = 2.5.4.43;
generationQualifier = 2.5.4.44;
x500UniqueIdentifier = 2.5.4.45;
dnQualifier = 2.5.4.46;
enhancedSearchGuide = 2.5.4.47;
protocolInformation = 2.5.4.48;
distinguishedName = 2.5.4.49;
uniqueMember = 2.5.4.50;
houseIdentifier = 2.5.4.51
supportedAlgorithms = 2.5.4.52;
deltaRevocationList = 2.5.4.53;
pseudonym = 2.5.4.65;
role = 2.5.4.72;
organizationIdentifier = 2.5.4.97
countryCode3c = 2.5.4.98;
countryCode3n = 2.5.4.99;
dnsName = 2.5.4.100;
GenRequest + VerifyRequest + GetRequestInfo
var INFO = new crypto.RequestINFO();
INFO.organizationIdentifier = "OrganizationIndentifier";
INFO.houseIdentifier = "houseIdentifier";
var genRequest = crypto.GenRequest(
genPrivateKey.privKey,
"12345678",
INFO,
null
);
console.log(`GenRequest: ${genRequest.data.toString()}`);
var verifyRequest = crypto.VerifyRequest(genRequest.data);
console.log(`VerifyRequest ... ${verifyRequest.status}`);
var ReqInfo = crypto.GetRequestInfo(genRequest.data);
console.log(`GetRequestInfo ... ${ReqInfo.status}`);
console.log(`${ReqInfo.data.toString()}`);