Доверенные команды ATA в Linux - PullRequest
1 голос
/ 16 января 2011

Коллеги,

Я реализую поддержку доверенных команд ATA

0x5C, TRUSTED RECEIVE, 
0x5D, TRUSTED RECEIVE DMA, 
0x5E, TRUSTED SEND
0x5F, TRUSTED SEND DMA, 

для Linux (два хоста, Fedora 12 и 14) для поддержки дисков с самошифрованием. Я взял код с этой страницы http://www.jukie.net/bart/blog/ata-via-scsi в качестве базового кода. Для доверенного приема (на этом уровне оно идентично IDENTIFY, 0xEC):

sg_io.interface_id    = 'S';
sg_io.cmdp            = cdb;
sg_io.cmd_len         = sizeof(cdb);
sg_io.dxferp          = data_in_buffer;
sg_io.dxfer_len       = data_in_length;         // multiple of 512
sg_io.dxfer_direction = SG_DXFER_FROM_DEV;
sg_io.sbp             = sense;
sg_io.mx_sb_len       = sizeof(sense);
sg_io.timeout         = 5000;                   // 5 seconds


cdb[0] = 0x85;           // pass-through ATA16 command (no translation)
cdb[1] = (4 << 1);       // data-in
cdb[2] = 0x2e;           // data-in
cdb[4] = feature_id;     // ATA feature ID
cdb[6] = 1;              // number of sectors
cdb[7] = lba_low >> 8;
cdb[8] = lba_low;
cdb[9] = lba_mid >> 8;
cdb[10] = lba_mid;
cdb[11] = lba_high >> 8;
cdb[12] = lba_high;
cdb[14] = 0x5C;           // TRUSTED RECEIVE

rc = ioctl (fd, SG_IO, &sg_io);

Он отлично работает для идентификации и всех других команд, но не для доверенных команд. Когда я подключаю анализатор протокола, я вижу, что эти команды не отправляются на шину SATA. Адаптер способен отправлять их, потому что они идут нормально под Windows (не мой код, но я думаю, используя ATA_PASS_THROUGH) И да, я запускаю этот код от имени root.

Пожалуйста, помогите разгадать эту тайну:)

1 Ответ

4 голосов
/ 16 января 2011

См. / usr / src / linux / drivers / ata / libata-scsi.c :

/*
 * Filter TPM commands by default. These provide an
 * essentially uncontrolled encrypted "back door" between
 * applications and the disk. Set libata.allow_tpm=1 if you
 * have a real reason for wanting to use them. This ensures
 * that installed software cannot easily mess stuff up without
 * user intent. DVR type users will probably ship with this enabled
 * for movie content management.
 *
 * Note that for ATA8 we can issue a DCS change and DCS freeze lock
 * for this and should do in future but that it is not sufficient as
 * DCS is an optional feature set. Thus we also do the software filter
 * so that we comply with the TC consortium stated goal that the user
 * can turn off TC features of their system.
 */
if (tf->command >= 0x5C && tf->command <= 0x5F && !libata_allow_tpm)
        goto invalid_fld;
...