Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
杨瘦锅
openssl
提交
ab1ec698
O
openssl
项目概览
杨瘦锅
/
openssl
通知
2
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,发现更多精彩内容 >>
提交
ab1ec698
编写于
8月 11, 2011
作者:
D
Dr. Stephen Henson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
aesni TLS GCM support
上级
19ad3457
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
69 addition
and
1 deletion
+69
-1
crypto/evp/e_aes.c
crypto/evp/e_aes.c
+69
-1
未找到文件。
crypto/evp/e_aes.c
浏览文件 @
ab1ec698
...
...
@@ -305,12 +305,80 @@ static int aesni_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
return
1
;
}
/* Handle TLS GCM packet format. This consists of the last portion of the IV
* followed by the payload and finally the tag. On encrypt generate IV,
* encrypt payload and write the tag. On verify retrieve IV, decrypt payload
* and verify tag.
*/
static
int
aesni_gcm_tls_cipher
(
EVP_CIPHER_CTX
*
ctx
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
size_t
len
)
{
EVP_AES_GCM_CTX
*
gctx
=
ctx
->
cipher_data
;
int
rv
=
-
1
;
/* Encrypt/decrypt must be performed in place */
if
(
out
!=
in
)
return
-
1
;
/* Set IV from start of buffer or generate IV and write to start
* of buffer.
*/
if
(
EVP_CIPHER_CTX_ctrl
(
ctx
,
ctx
->
encrypt
?
EVP_CTRL_GCM_IV_GEN
:
EVP_CTRL_GCM_SET_IV_INV
,
EVP_GCM_TLS_EXPLICIT_IV_LEN
,
out
)
<=
0
)
goto
err
;
/* Use saved AAD */
if
(
CRYPTO_gcm128_aad
(
&
gctx
->
gcm
,
ctx
->
buf
,
gctx
->
tls_aad_len
))
goto
err
;
/* Fix buffer and length to point to payload */
in
+=
EVP_GCM_TLS_EXPLICIT_IV_LEN
;
out
+=
EVP_GCM_TLS_EXPLICIT_IV_LEN
;
len
-=
EVP_GCM_TLS_EXPLICIT_IV_LEN
+
EVP_GCM_TLS_TAG_LEN
;
if
(
ctx
->
encrypt
)
{
/* Encrypt payload */
if
(
CRYPTO_gcm128_encrypt_ctr32
(
&
gctx
->
gcm
,
in
,
out
,
len
,
aesni_ctr32_encrypt_blocks
))
out
+=
len
;
/* Finally write tag */
CRYPTO_gcm128_tag
(
&
gctx
->
gcm
,
out
,
EVP_GCM_TLS_TAG_LEN
);
rv
=
len
+
EVP_GCM_TLS_EXPLICIT_IV_LEN
+
EVP_GCM_TLS_TAG_LEN
;
}
else
{
/* Decrypt */
if
(
CRYPTO_gcm128_decrypt_ctr32
(
&
gctx
->
gcm
,
in
,
out
,
len
,
aesni_ctr32_encrypt_blocks
))
goto
err
;
/* Retrieve tag */
CRYPTO_gcm128_tag
(
&
gctx
->
gcm
,
ctx
->
buf
,
EVP_GCM_TLS_TAG_LEN
);
/* If tag mismatch wipe buffer */
if
(
memcmp
(
ctx
->
buf
,
in
+
len
,
EVP_GCM_TLS_TAG_LEN
))
{
OPENSSL_cleanse
(
out
,
len
);
goto
err
;
}
rv
=
len
;
}
err:
gctx
->
iv_set
=
0
;
gctx
->
tls_aad_len
=
-
1
;
return
rv
;
}
static
int
aesni_gcm_cipher
(
EVP_CIPHER_CTX
*
ctx
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
size_t
len
)
{
EVP_AES_GCM_CTX
*
gctx
=
ctx
->
cipher_data
;
/* If not set up, return error */
if
(
!
gctx
->
iv_set
&&
!
gctx
->
key_set
)
if
(
!
gctx
->
key_set
)
return
-
1
;
if
(
gctx
->
tls_aad_len
>=
0
)
return
aesni_gcm_tls_cipher
(
ctx
,
out
,
in
,
len
);
if
(
!
gctx
->
iv_set
)
return
-
1
;
if
(
!
ctx
->
encrypt
&&
gctx
->
taglen
<
0
)
return
-
1
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录