Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
8c00b90f
Commit
8c00b90f
authored
Aug 04, 2004
by
Deepak Saxena
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux.bkbits.net/linux-2.5
into plexity.net:/home/dsaxena/src/linux-2.5-bk
parents
a685d7b5
1cc9f865
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
10 additions
and
1044 deletions
+10
-1044
Documentation/crypto/api-intro.txt
Documentation/crypto/api-intro.txt
+0
-1
arch/i386/Makefile
arch/i386/Makefile
+1
-2
arch/i386/crypto/Makefile
arch/i386/crypto/Makefile
+0
-9
arch/i386/crypto/aes-i586-asm.S
arch/i386/crypto/aes-i586-asm.S
+0
-903
arch/i386/crypto/aes-i586-glue.c
arch/i386/crypto/aes-i586-glue.c
+0
-105
crypto/Kconfig
crypto/Kconfig
+2
-22
drivers/md/multipath.c
drivers/md/multipath.c
+7
-2
No files found.
Documentation/crypto/api-intro.txt
View file @
8c00b90f
...
...
@@ -215,7 +215,6 @@ AES algorithm contributors:
Herbert Valerio Riedel
Kyle McMartin
Adam J. Richter
Fruhwirth Clemens (i586)
CAST5 algorithm contributors:
Kartikey Mahendra Bhatt (original developers unknown, FSF copyright).
...
...
arch/i386/Makefile
View file @
8c00b90f
...
...
@@ -104,8 +104,7 @@ head-y := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
libs-y
+=
arch
/i386/lib/
core-y
+=
arch
/i386/kernel/
\
arch
/i386/mm/
\
arch
/i386/
$
(
mcore-y
)
/
\
arch
/i386/crypto/
arch
/i386/
$
(
mcore-y
)
/
drivers-$(CONFIG_MATH_EMULATION)
+=
arch
/i386/math-emu/
drivers-$(CONFIG_PCI)
+=
arch
/i386/pci/
# must be linked after kernel/
...
...
arch/i386/crypto/Makefile
deleted
100644 → 0
View file @
a685d7b5
#
# i386/crypto/Makefile
#
# Arch-specific CryptoAPI modules.
#
obj-$(CONFIG_CRYPTO_AES_586)
+=
aes-i586.o
aes-i586-y
:=
aes-i586-asm.o aes-i586-glue.o
arch/i386/crypto/aes-i586-asm.S
deleted
100644 → 0
View file @
a685d7b5
//
Copyright
(
c
)
2001
,
Dr
Brian
Gladman
<
brg
@
gladman
.
uk
.
net
>,
Worcester
,
UK
.
//
All
rights
reserved
.
//
//
TERMS
//
//
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
//
modification
,
are
permitted
subject
to
the
following
conditions
:
//
//
1.
Redistributions
of
source
code
must
retain
the
above
copyright
//
notice
,
this
list
of
conditions
and
the
following
disclaimer
.
//
//
2.
Redistributions
in
binary
form
must
reproduce
the
above
copyright
//
notice
,
this
list
of
conditions
and
the
following
disclaimer
in
the
//
documentation
and
/
or
other
materials
provided
with
the
distribution
.
//
//
3.
The
copyright
holder
's name must not be used to endorse or promote
//
any
products
derived
from
this
software
without
his
specific
prior
//
written
permission
.
//
//
ALTERNATIVELY
,
provided
that
this
notice
is
retained
in
full
,
this
product
//
may
be
distributed
under
the
terms
of
the
GNU
General
Public
License
(
GPL
),
//
in
which
case
the
provisions
of
the
GPL
apply
INSTEAD
OF
those
given
above
.
//
//
This
software
is
provided
'as is'
with
no
express
or
implied
warranties
//
of
correctness
or
fitness
for
purpose
.
//
//
This
program
is
free
software
; you can redistribute it and/or modify it
//
under
the
terms
of
the
GNU
General
Public
License
as
published
by
the
Free
//
Software
Foundation
; either version 2 of the License, or (at your option)
//
any
later
version
.
//
Modified
by
Jari
Ruusu
,
December
24
2001
//
-
Converted
syntax
to
GNU
CPP
/
assembler
syntax
//
-
C
programming
interface
converted
back
to
"old"
API
//
-
Minor
portability
cleanups
and
speed
optimizations
//
Modified
by
Jari
Ruusu
,
April
11
2002
//
-
Added
above
copyright
and
terms
to
resulting
object
code
so
that
//
binary
distributions
can
avoid
legal
trouble
//
Modified
by
Clemens
Fruhwirth
,
Feb
04
2003
//
-
Switched
in
/
out
to
fit
CryptoAPI
calls
.
//
Modified
by
James
Morris
,
July
31
2004
//
-
Added
alternate
GPL
licensing
clause
with
permission
from
Dr
Gladman
.
//
An
AES
(
Rijndael
)
implementation
for
the
Pentium
.
This
version
only
//
implements
the
standard
AES
block
length
(
128
bits
,
16
bytes
)
.
This
code
//
does
not
preserve
the
eax
,
ecx
or
edx
registers
or
the
artihmetic
status
//
flags
.
However
,
the
ebx
,
esi
,
edi
,
and
ebp
registers
are
preserved
across
//
calls
.
//
void
aes_set_key
(
aes_context
*
cx
,
const
unsigned
char
key
[],
const
int
key_len
,
const
int
f
)
//
void
aes_encrypt
(
const
aes_context
*
cx
,
unsigned
char
out_blk
[],
const
unsigned
char
in_blk
[])
//
void
aes_decrypt
(
const
aes_context
*
cx
,
unsigned
char
out_blk
[],
const
unsigned
char
in_blk
[])
# define ALIGN32BYTES 32
.
file
"aes-i586.S"
.
globl
aes_set_key
.
globl
aes_encrypt
.
globl
aes_decrypt
#define tlen 1024 // length of each of 4 'xor' arrays (256 32-bit words)
//
offsets
to
parameters
with
one
register
pushed
onto
stack
#define ctx 8 // AES context structure
#define out_blk 12 // output byte array address parameter
#define in_blk 16 // input byte array address parameter
//
offsets
in
context
structure
#define nkey 0 // key length, size 4
#define nrnd 4 // number of rounds, size 4
#define ekey 8 // encryption key schedule base address, size 256
#define dkey 264 // decryption key schedule base address, size 256
//
This
macro
performs
a
forward
encryption
cycle
.
It
is
entered
with
//
the
first
previous
round
column
values
in
%
eax
,
%
ebx
,
%
esi
and
%
edi
and
//
exits
with
the
final
values
in
the
same
registers
.
#define fwd_rnd(p1,p2) \
mov
%
ebx
,(%
esp
)
;\
movzbl
%
al
,%
edx
;\
mov
%
eax
,%
ecx
;\
mov
p2
(%
ebp
),%
eax
;\
mov
%
edi
,
4
(%
esp
)
;\
mov
p2
+
12
(%
ebp
),%
edi
;\
xor
p1
(,%
edx
,
4
),%
eax
;\
movzbl
%
ch
,%
edx
;\
shr
$
16
,%
ecx
;\
mov
p2
+
4
(%
ebp
),%
ebx
;\
xor
p1
+
tlen
(,%
edx
,
4
),%
edi
;\
movzbl
%
cl
,%
edx
;\
movzbl
%
ch
,%
ecx
;\
xor
p1
+
3
*
tlen
(,%
ecx
,
4
),%
ebx
;\
mov
%
esi
,%
ecx
;\
mov
p1
+
2
*
tlen
(,%
edx
,
4
),%
esi
;\
movzbl
%
cl
,%
edx
;\
xor
p1
(,%
edx
,
4
),%
esi
;\
movzbl
%
ch
,%
edx
;\
shr
$
16
,%
ecx
;\
xor
p1
+
tlen
(,%
edx
,
4
),%
ebx
;\
movzbl
%
cl
,%
edx
;\
movzbl
%
ch
,%
ecx
;\
xor
p1
+
2
*
tlen
(,%
edx
,
4
),%
eax
;\
mov
(%
esp
),%
edx
;\
xor
p1
+
3
*
tlen
(,%
ecx
,
4
),%
edi
;\
movzbl
%
dl
,%
ecx
;\
xor
p2
+
8
(%
ebp
),%
esi
;\
xor
p1
(,%
ecx
,
4
),%
ebx
;\
movzbl
%
dh
,%
ecx
;\
shr
$
16
,%
edx
;\
xor
p1
+
tlen
(,%
ecx
,
4
),%
eax
;\
movzbl
%
dl
,%
ecx
;\
movzbl
%
dh
,%
edx
;\
xor
p1
+
2
*
tlen
(,%
ecx
,
4
),%
edi
;\
mov
4
(%
esp
),%
ecx
;\
xor
p1
+
3
*
tlen
(,%
edx
,
4
),%
esi
;\
movzbl
%
cl
,%
edx
;\
xor
p1
(,%
edx
,
4
),%
edi
;\
movzbl
%
ch
,%
edx
;\
shr
$
16
,%
ecx
;\
xor
p1
+
tlen
(,%
edx
,
4
),%
esi
;\
movzbl
%
cl
,%
edx
;\
movzbl
%
ch
,%
ecx
;\
xor
p1
+
2
*
tlen
(,%
edx
,
4
),%
ebx
;\
xor
p1
+
3
*
tlen
(,%
ecx
,
4
),%
eax
//
This
macro
performs
an
inverse
encryption
cycle
.
It
is
entered
with
//
the
first
previous
round
column
values
in
%
eax
,
%
ebx
,
%
esi
and
%
edi
and
//
exits
with
the
final
values
in
the
same
registers
.
#define inv_rnd(p1,p2) \
movzbl
%
al
,%
edx
;\
mov
%
ebx
,(%
esp
)
;\
mov
%
eax
,%
ecx
;\
mov
p2
(%
ebp
),%
eax
;\
mov
%
edi
,
4
(%
esp
)
;\
mov
p2
+
4
(%
ebp
),%
ebx
;\
xor
p1
(,%
edx
,
4
),%
eax
;\
movzbl
%
ch
,%
edx
;\
shr
$
16
,%
ecx
;\
mov
p2
+
12
(%
ebp
),%
edi
;\
xor
p1
+
tlen
(,%
edx
,
4
),%
ebx
;\
movzbl
%
cl
,%
edx
;\
movzbl
%
ch
,%
ecx
;\
xor
p1
+
3
*
tlen
(,%
ecx
,
4
),%
edi
;\
mov
%
esi
,%
ecx
;\
mov
p1
+
2
*
tlen
(,%
edx
,
4
),%
esi
;\
movzbl
%
cl
,%
edx
;\
xor
p1
(,%
edx
,
4
),%
esi
;\
movzbl
%
ch
,%
edx
;\
shr
$
16
,%
ecx
;\
xor
p1
+
tlen
(,%
edx
,
4
),%
edi
;\
movzbl
%
cl
,%
edx
;\
movzbl
%
ch
,%
ecx
;\
xor
p1
+
2
*
tlen
(,%
edx
,
4
),%
eax
;\
mov
(%
esp
),%
edx
;\
xor
p1
+
3
*
tlen
(,%
ecx
,
4
),%
ebx
;\
movzbl
%
dl
,%
ecx
;\
xor
p2
+
8
(%
ebp
),%
esi
;\
xor
p1
(,%
ecx
,
4
),%
ebx
;\
movzbl
%
dh
,%
ecx
;\
shr
$
16
,%
edx
;\
xor
p1
+
tlen
(,%
ecx
,
4
),%
esi
;\
movzbl
%
dl
,%
ecx
;\
movzbl
%
dh
,%
edx
;\
xor
p1
+
2
*
tlen
(,%
ecx
,
4
),%
edi
;\
mov
4
(%
esp
),%
ecx
;\
xor
p1
+
3
*
tlen
(,%
edx
,
4
),%
eax
;\
movzbl
%
cl
,%
edx
;\
xor
p1
(,%
edx
,
4
),%
edi
;\
movzbl
%
ch
,%
edx
;\
shr
$
16
,%
ecx
;\
xor
p1
+
tlen
(,%
edx
,
4
),%
eax
;\
movzbl
%
cl
,%
edx
;\
movzbl
%
ch
,%
ecx
;\
xor
p1
+
2
*
tlen
(,%
edx
,
4
),%
ebx
;\
xor
p1
+
3
*
tlen
(,%
ecx
,
4
),%
esi
//
AES
(
Rijndael
)
Encryption
Subroutine
.
text
.
align
ALIGN32BYTES
aes_encrypt
:
push
%
ebp
mov
ctx
(%
esp
),%
ebp
//
pointer
to
context
mov
in_blk
(%
esp
),%
ecx
push
%
ebx
push
%
esi
push
%
edi
mov
nrnd
(%
ebp
),%
edx
//
number
of
rounds
lea
ekey
+
16
(%
ebp
),%
ebp
//
key
pointer
//
input
four
columns
and
xor
in
first
round
key
mov
(%
ecx
),%
eax
mov
4
(%
ecx
),%
ebx
mov
8
(%
ecx
),%
esi
mov
12
(%
ecx
),%
edi
xor
-
16
(%
ebp
),%
eax
xor
-
12
(%
ebp
),%
ebx
xor
-
8
(%
ebp
),%
esi
xor
-
4
(%
ebp
),%
edi
sub
$
8
,%
esp
//
space
for
register
saves
on
stack
sub
$
10
,%
edx
je
aes_15
add
$
32
,%
ebp
sub
$
2
,%
edx
je
aes_13
add
$
32
,%
ebp
fwd_rnd
(
aes_ft_tab
,-64)
//
14
rounds
for
256
-
bit
key
fwd_rnd
(
aes_ft_tab
,-48)
aes_13
:
fwd_rnd
(
aes_ft_tab
,-32)
//
12
rounds
for
192
-
bit
key
fwd_rnd
(
aes_ft_tab
,-16)
aes_15
:
fwd_rnd
(
aes_ft_tab
,0)
//
10
rounds
for
128
-
bit
key
fwd_rnd
(
aes_ft_tab
,16)
fwd_rnd
(
aes_ft_tab
,32)
fwd_rnd
(
aes_ft_tab
,48)
fwd_rnd
(
aes_ft_tab
,64)
fwd_rnd
(
aes_ft_tab
,80)
fwd_rnd
(
aes_ft_tab
,96)
fwd_rnd
(
aes_ft_tab
,112)
fwd_rnd
(
aes_ft_tab
,128)
fwd_rnd
(
aes_fl_tab
,144)
//
last
round
uses
a
different
table
//
move
final
values
to
the
output
array
.
mov
out_blk
+
20
(%
esp
),%
ebp
add
$
8
,%
esp
mov
%
eax
,(%
ebp
)
mov
%
ebx
,
4
(%
ebp
)
mov
%
esi
,
8
(%
ebp
)
mov
%
edi
,
12
(%
ebp
)
pop
%
edi
pop
%
esi
pop
%
ebx
pop
%
ebp
ret
//
AES
(
Rijndael
)
Decryption
Subroutine
.
align
ALIGN32BYTES
aes_decrypt
:
push
%
ebp
mov
ctx
(%
esp
),%
ebp
//
pointer
to
context
mov
in_blk
(%
esp
),%
ecx
push
%
ebx
push
%
esi
push
%
edi
mov
nrnd
(%
ebp
),%
edx
//
number
of
rounds
lea
dkey
+
16
(%
ebp
),%
ebp
//
key
pointer
//
input
four
columns
and
xor
in
first
round
key
mov
(%
ecx
),%
eax
mov
4
(%
ecx
),%
ebx
mov
8
(%
ecx
),%
esi
mov
12
(%
ecx
),%
edi
xor
-
16
(%
ebp
),%
eax
xor
-
12
(%
ebp
),%
ebx
xor
-
8
(%
ebp
),%
esi
xor
-
4
(%
ebp
),%
edi
sub
$
8
,%
esp
//
space
for
register
saves
on
stack
sub
$
10
,%
edx
je
aes_25
add
$
32
,%
ebp
sub
$
2
,%
edx
je
aes_23
add
$
32
,%
ebp
inv_rnd
(
aes_it_tab
,-64)
//
14
rounds
for
256
-
bit
key
inv_rnd
(
aes_it_tab
,-48)
aes_23
:
inv_rnd
(
aes_it_tab
,-32)
//
12
rounds
for
192
-
bit
key
inv_rnd
(
aes_it_tab
,-16)
aes_25
:
inv_rnd
(
aes_it_tab
,0)
//
10
rounds
for
128
-
bit
key
inv_rnd
(
aes_it_tab
,16)
inv_rnd
(
aes_it_tab
,32)
inv_rnd
(
aes_it_tab
,48)
inv_rnd
(
aes_it_tab
,64)
inv_rnd
(
aes_it_tab
,80)
inv_rnd
(
aes_it_tab
,96)
inv_rnd
(
aes_it_tab
,112)
inv_rnd
(
aes_it_tab
,128)
inv_rnd
(
aes_il_tab
,144)
//
last
round
uses
a
different
table
//
move
final
values
to
the
output
array
.
mov
out_blk
+
20
(%
esp
),%
ebp
add
$
8
,%
esp
mov
%
eax
,(%
ebp
)
mov
%
ebx
,
4
(%
ebp
)
mov
%
esi
,
8
(%
ebp
)
mov
%
edi
,
12
(%
ebp
)
pop
%
edi
pop
%
esi
pop
%
ebx
pop
%
ebp
ret
//
AES
(
Rijndael
)
Key
Schedule
Subroutine
//
input
/
output
parameters
#define aes_cx 12 // AES context
#define in_key 16 // key input array address
#define key_ln 20 // key length, bytes (16,24,32) or bits (128,192,256)
#define ed_flg 24 // 0=create both encr/decr keys, 1=create encr key only
//
offsets
for
locals
#define cnt -4
#define kpf -8
#define slen 8
//
This
macro
performs
a
column
mixing
operation
on
an
input
32
-
bit
//
word
to
give
a
32
-
bit
result
.
It
uses
each
of
the
4
bytes
in
the
//
the
input
column
to
index
4
different
tables
of
256
32
-
bit
words
//
that
are
xored
together
to
form
the
output
value
.
#define mix_col(p1) \
movzbl
%
bl
,%
ecx
;\
mov
p1
(,%
ecx
,
4
),%
eax
;\
movzbl
%
bh
,%
ecx
;\
ror
$
16
,%
ebx
;\
xor
p1
+
tlen
(,%
ecx
,
4
),%
eax
;\
movzbl
%
bl
,%
ecx
;\
xor
p1
+
2
*
tlen
(,%
ecx
,
4
),%
eax
;\
movzbl
%
bh
,%
ecx
;\
xor
p1
+
3
*
tlen
(,%
ecx
,
4
),%
eax
//
Key
Schedule
Macros
#define ksc4(p1) \
rol
$
24
,%
ebx
;\
mix_col
(
aes_fl_tab
)
;\
ror
$
8
,%
ebx
;\
xor
4
*
p1
+
aes_rcon_tab
,%
eax
;\
xor
%
eax
,%
esi
;\
xor
%
esi
,%
ebp
;\
mov
%
esi
,
16
*
p1
(%
edi
)
;\
mov
%
ebp
,
16
*
p1
+
4
(%
edi
)
;\
xor
%
ebp
,%
edx
;\
xor
%
edx
,%
ebx
;\
mov
%
edx
,
16
*
p1
+
8
(%
edi
)
;\
mov
%
ebx
,
16
*
p1
+
12
(%
edi
)
#define ksc6(p1) \
rol
$
24
,%
ebx
;\
mix_col
(
aes_fl_tab
)
;\
ror
$
8
,%
ebx
;\
xor
4
*
p1
+
aes_rcon_tab
,%
eax
;\
xor
24
*
p1
-
24
(%
edi
),%
eax
;\
mov
%
eax
,
24
*
p1
(%
edi
)
;\
xor
24
*
p1
-
20
(%
edi
),%
eax
;\
mov
%
eax
,
24
*
p1
+
4
(%
edi
)
;\
xor
%
eax
,%
esi
;\
xor
%
esi
,%
ebp
;\
mov
%
esi
,
24
*
p1
+
8
(%
edi
)
;\
mov
%
ebp
,
24
*
p1
+
12
(%
edi
)
;\
xor
%
ebp
,%
edx
;\
xor
%
edx
,%
ebx
;\
mov
%
edx
,
24
*
p1
+
16
(%
edi
)
;\
mov
%
ebx
,
24
*
p1
+
20
(%
edi
)
#define ksc8(p1) \
rol
$
24
,%
ebx
;\
mix_col
(
aes_fl_tab
)
;\
ror
$
8
,%
ebx
;\
xor
4
*
p1
+
aes_rcon_tab
,%
eax
;\
xor
32
*
p1
-
32
(%
edi
),%
eax
;\
mov
%
eax
,
32
*
p1
(%
edi
)
;\
xor
32
*
p1
-
28
(%
edi
),%
eax
;\
mov
%
eax
,
32
*
p1
+
4
(%
edi
)
;\
xor
32
*
p1
-
24
(%
edi
),%
eax
;\
mov
%
eax
,
32
*
p1
+
8
(%
edi
)
;\
xor
32
*
p1
-
20
(%
edi
),%
eax
;\
mov
%
eax
,
32
*
p1
+
12
(%
edi
)
;\
push
%
ebx
;\
mov
%
eax
,%
ebx
;\
mix_col
(
aes_fl_tab
)
;\
pop
%
ebx
;\
xor
%
eax
,%
esi
;\
xor
%
esi
,%
ebp
;\
mov
%
esi
,
32
*
p1
+
16
(%
edi
)
;\
mov
%
ebp
,
32
*
p1
+
20
(%
edi
)
;\
xor
%
ebp
,%
edx
;\
xor
%
edx
,%
ebx
;\
mov
%
edx
,
32
*
p1
+
24
(%
edi
)
;\
mov
%
ebx
,
32
*
p1
+
28
(%
edi
)
.
align
ALIGN32BYTES
aes_set_key
:
pushfl
push
%
ebp
mov
%
esp
,%
ebp
sub
$slen
,%
esp
push
%
ebx
push
%
esi
push
%
edi
mov
aes_cx
(%
ebp
),%
edx
//
edx
->
AES
context
mov
key_ln
(%
ebp
),%
ecx
//
key
length
cmpl
$
128
,%
ecx
jb
aes_30
shr
$
3
,%
ecx
aes_30
:
cmpl
$
32
,%
ecx
je
aes_32
cmpl
$
24
,%
ecx
je
aes_32
mov
$
16
,%
ecx
aes_32
:
shr
$
2
,%
ecx
mov
%
ecx
,
nkey
(%
edx
)
lea
6
(%
ecx
),%
eax
//
10
/
12
/
14
for
4
/
6
/
8
32
-
bit
key
length
mov
%
eax
,
nrnd
(%
edx
)
mov
in_key
(%
ebp
),%
esi
//
key
input
array
lea
ekey
(%
edx
),%
edi
//
key
position
in
AES
context
cld
push
%
ebp
mov
%
ecx
,%
eax
//
save
key
length
in
eax
rep
; movsl // words in the key schedule
mov
-
4
(%
esi
),%
ebx
//
put
some
values
in
registers
mov
-
8
(%
esi
),%
edx
//
to
allow
faster
code
mov
-
12
(%
esi
),%
ebp
mov
-
16
(%
esi
),%
esi
cmpl
$
4
,%
eax
//
jump
on
key
size
je
aes_36
cmpl
$
6
,%
eax
je
aes_35
ksc8
(0)
ksc8
(1)
ksc8
(2)
ksc8
(3)
ksc8
(4)
ksc8
(5)
ksc8
(6)
jmp
aes_37
aes_35
:
ksc6
(0)
ksc6
(1)
ksc6
(2)
ksc6
(3)
ksc6
(4)
ksc6
(5)
ksc6
(6)
ksc6
(7)
jmp
aes_37
aes_36
:
ksc4
(0)
ksc4
(1)
ksc4
(2)
ksc4
(3)
ksc4
(4)
ksc4
(5)
ksc4
(6)
ksc4
(7)
ksc4
(8)
ksc4
(9)
aes_37
:
pop
%
ebp
mov
aes_cx
(%
ebp
),%
edx
//
edx
->
AES
context
cmpl
$
0
,
ed_flg
(%
ebp
)
jne
aes_39
//
compile
decryption
key
schedule
from
encryption
schedule
-
reverse
//
order
and
do
mix_column
operation
on
round
keys
except
first
and
last
mov
nrnd
(%
edx
),%
eax
//
kt
=
cx
->
d_key
+
nc
*
cx
->
Nrnd
shl
$
2
,%
eax
lea
dkey
(%
edx
,%
eax
,
4
),%
edi
lea
ekey
(%
edx
),%
esi
//
kf
=
cx
->
e_key
movsl
//
copy
first
round
key
(
unmodified
)
movsl
movsl
movsl
sub
$
32
,%
edi
movl
$
1
,
cnt
(%
ebp
)
aes_38
:
//
do
mix
column
on
each
column
of
lodsl
//
each
round
key
mov
%
eax
,%
ebx
mix_col
(
aes_im_tab
)
stosl
lodsl
mov
%
eax
,%
ebx
mix_col
(
aes_im_tab
)
stosl
lodsl
mov
%
eax
,%
ebx
mix_col
(
aes_im_tab
)
stosl
lodsl
mov
%
eax
,%
ebx
mix_col
(
aes_im_tab
)
stosl
sub
$
32
,%
edi
incl
cnt
(%
ebp
)
mov
cnt
(%
ebp
),%
eax
cmp
nrnd
(%
edx
),%
eax
jb
aes_38
movsl
//
copy
last
round
key
(
unmodified
)
movsl
movsl
movsl
aes_39
:
pop
%
edi
pop
%
esi
pop
%
ebx
mov
%
ebp
,%
esp
pop
%
ebp
popfl
ret
//
finite
field
multiplies
by
{
02
},
{
04
}
and
{
08
}
#define f2(x) ((x<<1)^(((x>>7)&1)*0x11b))
#define f4(x) ((x<<2)^(((x>>6)&1)*0x11b)^(((x>>6)&2)*0x11b))
#define f8(x) ((x<<3)^(((x>>5)&1)*0x11b)^(((x>>5)&2)*0x11b)^(((x>>5)&4)*0x11b))
//
finite
field
multiplies
required
in
table
generation
#define f3(x) (f2(x) ^ x)
#define f9(x) (f8(x) ^ x)
#define fb(x) (f8(x) ^ f2(x) ^ x)
#define fd(x) (f8(x) ^ f4(x) ^ x)
#define fe(x) (f8(x) ^ f4(x) ^ f2(x))
//
These
defines
generate
the
forward
table
entries
#define u0(x) ((f3(x) << 24) | (x << 16) | (x << 8) | f2(x))
#define u1(x) ((x << 24) | (x << 16) | (f2(x) << 8) | f3(x))
#define u2(x) ((x << 24) | (f2(x) << 16) | (f3(x) << 8) | x)
#define u3(x) ((f2(x) << 24) | (f3(x) << 16) | (x << 8) | x)
//
These
defines
generate
the
inverse
table
entries
#define v0(x) ((fb(x) << 24) | (fd(x) << 16) | (f9(x) << 8) | fe(x))
#define v1(x) ((fd(x) << 24) | (f9(x) << 16) | (fe(x) << 8) | fb(x))
#define v2(x) ((f9(x) << 24) | (fe(x) << 16) | (fb(x) << 8) | fd(x))
#define v3(x) ((fe(x) << 24) | (fb(x) << 16) | (fd(x) << 8) | f9(x))
//
These
defines
generate
entries
for
the
last
round
tables
#define w0(x) (x)
#define w1(x) (x << 8)
#define w2(x) (x << 16)
#define w3(x) (x << 24)
//
macro
to
generate
inverse
mix
column
tables
(
needed
for
the
key
schedule
)
#define im_data0(p1) \
.
long
p1
(
0x00
),
p1
(
0x01
),
p1
(
0x02
),
p1
(
0x03
),
p1
(
0x04
),
p1
(
0x05
),
p1
(
0x06
),
p1
(
0x07
)
;\
.
long
p1
(
0x08
),
p1
(
0x09
),
p1
(
0x0a
),
p1
(
0x0b
),
p1
(
0x0c
),
p1
(
0x0d
),
p1
(
0x0e
),
p1
(
0x0f
)
;\
.
long
p1
(
0x10
),
p1
(
0x11
),
p1
(
0x12
),
p1
(
0x13
),
p1
(
0x14
),
p1
(
0x15
),
p1
(
0x16
),
p1
(
0x17
)
;\
.
long
p1
(
0x18
),
p1
(
0x19
),
p1
(
0x1a
),
p1
(
0x1b
),
p1
(
0x1c
),
p1
(
0x1d
),
p1
(
0x1e
),
p1
(
0x1f
)
#define im_data1(p1) \
.
long
p1
(
0x20
),
p1
(
0x21
),
p1
(
0x22
),
p1
(
0x23
),
p1
(
0x24
),
p1
(
0x25
),
p1
(
0x26
),
p1
(
0x27
)
;\
.
long
p1
(
0x28
),
p1
(
0x29
),
p1
(
0x2a
),
p1
(
0x2b
),
p1
(
0x2c
),
p1
(
0x2d
),
p1
(
0x2e
),
p1
(
0x2f
)
;\
.
long
p1
(
0x30
),
p1
(
0x31
),
p1
(
0x32
),
p1
(
0x33
),
p1
(
0x34
),
p1
(
0x35
),
p1
(
0x36
),
p1
(
0x37
)
;\
.
long
p1
(
0x38
),
p1
(
0x39
),
p1
(
0x3a
),
p1
(
0x3b
),
p1
(
0x3c
),
p1
(
0x3d
),
p1
(
0x3e
),
p1
(
0x3f
)
#define im_data2(p1) \
.
long
p1
(
0x40
),
p1
(
0x41
),
p1
(
0x42
),
p1
(
0x43
),
p1
(
0x44
),
p1
(
0x45
),
p1
(
0x46
),
p1
(
0x47
)
;\
.
long
p1
(
0x48
),
p1
(
0x49
),
p1
(
0x4a
),
p1
(
0x4b
),
p1
(
0x4c
),
p1
(
0x4d
),
p1
(
0x4e
),
p1
(
0x4f
)
;\
.
long
p1
(
0x50
),
p1
(
0x51
),
p1
(
0x52
),
p1
(
0x53
),
p1
(
0x54
),
p1
(
0x55
),
p1
(
0x56
),
p1
(
0x57
)
;\
.
long
p1
(
0x58
),
p1
(
0x59
),
p1
(
0x5a
),
p1
(
0x5b
),
p1
(
0x5c
),
p1
(
0x5d
),
p1
(
0x5e
),
p1
(
0x5f
)
#define im_data3(p1) \
.
long
p1
(
0x60
),
p1
(
0x61
),
p1
(
0x62
),
p1
(
0x63
),
p1
(
0x64
),
p1
(
0x65
),
p1
(
0x66
),
p1
(
0x67
)
;\
.
long
p1
(
0x68
),
p1
(
0x69
),
p1
(
0x6a
),
p1
(
0x6b
),
p1
(
0x6c
),
p1
(
0x6d
),
p1
(
0x6e
),
p1
(
0x6f
)
;\
.
long
p1
(
0x70
),
p1
(
0x71
),
p1
(
0x72
),
p1
(
0x73
),
p1
(
0x74
),
p1
(
0x75
),
p1
(
0x76
),
p1
(
0x77
)
;\
.
long
p1
(
0x78
),
p1
(
0x79
),
p1
(
0x7a
),
p1
(
0x7b
),
p1
(
0x7c
),
p1
(
0x7d
),
p1
(
0x7e
),
p1
(
0x7f
)
#define im_data4(p1) \
.
long
p1
(
0x80
),
p1
(
0x81
),
p1
(
0x82
),
p1
(
0x83
),
p1
(
0x84
),
p1
(
0x85
),
p1
(
0x86
),
p1
(
0x87
)
;\
.
long
p1
(
0x88
),
p1
(
0x89
),
p1
(
0x8a
),
p1
(
0x8b
),
p1
(
0x8c
),
p1
(
0x8d
),
p1
(
0x8e
),
p1
(
0x8f
)
;\
.
long
p1
(
0x90
),
p1
(
0x91
),
p1
(
0x92
),
p1
(
0x93
),
p1
(
0x94
),
p1
(
0x95
),
p1
(
0x96
),
p1
(
0x97
)
;\
.
long
p1
(
0x98
),
p1
(
0x99
),
p1
(
0x9a
),
p1
(
0x9b
),
p1
(
0x9c
),
p1
(
0x9d
),
p1
(
0x9e
),
p1
(
0x9f
)
#define im_data5(p1) \
.
long
p1
(
0xa0
),
p1
(
0xa1
),
p1
(
0xa2
),
p1
(
0xa3
),
p1
(
0xa4
),
p1
(
0xa5
),
p1
(
0xa6
),
p1
(
0xa7
)
;\
.
long
p1
(
0xa8
),
p1
(
0xa9
),
p1
(
0xaa
),
p1
(
0xab
),
p1
(
0xac
),
p1
(
0xad
),
p1
(
0xae
),
p1
(
0xaf
)
;\
.
long
p1
(
0xb0
),
p1
(
0xb1
),
p1
(
0xb2
),
p1
(
0xb3
),
p1
(
0xb4
),
p1
(
0xb5
),
p1
(
0xb6
),
p1
(
0xb7
)
;\
.
long
p1
(
0xb8
),
p1
(
0xb9
),
p1
(
0xba
),
p1
(
0xbb
),
p1
(
0xbc
),
p1
(
0xbd
),
p1
(
0xbe
),
p1
(
0xbf
)
#define im_data6(p1) \
.
long
p1
(
0xc0
),
p1
(
0xc1
),
p1
(
0xc2
),
p1
(
0xc3
),
p1
(
0xc4
),
p1
(
0xc5
),
p1
(
0xc6
),
p1
(
0xc7
)
;\
.
long
p1
(
0xc8
),
p1
(
0xc9
),
p1
(
0xca
),
p1
(
0xcb
),
p1
(
0xcc
),
p1
(
0xcd
),
p1
(
0xce
),
p1
(
0xcf
)
;\
.
long
p1
(
0xd0
),
p1
(
0xd1
),
p1
(
0xd2
),
p1
(
0xd3
),
p1
(
0xd4
),
p1
(
0xd5
),
p1
(
0xd6
),
p1
(
0xd7
)
;\
.
long
p1
(
0xd8
),
p1
(
0xd9
),
p1
(
0xda
),
p1
(
0xdb
),
p1
(
0xdc
),
p1
(
0xdd
),
p1
(
0xde
),
p1
(
0xdf
)
#define im_data7(p1) \
.
long
p1
(
0xe0
),
p1
(
0xe1
),
p1
(
0xe2
),
p1
(
0xe3
),
p1
(
0xe4
),
p1
(
0xe5
),
p1
(
0xe6
),
p1
(
0xe7
)
;\
.
long
p1
(
0xe8
),
p1
(
0xe9
),
p1
(
0xea
),
p1
(
0xeb
),
p1
(
0xec
),
p1
(
0xed
),
p1
(
0xee
),
p1
(
0xef
)
;\
.
long
p1
(
0xf0
),
p1
(
0xf1
),
p1
(
0xf2
),
p1
(
0xf3
),
p1
(
0xf4
),
p1
(
0xf5
),
p1
(
0xf6
),
p1
(
0xf7
)
;\
.
long
p1
(
0xf8
),
p1
(
0xf9
),
p1
(
0xfa
),
p1
(
0xfb
),
p1
(
0xfc
),
p1
(
0xfd
),
p1
(
0xfe
),
p1
(
0xff
)
//
S
-
box
data
-
256
entries
#define sb_data0(p1) \
.
long
p1
(
0x63
),
p1
(
0x7c
),
p1
(
0x77
),
p1
(
0x7b
),
p1
(
0xf2
),
p1
(
0x6b
),
p1
(
0x6f
),
p1
(
0xc5
)
;\
.
long
p1
(
0x30
),
p1
(
0x01
),
p1
(
0x67
),
p1
(
0x2b
),
p1
(
0xfe
),
p1
(
0xd7
),
p1
(
0xab
),
p1
(
0x76
)
;\
.
long
p1
(
0xca
),
p1
(
0x82
),
p1
(
0xc9
),
p1
(
0x7d
),
p1
(
0xfa
),
p1
(
0x59
),
p1
(
0x47
),
p1
(
0xf0
)
;\
.
long
p1
(
0xad
),
p1
(
0xd4
),
p1
(
0xa2
),
p1
(
0xaf
),
p1
(
0x9c
),
p1
(
0xa4
),
p1
(
0x72
),
p1
(
0xc0
)
#define sb_data1(p1) \
.
long
p1
(
0xb7
),
p1
(
0xfd
),
p1
(
0x93
),
p1
(
0x26
),
p1
(
0x36
),
p1
(
0x3f
),
p1
(
0xf7
),
p1
(
0xcc
)
;\
.
long
p1
(
0x34
),
p1
(
0xa5
),
p1
(
0xe5
),
p1
(
0xf1
),
p1
(
0x71
),
p1
(
0xd8
),
p1
(
0x31
),
p1
(
0x15
)
;\
.
long
p1
(
0x04
),
p1
(
0xc7
),
p1
(
0x23
),
p1
(
0xc3
),
p1
(
0x18
),
p1
(
0x96
),
p1
(
0x05
),
p1
(
0x9a
)
;\
.
long
p1
(
0x07
),
p1
(
0x12
),
p1
(
0x80
),
p1
(
0xe2
),
p1
(
0xeb
),
p1
(
0x27
),
p1
(
0xb2
),
p1
(
0x75
)
#define sb_data2(p1) \
.
long
p1
(
0x09
),
p1
(
0x83
),
p1
(
0x2c
),
p1
(
0x1a
),
p1
(
0x1b
),
p1
(
0x6e
),
p1
(
0x5a
),
p1
(
0xa0
)
;\
.
long
p1
(
0x52
),
p1
(
0x3b
),
p1
(
0xd6
),
p1
(
0xb3
),
p1
(
0x29
),
p1
(
0xe3
),
p1
(
0x2f
),
p1
(
0x84
)
;\
.
long
p1
(
0x53
),
p1
(
0xd1
),
p1
(
0x00
),
p1
(
0xed
),
p1
(
0x20
),
p1
(
0xfc
),
p1
(
0xb1
),
p1
(
0x5b
)
;\
.
long
p1
(
0x6a
),
p1
(
0xcb
),
p1
(
0xbe
),
p1
(
0x39
),
p1
(
0x4a
),
p1
(
0x4c
),
p1
(
0x58
),
p1
(
0xcf
)
#define sb_data3(p1) \
.
long
p1
(
0xd0
),
p1
(
0xef
),
p1
(
0xaa
),
p1
(
0xfb
),
p1
(
0x43
),
p1
(
0x4d
),
p1
(
0x33
),
p1
(
0x85
)
;\
.
long
p1
(
0x45
),
p1
(
0xf9
),
p1
(
0x02
),
p1
(
0x7f
),
p1
(
0x50
),
p1
(
0x3c
),
p1
(
0x9f
),
p1
(
0xa8
)
;\
.
long
p1
(
0x51
),
p1
(
0xa3
),
p1
(
0x40
),
p1
(
0x8f
),
p1
(
0x92
),
p1
(
0x9d
),
p1
(
0x38
),
p1
(
0xf5
)
;\
.
long
p1
(
0xbc
),
p1
(
0xb6
),
p1
(
0xda
),
p1
(
0x21
),
p1
(
0x10
),
p1
(
0xff
),
p1
(
0xf3
),
p1
(
0xd2
)
#define sb_data4(p1) \
.
long
p1
(
0xcd
),
p1
(
0x0c
),
p1
(
0x13
),
p1
(
0xec
),
p1
(
0x5f
),
p1
(
0x97
),
p1
(
0x44
),
p1
(
0x17
)
;\
.
long
p1
(
0xc4
),
p1
(
0xa7
),
p1
(
0x7e
),
p1
(
0x3d
),
p1
(
0x64
),
p1
(
0x5d
),
p1
(
0x19
),
p1
(
0x73
)
;\
.
long
p1
(
0x60
),
p1
(
0x81
),
p1
(
0x4f
),
p1
(
0xdc
),
p1
(
0x22
),
p1
(
0x2a
),
p1
(
0x90
),
p1
(
0x88
)
;\
.
long
p1
(
0x46
),
p1
(
0xee
),
p1
(
0xb8
),
p1
(
0x14
),
p1
(
0xde
),
p1
(
0x5e
),
p1
(
0x0b
),
p1
(
0xdb
)
#define sb_data5(p1) \
.
long
p1
(
0xe0
),
p1
(
0x32
),
p1
(
0x3a
),
p1
(
0x0a
),
p1
(
0x49
),
p1
(
0x06
),
p1
(
0x24
),
p1
(
0x5c
)
;\
.
long
p1
(
0xc2
),
p1
(
0xd3
),
p1
(
0xac
),
p1
(
0x62
),
p1
(
0x91
),
p1
(
0x95
),
p1
(
0xe4
),
p1
(
0x79
)
;\
.
long
p1
(
0xe7
),
p1
(
0xc8
),
p1
(
0x37
),
p1
(
0x6d
),
p1
(
0x8d
),
p1
(
0xd5
),
p1
(
0x4e
),
p1
(
0xa9
)
;\
.
long
p1
(
0x6c
),
p1
(
0x56
),
p1
(
0xf4
),
p1
(
0xea
),
p1
(
0x65
),
p1
(
0x7a
),
p1
(
0xae
),
p1
(
0x08
)
#define sb_data6(p1) \
.
long
p1
(
0xba
),
p1
(
0x78
),
p1
(
0x25
),
p1
(
0x2e
),
p1
(
0x1c
),
p1
(
0xa6
),
p1
(
0xb4
),
p1
(
0xc6
)
;\
.
long
p1
(
0xe8
),
p1
(
0xdd
),
p1
(
0x74
),
p1
(
0x1f
),
p1
(
0x4b
),
p1
(
0xbd
),
p1
(
0x8b
),
p1
(
0x8a
)
;\
.
long
p1
(
0x70
),
p1
(
0x3e
),
p1
(
0xb5
),
p1
(
0x66
),
p1
(
0x48
),
p1
(
0x03
),
p1
(
0xf6
),
p1
(
0x0e
)
;\
.
long
p1
(
0x61
),
p1
(
0x35
),
p1
(
0x57
),
p1
(
0xb9
),
p1
(
0x86
),
p1
(
0xc1
),
p1
(
0x1d
),
p1
(
0x9e
)
#define sb_data7(p1) \
.
long
p1
(
0xe1
),
p1
(
0xf8
),
p1
(
0x98
),
p1
(
0x11
),
p1
(
0x69
),
p1
(
0xd9
),
p1
(
0x8e
),
p1
(
0x94
)
;\
.
long
p1
(
0x9b
),
p1
(
0x1e
),
p1
(
0x87
),
p1
(
0xe9
),
p1
(
0xce
),
p1
(
0x55
),
p1
(
0x28
),
p1
(
0xdf
)
;\
.
long
p1
(
0x8c
),
p1
(
0xa1
),
p1
(
0x89
),
p1
(
0x0d
),
p1
(
0xbf
),
p1
(
0xe6
),
p1
(
0x42
),
p1
(
0x68
)
;\
.
long
p1
(
0x41
),
p1
(
0x99
),
p1
(
0x2d
),
p1
(
0x0f
),
p1
(
0xb0
),
p1
(
0x54
),
p1
(
0xbb
),
p1
(
0x16
)
//
Inverse
S
-
box
data
-
256
entries
#define ib_data0(p1) \
.
long
p1
(
0x52
),
p1
(
0x09
),
p1
(
0x6a
),
p1
(
0xd5
),
p1
(
0x30
),
p1
(
0x36
),
p1
(
0xa5
),
p1
(
0x38
)
;\
.
long
p1
(
0xbf
),
p1
(
0x40
),
p1
(
0xa3
),
p1
(
0x9e
),
p1
(
0x81
),
p1
(
0xf3
),
p1
(
0xd7
),
p1
(
0xfb
)
;\
.
long
p1
(
0x7c
),
p1
(
0xe3
),
p1
(
0x39
),
p1
(
0x82
),
p1
(
0x9b
),
p1
(
0x2f
),
p1
(
0xff
),
p1
(
0x87
)
;\
.
long
p1
(
0x34
),
p1
(
0x8e
),
p1
(
0x43
),
p1
(
0x44
),
p1
(
0xc4
),
p1
(
0xde
),
p1
(
0xe9
),
p1
(
0xcb
)
#define ib_data1(p1) \
.
long
p1
(
0x54
),
p1
(
0x7b
),
p1
(
0x94
),
p1
(
0x32
),
p1
(
0xa6
),
p1
(
0xc2
),
p1
(
0x23
),
p1
(
0x3d
)
;\
.
long
p1
(
0xee
),
p1
(
0x4c
),
p1
(
0x95
),
p1
(
0x0b
),
p1
(
0x42
),
p1
(
0xfa
),
p1
(
0xc3
),
p1
(
0x4e
)
;\
.
long
p1
(
0x08
),
p1
(
0x2e
),
p1
(
0xa1
),
p1
(
0x66
),
p1
(
0x28
),
p1
(
0xd9
),
p1
(
0x24
),
p1
(
0xb2
)
;\
.
long
p1
(
0x76
),
p1
(
0x5b
),
p1
(
0xa2
),
p1
(
0x49
),
p1
(
0x6d
),
p1
(
0x8b
),
p1
(
0xd1
),
p1
(
0x25
)
#define ib_data2(p1) \
.
long
p1
(
0x72
),
p1
(
0xf8
),
p1
(
0xf6
),
p1
(
0x64
),
p1
(
0x86
),
p1
(
0x68
),
p1
(
0x98
),
p1
(
0x16
)
;\
.
long
p1
(
0xd4
),
p1
(
0xa4
),
p1
(
0x5c
),
p1
(
0xcc
),
p1
(
0x5d
),
p1
(
0x65
),
p1
(
0xb6
),
p1
(
0x92
)
;\
.
long
p1
(
0x6c
),
p1
(
0x70
),
p1
(
0x48
),
p1
(
0x50
),
p1
(
0xfd
),
p1
(
0xed
),
p1
(
0xb9
),
p1
(
0xda
)
;\
.
long
p1
(
0x5e
),
p1
(
0x15
),
p1
(
0x46
),
p1
(
0x57
),
p1
(
0xa7
),
p1
(
0x8d
),
p1
(
0x9d
),
p1
(
0x84
)
#define ib_data3(p1) \
.
long
p1
(
0x90
),
p1
(
0xd8
),
p1
(
0xab
),
p1
(
0x00
),
p1
(
0x8c
),
p1
(
0xbc
),
p1
(
0xd3
),
p1
(
0x0a
)
;\
.
long
p1
(
0xf7
),
p1
(
0xe4
),
p1
(
0x58
),
p1
(
0x05
),
p1
(
0xb8
),
p1
(
0xb3
),
p1
(
0x45
),
p1
(
0x06
)
;\
.
long
p1
(
0xd0
),
p1
(
0x2c
),
p1
(
0x1e
),
p1
(
0x8f
),
p1
(
0xca
),
p1
(
0x3f
),
p1
(
0x0f
),
p1
(
0x02
)
;\
.
long
p1
(
0xc1
),
p1
(
0xaf
),
p1
(
0xbd
),
p1
(
0x03
),
p1
(
0x01
),
p1
(
0x13
),
p1
(
0x8a
),
p1
(
0x6b
)
#define ib_data4(p1) \
.
long
p1
(
0x3a
),
p1
(
0x91
),
p1
(
0x11
),
p1
(
0x41
),
p1
(
0x4f
),
p1
(
0x67
),
p1
(
0xdc
),
p1
(
0xea
)
;\
.
long
p1
(
0x97
),
p1
(
0xf2
),
p1
(
0xcf
),
p1
(
0xce
),
p1
(
0xf0
),
p1
(
0xb4
),
p1
(
0xe6
),
p1
(
0x73
)
;\
.
long
p1
(
0x96
),
p1
(
0xac
),
p1
(
0x74
),
p1
(
0x22
),
p1
(
0xe7
),
p1
(
0xad
),
p1
(
0x35
),
p1
(
0x85
)
;\
.
long
p1
(
0xe2
),
p1
(
0xf9
),
p1
(
0x37
),
p1
(
0xe8
),
p1
(
0x1c
),
p1
(
0x75
),
p1
(
0xdf
),
p1
(
0x6e
)
#define ib_data5(p1) \
.
long
p1
(
0x47
),
p1
(
0xf1
),
p1
(
0x1a
),
p1
(
0x71
),
p1
(
0x1d
),
p1
(
0x29
),
p1
(
0xc5
),
p1
(
0x89
)
;\
.
long
p1
(
0x6f
),
p1
(
0xb7
),
p1
(
0x62
),
p1
(
0x0e
),
p1
(
0xaa
),
p1
(
0x18
),
p1
(
0xbe
),
p1
(
0x1b
)
;\
.
long
p1
(
0xfc
),
p1
(
0x56
),
p1
(
0x3e
),
p1
(
0x4b
),
p1
(
0xc6
),
p1
(
0xd2
),
p1
(
0x79
),
p1
(
0x20
)
;\
.
long
p1
(
0x9a
),
p1
(
0xdb
),
p1
(
0xc0
),
p1
(
0xfe
),
p1
(
0x78
),
p1
(
0xcd
),
p1
(
0x5a
),
p1
(
0xf4
)
#define ib_data6(p1) \
.
long
p1
(
0x1f
),
p1
(
0xdd
),
p1
(
0xa8
),
p1
(
0x33
),
p1
(
0x88
),
p1
(
0x07
),
p1
(
0xc7
),
p1
(
0x31
)
;\
.
long
p1
(
0xb1
),
p1
(
0x12
),
p1
(
0x10
),
p1
(
0x59
),
p1
(
0x27
),
p1
(
0x80
),
p1
(
0xec
),
p1
(
0x5f
)
;\
.
long
p1
(
0x60
),
p1
(
0x51
),
p1
(
0x7f
),
p1
(
0xa9
),
p1
(
0x19
),
p1
(
0xb5
),
p1
(
0x4a
),
p1
(
0x0d
)
;\
.
long
p1
(
0x2d
),
p1
(
0xe5
),
p1
(
0x7a
),
p1
(
0x9f
),
p1
(
0x93
),
p1
(
0xc9
),
p1
(
0x9c
),
p1
(
0xef
)
#define ib_data7(p1) \
.
long
p1
(
0xa0
),
p1
(
0xe0
),
p1
(
0x3b
),
p1
(
0x4d
),
p1
(
0xae
),
p1
(
0x2a
),
p1
(
0xf5
),
p1
(
0xb0
)
;\
.
long
p1
(
0xc8
),
p1
(
0xeb
),
p1
(
0xbb
),
p1
(
0x3c
),
p1
(
0x83
),
p1
(
0x53
),
p1
(
0x99
),
p1
(
0x61
)
;\
.
long
p1
(
0x17
),
p1
(
0x2b
),
p1
(
0x04
),
p1
(
0x7e
),
p1
(
0xba
),
p1
(
0x77
),
p1
(
0xd6
),
p1
(
0x26
)
;\
.
long
p1
(
0xe1
),
p1
(
0x69
),
p1
(
0x14
),
p1
(
0x63
),
p1
(
0x55
),
p1
(
0x21
),
p1
(
0x0c
),
p1
(
0x7d
)
//
The
rcon_table
(
needed
for
the
key
schedule
)
//
//
Here
is
original
Dr
Brian
Gladman
's source code:
//
_rcon_tab
:
//
%
assign
x
1
//
%
rep
29
//
dd
x
//
%
assign
x
f2
(
x
)
//
%
endrep
//
//
Here
is
precomputed
output
(
it
's more portable this way):
.
align
ALIGN32BYTES
aes_rcon_tab
:
.
long
0x01
,
0x02
,
0x04
,
0x08
,
0x10
,
0x20
,
0x40
,
0x80
.
long
0x1b
,
0x36
,
0x6c
,
0xd8
,
0xab
,
0x4d
,
0x9a
,
0x2f
.
long
0x5e
,
0xbc
,
0x63
,
0xc6
,
0x97
,
0x35
,
0x6a
,
0xd4
.
long
0xb3
,
0x7d
,
0xfa
,
0xef
,
0xc5
//
The
forward
xor
tables
.
align
ALIGN32BYTES
aes_ft_tab
:
sb_data0
(
u0
)
sb_data1
(
u0
)
sb_data2
(
u0
)
sb_data3
(
u0
)
sb_data4
(
u0
)
sb_data5
(
u0
)
sb_data6
(
u0
)
sb_data7
(
u0
)
sb_data0
(
u1
)
sb_data1
(
u1
)
sb_data2
(
u1
)
sb_data3
(
u1
)
sb_data4
(
u1
)
sb_data5
(
u1
)
sb_data6
(
u1
)
sb_data7
(
u1
)
sb_data0
(
u2
)
sb_data1
(
u2
)
sb_data2
(
u2
)
sb_data3
(
u2
)
sb_data4
(
u2
)
sb_data5
(
u2
)
sb_data6
(
u2
)
sb_data7
(
u2
)
sb_data0
(
u3
)
sb_data1
(
u3
)
sb_data2
(
u3
)
sb_data3
(
u3
)
sb_data4
(
u3
)
sb_data5
(
u3
)
sb_data6
(
u3
)
sb_data7
(
u3
)
.
align
ALIGN32BYTES
aes_fl_tab
:
sb_data0
(
w0
)
sb_data1
(
w0
)
sb_data2
(
w0
)
sb_data3
(
w0
)
sb_data4
(
w0
)
sb_data5
(
w0
)
sb_data6
(
w0
)
sb_data7
(
w0
)
sb_data0
(
w1
)
sb_data1
(
w1
)
sb_data2
(
w1
)
sb_data3
(
w1
)
sb_data4
(
w1
)
sb_data5
(
w1
)
sb_data6
(
w1
)
sb_data7
(
w1
)
sb_data0
(
w2
)
sb_data1
(
w2
)
sb_data2
(
w2
)
sb_data3
(
w2
)
sb_data4
(
w2
)
sb_data5
(
w2
)
sb_data6
(
w2
)
sb_data7
(
w2
)
sb_data0
(
w3
)
sb_data1
(
w3
)
sb_data2
(
w3
)
sb_data3
(
w3
)
sb_data4
(
w3
)
sb_data5
(
w3
)
sb_data6
(
w3
)
sb_data7
(
w3
)
//
The
inverse
xor
tables
.
align
ALIGN32BYTES
aes_it_tab
:
ib_data0
(
v0
)
ib_data1
(
v0
)
ib_data2
(
v0
)
ib_data3
(
v0
)
ib_data4
(
v0
)
ib_data5
(
v0
)
ib_data6
(
v0
)
ib_data7
(
v0
)
ib_data0
(
v1
)
ib_data1
(
v1
)
ib_data2
(
v1
)
ib_data3
(
v1
)
ib_data4
(
v1
)
ib_data5
(
v1
)
ib_data6
(
v1
)
ib_data7
(
v1
)
ib_data0
(
v2
)
ib_data1
(
v2
)
ib_data2
(
v2
)
ib_data3
(
v2
)
ib_data4
(
v2
)
ib_data5
(
v2
)
ib_data6
(
v2
)
ib_data7
(
v2
)
ib_data0
(
v3
)
ib_data1
(
v3
)
ib_data2
(
v3
)
ib_data3
(
v3
)
ib_data4
(
v3
)
ib_data5
(
v3
)
ib_data6
(
v3
)
ib_data7
(
v3
)
.
align
ALIGN32BYTES
aes_il_tab
:
ib_data0
(
w0
)
ib_data1
(
w0
)
ib_data2
(
w0
)
ib_data3
(
w0
)
ib_data4
(
w0
)
ib_data5
(
w0
)
ib_data6
(
w0
)
ib_data7
(
w0
)
ib_data0
(
w1
)
ib_data1
(
w1
)
ib_data2
(
w1
)
ib_data3
(
w1
)
ib_data4
(
w1
)
ib_data5
(
w1
)
ib_data6
(
w1
)
ib_data7
(
w1
)
ib_data0
(
w2
)
ib_data1
(
w2
)
ib_data2
(
w2
)
ib_data3
(
w2
)
ib_data4
(
w2
)
ib_data5
(
w2
)
ib_data6
(
w2
)
ib_data7
(
w2
)
ib_data0
(
w3
)
ib_data1
(
w3
)
ib_data2
(
w3
)
ib_data3
(
w3
)
ib_data4
(
w3
)
ib_data5
(
w3
)
ib_data6
(
w3
)
ib_data7
(
w3
)
//
The
inverse
mix
column
tables
.
align
ALIGN32BYTES
aes_im_tab
:
im_data0
(
v0
)
im_data1
(
v0
)
im_data2
(
v0
)
im_data3
(
v0
)
im_data4
(
v0
)
im_data5
(
v0
)
im_data6
(
v0
)
im_data7
(
v0
)
im_data0
(
v1
)
im_data1
(
v1
)
im_data2
(
v1
)
im_data3
(
v1
)
im_data4
(
v1
)
im_data5
(
v1
)
im_data6
(
v1
)
im_data7
(
v1
)
im_data0
(
v2
)
im_data1
(
v2
)
im_data2
(
v2
)
im_data3
(
v2
)
im_data4
(
v2
)
im_data5
(
v2
)
im_data6
(
v2
)
im_data7
(
v2
)
im_data0
(
v3
)
im_data1
(
v3
)
im_data2
(
v3
)
im_data3
(
v3
)
im_data4
(
v3
)
im_data5
(
v3
)
im_data6
(
v3
)
im_data7
(
v3
)
arch/i386/crypto/aes-i586-glue.c
deleted
100644 → 0
View file @
a685d7b5
/*
*
* Glue Code for optimized 586 assembler version of AES
*
* Copyright (c) 2001, Dr Brian Gladman <brg@gladman.uk.net>, Worcester, UK.
* Copyright (c) 2003, Adam J. Richter <adam@yggdrasil.com> (conversion to
* 2.5 API).
* Copyright (c) 2003, 2004 Fruhwirth Clemens <clemens@endorphin.org>
*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/crypto.h>
#include <linux/linkage.h>
#define AES_MIN_KEY_SIZE 16
#define AES_MAX_KEY_SIZE 32
#define AES_BLOCK_SIZE 16
#define AES_KS_LENGTH 4 * AES_BLOCK_SIZE
#define AES_RC_LENGTH (9 * AES_BLOCK_SIZE) / 8 - 8
typedef
struct
{
u_int32_t
aes_Nkey
;
// the number of words in the key input block
u_int32_t
aes_Nrnd
;
// the number of cipher rounds
u_int32_t
aes_e_key
[
AES_KS_LENGTH
];
// the encryption key schedule
u_int32_t
aes_d_key
[
AES_KS_LENGTH
];
// the decryption key schedule
u_int32_t
aes_Ncol
;
// the number of columns in the cipher state
}
aes_context
;
/*
* The Cipher Interface
*/
asmlinkage
void
aes_set_key
(
void
*
,
const
unsigned
char
[],
const
int
,
const
int
);
/* Actually:
* extern void aes_encrypt(const aes_context *, unsigned char [], const unsigned char []);
* extern void aes_decrypt(const aes_context *, unsigned char [], const unsigned char []);
*/
asmlinkage
void
aes_encrypt
(
void
*
,
unsigned
char
[],
const
unsigned
char
[]);
asmlinkage
void
aes_decrypt
(
void
*
,
unsigned
char
[],
const
unsigned
char
[]);
static
int
aes_set_key_glue
(
void
*
cx
,
const
u8
*
key
,
unsigned
int
key_length
,
u32
*
flags
)
{
if
(
key_length
!=
16
&&
key_length
!=
24
&&
key_length
!=
32
)
{
*
flags
|=
CRYPTO_TFM_RES_BAD_KEY_LEN
;
return
-
EINVAL
;
}
aes_set_key
(
cx
,
key
,
key_length
,
0
);
return
0
;
}
#ifdef CONFIG_REGPARM
static
void
aes_encrypt_glue
(
void
*
a
,
unsigned
char
b
[],
const
unsigned
char
c
[])
{
aes_encrypt
(
a
,
b
,
c
);
}
static
void
aes_decrypt_glue
(
void
*
a
,
unsigned
char
b
[],
const
unsigned
char
c
[])
{
aes_decrypt
(
a
,
b
,
c
);
}
#else
#define aes_encrypt_glue aes_encrypt
#define aes_decrypt_glue aes_decrypt
#endif
/* CONFIG_REGPARM */
static
struct
crypto_alg
aes_alg
=
{
.
cra_name
=
"aes"
,
.
cra_flags
=
CRYPTO_ALG_TYPE_CIPHER
,
.
cra_blocksize
=
AES_BLOCK_SIZE
,
.
cra_ctxsize
=
sizeof
(
aes_context
),
.
cra_module
=
THIS_MODULE
,
.
cra_list
=
LIST_HEAD_INIT
(
aes_alg
.
cra_list
),
.
cra_u
=
{
.
cipher
=
{
.
cia_min_keysize
=
AES_MIN_KEY_SIZE
,
.
cia_max_keysize
=
AES_MAX_KEY_SIZE
,
.
cia_setkey
=
aes_set_key_glue
,
.
cia_encrypt
=
aes_encrypt_glue
,
.
cia_decrypt
=
aes_decrypt_glue
}
}
};
static
int
__init
aes_init
(
void
)
{
return
crypto_register_alg
(
&
aes_alg
);
}
static
void
__exit
aes_fini
(
void
)
{
crypto_unregister_alg
(
&
aes_alg
);
}
module_init
(
aes_init
);
module_exit
(
aes_fini
);
MODULE_DESCRIPTION
(
"Rijndael (AES) Cipher Algorithm, i586 asm optimized"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Fruhwirth Clemens"
);
MODULE_ALIAS
(
"aes"
);
crypto/Kconfig
View file @
8c00b90f
...
...
@@ -118,9 +118,9 @@ config CRYPTO_SERPENT
See also:
http://www.cl.cam.ac.uk/~rja14/serpent.html
config CRYPTO_AES
_GENERIC
config CRYPTO_AES
tristate "AES cipher algorithms"
depends on CRYPTO
&& !(X86 && !X86_64)
depends on CRYPTO
help
AES cipher algorithms (FIPS-197). AES uses the Rijndael
algorithm.
...
...
@@ -138,26 +138,6 @@ config CRYPTO_AES_GENERIC
See http://csrc.nist.gov/CryptoToolkit/aes/ for more information.
config CRYPTO_AES_586
tristate "AES cipher algorithms (i586)"
depends on CRYPTO && (X86 && !X86_64)
help
AES cipher algorithms (FIPS-197). AES uses the Rijndael
algorithm.
Rijndael appears to be consistently a very good performer in
both hardware and software across a wide range of computing
environments regardless of its use in feedback or non-feedback
modes. Its key setup time is excellent, and its key agility is
good. Rijndael's very low memory requirements make it very well
suited for restricted-space environments, in which it also
demonstrates excellent performance. Rijndael's operations are
among the easiest to defend against power and timing attacks.
The AES specifies three key sizes: 128, 192 and 256 bits
See http://csrc.nist.gov/encryption/aes/ for more information.
config CRYPTO_CAST5
tristate "CAST5 (CAST-128) cipher algorithm"
depends on CRYPTO
...
...
drivers/md/multipath.c
View file @
8c00b90f
...
...
@@ -120,7 +120,7 @@ int multipath_end_request(struct bio *bio, unsigned int bytes_done, int error)
if
(
uptodate
)
multipath_end_bh_io
(
mp_bh
,
uptodate
);
else
{
else
if
((
bio
->
bi_rw
&
(
1
<<
BIO_RW_AHEAD
))
==
0
)
{
/*
* oops, IO error:
*/
...
...
@@ -130,7 +130,8 @@ int multipath_end_request(struct bio *bio, unsigned int bytes_done, int error)
bdevname
(
rdev
->
bdev
,
b
),
(
unsigned
long
long
)
bio
->
bi_sector
);
multipath_reschedule_retry
(
mp_bh
);
}
}
else
multipath_end_bh_io
(
mp_bh
,
0
);
rdev_dec_pending
(
rdev
,
conf
->
mddev
);
return
0
;
}
...
...
@@ -382,7 +383,11 @@ static void multipathd (mddev_t *mddev)
" to another IO path
\n
"
,
bdevname
(
bio
->
bi_bdev
,
b
),
(
unsigned
long
long
)
bio
->
bi_sector
);
*
bio
=
*
(
mp_bh
->
master_bio
);
bio
->
bi_bdev
=
conf
->
multipaths
[
mp_bh
->
path
].
rdev
->
bdev
;
bio
->
bi_rw
|=
(
1
<<
BIO_RW_FAILFAST
);
bio
->
bi_end_io
=
multipath_end_request
;
bio
->
bi_private
=
mp_bh
;
generic_make_request
(
bio
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment