Содержание


Использование встроенных криптографических возможностей процессора POWER8

Введение в использование AES-команд

Comments

POWER8 – это семейство суперскалярных симметричных мультипроцессоров с архитектурой POWER. В процессорах семейства POWER8 реализованы улучшения в области их криптографических возможностей, в том числе внутриядерные улучшения при использовании криптографического стандарта с симметричным ключом Advanced Encryption Standard (AES).

Набор AES-команд процессора POWER8 содержит пять векторных команд для выполнения шифрования/дешифрования блочного шифра на основе стандарта AES. Кроме того, процессор POWER8 поддерживает команды для умножения в поле Галуа, используемые при реализации алгоритмов GCM (Galois Counter Mode) и GHASH [1].

В предлагаемой статье описываются эти криптографические команды и излагаются простые примеры, демонстрирующие возможность их использования для реализации AES или режимов AES в приложении или в драйвере.

Что такое AES

Стандарт AES (Advanced Encryption Standard), также известный как Rijndael, был принят для шифрования электронных данных Национальным институтом стандартов и технологий (National Institute of Standards and Technology, NIST) в 2001 году. Этот стандарт описывает алгоритм с симметричным ключом, обрабатывающий блоки данных длиной 16 байт/128 разрядов. Другими словами, это алгоритм блочного шифрования. 128-разрядный блок помещается в 128-разрядный регистр VMX/VSX. Ключи для этого алгоритма могут иметь длину 128, 192 или 256 разрядов. Архитектура POWER8 позволяет реализовывать алгоритм AES с помощью пяти команд для исполнения важнейших шагов алгоритме AES непосредственно в процессорном ядре, особенно таких частей алгоритма AES, как расширение ключа и раунды шифрования/дешифрования.

Vector Multimedia eXtension (VMX)

Одно из улучшений процессора POWER8 состоит в реализации интегрированной мультиконвейерной векторной команды типа SIMD, которая поддерживает тридцать два 128-разрядных векторных регистра VMX. Векторные данные могут быть представлены разными способами, как показано в следующей таблице.

qword
dword dword
word word word word
hword hword wword hword hword hword hword hword
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f

* hword = 2 байта, word = 4 байта, dword = 8 байт, qword = 16 байт.

В интересах использования алгоритма AES рассмотрите возможность применения полного 16-байтного вектора, способного манипулировать с самым большим ключом AES или с состоянием (state)/шифрованным текстом на шагах шифрования/дешифрования.

Алгоритм AES

Алгоритм AES состоит из следующих шагов.

  • Расширение ключа/Генерация ключей раундов (RoundKey)
    • RotWord
    • SubBytes
    • Rcon Xor
  • Начальный раунд
    • AddKeyRound
  • Раунды
    • SubBytes
    • ShiftRows
    • MixColumns
    • AddRoundKey
  • Финальный раунд (без Mixcolumns)
    • SubBytes
    • ShiftRows
    • AddRoundKey

Шаг Расширение ключа/Генерация ключей раундов дает общее представление о сути алгоритма. Каждый из этих шагов описывается в следующих разделах.

Рисунок 1. Блок-схема алгоритма AES

Расширение ключа/Генерация ключей раундов

Шаг Расширение ключа/Генерация ключей раундов начинается с заданного ключа и осуществляет его расширение в несколько ключей. В результате расширения 128-разрядного ключа получается 11 ключей. В результате расширения 192-разрядного ключа получается 13 ключей. В результате расширения 256-разрядного ключа получается 15 ключей.

Первый расширенный ключ генерируется из последнего слова исходного ключа и обрабатывается посредством трех шагов, производящих слово, которое затем используется для генерации всех четырех слов расширенного ключа. В следующем раунде используется последнее слово ключа, сгенерированного в предыдущем раунде. Этот процесс повторяется до тех пор, пока все ключи не будут сгенерированы. Следует иметь в виду, что вне зависимости от размера исходного ключа, внутри алгоритма AES всегда используются 16-байтовые ключи.

Шаг RotWord

Шаг Rotate Word (RotWord) обрабатывает слово и циклически сдвигает его байты следующим образом:

Байты 0 1 2 3 -> 1 2 3 0

Пример:

Исходное слово:

79 d2 85 46

Результат после выполнения шага RotWord:

