WebCrypto GOST: Tatiana's Letter to Eugene

This is a live example. All buttons execute appropriate javascript algorithms with values from the page. For experimentation directly on the page you can change the text or ciphertext, the values ​​of digital signatures, secret keys and passwords, make changes in the javascript algorithms, their settings.

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);
});