ЛИЦЕНЗИОННЫЙ ДОГОВОР НА ПРАВО ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ ДЛЯ ЭВМ “WELSIB” (Черновик) 1. Введение Перед началом использования программного обеспечения внимательно ознакомьтесь с условиями настоящего лицензионного договора на право использования программы для ЭВМ “WELSIB”, именуемой в дальнейшем Программа. Настоящий договор является лицензионным договором на использование Программы в форме договора присоединения в значении статьи 428 Гражданского кодекса Российской Федерации и заключается в соответствии с пунктом 5 статьи 1286 Гражданского кодекса Российской Федерации, именуемым в дальнейшем Договор. Настоящий Договор заключается между автором Программы, именуемым в дальнейшем Лицензиар, и пользователем Программы, именуемым в дальнейшем Лицензиат, и именуемыми в дальнейшем Сторонами. Начало использования Программы, означает согласие Лицензиата со всеми условиями настоящего Договора и признаётся акцептом. 2. Основные понятия 2.1. Цифровой конверт - 2560 бит информации содержащих: * цифровой ключ (512 бит) * публичная часть талона Лицензиата (x = 512 бит и y = 512 бит) * цифровая подпись (r = 512 бит и s = 512 бит) и извлекаемых с помощью метода Программы extract_digital_convert. Цифровой конверт может быть представлен строкой в кодировке safe URL base64. 2.2. Цифровым ключом называется 512 бит информации содержащихся в цифровом конверте для обеспечения возможности создания кода разблокировки доступа к возмездным методам Программы. 2.3. Тестовым цифровым ключом называется Цифровой ключ, применяя к которому операцию логического "И" со значением 127 в десятичной системе счисления, в результате получится число 127. Формула: is_test_key = license_key & 127 == 127 2.4. Активация - действие, направленное на создание цифровой информации применяемой для формирования кода разблокировки доступа к возмездным методам и выполняется последовательным вызовом безвозмездных методов в перечисленном порядке: * activate_init * activate_run * activate_done и отправке запросов сервису активации между ними. 2.5. Срок действия активации не превышает год действия ключа. 2.6. Доказательство активации обеспечивается методом activation_proof исходный код которого представлен в приложении к настоящему договору. Клиенты Лицензиата могут самостоятельно убедиться, что Лицензиат обладает активированным цифровым ключом, исползьуя аггрегированную подпись в состав которой входит часть сгенерированная сервисом активации. С исходным кодом можете ознакомиться в приложении к настоящему Договору. 2.7. Доказательство использования не тестовой версии цифрового ключа для активации Программы на основе цифровой подписи созданной активированной версией Программы с помощью метода is_not_test_signature_proof, при этом клиенты Лицензиата могут самостоятельно это проверить. С исходным кодом можете ознакомиться в приложении к настоящему Договору. 2.8. Разблокировка доступа к возмездным методам Программы - действие, направленное на использование Лицензиатом информации созданной с помощью Активации в безвозмездном методе Программы activate для возможности использования возмездных методов, охраняемых настоящим Договором. 2.9. Список методов Программы, не требующих активации: * activate * is_not_test_signature_proof * activation_proof * is_activated * is_test_mode * digest * verify * extract_signing_key * activate_init * activate_run * activate_done * make_talon * extract_digital_convert * verify_digital_convert * vec2hex -- PHP only * hex2vec -- PHP only 2.10. Список возмездных методов Программы, доступный после активации и разблокировки: * digest_init * digest_update * digest_finalize * make_signing_key * make_verifying_key * make_keypair * sign * agg_sign * agg_public_keys * agg_signatures 2.11. Дистрибьютор - лицо наделённое правом осуществлять продажу цифровых ключей для использования возмездных функций программы при помощи выделенной Лицензиаром начальной квоты. 2.12. Цифровым талоном называется секретный и публичный ключи, создаваемые методом make_talon и разделённые символом перевода строки "\n" (ASCII 0x0A). 2.13. Квотой Дистрибьютора называется число оставшихся попыток генераций новых цифровых ключей через сервис дистрибьюции. 2.14. Стоимостью квоты дистрибьютора считается цена цифрового ключа умноженного на начальную квоту. 2.15. Сервис активации - Дистрибьютор или API данные для доступа к которому можно узнать у Дистрибьютора или из примеров использования. 2.16. Сервис дистрибьюции - Дистрибьютор или API Дистрибьютора для проверки квоты и/или создания новых цифровых конвертов содержащих цифровые ключи по запросу Лицензиата. 3. Предмет договора 3.1. Программа обеспечивает возможность создания и проверки цифровых подписей и аггрегированных подписей, основанных на стандарте ГОСТ 34.10-2018 с длиной ключа 512 бит. В основе Программы используется эллиптическая кривая с идентификаторами объектов технического комитета по стандартизации "Криптографическая защита информации" OID: 1.2.643.7.1.2.1.2.1, TC26: id-tc26-gost-3410-12-512-paramSetA. 3.2. Лицензиар предоставляет Лицензиату на безвозмездной основе, в порядке и на условиях, изложенных в настоящем Договоре, право использования Программы, ограничиваясь методами, перечисленными в списке методов Программы не требующих активации, и на возмездной для доступа к определённым методам, перечисленным в списке методов Программы, доступных после активации. 3.3. Лицензиат не вправе предоставлять право использования Программы другому лицу. 3.4. Использование возмездных методов Программы становится возможным с момента активации цифрового ключа, который Лицензиат приобретает у Дистрибьютора. Лицензиат подтверждает, что осведомлен о том, что активация цифрового ключа дает право на использование Программы только в пределах, указанных в данном Договоре. 3.5. Лицензиар оставляет за собой право ограничивать доступ к Программе в случае неисполнения Лицензиатом условий Договора. 3.6. Изменения и дополнения к договору могут быть согласованы в устной форме, если это не противоречит законодательству. 4. Сроки исполнения обязательств 4.1. Договор вступает в силу с момента его акцепта Лицензиатом и действует до конца следующего календарного года. 4.2. Год действия ключа ограничен числом равным результату применения операции "И" к битам цифрового ключа битов числа 127 в десятичной системе счисления, и операции "ИЛИ" к числу 2000 в десятичной системе счисления, включительно. Формула: year = 2000 | (license_key & 127), где license_key - это 512 битное число. 4.3. Действие лицензии заканчивается при удалении Программы, если это возможно и истечении года действия приобретённых через Дистрибьютора цифровых ключей. 4.4. Продление настоящей лицензии для использования возмезных методов осуществляется приобретением и активацией нового цифрового ключа. 5. Права и обязанности сторон 5.1. Лицензиат в праве воспользоваться технической поддержкой сервиса активации для совершения активации цифрового ключа и разблокировки программы, а так же для приобретения статуса Дистрибьютора. 5.2. Лицензиат обязан не использовать возмезных методов программы требующих активации без использования активационных данных цифрового ключа доказательство которых проверяется методом activation_proof, и, если год окончания действия цифрового ключа, с помощью которых они были сгенерированы, менее текущего года. 5.3. Лицензиат обязан хранить в секрете секретный ключ требующийся для активации методом activate и содержащийся в результате выполнения метода activate_done перекодированного из base64 в байтах с 64 по 128, и ключ хранящийся с 0 по 64 байт до окончания срока действия активации. 5.4. Дистрибьютор обязан Лицензиату предоставить возможность стать Дистрибьютором через организацию собственного API Дистрибьютора или перенаправить на Дистрибьютора имеющего такую возможность. 5.5. Дистрибьютор обязан предоставить по запросу Лицензиата информацию о параметрах доступа к сервису активации и/или сервису дистрибьюции, если таковые существуют и действуют. 6. Использование 6.1. На этапе распаковки Программы из .tgz архива UNIX формата TAR со сжатием с использованием Gnu Zip, перед использованием Лицензиат обязан внимательно ознакомиться с настоящим лицензионным договором. 6.2. Для приобретения цифрового ключа, Лицензиату понадобится создать цифровой талон и отправить его дистрибьютору. Согласовав условия, дистрибьютор в ответ Лицензиату обязуется прислать цифровой конверт в течение согласованных с ним сроков. 6.3. Извлечение Цифрового ключа из цифрового конверта выполняется методом extract_digital_convert. Пример использования в файле extract_license_key.js для nodejs версии и extract_license_key.php для PHP, содержащемся в архиве с Программой. Талон, используемый в параметрах, тот же, который использовался в приобретении цифрового ключа. 6.4. При наличии Интернет соединения Лицензиат может воспользоваться скриптом index.js для nodejs версии и activation.php для PHP, предварительно настроив input параметры, при необходимости уточнив их у Дистрибьютора, для произведения активации и выполнения демонстрационных скриптов, или создать свой скрипт активации с сохранением данных в надёжном месте. Если для активации используются скрипты по умолчанию, то перед запуском надо убедиться, что запись из этих скриптов на диск разрешена, для не тестовой активации это может привести к потере информации об активации, поэтому сначала надо протестировать активацию на тестовом цифровом ключе. Не тестовый цифровой ключ второй раз активировать не предоставляется возможным настоящей версией сервиса активации. 6.5. Активацию одного и тогоже тестового цифрового ключа можно выполнять многократно. Использование Программы активированной тестовым цифровым ключом не защищено от подделки созданных с помощью неё цифровых подписей. 6.6. Лицензиат может возмездно стать Дистрибьютором, связавшись с одним из Дистрибьюторов, предоставив ему публичную часть цифрового талона и желаемое количество потенциальных генераций новых цифровых ключей. После успешного заведения квоты, при наличии Интернет соединения, настроив input в скрипте sell.js для nodejs версии или sell.php для PHP версии и воспользовавшись им или написав свой скрипт, узнать значения квоты для соответствующего талона. Пример создания цифрового талона смотрите в файле make_talon.js для nodejs версии, или в make_talon.php для PHP. 6.7. Срок действия лицензионного ключа проверяется Лицензиатом без подключения к Интернет используя формулу из пункта 4.2. настоящего договора. Новые лицензионные ключи создаются сервисом дистрибьюции и могут быть двух типов, в зависимости от квот дистрибьютора: а) до конца текущего года по времени сервиса активации, б) до конца следующего года по времени сервиса активации. Время сервиса активации определяется отправкой Лицензиатом сервису активации текущего времени в формате UTC (RFC3339) и верификацией ответа, содержащего: UTC отправителя, UTC сервиса активации и цифровую подпись сервиса активации для этих двух значений, проверяемую методом verify_digital_convert. Пример проверки времени смотрите в файле time.js для nodejs версии, или в time.php для PHP. 7. Ответственность сторон 7.1. Цифровые ключи после их активации Лицензиатом считаются использованными и держать их в секрете не обязательно. 7.2. Повторная активация после утраты данных активации Лицензиатом цифрового ключа ограничена сервисом активации. 7.3. Активированные цифровые ключи Лицензиатов при утечке данных Лицензиара или Дистрибьютора не пострадают, при условии хранения секретных ключей Лицензиатами в защищённом от утечек информации месте. 7.4. Лицензиар не несёт ответственности за ошибки или сбои, вызванные аппаратными или программными проблемами Лицензиатов. 7.5. Лицензиар не несёт ответственности за косвенные убытки, которые могут возникнуть из-за проблем со стороны Лицензиатов. 7.6. Стороны освобождаются от ответственности за невыполнение обязательств из-за обстоятельств непреодолимой силы, включая атаки на инфраструктуру сервисов активации и сервисов дистрибьюции. 7.7. Стороны освобождаются от ответственности при возникновении форс-мажоров и до их исправления. Приложение pub fn is_not_test_signature_proof(signature_bytes: Vec) -> bool { let test_signature_r = BigInt::parse_bytes(b"27042a833c89361b73cf7bc9e0dfa207121e69524d891bde6e48d134fa217822882e3086c0800a2d74af08ff3575a579e38540226ba842f67224bf298758a820", 16).unwrap(); Signature::from_be_bytes(&signature_bytes).r != test_signature_r } pub fn activation_proof(request_init_json: String, multi_signature_bytes: Vec) -> bool { // Доказательство активации ключа аггрегированной подписью let request_init = match serde_json::from_str::(&request_init_json) { Ok(request) => request, Err(_e) => { return false; } }; let constrol_sum = encode(&_digest(&[ request_init.client_public_key.clone(), request_init.public_sig_key.clone(), request_init.license_key_hash.clone(), request_init.imei_hash.clone(), request_init.sim_serial_number_hash.clone(), request_init.rustore_token_hash.clone(), request_init.apns_token_hash.clone(), request_init.seller_id_hash.clone(), ].concat().as_bytes().to_vec())); if constrol_sum != request_init.control_sum { return false; } let app_public_key: Point = Point { x: BigInt::parse_bytes(b"9e4c452444fb1de73afc6e3c057b6c3ae6f01c179a10248a283985d08636d7b0c9e28968fafc1323f35985267080631b64aa90363a745ef0549faa1ed87cf219", 16).unwrap(), y: BigInt::parse_bytes(b"ca4dbd8e97e95550ca4452c7aca427796752433050c68fab4b3c9ce236a03ae79f050e775f37eeedaf9a57fc721aa823540a6a77340e533957e47cc0354d51fa", 16).unwrap(), }; let curve = EllipticCurve::make_curve_a(); let public_keys = [point2vec(app_public_key.clone()), decode(&request_init.client_public_key)].concat(); // проверка мультиподписи активации ключа match _agg_public_keys(public_keys) { Some(agg_public_key) => { let activation_hash = decode(&request_init.control_sum); verify(activation_hash, multi_signature_bytes, agg_public_key) }, None => false } }