d2 85 46 79

Шаг SubBytes

На шаге SubBytes используется таблица замен (Substitution box, S-Box), которая заменяет байты в слове на мультипликативную обратную величину для этого слова в поле Галуа. GF(28) = GF(2)[x]/(x8+X4+x3+x+1) [2]. В случае дешифрования на этом шаге используется таблицу замен Inverse S-Box.

Рисунок 2. Таблица S-Box

Например, при использовании S-Box байт 0x9a заменяется байтом 0xb8. Этот шаг выполняется внутри с помощью команд vcipher и vcipherlast. Операции Inverse S-Box выполняются внутри с помощью команд vncipher и vncipherlast.

Например, заданное слово имеет вид:

af 7f 67 98

Операция SubBytes(word) даст следующий результат:

79 d2 85 46

Шаг Rcon Xor

Шаг Rcon (Round Counter) – это показательная функция с основанием 2 для заданного пользователем значения [3]. В алгоритме AES это значение является номером раунда.

Количество требуемых алгоритму AES раундов зависит от размера ключа. Для 128-разрядных ключей алгоритму AES требуется до rcon(10); для 192-разрядных ключей алгоритму AES требуется до rcon(8); для 256-разрядных ключей алгоритму AES требуется до rcon(7). Таким образом, с учетом всех возможностей AES нам нужно иметь сохраненные значения rcon от 1 до 10:

Rcon(1-10) = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36

Чтобы сгенерировать первый расширенный ключ, добавив rcon, мы выполняем выражение key-word Xor rcon(1) или key-word xor 01 00 00 00.

Ниже показан полный пример того, как работает расширение ключа.

 Key: 0xac 0x2b 0x3c 0xdd 0xee 0x04 0x11 0x44 0xa1 0x4b 0x5c 0xd1 0x6a 0xb9 0x1c 0xdd Splitting key into words for the first key in key expand buffer: W0 = ac 2b 3c dd W1 = ee 04 11 44 W2 = a1 4b 5c d1 W3 = 6a b9 1c dd Key expand algorithm always uses the last word to execute steps, in our case W3: X1 <- RotWord(w3) X1 = b9 1c dd 6a Y1 <- SubBytes(X1) Y1 = 56 9c c1 02 Rcon(1) = 01 00 00 00 Z1 <- Y1 xor 01 00 00 00 Z1 = 57 9c c1 02 -------------------- Second key in key expand buffer: W4 = W0 xor Z1 = fb b7 fd df W5 = (W4 xor W1) = 15 b3 ec 9b W6 = (W5 xor W2) = b4 f8 b0 4a W7 = (W6 xor W3) = de 41 ac 97 ______________________________ X2 <- RodWord(W7) X2 = 41 ac 97 de Y2 <- SubBytes(X2) Y2 = 83 91 88 1d Rcon(2) = 02 00 00 00 Z2 <- Y2 xor 02 00 00 00 Z2 = 81 91 88 1d ------------------------------ Third key in key expand buffer: W8 = W4 xor z2 = 7a 26 75 c2 W9 = (W8 xor W5) = 6f 95 99 59 W10 = (W9 xor W6) = db 6d 29 13 W11 = (W10 xor W7) = 52 c8 58 40 (...)

Теперь рассмотрим создание расширенных ключей с помощью векторных команд и AES-команд процессора POWER8.

Сначала рассмотрим AES-команды. Как указывалось выше, процессор P8 поддерживает пять AES-команд: vcipher, vcipherlast, vncipher, vncipherlast и vsbox. Сосредоточимся на первых двух командах.

 vcipher VRT,VRA,VRB State ← VR[VRA] RoundKey ← VR[VRB] vtemp1 ← SubBytes(State) vtemp2 ← ShiftRows(vtemp1) vtemp3 ← MixColumns(vtemp2) VR[VRT] ← vtemp3 ^ RoundKey

State – это зашифрованный текст в текущем раунде или даже открытый текст на первом шаге алгоритма AES. Оба значения имеют размер 16 байт или размер блока AES. RoundKey – это ключ в текущем раунде. VMX-векторы имеют длину 16 байт, поэтому они способны обращаться с полноразмерными ключами раундов и с зашифрованным текстом.

 vcipherlast VRT,VRA,VRB State ←VR[VRA] RoundKey ← VR[VRB] vtemp1 ← SubBytes(State) vtemp2 ← ShiftRows(vtemp1) VR[VRT] ← vtemp2 ^ RoundKey

