Block Cipher "Magma" (GOST R 34.12-2015, former GOST 28147-89)
Supported Cipher Modes
- ECB - Electronic Codebook Mode
- CTR - Counter Encryption Mode
- CTR-ACPKM - Counter Encryption Mode as per RFC8645
- OFB - Output Feedback Mode
- CBC - Cipher Block Chaining Mode
- CFB - Cipher Feedback Mode
- MAC - Message Authentication Code Generation Mode
Implemented and tested according to specifications
- RFC 8891 a.k.a GOST R 34.12-2015: Block Cipher "Magma"
- RFC 5830 a.k.a GOST 28147-89
- Block Cipher Modes:
Tests are implemented using: crypto_vectors
Tested on platforms
- Linux Ubuntu 22.04 LTS / Intel® Core™ i7
- MacOS Ventura 13.4 / Apple Macbook Pro M1
Usage
Please look at magma_samples
Block encryption sample: encrypt_block.rs
use Magma;
let key: = ;
println!;
let magma = with_key;
let source = 0xfedcba9876543210_u64;
println!;
let encrypted = magma.encrypt;
println!;
let decrypted = magma.decrypt;
println!;
assert_eq!;
Text encryption sample: encrypt_text.rs
use ;
let key = ;
println!;
let mut magma = new;
let source = b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. \
Aenean ac sem leo. Morbi pretium neque eget felis finibus convallis. \
Praesent tristique rutrum odio at rhoncus. Duis non ligula ut diam tristique commodo. \
Phasellus vel ex nec leo pretium efficitur. Aliquam malesuada vestibulum magna. \
Quisque iaculis est et est volutpat posuere.";
println!;
let encrypted = magma.encrypt;
println!;
let mut decrypted = magma.decrypt;
if magma.get_mode.has_padding
assert_eq!;
println!;
Message Authentication Code (MAC) sample: calculate_mac.rs
use ;
let key: = ;
println!;
let message = ;
println!;
let mut magma = new;
// update the context
for chunk in message.chunks
// finalize and get result
let mac = finalize;
println!;
assert_eq!;
File encryption sample: encrypt_file.rs
use ;
use env;
use File;
use ;
let key = ;
let mut magma = new;
// opening source file
let source_filename = "README.md";
println!;
let mut source_file = open.expect;
let source_len = source_file.metadata.unwrap.len;
let temp_dir = temp_dir;
// creating file for encrypted data
let encrypted_filename = format!;
let encrypted_filepath = temp_dir.join;
println!;
let mut encrypted_file = options
.write
.read
.create
.open
.expect;
println!;
// ensure buf size % 8 bytes
let mut buf = ;
loop
encrypted_file
.flush
.expect;
println!;
let decrypted_filename = format!;
let decrypted_filepath = temp_dir.join;
println!;
let mut decrypted_file =
create.expect;
println!;
// rewind the file position to the begining
encrypted_file
.rewind
.expect;
loop
decrypted_file
.flush
.expect;
if magma.get_mode.has_padding
println!;