Перед покупкой лицензионного ключа создайте талон состоящий из секретной и публичной частей:
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 и присвойте ей значение лицензионного ключа извлечённого из цифрового конвера.
Пример создания и проверки цифровой подписи
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 запросов.
Пример скрипта продажи ключа в sell.js, чтобы произвести продажу надо найти и настроить поля константы input:
input.license_key -- активированным лицензионным ключём дистрибьютора
input.seller_talon_secret -- секретной частью талона исползьуемой для запроса доступа к API дистрибьютора ключей
input.seller_talon_public -- публичной частью талона исползьуемой для запроса доступа к API дистрибьютора ключей
input.client_talon_public -- публичной частью талона присланной клиентом дистрибьютора который желает приобрести лицензионный ключ