pmv_encryption_rs 1.0.0

Implementation of PersonalMediaVault encrypted storage model. This library allows to encrypt and decrypt data, and also read ans write files in the same format PersonalMediaVault uses.
Documentation
// Library entry point

mod method;
pub use method::*;

mod encrypt;
pub use encrypt::*;

mod decrypt;
pub use decrypt::*;

mod file_block;
pub use file_block::*;

mod multi_file_pack;
pub use multi_file_pack::*;

#[cfg(test)]
mod tests {
    use base64::{Engine, prelude::BASE64_STANDARD};

    use super::*;

    #[test]
    fn test_encryption_decryption_flat() {
        let key: &[u8] = &[0x01; 32]; // Mock key

        let data = "Hello world!".as_bytes();

        let encrypted = encrypt(data, EncryptionMethod::Aes256Flat, key).unwrap();

        let decrypted = decrypt(&encrypted, key).unwrap();

        assert_eq!(decrypted.as_slice(), data);
    }

    #[test]
    fn test_encryption_decryption_zip() {
        let key: &[u8] = &[0x01; 32]; // Mock key

        let data = "Hello world!".as_bytes();

        let encrypted = encrypt(data, EncryptionMethod::Aes256Zip, key).unwrap();

        let decrypted = decrypt(&encrypted, key).unwrap();

        assert_eq!(decrypted.as_slice(), data);
    }