Команда vcipherlast делает то же самое, что и команда vcipher, за исключением того, что в ней отсутствует шаг MixColumns.

Команды vncipher и vncipherlast аналогичны командам vcipher и vcipherlast, за исключением того, что они предназначены для дешифрования и, соответственно, используют обратные шаги.

Процессор Power8 не имеет специальной команды для операции Key Expand. Однако для реализации операции Key Expand можно использовать команду vcipherlast с некоторыми дополнительными шагами.

В следующем примере показано, как использовать команду vcipherlast для выполнения операции Expand Key.

В этом примере указатель rcon уже загружен в векторный регистр — с дополнительной информацией можно ознакомиться в документации по драйверу vmx-crypto [5]. Также обратите внимание, что в коде ассемблера Power PC обращение к регистрам осуществляется по номерам, а не по именам. Например, vperm 3,1,1,5 принимает vr3 в качестве результата регистра и использует vr1 и vr5 в качестве параметров. Для получения дополнительной информации обратитесь к данному документу [4].

 /** * vr1 – первый ключ = 0xac 0x2b 0x3c 0xdd 0xee 0x04 0x11 0x44 0xa1 0x4b 0x5c 0xd1 0x6a 0xb9 0x1c 0xdd * vr5 – маска для циклического сдвига слова, примененная ко всем четырем словам в нашем ключе. * vr5 = 0x0d0e0f0c 0d0e0f0c 0d0e0f0c 0d0e0f0c * vr3 – ключ в месте назначения для использования * vr4 первый загруженный rcon: 01 00 00 00 01 00 00 00 01 00 00 00 * 01 00 00 00 **/ Loop128: 1 vperm 3,1,1,5 2 vsldoi 6,0,1,12 3 vcipherlast 3,3,4 4 vxor 1,1,6 5 vsldoi 6,0,6,12 6 vxor 1,1,6 7 vsldoi 6,0,6,12 8 vxor 1,1,6 9 vadduwm 4,4,4 10 vxor 1,1,3 11 bdnz Loop128

В строке 1 маска применяется к ключу. В данном случае после выполнения vperm ключ vr3 будет иметь вид:

 0xb91cdd6a 0xb91cdd6a 0xb91cdd6a 0xb91cdd6a

Строка 2 дает следующий результат:

 0x0000000ac2b3cddee041144a14b5cd1

В строке 3 осуществляется вызов команды vcipherlast с целью выполнения операций SubBytes, ShiftRows и xor с Rcon (n). Согласно определению функции ShiftRows в документе Power ISA 2.07B [4], ShiftRows не оказывает влияния в случае применения в этом векторе. В этом конкретном сценарии выполняются только операции SubBytes и xor Rcon(n). Другими словами, генерируется первое слово Z или Z1. Таким образом, после исполнения команды vcipherlast мы имеем:

Z1: 0x579cc102 579cc102 579cc102 579cc102

В строках 4 - 8 выполняются математические операции для генерации слов ключа в алгоритме расширения ключа.

 W4 = (W0 xor Z1) W5 = (W1 xor W4) W6 = (W2 xor W5) W7 = (W3 xor W6)

Это можно переписать следующим образом:

 W4' = W0 W5' = W1 xor W0 W6' = W2 xor W1 or W0 W7' = W3 xor W2 Xor W1 xor W0

Где ' означает временное слово перед применением Z1.

Ниже показана детализация операций в строках 4 - 8:

 W0 W1 W2 W3 vr1 0xac2b3cdd 0xee041144 0xa14b5cd1 0x6ab91cdd W0 W1 W2 w3 vr6 0x00000000 0xac2b3cdd 0xee041144 0xa14b5cd1 ------------------------------------------- W4' W5' temp-W6' temp-W7' vr1 0xac2b3cdd 0x422f2d99 0x4f4f4d95 0xcbf2400c W0 W1 vr6 0x00000000 0x00000000 0xac2b3cdd 0xee041144 ------------------------------------------- W4' W5' W6' temp-W7' vr1 0xac2b3cdd 0x422f2d99 0xe3647148 0x25f65148 W0 vr6 0x00000000 0x00000000 0x00000000 0xac2b3cdd ------------------------------------------- W4' W5' W6' W7' vr1 0xac2b3cdd 0x422f2d99 0xe3647148 0x89dd6d95

