设置 LTO 加密时,什么会导致“检测错误”?

Mal*_*ous 4 linux encryption lto

我正在尝试在 Linux 下的 LTO-4 驱动器上设置加密密钥。我成功地做到了一次,对驱动器重新通电,现在我无法让驱动器再次接受密钥。

我使用的命令是这样的:

$ stenc -f /dev/nst0 -a 1 -e on -k test.key
Provided key length is 256 bits.
Key checksum is 7a43.
Turning on encryption on device '/dev/nst0'...
Sense Code:              Illegal Request (0x05)
 ASC:                    0x26
 ASCQ:                   0x00
 Additional data:        0x00000000000000000000000000000000
Error: Turning encryption on for '/dev/nst0' failed!
Usage: stenc --version | -g <length> -k <file> [-kd <description>] | -f <device> [--detail] [-e <on/mixed/rawread/off> [-k <file>] [-kd <description>] [-a <index>] [--protect | --unprotect] [--ckod] ]
Type 'man stenc' for more information.
Run Code Online (Sandbox Code Playgroud)

驱动器是 HP 所以我需要使用-a 1但是不同的值不会改变结果。使用/dev/sg1,而不是有同样的问题。

磁带是 LTO-4,因此支持加密:

$ mt-st -f /dev/nst0 status
SCSI 2 tape drive:
File number=0, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x46 (LTO-4).
Soft error count since last status=0
General status bits on (41010000):
 BOT ONLINE IM_REP_EN
Run Code Online (Sandbox Code Playgroud)

我运行了 HP Tape & Library Tools 并使用相同的磁带进行了加密测试并且它通过了,所以驱动器似乎能够设置密钥,只是stenc出于某种原因不能通过程序。

我发现一个 SCSI 手册说 ASC 0x26 是“参数列表中的无效字段”,这并没有真正解释太多。

有没有其他人以前见过这个错误或者有任何想法如何让驱动器接受密钥?

Mal*_*ous 6

像往常一样,数小时的故障排除毫无意义,但在公共论坛上发布问题会立即揭示问题。

stenc 1.0.7 中存在一个错误,如果您--detail在空白磁带上使用会导致崩溃。我试图联系作者进行修复,但无法联系到他。

似乎这次崩溃使驱动器处于不一致的状态,它拒绝接受更多密钥。修复错误然后在stenc --detail没有崩溃的情况下运行似乎已经解决了问题。我现在可以任意次数设置任何键,并且没有进一步的问题。

如果其他人遇到同样的问题,请在stenc-1.0.7/sec/scsiencrypt.cpp第 176 行显示delete status;. 您需要在其正下方添加一个新行,内容为status=NULL;. 这修复了导致崩溃的双重释放错误。

--- a/src/scsiencrypt.cpp
+++ b/src/scsiencrypt.cpp
@@ -174,6 +174,7 @@ SSP_NBES* SSPGetNBES(string tapeDevice,bool retry){
            if(status->nbes.encryptionStatus!=0x01)break;
            if(moves>=MAX_TAPE_READ_BLOCKS)break;
            delete status;
+           status=NULL; //double free bug fix
            if(!moveTape(tapeDevice,1,true))break;
            moves++;
            status=SSPGetNBES(tapeDevice,false);
Run Code Online (Sandbox Code Playgroud)