    fn get_big_data() -> Vec<u8> {
        BASE64_STANDARD
            .decode(
                [
                    "CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNj",
                    "aW5nIGVsaXQuIE1vcmJpIG5vbiBtaSBlbGl0LiBQcm9pbiBzdXNjaXBpdCBsZWN0",
                    "dXMgc2l0IGFtZXQgc2VtIHB1bHZpbmFyIHRpbmNpZHVudC4gRG9uZWMgaW4gbWV0",
                    "dXMgdXQgbnVuYyBjb25kaW1lbnR1bSBwb3J0dGl0b3Igdml0YWUgZXQgbGFjdXMu",
                    "IFZlc3RpYnVsdW0gZWdldCBkaWFtIHNlZCBwdXJ1cyB0ZW1wb3IgcG9ydHRpdG9y",
                    "LiBEb25lYyBzY2VsZXJpc3F1ZSB2aXRhZSBlcm9zIGVnZXQgZ3JhdmlkYS4gQWxp",
                    "cXVhbSB0ZW1wb3IgbnVsbGEgc2l0IGFtZXQgdHJpc3RpcXVlIHJob25jdXMuIE51",
                    "bGxhbSBzY2VsZXJpc3F1ZSBudW5jIGF0IG1heGltdXMgbWF0dGlzLiBQaGFzZWxs",
                    "dXMgYWxpcXVldCwgb2RpbyBpZCB0ZW1wdXMgY3Vyc3VzLCB0b3J0b3IgbGVvIGlt",
                    "cGVyZGlldCBlc3QsIG5vbiBhY2N1bXNhbiBtYXNzYSBsZWN0dXMgZWdldCBxdWFt",
                    "LiBTZWQgdXQgYmxhbmRpdCBtYWduYSwgcXVpcyBlZ2VzdGFzIHB1cnVzLiBOdWxs",
                    "YW0gbW9sZXN0aWUgdnVscHV0YXRlIHB1bHZpbmFyLiBJbnRlZ2VyIHZpdmVycmEg",
                    "ZXJvcyB2dWxwdXRhdGUgaXBzdW0gcGhhcmV0cmEgZ3JhdmlkYS4gU2VkIHF1aXMg",
                    "ZXJvcyB1dCBvZGlvIHVsdHJpY2llcyBsYWNpbmlhIGlkIHV0IG51bmMuIFF1aXNx",
                    "dWUgYXQgc2VtcGVyIHVybmEsIG5lYyB0cmlzdGlxdWUgZXJhdC4gRXRpYW0gc2l0",
                    "IGFtZXQgY29uc2VjdGV0dXIgbWkuIEN1cmFiaXR1ciB2YXJpdXMgcXVhbSBpbiBl",
                    "Z2VzdGFzIHBsYWNlcmF0LgoKUHJvaW4gcGxhY2VyYXQsIG1pIGZyaW5naWxsYSB0",
                    "ZW1wdXMgZGFwaWJ1cywgZWxpdCBtYWduYSBzY2VsZXJpc3F1ZSBmZWxpcywgc2Vk",
                    "IGFsaXF1ZXQgdG9ydG9yIG5lcXVlIGV0IG9kaW8uIEN1cmFiaXR1ciB2aXRhZSBu",
                    "dW5jIGZyaW5naWxsYSwgaW1wZXJkaWV0IG51bGxhIGltcGVyZGlldCwgZ3Jhdmlk",
                    "YSB0ZWxsdXMuIENyYXMgYmliZW5kdW0gbG9ib3J0aXMgdG9ydG9yIGVnZXQgbWF0",
                    "dGlzLiBNYWVjZW5hcyBlZ2V0IG1heGltdXMgbWFnbmEuIE51bGxhIGZhY2lsaXNp",
                    "LiBEb25lYyBkdWkgbmliaCwgY29tbW9kbyBldCBsZWN0dXMgYXQsIHJob25jdXMg",
                    "cGxhY2VyYXQgbGliZXJvLiBQZWxsZW50ZXNxdWUgdmVoaWN1bGEsIGVsaXQgaW4g",
                    "YXVjdG9yIGZlcm1lbnR1bSwgYXVndWUgbWFnbmEgdWxsYW1jb3JwZXIgZGlhbSwg",
                    "ZWdldCB2b2x1dHBhdCB0dXJwaXMgbmVxdWUgZXQgbWV0dXMuIFF1aXNxdWUgdmVs",
                    "IGZpbmlidXMgc2FwaWVuLiBOdWxsYW0gZmluaWJ1cyB2ZWwgc2FwaWVuIHV0IHVs",
                    "dHJpY2llcy4gU2VkIGNvbnNlY3RldHVyLCBtZXR1cyBhIGltcGVyZGlldCBzZW1w",
                    "ZXIsIGlwc3VtIGV4IHRyaXN0aXF1ZSB2ZWxpdCwgaWQgdmFyaXVzIG9yY2kgb2Rp",
                    "byB0ZW1wb3IgZW5pbS4gRG9uZWMgY29uZ3VlIHVsdHJpY2VzIG5lcXVlLCB1dCBj",
                    "b21tb2RvIGxlbyBkaWN0dW0gZXUuIFF1aXNxdWUgZWdldCBsZW8gYmxhbmRpdCwg",
                    "c3VzY2lwaXQgZXJhdCBhdCwgZmV1Z2lhdCBleC4gSW50ZWdlciBzb2RhbGVzIHB1",
                    "cnVzIGF0IGR1aSB2aXZlcnJhIGFsaXF1ZXQuIFN1c3BlbmRpc3NlIHJob25jdXMs",
                    "IG51bmMgc2VkIGZhdWNpYnVzIGxhb3JlZXQsIGF1Z3VlIGRpYW0gYmliZW5kdW0g",
                    "dG9ydG9yLCBxdWlzIG1vbGVzdGllIHB1cnVzIG9yY2kgZXQgZXguIFBlbGxlbnRl",
                    "c3F1ZSBtb2xsaXMgdGVsbHVzIGV4LCBhY2N1bXNhbiBvcm5hcmUgbWkgZWdlc3Rh",
                    "cyBhdC4gTnVsbGEgZmFjaWxpc2kuCgpJbiBpbiBzdXNjaXBpdCBudWxsYSwgZXUg",
                    "ZWZmaWNpdHVyIGVuaW0uIFBoYXNlbGx1cyBzYWdpdHRpcyBhdWN0b3IgY29udmFs",
                    "bGlzLiBWaXZhbXVzIHNlZCBkaWduaXNzaW0gcHVydXMuIFF1aXNxdWUgaWQgaW1w",
                    "ZXJkaWV0IG1ldHVzLiBTdXNwZW5kaXNzZSBwdWx2aW5hciBsb3JlbSBzZW0sIGV0",
                    "IGNvbmd1ZSBwdXJ1cyB2b2x1dHBhdCBldC4gTnVsbGEgdXQgbWFzc2EgZXUgbnVu",
                    "YyBjdXJzdXMgY29uc2VxdWF0IHZlbCB2dWxwdXRhdGUgbG9yZW0uIFZpdmFtdXMg",
                    "ZGlhbSBtYXNzYSwgY29uc2VxdWF0IG5lYyByaXN1cyBldCwgc2VtcGVyIGZlcm1l",
                    "bnR1bSBmZWxpcy4gTmFtIHNlZCBkdWkgdmVsIHNhcGllbiBjb21tb2RvIGNvbmd1",
                    "ZSBub24gYXQgdG9ydG9yLiBOYW0gc29sbGljaXR1ZGluIHNlbSBxdWlzIGVuaW0g",
                    "ZmFjaWxpc2lzIGZlcm1lbnR1bS4KCkludGVnZXIgYWNjdW1zYW4gbGliZXJvIHVy",
                    "bmEsIHZpdGFlIGNvbmRpbWVudHVtIGRvbG9yIHRpbmNpZHVudCBldC4gTWF1cmlz",
                    "IGRhcGlidXMgdmVsIG1ldHVzIGluIGFsaXF1ZXQuIER1aXMgc3VzY2lwaXQgYXJj",
                    "dSB2ZWwgZXJvcyB2ZWhpY3VsYSBhbGlxdWFtLiBBbGlxdWFtIGVmZmljaXR1ciwg",
                    "YW50ZSBpbiB2b2x1dHBhdCBzZW1wZXIsIGxpZ3VsYSBudW5jIG1vbGVzdGllIGVs",
                    "aXQsIGEgc3VzY2lwaXQgZXJhdCBsaWd1bGEgc2l0IGFtZXQgbnVuYy4gRHVpcyBl",
                    "dSBsZWN0dXMgZXUgbWFzc2Egc2NlbGVyaXNxdWUgdml2ZXJyYS4gQ3VyYWJpdHVy",
                    "IHZhcml1cywgdXJuYSBldCBkaWN0dW0gZ3JhdmlkYSwgbWV0dXMgZHVpIGZpbmli",
                    "dXMgc2VtLCB1dCB2YXJpdXMgZXggbWkgaWQgdGVsbHVzLiBGdXNjZSB1bHRyaWNl",
                    "cyB0ZWxsdXMgcHVydXMsIHNpdCBhbWV0IHB1bHZpbmFyIGFyY3UgZmF1Y2lidXMg",
                    "bm9uLiBNb3JiaSBtYWxlc3VhZGEgYSBhbnRlIGlkIG1vbGxpcy4gSW50ZXJkdW0g",
                    "ZXQgbWFsZXN1YWRhIGZhbWVzIGFjIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNp",
                    "YnVzLgoKTWFlY2VuYXMgZXUgbmlzaSBlcmF0LiBJbiBuZXF1ZSBvZGlvLCBhbGlx",
                    "dWV0IHF1aXMgcGhhcmV0cmEgdXQsIGxhY2luaWEgbm9uIG1hdXJpcy4gVml2YW11",
                    "cyBzaXQgYW1ldCBlcm9zIHV0IG5pc2kgdGVtcG9yIGNvbnNlcXVhdC4gU3VzcGVu",
                    "ZGlzc2UgcnV0cnVtIHNlZCBleCBzaXQgYW1ldCBldWlzbW9kLiBEb25lYyBldWlz",
                    "bW9kLCBhbnRlIGF0IHJ1dHJ1bSBjb25zZXF1YXQsIGlwc3VtIGF1Z3VlIG1vbGVz",
                    "dGllIG9yY2ksIGluIHBvc3VlcmUgb3JjaSBuZXF1ZSBldSBzZW0uIEV0aWFtIGFs",
                    "aXF1ZXQsIGlwc3VtIGNvbmd1ZSBkaWN0dW0gcGxhY2VyYXQsIG1hdXJpcyBpcHN1",
                    "bSBjdXJzdXMganVzdG8sIG5vbiBwdWx2aW5hciB0ZWxsdXMgbWFzc2EgZXUgbGVj",
                    "dHVzLiBQcmFlc2VudCBlbGVpZmVuZCB0b3J0b3IgdG9ydG9yLCBub24gb3JuYXJl",
                    "IHVybmEgZmFjaWxpc2lzIHNpdCBhbWV0LiBTZWQgcG9ydHRpdG9yLCBlbmltIG9y",
                    "bmFyZSBlbGVtZW50dW0gcHVsdmluYXIsIGVzdCBtYXNzYSB1bGxhbWNvcnBlciBs",
                    "aWJlcm8sIGFjIGZhY2lsaXNpcyBhdWd1ZSBvZGlvIG5vbiBhbnRlLiAKCQ==",
                ]
                .concat(),
            )
            .unwrap()
    }

    #[test]
    fn test_encryption_decryption_flat_big() {
        let key: &[u8] = &[0x01; 32]; // Mock key

        let data = get_big_data();

        let encrypted = encrypt(&data, EncryptionMethod::Aes256Flat, key).unwrap();

        let decrypted = decrypt(&encrypted, key).unwrap();

        assert_eq!(decrypted.as_slice(), data.as_slice());
    }

    #[test]
    fn test_encryption_decryption_zip_big() {
        let key: &[u8] = &[0x01; 32]; // Mock key

        let data = get_big_data();

        let encrypted = encrypt(&data, EncryptionMethod::Aes256Zip, key).unwrap();

        let decrypted = decrypt(&encrypted, key).unwrap();

        assert_eq!(decrypted.as_slice(), data.as_slice());
    }
}