В строке 9 добавляется rcon для следующего раунда:

 vr4 02 00 00 00 02 00 00 00 02 00 00 00 02 00 00 00

Наконец, в строке 10 применяются слова Z1 с целью генерации первого расширенного ключа.

 W4' W5' W6' W7' vr1 0xac2b3cdd 0x422f2d99 0xe3647148 0x89dd6d95 Z1 Z1 Z1 Z1 vr3 0x579cc102 0x579cc102 0x579cc102 0x579cc102 ------------------------------------------- W4 W5 W6 W7 vr1 0xfbb7fddf 0x15b3ec9b 0xb4f8b04a 0xde41ac97

В строке 11 осуществляется обратный переход к началу цикла и повторение всех предыдущих шагов согласно количеству необходимых раундов.

По сравнению с раундами расширения ключа (Key Expand) раунды AES просты, поскольку им требуются только, чтобы расширенные ключи и данные были зашифрованы или дешифрованы.

В следующем простом примере демонстрируется использование внутрипроцессорных команд. Более точный пример программного кода приведен в Приложении A.

 /** * – наш регистр State или векторный регистр, в котором находится адрес нашего открытого текста/адрес указателя. * vr1 – это ключ key0, предоставленный пользователем, или первый ключ * vr2 – второй ключ, сгенерированный расширенным ключом * vr3 – третий ключ и так далее, вплоть до vr11 **/ 1 vxor 0,0,1 2 vcipher 0,0,2 3 vcipher 0,0,3 4 vcipher 0,0,4 5 vcipher 0,0,5 ... 11 vcipherlast 0,0,11

В строке 1 ключ key0 добавляется к исходному состоянию AES.

Строка 2 – это первый раунд AES с ключом key1.

Строка 3 – это второй цикл AES и так далее.

Строка 11 – это последний раунд AES с ключом key10.

Драйвер ядра, использующий внутрипроцессорные команды POWER8

vmx-crypto – это драйвер ядра, поддерживающий AES-команды процессора POWER8. Первоначально этот драйвер поддерживает AES в режимах CTR и CBC. Кроме того, этот драйвер поддерживает алгоритм GHASH. Этот драйвер доступен для ядра версии Kernel 4.1 и выше. Он поддерживает прямой и обратный порядок байтов.

Чтобы убедиться в том, что ваше ядро использует драйвер vmx-crypto, выполните команду lsmod | grep vmx. Если ваша машина еще не использует этот драйвер, выполните команду modprobe vmx-crypto, а затем осуществите повторную проверку с помощью команды lsmod или даже cat /proc/crypto | less и обратите внимание на префикс p8. Драйвер поддерживает следующие алгоритмы/режимы.

  • имя : ghash

    драйвер : p8_ghash

    модуль : vmx_crypto

  • имя : aes

    драйвер : p8_aes

    модуль : vmx_crypto

  • имя : cbc(aes)

    драйвер : p8_aes_cbc

    модуль : vmx_crypto

  • имя : ctr(aes)

    драйвер : p8_aes_ctr

    модуль : vmx_crypto

Внутрипроцессорные команды POWER8 в пространстве пользователя

Многие проекты используют OpenSSL в качестве поставщика криптографии. Начиная с версии OpenSSL 1.0.2, программный код реализует SSL-криптографию с помощью внутрипроцессорных команд P8. Будучи активированной на работающей системе, данная версия OpenSSL (и старше) обеспечивает повышение производительности благодаря использованию VMX-кода ассемблера POWER8 и оптимизации аппаратных средств. Сегодня очень многие приложения используют OpenSSL для удовлетворения своих криптографических потребностей, поэтому такое усовершенствование в области OpenSSL позволяет самым разнообразным приложениям пользоваться AES-командами POWER8.

Заключение

Использование внутрипроцессорных команд при работе на POWER8-системах позволяет реализовать комплект криптографических средств, непосредственно использующих мощь аппаратных средств POWER8, что поможет вашему программному коду демонстрировать отличную производительность в криптографических тестах.

