Skip to content

Commit

Permalink
added bitmap encryption sample (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
sheroz committed Aug 17, 2023
1 parent d72e6e6 commit 6f9b054
Show file tree
Hide file tree
Showing 21 changed files with 266 additions and 64 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

All notable changes to this project will be documented in this file.

## 0.8.1 (2023-08-17)

- Added bitmap encryption sample

## 0.8.0 (2023-08-15)

### Breaking Change
Expand Down
4 changes: 4 additions & 0 deletions cipher_magma/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

All notable changes to this project will be documented in this file.

## 0.8.1 (2023-08-17)

- Added bitmap encryption sample

## 0.8.0 (2023-08-15)

### Breaking Change
Expand Down
25 changes: 25 additions & 0 deletions cipher_magma/src/stream/cipher_mode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,20 @@ impl CipherMode {
}
}

impl ToString for CipherMode {
fn to_string(&self) -> String {
match *self {
CipherMode::ECB => "ECB".to_string(),
CipherMode::CTR => "CTR".to_string(),
CipherMode::CTR_ACPKM => "CTR_ACPKM".to_string(),
CipherMode::OFB => "OFB".to_string(),
CipherMode::CBC => "CBC".to_string(),
CipherMode::CFB => "CFB".to_string(),
CipherMode::MAC => "MAC".to_string(),
}
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand All @@ -75,4 +89,15 @@ mod tests {
assert_eq!(CipherMode::CFB.has_padding(), false);
assert_eq!(CipherMode::MAC.has_padding(), true);
}
#[test]
fn to_string() {
assert_eq!(CipherMode::ECB.to_string(), "ECB");
assert_eq!(CipherMode::CTR.to_string(), "CTR");
assert_eq!(CipherMode::CTR_ACPKM.to_string(), "CTR_ACPKM");
assert_eq!(CipherMode::OFB.to_string(), "OFB");
assert_eq!(CipherMode::CBC.to_string(), "CBC");
assert_eq!(CipherMode::CFB.to_string(), "CFB");
assert_eq!(CipherMode::MAC.to_string(), "MAC");
}

}
1 change: 1 addition & 0 deletions magma_samples/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ edition = "2021"

[dependencies]
cipher_magma = { path = "../cipher_magma" }
image = "0.24"

[dev-dependencies]
criterion = "0.5"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/// Message Authentication Code (MAC) calculation
pub fn sample_calculate_mac() {
pub fn calculate_mac() {
use cipher_magma::{mac, CipherMode, MagmaStream};

let key: [u32; 8] = [
Expand All @@ -23,7 +23,7 @@ pub fn sample_calculate_mac() {

/// Message Authentication Code (MAC)
/// Updating context with data chunks and finalizing result
pub fn sample_calculate_mac_data_chunks() {
pub fn calculate_mac_data_chunks() {
use cipher_magma::{mac, CipherMode, MagmaStream};

let key: [u8; 32] = [
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/// Block encryption sample
pub fn sample_encrypt_block() {
pub fn encrypt_block() {
use cipher_magma::Magma;

let key: [u32; 8] = [
Expand Down
54 changes: 54 additions & 0 deletions magma_samples/src/encrypt_bmp.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
use cipher_magma::{CipherMode, MagmaStream};
use image;
use std::env;
use std::path::PathBuf;

/// Bitmap image encryption sample
pub fn encrypt_bmp(filename: &str, cipher_mode: CipherMode) {

// sample files are located in the /tests directory of the package root (magma_samples)
let source_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests");

// let target_dir = env::temp_dir();
// target directory is /tests/out of the package root (magma_samples)
let target_dir = source_dir.join("out");

let source_filepath = source_dir.join(filename);

println!("Opening the image file: {:?} ...", source_filepath);
let img = image::open(source_filepath).unwrap();

let buf = img.as_bytes();
assert!(buf.len() % 8 == 0);

let key = [
0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11,
0x00, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,
0xfe, 0xff,
];

let mut magma = MagmaStream::new(key, cipher_mode);

println!("Encrypting...");
let enc_buf = magma.encrypt(&buf);
assert_eq!(buf.len(), enc_buf.len());

let enc_filename = format!(
"encrypted_{}.{}",
magma.get_mode().to_string().to_lowercase(),
filename
);
let enc_filepath = target_dir.join(enc_filename);

println!("Saving the encrypted image as: {:?}", enc_filepath);
image::save_buffer(
enc_filepath,
&enc_buf,
img.width(),
img.height(),
img.color(),
)
.unwrap();

println!("Completed.");
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/// Sample of encryption of large data in chunks
pub fn sample_encrypt_large_buffer() {
/// Sample of buffer encryption in chunks
pub fn encrypt_buffer() {
use cipher_magma::{CipherMode, MagmaStream};

const BUF_SIZE: usize = 128;
Expand All @@ -13,12 +13,12 @@ pub fn sample_encrypt_large_buffer() {
Phasellus vel ex nec leo pretium efficitur. Aliquam malesuada vestibulum magna. \
Quisque iaculis est et est volutpat posuere.\n";

// building data containing 5000x of txt
// build the source buffer containing 5000x of txt
let repeat_count = 5000;
let mut source = Vec::<u8>::with_capacity(txt.len() * repeat_count);
(0..repeat_count).for_each(|_| source.extend_from_slice(txt));

println!("Source len:{}", source.len());
println!("Source buffer len:{}", source.len());

let mut encrypted = Vec::<u8>::with_capacity(source.len());
let source_chunks = source.chunks(BUF_SIZE);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,28 @@
/// File encryption sample
pub fn sample_encrypt_file() {
pub fn encrypt_file() {
use cipher_magma::{CipherMode, MagmaStream};
use std::env;
use std::fs::File;
use std::io::{Read, Seek, Write};
use std::path::PathBuf;

let key = [0xab; 32];
let mut magma = MagmaStream::new(key, CipherMode::CBC);
let filename = "sample.md";

// opening source file
let source_filename = "README.md";
println!("Opening source file: {}", source_filename);
// sample files are located in the /tests directory of the package root (magma_samples)
let source_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests");

let mut source_file = File::open(source_filename).expect("Could not open file.");
let source_len = source_file.metadata().unwrap().len();
// let target_dir = env::temp_dir();
// target directory is /tests/out of the package root (magma_samples)
let target_dir = source_dir.join("out");

let source_filepath = source_dir.join(filename);
println!("Opening source file: {:?}", source_filepath);

let temp_dir = env::temp_dir();
let mut source_file = File::open(&source_filepath).expect("Could not open the source file.");
let source_len = source_file.metadata().unwrap().len();

// creating file for encrypted data
let encrypted_filename = format!("{}.encrypted", source_filename);
let encrypted_filepath = temp_dir.join(encrypted_filename);
let encrypted_filepath = target_dir.join(format!("{}.encrypted", filename));
println!("Creating encrypted file: {:?}", encrypted_filepath);

let mut encrypted_file = File::options()
Expand All @@ -34,6 +37,9 @@ pub fn sample_encrypt_file() {
// ensure buf size % 8 bytes
let mut buf = [0u8; 1024];

let key = [0xab; 32];
let mut magma = MagmaStream::new(key, CipherMode::CBC);

loop {
let read_count = source_file
.read(&mut buf)
Expand All @@ -56,8 +62,7 @@ pub fn sample_encrypt_file() {

println!("Encryption completed.");

let decrypted_filename = format!("{}.decrypted", source_filename);
let decrypted_filepath = temp_dir.join(decrypted_filename);
let decrypted_filepath = target_dir.join(format!("decrypted.{}", filename));

println!("Creating file for decrypted data: {:?}", decrypted_filepath);

Expand Down Expand Up @@ -91,8 +96,8 @@ pub fn sample_encrypt_file() {
.flush()
.expect("Could not flush the decrypted file");

// remove padding bytes
if magma.get_mode().has_padding() {
// remove padding bytes
decrypted_file
.set_len(source_len)
.expect("Could not remove padding bytes from decrypted file");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/// Text encryption sample
pub fn sample_encrypt_text() {
pub fn encrypt_text() {
use cipher_magma::{CipherMode, MagmaStream};

let key = [0xab; 32];
Expand Down
58 changes: 21 additions & 37 deletions magma_samples/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,28 +1,37 @@
mod samples;
use samples::encrypt_block::*;
use samples::encrypt_text::*;
use samples::encrypt_large_buffer::*;
use samples::calculate_mac::*;
use samples::encrypt_file::*;
mod calculate_mac;
mod encrypt_block;
mod encrypt_bmp;
mod encrypt_buffer;
mod encrypt_file;
mod encrypt_text;

fn main() {

println!("\n***\n\nBlock encryption\n");
sample_encrypt_block();
encrypt_block::encrypt_block();

println!("\n***\n\nText encryption\n");
sample_encrypt_text();
encrypt_text::encrypt_text();

println!("\n***\n\nEncrypting of large buffer in chunks\n");
sample_encrypt_large_buffer();
encrypt_buffer::encrypt_buffer();

println!("\n***\n\nMessage Authentication Code (MAC) calculation\n");
sample_calculate_mac();
calculate_mac::calculate_mac();

println!("\n***\n\nMessage Authentication Code (MAC) calculation in data chunks\n");
sample_calculate_mac_data_chunks();
calculate_mac::calculate_mac_data_chunks();

println!("\n***\n\nFile encryption\n");
sample_encrypt_file();
encrypt_file::encrypt_file();

println!("\n***\n\nBitmap image encryption\n");
let bmp_filename = "ferris.bmp";
encrypt_bmp::encrypt_bmp(bmp_filename, cipher_magma::CipherMode::ECB);
encrypt_bmp::encrypt_bmp(bmp_filename, cipher_magma::CipherMode::CBC);
encrypt_bmp::encrypt_bmp(bmp_filename, cipher_magma::CipherMode::OFB);
encrypt_bmp::encrypt_bmp(bmp_filename, cipher_magma::CipherMode::CTR);
encrypt_bmp::encrypt_bmp(bmp_filename, cipher_magma::CipherMode::CFB);
}

#[cfg(test)]
Expand All @@ -33,29 +42,4 @@ mod tests {
fn main_test() {
main();
}

#[test]
fn sample_encrypt_block_test() {
sample_encrypt_block();
}

#[test]
fn sample_encrypt_text_test() {
sample_encrypt_text();
}

#[test]
fn sample_encrypt_large_buffer_test() {
sample_encrypt_large_buffer();
}

#[test]
fn sample_calculate_mac_test() {
sample_calculate_mac();
}

#[test]
fn sample_calculate_mac_update_test() {
sample_calculate_mac_data_chunks();
}
}
5 changes: 0 additions & 5 deletions magma_samples/src/samples.rs

This file was deleted.

Binary file added magma_samples/tests/ferris.bmp
Binary file not shown.
65 changes: 65 additions & 0 deletions magma_samples/tests/out/decrypted.sample.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Lorem Ipsum

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at faucibus risus. Praesent scelerisque venenatis purus, vitae molestie ligula porta in. Nam nec augue ac magna venenatis iaculis ac vitae tellus. Quisque quis mollis elit. Mauris lobortis libero et scelerisque sagittis. Praesent sed sollicitudin arcu. Cras ut orci eget nisi posuere malesuada.

Curabitur nibh mauris, tincidunt id urna vitae, faucibus posuere turpis. Phasellus nibh arcu, vestibulum sit amet enim vel, iaculis elementum leo. Suspendisse vulputate, libero a aliquet cursus, lacus massa aliquam sapien, quis aliquet nulla felis vitae elit. Sed euismod velit est, ac scelerisque lectus volutpat non. Nullam molestie pellentesque erat, vel pharetra quam. Fusce facilisis scelerisque maximus. Integer ac dui sit amet mauris tincidunt commodo eu dapibus sem. In eget pretium quam. Ut mollis a lorem quis elementum. In vitae purus iaculis, pharetra tortor a, accumsan justo. Quisque magna ipsum, finibus eu gravida nec, gravida sed orci. Pellentesque convallis pharetra diam, ut mollis diam tristique a.

Proin vulputate massa ligula, id lobortis nisl venenatis ac. Quisque eleifend ligula dolor, vel ultricies enim dignissim ut. Donec convallis mi et elit molestie tempor. Nullam facilisis elit arcu, at varius est sodales vel. Sed dignissim id eros at tincidunt. Mauris non lorem hendrerit, fringilla velit sit amet, tempus nibh. Sed interdum cursus ante vel convallis.

Praesent eget mollis urna. Curabitur eget dolor non magna fermentum hendrerit eu et nisl. Suspendisse volutpat finibus massa, eu eleifend libero viverra a. Suspendisse aliquet vulputate turpis, vitae gravida sapien mollis sed. Ut porttitor, arcu eu auctor suscipit, risus enim pellentesque dolor, eu congue erat lorem imperdiet ligula. Suspendisse placerat feugiat purus, aliquam faucibus nisi facilisis laoreet. Aenean a pellentesque orci. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ac tristique orci, quis iaculis elit.

Nullam turpis diam, ultricies sit amet pellentesque eu, semper et felis. Vivamus id orci a nulla semper laoreet id in odio. Donec quis dolor eros. Phasellus laoreet massa id blandit fringilla. Etiam bibendum dolor et ultrices pharetra. Ut varius semper scelerisque. Vivamus ullamcorper libero justo, porta commodo ex lobortis vel. In a purus vel justo facilisis fermentum.

## Maritum et et illum epulis premente ac

Lorem markdownum bracchia ferventi spargit? Sua quas, cornua? Pisce manere ligno
et vaporibus sede animoque fidum. Quod atque, et et parabat cacumina facta,
viisque [iam mutatus mihi](http://ut.com/eratunum.php) ait lacerta vanos.

1. Audiri media fusum inducere igitur civilibus caput
2. Egi refert unca moderator ipsamque
3. In unum sepulchro volat caelestibus cornibus
4. Venti repugnat nostrum geminaque tepidisque est adacto
5. Pelago amnicolaeque divis tale Nec
6. Iam dimovit

AI in non. Undique premit tormento residens et non, e, mihi, agitasse adgreditur
ignorans leti. Felices Neptune ingens? Adiutrixque viva, monte campo peto
lacrimaeque debere Graium, ea pulcherrime auras nam mirata.

> Me comes, dicta illis Ilithyiam lacrimis manus se stridore volui curvamine
> luminis: pectora et. Typhoea Ceres oraque domos origo vobis factos medio
> finita piscosamque inulti sollertius velox locatas illa. Nescitve quis, mihi
> ille vale armo constituis, eque. Magnoque undas, Atque armos et decolor,
> modicisque dignam quae cetera et passis, et.
## Hic nate quis fecit

Tegens quodque deum: vera: cum Eryx cristati. Astris cum illis Magnetas mihi,
per orbem, simul *viva ad*, sed munere *umeris antiquo*, statuit. Sumptis
gemmata [Meleagros illas](http://quoque-patria.com/frenataqueet), sequitur
molliter; [tibi](http://saxea.net/) errans Diana procul et. Caligine gaudet,
[init suos](http://agna.com/satis-corpus.php) tempus! Ieiunia haec acceptaque
ipsum rursus qui esse; fictos sub invia deum quater.

1. Dea sperat ac aethera volucresque iacui umbra
2. Pronus ades leto pavet posuitque
3. Audet ut musco potest neve
4. At rediit fusus
5. Coniurata cantusque

Ignes reppulit inania quotiensque perdere *praecipue pallor* alis defensae
dixit. Nescioquam [flamma decipienda](http://veniret-vultu.com/lacrimaeque) erat
est *sati ipse qua*. Eat aevi querellae facto incurvo atria utque quis mediis
atram.

> Et est fuerant. Umbrosum errorem, coniunctis; eminet humano calidis, situs,
> reseratis nunc maesta deae, Hectoris, victor. Sceleris qui vino astra cadat
> errat nimium tributum, ut cacumina repercusso. Tela similis adversaque *toto
> plura* superat tempore tenui fuit lympha iussae. Traxit fulminibus glaciali
> studio, esses saepibus, et *e puerum*.
Serae da cursus mecum cursus cognosci et adhaesit tantique, funera exstinctos
Curetas tenuit! Hos nec inferna; multas alto arduus, undas utimur! *Veniunt ubi
Threicio* sacra in lacrimas cortice procorum, pecus? Proserpina rector levati;
qui terra repetemus terra postquam opus *trahuntur* amplexa.
Binary file added magma_samples/tests/out/encrypted_cbc.ferris.bmp
Binary file not shown.
Binary file added magma_samples/tests/out/encrypted_cfb.ferris.bmp
Binary file not shown.
Binary file added magma_samples/tests/out/encrypted_ctr.ferris.bmp
Binary file not shown.
Binary file added magma_samples/tests/out/encrypted_ecb.ferris.bmp
Binary file not shown.
Binary file added magma_samples/tests/out/encrypted_ofb.ferris.bmp
Binary file not shown.
Binary file added magma_samples/tests/out/sample.md.encrypted
Binary file not shown.

0 comments on commit 6f9b054

Please sign in to comment.