Инструкция использования библиотеки esig от welsib с примерами.

Генерация талона на доствку лицензионного ключа

Перед покупкой лицензионного ключа создайте талон состоящий из секретной и публичной частей:

const esig = require('esig-shared');
let talon = esig.make_talon().split("\n");
console.log("Talon secret:\n", talon[0]); // talon[0] -- секретная часть талона
console.log("Talon public:\n", talon[1]); // talon[1] -- публичная часть талона

Обеспечте недоступность доступа посторонним к секретной части талона до успешного выполнения активации.

В архиве содержится пример скрипта для создания талона, для запуска используйте команду

node make_talon.js

Публичную часть талона передайте лицу осуществляющему продажу лицензионных ключей любым удобным вам способом.

Извлечение лицензионного ключа из цифрового конверта

Дождитесь от лица осуществляющего распространение лиценизионных ключей цифрового конверта представляющего из себя строку закодированную в URL_SAFE_BASE64.

В архиве содержится пример скрипта для извлечения лицензионного ключа из цифрового конверта

node extract_license_key.js
Для исползования примера найдите в файле и установите в нём соответствующие значения переменным
digital_convert, talon_secret и talon_public

Активация лицензионного ключа

Пример кода активации представлен в файле index.js из архива с предоставляемой библиотекой.

Для запуска найдите в файле index.js переменную input.license_key и присвойте ей значение лицензионного ключа извлечённого из цифрового конвера.

Примеры использования библиотеки esig от welsib

Пример создания и проверки цифровой подписи

const keypair = esig.make_keypair(); // [[u8;64], [u8;64], [u8;64]].concat()
console.log("ESIG: keypair =\n", keypair);
console.log("signing_key: ", keypair.slice(0, 64));
console.log("verifying_key Point{x,y}: ", keypair.slice(64, 128), keypair.slice(128));

bytes = [1, 2, 3, 4, 5]; // Данные (необходимо преобразовать в массив байт)
hash = esig.digest(bytes); // Хеш от данных
const signing_key = keypair.slice(0, 64);
signature = esig.sign(hash, signing_key);
console.log("ESIG: signature =\n", signature);

const verifying_key = keypair.slice(64);
console.log("ESIG: verify = ", esig.verify(hash, signature, verifying_key)); // вернёт true в случае успешной проверки подписи

Пример создания и проверки аггрегированной подписи.

Подпись создают Alice и Bob, сначала обменявшись публичными ключами, затем частями подписи для её аггрегации в единую подпись Алисы и Боба.

// user keys
const alice_keypair = esig.make_keypair()
let alice_secret_key = alice_keypair.slice(0, 64)
let alice_public_key = alice_keypair.slice(64)

const bob_keypair = esig.make_keypair()
let bob_secret_key = bob_keypair.slice(0, 64)
let bob_public_key = bob_keypair.slice(64)

// agg sign keys
const alice_sign_keypair = esig.make_keypair()
let alice_sign_secret = alice_sign_keypair.slice(0, 64)
let alice_sign_public = alice_sign_keypair.slice(64)

const bob_sign_keypair = esig.make_keypair()
let bob_sign_secret = bob_sign_keypair.slice(0, 64)
let bob_sign_public = bob_sign_keypair.slice(64)

// Алиса и Боб обмениваются публичными ключами alice_sign_public и bob_sign_public

// public signature keys aggregation
let sign_public_keys = [...alice_sign_public, ...bob_sign_public]
let agg_sign_public = esig.agg_public_keys(sign_public_keys) // R = R1+R2+...+Rm (Random)

// Созданный Алисой и Бобом agg_sign_public используется дальше для создания компонент подписи alice_sig и bob_sig

// sign
let alice_sig = esig.agg_sign(hash, alice_secret_key, agg_sign_public.slice(0, 64), alice_sign_secret)
let bob_sig = esig.agg_sign(hash, bob_secret_key, agg_sign_public.slice(0, 64), bob_sign_secret)

// Алиса и Боб обмениваются друг с другом alice_sig и bob_sig

// signatures aggregation
let signatures = [...alice_sig, ...bob_sig]
let agg_signature = esig.agg_signatures(signatures) // S = S1+S2+...+Sm (Signature)

