Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
btwise
openssl
提交
a69c0a1b
O
openssl
项目概览
btwise
/
openssl
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a69c0a1b
编写于
10月 08, 2013
作者:
A
Andy Polyakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
evp/e_aes_cbc_hmac_sha*.c: harmonize names, fix bugs.
上级
b1de640f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
103 addition
and
75 deletion
+103
-75
crypto/evp/e_aes_cbc_hmac_sha1.c
crypto/evp/e_aes_cbc_hmac_sha1.c
+52
-38
crypto/evp/e_aes_cbc_hmac_sha256.c
crypto/evp/e_aes_cbc_hmac_sha256.c
+51
-37
未找到文件。
crypto/evp/e_aes_cbc_hmac_sha1.c
浏览文件 @
a69c0a1b
...
...
@@ -71,8 +71,8 @@
#define EVP_CIPH_FLAG_DEFAULT_ASN1 0
#endif
#if !defined(EVP_CIPH_FLAG_TLS1
1_MULTI_
BLOCK)
#define EVP_CIPH_FLAG_TLS1
1_MULTI_
BLOCK 0
#if !defined(EVP_CIPH_FLAG_TLS1
_1_MULTI
BLOCK)
#define EVP_CIPH_FLAG_TLS1
_1_MULTI
BLOCK 0
#endif
#define TLS1_1_VERSION 0x0302
...
...
@@ -95,7 +95,7 @@ typedef struct
defined(_M_AMD64) || defined(_M_X64) || \
defined(__INTEL__) )
extern
unsigned
int
OPENSSL_ia32cap_P
[
2
];
extern
unsigned
int
OPENSSL_ia32cap_P
[
3
];
#define AESNI_CAPABLE (1<<(57-32))
int
aesni_set_encrypt_key
(
const
unsigned
char
*
userKey
,
int
bits
,
...
...
@@ -177,7 +177,7 @@ static void sha1_update(SHA_CTX *c,const void *data,size_t len)
#endif
#define SHA1_Update sha1_update
#if
EVP_CIPH_FLAG_TLS11_MULTI_
BLOCK
#if
!defined(OPENSSL_NO_MULTIBLOCK) && EVP_CIPH_FLAG_TLS1_1_MULTI
BLOCK
typedef
struct
{
unsigned
int
A
[
8
],
B
[
8
],
C
[
8
],
D
[
8
],
E
[
8
];
}
SHA1_MB_CTX
;
typedef
struct
{
const
unsigned
char
*
ptr
;
int
blocks
;
}
HASH_DESC
;
...
...
@@ -185,11 +185,11 @@ typedef struct { const unsigned char *ptr; int blocks; } HASH_DESC;
void
sha1_multi_block
(
SHA1_MB_CTX
*
,
const
HASH_DESC
*
,
int
);
typedef
struct
{
const
unsigned
char
*
inp
;
unsigned
char
*
out
;
int
blocks
;
double
iv
[
2
];
}
CIPH_DESC
;
int
blocks
;
u64
iv
[
2
];
}
CIPH_DESC
;
void
aesni_multi_cbc_encrypt
(
CIPH_DESC
*
,
void
*
,
int
);
static
size_t
tls11_multi_block_encrypt
(
EVP_AES_HMAC_SHA1
*
key
,
static
size_t
tls1
_
1_multi_block_encrypt
(
EVP_AES_HMAC_SHA1
*
key
,
unsigned
char
*
out
,
const
unsigned
char
*
inp
,
size_t
inp_len
,
int
n4x
)
/* n4x is 1 or 2 */
{
...
...
@@ -202,6 +202,7 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA1 *key,
SHA1_MB_CTX
*
ctx
;
unsigned
int
frag
,
last
,
packlen
,
i
,
x4
=
4
*
n4x
;
size_t
ret
=
0
;
u8
*
IVs
;
ctx
=
(
SHA1_MB_CTX
*
)(
storage
+
32
-
((
size_t
)
storage
%
32
));
/* align */
...
...
@@ -228,21 +229,21 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA1 *key,
#if defined(BSWAP8)
blocks
[
i
].
q
[
0
]
=
BSWAP8
(
BSWAP8
(
*
(
u64
*
)
key
->
md
.
data
)
+
i
);
#else
blocks
[
i
].
c
[
7
]
+=
key
->
md
.
data
[
7
]
+
i
;
blocks
[
i
].
c
[
7
]
+=
((
u8
*
)
key
->
md
.
data
)
[
7
]
+
i
;
if
(
blocks
[
i
].
c
[
7
]
<
i
)
{
int
j
;
for
(
j
=
6
;
j
>=
0
;
j
--
)
{
if
(
blocks
[
i
].
c
[
j
]
=
key
->
md
.
data
[
j
]
+
1
)
break
;
if
(
blocks
[
i
].
c
[
j
]
=
((
u8
*
)
key
->
md
.
data
)
[
j
]
+
1
)
break
;
}
}
#endif
blocks
[
i
].
c
[
8
]
=
key
->
md
.
data
[
8
];
blocks
[
i
].
c
[
9
]
=
key
->
md
.
data
[
9
];
blocks
[
i
].
c
[
10
]
=
key
->
md
.
data
[
10
];
blocks
[
i
].
c
[
8
]
=
((
u8
*
)
key
->
md
.
data
)
[
8
];
blocks
[
i
].
c
[
9
]
=
((
u8
*
)
key
->
md
.
data
)
[
9
];
blocks
[
i
].
c
[
10
]
=
((
u8
*
)
key
->
md
.
data
)
[
10
];
/* fix length */
blocks
[
i
].
c
[
11
]
=
(
u
nsigned
char
)(
len
>>
8
);
blocks
[
i
].
c
[
12
]
=
(
u
nsigned
char
)(
len
);
blocks
[
i
].
c
[
11
]
=
(
u
8
)(
len
>>
8
);
blocks
[
i
].
c
[
12
]
=
(
u
8
)(
len
);
memcpy
(
blocks
[
i
].
c
+
13
,
hash_d
[
i
].
ptr
,
64
-
13
);
hash_d
[
i
].
ptr
+=
64
-
13
;
...
...
@@ -252,7 +253,9 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA1 *key,
edges
[
i
].
blocks
=
1
;
}
/* hash 13-byte headers and first 64-13 bytes of inputs */
sha1_multi_block
(
ctx
,
edges
,
n4x
);
/* hash bulk inputs */
sha1_multi_block
(
ctx
,
hash_d
,
n4x
);
memset
(
blocks
,
0
,
sizeof
(
blocks
));
...
...
@@ -276,6 +279,7 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA1 *key,
edges
[
i
].
ptr
=
blocks
[
i
].
c
;
}
/* hash input tails and finalize */
sha1_multi_block
(
ctx
,
edges
,
n4x
);
memset
(
blocks
,
0
,
sizeof
(
blocks
));
...
...
@@ -291,6 +295,7 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA1 *key,
edges
[
i
].
blocks
=
1
;
}
/* finalize MACs */
sha1_multi_block
(
ctx
,
edges
,
n4x
);
packlen
=
5
+
16
+
((
frag
+
20
+
16
)
&-
16
);
...
...
@@ -298,6 +303,8 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA1 *key,
out
+=
(
packlen
<<
(
1
+
n4x
))
-
packlen
;
inp
+=
(
frag
<<
(
1
+
n4x
))
-
frag
;
RAND_bytes
((
IVs
=
blocks
[
0
].
c
),
16
*
x4
);
/* ask for IVs in bulk */
for
(
i
=
x4
-
1
;;
i
--
)
{
unsigned
int
len
=
(
i
==
(
x4
-
1
)
?
last
:
frag
),
pad
,
j
;
unsigned
char
*
out0
=
out
;
...
...
@@ -308,42 +315,49 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA1 *key,
memmove
(
out
,
inp
,
len
);
out
+=
len
;
inp
-=
frag
;
/* write MAC */
((
u32
*
)
out
)[
0
]
=
BSWAP4
(
ctx
->
A
[
i
]);
((
u32
*
)
out
)[
1
]
=
BSWAP4
(
ctx
->
B
[
i
]);
((
u32
*
)
out
)[
2
]
=
BSWAP4
(
ctx
->
C
[
i
]);
((
u32
*
)
out
)[
3
]
=
BSWAP4
(
ctx
->
D
[
i
]);
((
u32
*
)
out
)[
4
]
=
BSWAP4
(
ctx
->
E
[
i
]);
out
+=
20
;
len
+=
20
+
16
;
len
+=
20
;
/* pad */
pad
=
15
-
len
%
16
;
for
(
j
=
0
;
j
<=
pad
;
j
++
)
*
(
out
++
)
=
pad
;
len
+=
pad
+
1
;
ciph_d
[
i
].
blocks
=
len
/
16
;
len
+=
16
;
/* account for explicit iv */
/* arrange header */
out0
[
0
]
=
key
->
md
.
data
[
8
];
out0
[
1
]
=
key
->
md
.
data
[
9
];
out0
[
2
]
=
key
->
md
.
data
[
10
];
out0
[
3
]
=
(
u
nsigned
char
)(
len
>>
8
);
out0
[
4
]
=
(
u
nsigned
char
)(
len
);
out0
[
0
]
=
((
u8
*
)
key
->
md
.
data
)
[
8
];
out0
[
1
]
=
((
u8
*
)
key
->
md
.
data
)
[
9
];
out0
[
2
]
=
((
u8
*
)
key
->
md
.
data
)
[
10
];
out0
[
3
]
=
(
u
8
)(
len
>>
8
);
out0
[
4
]
=
(
u
8
)(
len
);
/* explicit iv */
RAND_bytes
((
u8
*
)
ciph_d
[
i
].
iv
,
16
);
memcpy
(
&
out
[
5
],
ciph_d
[
i
].
iv
,
16
);
memcpy
(
ciph_d
[
i
].
iv
,
IVs
,
16
);
memcpy
(
&
out
0
[
5
],
IVs
,
16
);
ret
+=
len
+
5
;
if
(
i
==
0
)
break
;
out
=
out0
-
packlen
;
inp
-=
frag
;
IVs
+=
16
;
}
aesni_multi_cbc_encrypt
(
ciph_d
,
&
key
->
ks
,
n4x
);
OPENSSL_cleanse
(
blocks
,
sizeof
(
blocks
));
OPENSSL_cleanse
(
ctx
,
sizeof
(
*
ctx
));
return
ret
;
}
#endif
...
...
@@ -686,15 +700,15 @@ static int aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void
return
SHA_DIGEST_LENGTH
;
}
}
#if
EVP_EVP_CIPH_FLAG_TLS11_MULTI_
BLOCK
case
EVP_CTRL_TLS1
1_MULTI_
BLOCK_AAD
:
#if
!defined(OPENSSL_NO_MULTIBLOCK) && EVP_CIPH_FLAG_TLS1_1_MULTI
BLOCK
case
EVP_CTRL_TLS1
_1_MULTI
BLOCK_AAD
:
{
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
*
param
=
(
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
*
)
ptr
;
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
*
param
=
(
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
*
)
ptr
;
unsigned
int
n4x
=
1
,
x4
;
unsigned
int
frag
,
last
,
packlen
,
inp_len
;
if
(
arg
<
sizeof
(
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
))
return
-
1
;
if
(
arg
<
sizeof
(
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
))
return
-
1
;
inp_len
=
param
->
inp
[
11
]
<<
8
|
param
->
inp
[
12
];
...
...
@@ -702,10 +716,10 @@ static int aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void
{
if
((
param
->
inp
[
9
]
<<
8
|
param
->
inp
[
10
])
<
TLS1_1_VERSION
)
return
-
1
;
if
(
inp_len
<
2048
)
return
-
1
;
/* too short */
if
(
inp_len
>=
6144
)
n4x
=
2
;
if
(
inp_len
<
4096
)
return
0
;
/* too short */
if
(
OPENSSL_ia32cap_P
[
2
]
&
(
1
<<
5
))
n4x
=
2
;
/* AVX2 */
key
->
md
=
key
->
head
;
SHA1_Update
(
&
key
->
md
,
param
->
inp
,
13
);
...
...
@@ -720,7 +734,7 @@ static int aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void
}
packlen
=
5
+
16
+
((
frag
+
20
+
16
)
&-
16
);
packlen
=
(
packlen
<<
(
1
+
n4x
)
)
-
packlen
;
packlen
=
(
packlen
<<
n4x
)
-
packlen
;
packlen
+=
5
+
16
+
((
last
+
20
+
16
)
&-
16
);
param
->
interleave
=
x4
;
...
...
@@ -730,15 +744,15 @@ static int aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void
else
return
-
1
;
/* not yet */
}
case
EVP_CTRL_TLS1
1_MULTI_
BLOCK_ENCRYPT
:
case
EVP_CTRL_TLS1
_1_MULTI
BLOCK_ENCRYPT
:
{
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
*
param
=
(
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
*
)
ptr
;
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
*
param
=
(
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
*
)
ptr
;
return
tls1
1_multi_block_encrypt
(
key
,
param
->
out
,
param
->
inp
,
return
(
int
)
tls1_
1_multi_block_encrypt
(
key
,
param
->
out
,
param
->
inp
,
param
->
len
,
param
->
interleave
/
4
);
}
case
EVP_CTRL_TLS1
1_MULTI_
BLOCK_DECRYPT
:
case
EVP_CTRL_TLS1
_1_MULTI
BLOCK_DECRYPT
:
#endif
default:
return
-
1
;
...
...
@@ -754,7 +768,7 @@ static EVP_CIPHER aesni_128_cbc_hmac_sha1_cipher =
#endif
16
,
16
,
16
,
EVP_CIPH_CBC_MODE
|
EVP_CIPH_FLAG_DEFAULT_ASN1
|
EVP_CIPH_FLAG_AEAD_CIPHER
|
EVP_CIPH_FLAG_TLS1
1_MULTI_
BLOCK
,
EVP_CIPH_FLAG_AEAD_CIPHER
|
EVP_CIPH_FLAG_TLS1
_1_MULTI
BLOCK
,
aesni_cbc_hmac_sha1_init_key
,
aesni_cbc_hmac_sha1_cipher
,
NULL
,
...
...
@@ -774,7 +788,7 @@ static EVP_CIPHER aesni_256_cbc_hmac_sha1_cipher =
#endif
16
,
32
,
16
,
EVP_CIPH_CBC_MODE
|
EVP_CIPH_FLAG_DEFAULT_ASN1
|
EVP_CIPH_FLAG_AEAD_CIPHER
|
EVP_CIPH_FLAG_TLS1
1_MULTI_
BLOCK
,
EVP_CIPH_FLAG_AEAD_CIPHER
|
EVP_CIPH_FLAG_TLS1
_1_MULTI
BLOCK
,
aesni_cbc_hmac_sha1_init_key
,
aesni_cbc_hmac_sha1_cipher
,
NULL
,
...
...
crypto/evp/e_aes_cbc_hmac_sha256.c
浏览文件 @
a69c0a1b
...
...
@@ -71,8 +71,8 @@
#define EVP_CIPH_FLAG_DEFAULT_ASN1 0
#endif
#if !defined(EVP_CIPH_FLAG_TLS1
1_MULTI_
BLOCK)
#define EVP_CIPH_FLAG_TLS1
1_MULTI_
BLOCK 0
#if !defined(EVP_CIPH_FLAG_TLS1
_1_MULTI
BLOCK)
#define EVP_CIPH_FLAG_TLS1
_1_MULTI
BLOCK 0
#endif
#define TLS1_1_VERSION 0x0302
...
...
@@ -178,7 +178,7 @@ static void sha256_update(SHA256_CTX *c,const void *data,size_t len)
#endif
#define SHA256_Update sha256_update
#if
EVP_CIPH_FLAG_TLS11_MULTI_
BLOCK
#if
!defined(OPENSSL_NO_MULTIBLOCK) && EVP_CIPH_FLAG_TLS1_1_MULTI
BLOCK
typedef
struct
{
unsigned
int
A
[
8
],
B
[
8
],
C
[
8
],
D
[
8
],
E
[
8
],
F
[
8
],
G
[
8
],
H
[
8
];
}
SHA256_MB_CTX
;
typedef
struct
{
const
unsigned
char
*
ptr
;
int
blocks
;
}
HASH_DESC
;
...
...
@@ -186,11 +186,11 @@ typedef struct { const unsigned char *ptr; int blocks; } HASH_DESC;
void
sha256_multi_block
(
SHA256_MB_CTX
*
,
const
HASH_DESC
*
,
int
);
typedef
struct
{
const
unsigned
char
*
inp
;
unsigned
char
*
out
;
int
blocks
;
double
iv
[
2
];
}
CIPH_DESC
;
int
blocks
;
u64
iv
[
2
];
}
CIPH_DESC
;
void
aesni_multi_cbc_encrypt
(
CIPH_DESC
*
,
void
*
,
int
);
static
size_t
tls11_multi_block_encrypt
(
EVP_AES_HMAC_SHA256
*
key
,
static
size_t
tls1
_
1_multi_block_encrypt
(
EVP_AES_HMAC_SHA256
*
key
,
unsigned
char
*
out
,
const
unsigned
char
*
inp
,
size_t
inp_len
,
int
n4x
)
/* n4x is 1 or 2 */
{
...
...
@@ -203,6 +203,7 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA256 *key,
SHA256_MB_CTX
*
ctx
;
unsigned
int
frag
,
last
,
packlen
,
i
,
x4
=
4
*
n4x
;
size_t
ret
=
0
;
u8
*
IVs
;
ctx
=
(
SHA256_MB_CTX
*
)(
storage
+
32
-
((
size_t
)
storage
%
32
));
/* align */
...
...
@@ -232,21 +233,21 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA256 *key,
#if defined(BSWAP8)
blocks
[
i
].
q
[
0
]
=
BSWAP8
(
BSWAP8
(
*
(
u64
*
)
key
->
md
.
data
)
+
i
);
#else
blocks
[
i
].
c
[
7
]
+=
key
->
md
.
data
[
7
]
+
i
;
blocks
[
i
].
c
[
7
]
+=
((
u8
*
)
key
->
md
.
data
)
[
7
]
+
i
;
if
(
blocks
[
i
].
c
[
7
]
<
i
)
{
int
j
;
for
(
j
=
6
;
j
>=
0
;
j
--
)
{
if
(
blocks
[
i
].
c
[
j
]
=
key
->
md
.
data
[
j
]
+
1
)
break
;
if
(
blocks
[
i
].
c
[
j
]
=
((
u8
*
)
key
->
md
.
data
)
[
j
]
+
1
)
break
;
}
}
#endif
blocks
[
i
].
c
[
8
]
=
key
->
md
.
data
[
8
];
blocks
[
i
].
c
[
9
]
=
key
->
md
.
data
[
9
];
blocks
[
i
].
c
[
10
]
=
key
->
md
.
data
[
10
];
blocks
[
i
].
c
[
8
]
=
((
u8
*
)
key
->
md
.
data
)
[
8
];
blocks
[
i
].
c
[
9
]
=
((
u8
*
)
key
->
md
.
data
)
[
9
];
blocks
[
i
].
c
[
10
]
=
((
u8
*
)
key
->
md
.
data
)
[
10
];
/* fix length */
blocks
[
i
].
c
[
11
]
=
(
u
nsigned
char
)(
len
>>
8
);
blocks
[
i
].
c
[
12
]
=
(
u
nsigned
char
)(
len
);
blocks
[
i
].
c
[
11
]
=
(
u
8
)(
len
>>
8
);
blocks
[
i
].
c
[
12
]
=
(
u
8
)(
len
);
memcpy
(
blocks
[
i
].
c
+
13
,
hash_d
[
i
].
ptr
,
64
-
13
);
hash_d
[
i
].
ptr
+=
64
-
13
;
...
...
@@ -256,7 +257,9 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA256 *key,
edges
[
i
].
blocks
=
1
;
}
/* hash 13-byte headers and first 64-13 bytes of inputs */
sha256_multi_block
(
ctx
,
edges
,
n4x
);
/* hash bulk inputs */
sha256_multi_block
(
ctx
,
hash_d
,
n4x
);
memset
(
blocks
,
0
,
sizeof
(
blocks
));
...
...
@@ -280,6 +283,7 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA256 *key,
edges
[
i
].
ptr
=
blocks
[
i
].
c
;
}
/* hash input tails and finalize */
sha256_multi_block
(
ctx
,
edges
,
n4x
);
memset
(
blocks
,
0
,
sizeof
(
blocks
));
...
...
@@ -298,6 +302,7 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA256 *key,
edges
[
i
].
blocks
=
1
;
}
/* finalize MACs */
sha256_multi_block
(
ctx
,
edges
,
n4x
);
packlen
=
5
+
16
+
((
frag
+
32
+
16
)
&-
16
);
...
...
@@ -305,6 +310,8 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA256 *key,
out
+=
(
packlen
<<
(
1
+
n4x
))
-
packlen
;
inp
+=
(
frag
<<
(
1
+
n4x
))
-
frag
;
RAND_bytes
((
IVs
=
blocks
[
0
].
c
),
16
*
x4
);
/* ask for IVs in bulk */
for
(
i
=
x4
-
1
;;
i
--
)
{
unsigned
int
len
=
(
i
==
(
x4
-
1
)
?
last
:
frag
),
pad
,
j
;
unsigned
char
*
out0
=
out
;
...
...
@@ -315,8 +322,8 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA256 *key,
memmove
(
out
,
inp
,
len
);
out
+=
len
;
inp
-=
frag
;
/* write MAC */
((
u32
*
)
out
)[
0
]
=
BSWAP4
(
ctx
->
A
[
i
]);
((
u32
*
)
out
)[
1
]
=
BSWAP4
(
ctx
->
B
[
i
]);
((
u32
*
)
out
)[
2
]
=
BSWAP4
(
ctx
->
C
[
i
]);
...
...
@@ -326,34 +333,41 @@ static size_t tls11_multi_block_encrypt(EVP_AES_HMAC_SHA256 *key,
((
u32
*
)
out
)[
6
]
=
BSWAP4
(
ctx
->
G
[
i
]);
((
u32
*
)
out
)[
7
]
=
BSWAP4
(
ctx
->
H
[
i
]);
out
+=
32
;
len
+=
32
+
16
;
len
+=
32
;
/* pad */
pad
=
15
-
len
%
16
;
for
(
j
=
0
;
j
<=
pad
;
j
++
)
*
(
out
++
)
=
pad
;
len
+=
pad
+
1
;
ciph_d
[
i
].
blocks
=
len
/
16
;
len
+=
16
;
/* account for explicit iv */
/* arrange header */
out0
[
0
]
=
key
->
md
.
data
[
8
];
out0
[
1
]
=
key
->
md
.
data
[
9
];
out0
[
2
]
=
key
->
md
.
data
[
10
];
out0
[
3
]
=
(
u
nsigned
char
)(
len
>>
8
);
out0
[
4
]
=
(
u
nsigned
char
)(
len
);
out0
[
0
]
=
((
u8
*
)
key
->
md
.
data
)
[
8
];
out0
[
1
]
=
((
u8
*
)
key
->
md
.
data
)
[
9
];
out0
[
2
]
=
((
u8
*
)
key
->
md
.
data
)
[
10
];
out0
[
3
]
=
(
u
8
)(
len
>>
8
);
out0
[
4
]
=
(
u
8
)(
len
);
/* explicit iv */
RAND_bytes
((
u8
*
)
ciph_d
[
i
].
iv
,
16
);
memcpy
(
&
out
[
5
],
ciph_d
[
i
].
iv
,
16
);
memcpy
(
ciph_d
[
i
].
iv
,
IVs
,
16
);
memcpy
(
&
out
0
[
5
],
IVs
,
16
);
ret
+=
len
+
5
;
if
(
i
==
0
)
break
;
out
=
out0
-
packlen
;
inp
-=
frag
;
IVs
+=
16
;
}
aesni_multi_cbc_encrypt
(
ciph_d
,
&
key
->
ks
,
n4x
);
OPENSSL_cleanse
(
blocks
,
sizeof
(
blocks
));
OPENSSL_cleanse
(
ctx
,
sizeof
(
*
ctx
));
return
ret
;
}
#endif
...
...
@@ -713,15 +727,15 @@ static int aesni_cbc_hmac_sha256_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, vo
return
SHA256_DIGEST_LENGTH
;
}
}
#if
EVP_EVP_CIPH_FLAG_TLS11_MULTI_
BLOCK
case
EVP_CTRL_TLS1
1_MULTI_
BLOCK_AAD
:
#if
!defined(OPENSSL_NO_MULTIBLOCK) && EVP_CIPH_FLAG_TLS1_1_MULTI
BLOCK
case
EVP_CTRL_TLS1
_1_MULTI
BLOCK_AAD
:
{
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
*
param
=
(
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
*
)
ptr
;
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
*
param
=
(
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
*
)
ptr
;
unsigned
int
n4x
=
1
,
x4
;
unsigned
int
frag
,
last
,
packlen
,
inp_len
;
if
(
arg
<
sizeof
(
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
))
return
-
1
;
if
(
arg
<
sizeof
(
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
))
return
-
1
;
inp_len
=
param
->
inp
[
11
]
<<
8
|
param
->
inp
[
12
];
...
...
@@ -729,10 +743,10 @@ static int aesni_cbc_hmac_sha256_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, vo
{
if
((
param
->
inp
[
9
]
<<
8
|
param
->
inp
[
10
])
<
TLS1_1_VERSION
)
return
-
1
;
if
(
inp_len
<
2048
)
return
-
1
;
/* too short */
if
(
inp_len
>=
6144
)
n4x
=
2
;
if
(
inp_len
<
2048
)
return
0
;
/* too short */
if
(
OPENSSL_ia32cap_P
[
2
]
&
(
1
<<
5
))
n4x
=
2
;
/* AVX2 */
key
->
md
=
key
->
head
;
SHA256_Update
(
&
key
->
md
,
param
->
inp
,
13
);
...
...
@@ -747,7 +761,7 @@ static int aesni_cbc_hmac_sha256_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, vo
}
packlen
=
5
+
16
+
((
frag
+
32
+
16
)
&-
16
);
packlen
=
(
packlen
<<
(
1
+
n4x
)
)
-
packlen
;
packlen
=
(
packlen
<<
n4x
)
-
packlen
;
packlen
+=
5
+
16
+
((
last
+
32
+
16
)
&-
16
);
param
->
interleave
=
x4
;
...
...
@@ -757,15 +771,15 @@ static int aesni_cbc_hmac_sha256_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, vo
else
return
-
1
;
/* not yet */
}
case
EVP_CTRL_TLS1
1_MULTI_
BLOCK_ENCRYPT
:
case
EVP_CTRL_TLS1
_1_MULTI
BLOCK_ENCRYPT
:
{
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
*
param
=
(
EVP_CTRL_TLS1
1_MULTI_
BLOCK_PARAM
*
)
ptr
;
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
*
param
=
(
EVP_CTRL_TLS1
_1_MULTI
BLOCK_PARAM
*
)
ptr
;
return
tls1
1_multi_block_encrypt
(
key
,
param
->
out
,
param
->
inp
,
return
(
int
)
tls1_
1_multi_block_encrypt
(
key
,
param
->
out
,
param
->
inp
,
param
->
len
,
param
->
interleave
/
4
);
}
case
EVP_CTRL_TLS1
1_MULTI_
BLOCK_DECRYPT
:
case
EVP_CTRL_TLS1
_1_MULTI
BLOCK_DECRYPT
:
#endif
default:
return
-
1
;
...
...
@@ -781,7 +795,7 @@ static EVP_CIPHER aesni_128_cbc_hmac_sha256_cipher =
#endif
16
,
16
,
16
,
EVP_CIPH_CBC_MODE
|
EVP_CIPH_FLAG_DEFAULT_ASN1
|
EVP_CIPH_FLAG_AEAD_CIPHER
|
EVP_CIPH_FLAG_TLS1
1_MULTI_
BLOCK
,
EVP_CIPH_FLAG_AEAD_CIPHER
|
EVP_CIPH_FLAG_TLS1
_1_MULTI
BLOCK
,
aesni_cbc_hmac_sha256_init_key
,
aesni_cbc_hmac_sha256_cipher
,
NULL
,
...
...
@@ -801,7 +815,7 @@ static EVP_CIPHER aesni_256_cbc_hmac_sha256_cipher =
#endif
16
,
32
,
16
,
EVP_CIPH_CBC_MODE
|
EVP_CIPH_FLAG_DEFAULT_ASN1
|
EVP_CIPH_FLAG_AEAD_CIPHER
|
EVP_CIPH_FLAG_TLS1
1_MULTI_
BLOCK
,
EVP_CIPH_FLAG_AEAD_CIPHER
|
EVP_CIPH_FLAG_TLS1
_1_MULTI
BLOCK
,
aesni_cbc_hmac_sha256_init_key
,
aesni_cbc_hmac_sha256_cipher
,
NULL
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录