Key pair generation
Tatiana generate the key pair and provide the public key to Eugene personally or though trusted channel.
Generate key pair procedure
// Generate key pair
gostCrypto.subtle.generateKey('GOST R 34.10', true, ['sign', 'verify']).then(function(keyPair) {
// Store key in secluded place
return gostCrypto.subtle.exportKey('raw', keyPair.privateKey).then(function(result) {
privateKey.value = gostCrypto.coding.Hex.encode(result);
// Provide the public key to recepient
return gostCrypto.subtle.exportKey('raw', keyPair.publicKey).then(function(result) {
publicKey.value = gostCrypto.coding.Hex.encode(result);
signButton.removeAttribute('disabled');
});
});
}).catch(function(error) {
alert(error.message);
});
Message signing
Tatiana wrote a Letter to Eugene and signed by using the private key.
Tatiana's Letter to Eugene. In according to specific aristocracy Tatiana fluently parler français and difficulty по-русски. But in the original Letter given на русском языке, so we use WIN-1251 encoding.Я к вам пишу — чего же боле? Что я могу еще сказать? Теперь, я знаю, в вашей воле Меня презреньем наказать. Но вы, к моей несчастной доле Хоть каплю жалости храня, Вы не оставите меня. Сначала я молчать хотела; Поверьте: моего стыда Вы не узнали б никогда, Когда б надежду я имела Хоть редко, хоть в неделю раз В деревне нашей видеть вас, Чтоб только слышать ваши речи, Вам слово молвить, и потом Все думать, думать об одном И день и ночь до новой встречи. Но, говорят, вы нелюдим; В глуши, в деревне все вам скучно, А мы... ничем мы не блестим, Хоть вам и рады простодушно. Зачем вы посетили нас? В глуши забытого селенья Я никогда не знала б вас, Не знала б горького мученья. Души неопытной волненья Смирив со временем (как знать?), По сердцу я нашла бы друга, Была бы верная супруга И добродетельная мать. Другой!.. Нет, никому на свете Не отдала бы сердца я! То в вышнем суждено совете... То воля неба: я твоя; Вся жизнь моя была залогом Свиданья верного с тобой; Я знаю, ты мне послан богом, До гроба ты хранитель мой... Ты в сновиденьях мне являлся Незримый, ты мне был уж мил, Твой чудный взгляд меня томил, В душе твой голос раздавался Давно... нет, это был не сон! Ты чуть вошел, я вмиг узнала, Вся обомлела, запылала И в мыслях молвила: вот он! Не правда ль? я тебя слыхала: Ты говорил со мной в тиши, Когда я бедным помогала Или молитвой услаждала Тоску волнуемой души? И в это самое мгновенье Не ты ли, милое виденье, В прозрачной темноте мелькнул, Приникнул тихо к изголовью? Не ты ль, с отрадой и любовью, Слова надежды мне шепнул? Кто ты, мой ангел ли хранитель, Или коварный искуситель: Мои сомненья разреши. Быть может, это все пустое, Обман неопытной души! И суждено совсем иное... Но так и быть! Судьбу мою Отныне я тебе вручаю, Перед тобою слезы лью, Твоей защиты умоляю... Вообрази: я здесь одна, Никто меня не понимает, Рассудок мой изнемогает, И молча гибнуть я должна. Я жду тебя: единым взором Надежды сердца оживи Иль сон тяжелый перерви, Увы, заслуженным укором! Кончаю! Страшно перечесть... Стыдом и страхом замираю... Но мне порукой ваша честь, И смело ей себя вверяю...Sign message procedure
// Get private key from secluded place
gostCrypto.subtle.importKey('raw', gostCrypto.coding.Hex.decode(privateKey.value),
'GOST R 34.10', true, ['sign']).then(function(key) {
// Use private key for signing message
return gostCrypto.subtle.sign('GOST R 34.10/GOST R 34.11', key,
gostCrypto.coding.Chars.decode(message.textContent));
}).then(function(result) {
// Send signature with message
signature.value = gostCrypto.coding.Hex.encode(result);
verifyButton.removeAttribute('disabled');
}).catch(function(error) {
alert(error.message);
});
Signature verification
Eugene had read the Letter, can verify the signature by using the public key that it was really from Tatiana
Verify signature procedure
// Get public key from trusted source
gostCrypto.subtle.importKey('raw', gostCrypto.coding.Hex.decode(publicKey.value),
'GOST R 34.10', true, ['verify']).then(function(key) {
// Use public key for verify message signature
return gostCrypto.subtle.verify('GOST R 34.10/GOST R 34.11', key,
gostCrypto.coding.Hex.decode(signature.value), gostCrypto.coding.Chars.decode(message.textContent));
}).then(function(result) {
// Check result
verified.value = result ? 'Yes' : 'No';
}).catch(function(error) {
alert(error.message);
});