Ссылки

[1] Brian Hall; Ryan Arnold; Peter Bergner; Wainer dos Santos Moschetta; Robert Enenkel; Pat Haugen; Michael R. Meissner; Alex Mericas; Philipp Oehler; Berni Shiefer; Brian F. Veale; Suresh Warrier; Daniel Zabawa; Adhemerval Zanella. Performance Optimization and Tuning Techniques for IBM Processors, including IBM POWER8. Публикация серии IBM Redbooks, 2014 г..

[2] G. David Forney, Principles of Digital Communication II - Spring 2005. Introduction to Finite Fields, 2005.

[3] Federal Information Processing Standards Publication – Announcing the Advanced Encryption Standard – AES, 2001.

[4] IBM. Power ISA 2.07B. Vector Facilities, 2015. p.217. Документ доступен по ссылке: https://www.power.org/documentation/power-isa-v-2-07b/

[5] Cerri, M. VMX-crypto driver. Документ доступен по ссылке: http://lxr.free-electrons.com/source/drivers/crypto/vmx/.

Приложение A

 /** * vmx-crypto AES-шифрование/aes-шифрование OpenSSL * В ядре: /drivers/crypto/vmx/aesp8-ppc.S * В OpenSSL: /crypto/aes/aesp8-ppc.s **/ .aes_p8_encrypt: lwz 6,240(5) lis 0,0xfc00 mfspr 12,256 li 7,15 mtspr 256,0 lvx 0,0,3 neg 11,4 lvx 1,7,3 lvsl 2,0,3 lvsl 3,0,11 li 7,16 vperm 0,0,1,2 lvx 1,0,5 lvsl 5,0,5 srwi 6,6,1 lvx 2,7,5 addi 7,7,16 subi 6,6,1 vperm 1,1,2,5 vxor 0,0,1 lvx 1,7,5 addi 7,7,16 mtctr 6 .Loop_enc: vperm 2,2,1,5 vcipher 0,0,2 lvx 2,7,5 addi 7,7,16 vperm 1,1,2,5 vcipher 0,0,1 lvx 1,7,5 addi 7,7,16 bdnz .Loop_enc vperm 2,2,1,5 vcipher 0,0,2 lvx 2,7,5 vperm 1,1,2,5 vcipherlast 0,0,1 vspltisb 2,-1 vxor 1,1,1 li 7,15 vperm 2,1,2,3 lvx 1,0,4 vperm 0,0,0,3 vsel 1,1,0,2 lvx 4,7,4 stvx 1,0,4 vsel 0,0,4,2 stvx 0,7,4 mtspr 256,12 blr /** * vmx-crypto AES-дешифрование * В ядре: /drivers/crypto/vmx/aesp8-ppc.S * В OpenSSL: /crypto/aes/aesp8-ppc.s **/ .aes_p8_decrypt: lwz 6,240(5) lis 0,0xfc00 mfspr 12,256 li 7,15 mtspr 256,0 lvx 0,0,3 neg 11,4 lvx 1,7,3 lvsl 2,0,3 lvsl 3,0,11 li 7,16 vperm 0,0,1,2 lvx 1,0,5 lvsl 5,0,5 srwi 6,6,1 lvx 2,7,5 addi 7,7,16 subi 6,6,1 vperm 1,1,2,5 vxor 0,0,1 lvx 1,7,5 addi 7,7,16 mtctr 6 .Loop_dec: vperm 2,2,1,5 vncipher 0,0,2 lvx 2,7,5 addi 7,7,16 vperm 1,1,2,5 vncipher 0,0,1 lvx 1,7,5 addi 7,7,16 bdnz .Loop_dec vperm 2,2,1,5 vncipher 0,0,2 lvx 2,7,5 vperm 1,1,2,5 vncipherlast 0,0,1 vspltisb 2,-1 vxor 1,1,1 li 7,15 vperm 2,1,2,3 lvx 1,0,4 vperm 0,0,0,3 vsel 1,1,0,2 lvx 4,7,4 stvx 1,0,4 vsel 0,0,4,2 stvx 0,7,4 mtspr 256,12 blr

Ресурсы для скачивания


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Security
ArticleID=1030884
ArticleTitle=Использование встроенных криптографических возможностей процессора POWER8
publish-date=04292016