Pelo menos com o pacote Fedora 20 qemu-img
(1.6.2, 10.fc20) não usa AES-NI para criptografia AES.
Confirmando
Pode-se verificar da seguinte forma:
-
A CPU tem AES-NI?
$ grep aes /proc/cpuinfo -i
Por exemplo, meu Intel Core 7 tem essa extensão.
-
Instale os pacotes de depuração necessários:
# debuginfo-install qemu-img
-
Executar
qemu-img
em um depurador:$ gdb --args qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2
-
Defina um ponto de interrupção em uma função de criptografia qemu bem conhecida que não seja otimizada para AES-NI:
(gdb) b AES_encrypt Breakpoint 1 at 0x794b0: file util/aes.c, line 881.
-
Execute o programa:
(gdb) r Starting program: /usr/bin/qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2
Resultados
No meu teste, ele pára aí:
Breakpoint 1, AES_encrypt (in=0x7ffff7fabd60 "...", key=0x555555c1b510) at util/aes.c:881
881 const AES_KEY *key) {
(gdb) n
889 assert(in && out && key);
(gdb) n
881 const AES_KEY *key) {
(gdb) n
889 assert(in && out && key);
(gdb) n
896 s0 = GETU32(in ) ^ rk[0];
(gdb) n
897 s1 = GETU32(in + 4) ^ rk[1];
Significa que, de fato, as instruções do Intel AES não são usadas.
Meu primeiro pensamento foi que qemu-img
talvez apenas use libcrypto
de forma que o AES-NI seja usado automaticamente, quando disponível. qemu-img
até vincula contra libcrypto (cf ldd $(which qemu-img)
) - mas não parece usá-lo para criptografia AES. Hmm.
Eu derivado a localização do ponto de interrupção via grepping o código-fonte do QEMU. No Fedora você pode fazer assim:
$ fedpkg clone -a qemu
$ cd qemu
$ fedpkg source
$ tar xfv qemu-2.2.0-rc1.tar.bz2
$ cd qemu-2.2.0-rc1
OBSERVAÇÃO: gdb
pode ser encerrado pelo comando q
uit.