From b22b6c22993f2e9b0e40c7e27de5161855307bd7 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Sat, 16 Jan 2021 18:24:04 +0100 Subject: [PATCH] tape: encryption scsi command cleanup --- src/tape/drive/encryption.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/tape/drive/encryption.rs b/src/tape/drive/encryption.rs index 7a6da8f3..4b08dfd1 100644 --- a/src/tape/drive/encryption.rs +++ b/src/tape/drive/encryption.rs @@ -1,4 +1,5 @@ use std::os::unix::prelude::AsRawFd; +use std::io::Write; use anyhow::{bail, format_err, Error}; use endian_trait::Endian; @@ -75,7 +76,7 @@ struct SspSetDataEncryptionPage { key_format: u8, reserved: [u8; 8], key_len: u16, - key: [u8; 32], + /* key follows */ } fn sg_spout_set_encryption( @@ -86,7 +87,11 @@ fn sg_spout_set_encryption( let mut sg_raw = SgRaw::new(file, 0)?; - let outbuf_len = std::mem::size_of::(); + let mut outbuf_len = std::mem::size_of::(); + if let Some(ref key) = key { + outbuf_len += key.len(); + } + let mut outbuf = alloc_page_aligned_buffer(outbuf_len)?; let chok: u8 = 0; @@ -100,16 +105,16 @@ fn sg_spout_set_encryption( algorythm_index, key_format: 0, reserved: [0u8; 8], - key_len: 32, - key: match key { - Some(key) => key, - None => [0u8; 32], - } + key_len: if let Some(ref key) = key { key.len() as u16 } else { 0 }, }; let mut writer = &mut outbuf[..]; unsafe { writer.write_be_value(page)? }; + if let Some(ref key) = key { + writer.write_all(key)?; + } + let mut cmd = Vec::new(); cmd.push(0xB5); // SECURITY PROTOCOL IN (SPOUT) cmd.push(0x20); // Tape Data Encryption Page @@ -181,7 +186,7 @@ struct DataEncryptionStatus { mode: DataEncryptionMode, } -#[derive(Debug, Endian)] +#[derive(Endian)] #[repr(C, packed)] struct SspDataEncryptionCapabilityPage { page_code: u16, @@ -190,7 +195,7 @@ struct SspDataEncryptionCapabilityPage { reserverd: [u8; 15], } -#[derive(Debug, Endian)] +#[derive(Endian)] #[repr(C, packed)] struct SspDataEncryptionAlgorithmDescriptor { algorythm_index: u8, @@ -254,7 +259,7 @@ fn decode_spin_data_encryption_caps(data: &[u8]) -> Result { } -#[derive(Debug, Endian)] +#[derive(Endian)] #[repr(C, packed)] struct SspDataEncryptionStatusPage { page_code: u16,