// Компоненты подписи аггрегируются в результирующую S компоненту подписи agg_signature и объединяются с R компонентой

let multi_signature = [...agg_sign_public.slice(0, 64), ...agg_signature] // (R, S)

// verify
let public_keys = [...alice_public_key, ...bob_public_key]
let agg_public_key = esig.agg_public_keys(public_keys)
let verified = esig.verify(hash, multi_signature, agg_public_key)

console.log("ESIG: verify multisig =", verified) // вернёт true в случае успешной проверки аггрегированной подписи

Дистрибьюторам лицензионных ключей

Для доступа к API продаж лицензионных ключей вам понадобится связаться с автором библиотеки, например, через Jivosite чат на этом сайте. Создаёте талон, публичную часть талона и информацию о желаемом количестве и типе (до конца текущего или следующего года) лицензионных ключей отправляете в чат, согласуете оплату и дожидаетесь получения подтверждения об успешности предоставления доступа к соответствующему API. Чтобы проверить успешно ли предоставлен доступ к API, запросите квоту.

// Отправить информацию о готовности к проверке квоты
let request_ready_to_check_quota_json = JSON.stringify({
    command: "ready_to_check_quota",
    attributes: "{}"
});
console.log("Request (ready_to_check_quota): ", request_ready_to_check_quota_json);

let response_ready_to_check_quota = await fetch("http"+(input.has_ssl?'s':'')+"://"+input.host+"/api", {
    method: "POST",
    body: request_ready_to_check_quota_json
});
let response_ready_to_check_quota_json = await response_ready_to_check_quota.json();
console.log("Response (ready_to_check_quota): ", response_ready_to_check_quota_json);

let nonce_sig = JSON.parse(response_ready_to_check_quota_json.attributes).nonce_sig;
console.log("Nonсe sig: ", nonce_sig);
let nonce_sig_buf = Array.from(Buffer.from(nonce_sig, 'base64url'));
console.log("Nonсe sig buffer: ", nonce_sig_buf);
let year = (new Date()).getFullYear() % 100;
let hash = esig.digest([...nonce_sig_buf, year]);
console.log("Hash: ", hash);
let signing_key = Array.from(Buffer.from(input.seller_talon_secret, 'base64url'));
let signature = esig.sign(hash, signing_key);
let signature_base64 = Buffer.from(signature).toString('base64url');

// let signing_key_base64 = Buffer.from(signing_key).toString('base64url')
// console.log('Talon source: ', input.seller_talon_secret);
// console.log('Talon destin: ', signing_key_base64);

let check_quota_json = JSON.stringify({
    year,
    nonce_sig,
    signature: signature_base64
});

let request_check_quota_json = JSON.stringify({
    command: "check_quota",
    attributes: check_quota_json
});
console.log("Request (check_quota): ", request_check_quota_json);

let response_check_quota = await fetch("http"+(input.has_ssl?'s':'')+"://"+input.host+"/api", {
    method: "POST",
    body: request_check_quota_json
});
let response_check_quota_json = await response_check_quota.json();
console.log("Response (check_quota): ", response_check_quota_json);
// TODO: verify response (esig.verify_digital_convert(hash(response_check_quota_json.attributes), response_check_quota_json.signature*))
let digital_convert = JSON.parse(response_check_quota_json.attributes).digital_convert;
let quota = esig.extract_digital_convert(digital_convert, input.seller_talon_public, input.seller_talon_secret);

console.log("Quota: ", quota);

Пример скрипта проверки квоты и совершения продажи смотрите в файле sell.js

Процесс оформления продажи лицензионного ключа покупателю через API дистрибьюции лицензионных ключей

Для осуществления продажи ключа своему клиенту дистрибьютору надо отправить ряд API запросов.

Пример скрипта продажи ключа в sell.js, чтобы произвести продажу надо найти и настроить поля константы input:

input.license_key -- активированным лицензионным ключём дистрибьютора

input.seller_talon_secret -- секретной частью талона исползьуемой для запроса доступа к API дистрибьютора ключей

input.seller_talon_public -- публичной частью талона исползьуемой для запроса доступа к API дистрибьютора ключей

input.client_talon_public -- публичной частью талона присланной клиентом дистрибьютора который желает приобрести лицензионный ключ

Вернуться на главную страницу