openssl_seal()/_open() is not able to handle gcm cipers, e.g. aes-256-gcm
未关闭
还没有人认领这个 Issue。
Extension: openssl
Feature
Status: Verified
- 主要语言
- C
- 星标
- 40.4k
- 派生
- 8.2k
- 平均合并
- 2 天 13 小时
- 30 天内合并 PR
- 96
描述
Description
The following code:
<?php
const NUM_KEYS = 2;
for ($i = 0; $i < NUM_KEYS; $i++) {
$keys[] = $key = openssl_pkey_new();
$details = openssl_pkey_get_details($key);
$pubKeys[] = $details['key'];
$privKeys[] = openssl_pkey_get_private($key);
}
$data = 'Test Data String';
$ciphers = [
'aes-256-ctr',
'aes-256-gcm',
];
foreach ($ciphers as $cipherAlgo) {
echo "*** TESTING $cipherAlgo ***" . PHP_EOL . PHP_EOL;
$iv = \random_bytes(openssl_cipher_iv_length($cipherAlgo));
$result = openssl_seal($data, $sealedData, $sealedKeys, $pubKeys, $cipherAlgo, $iv);
echo "DATA : " . strlen($data) . ' ' . $data . PHP_EOL;
echo "IV-LEN: " . openssl_cipher_iv_length($cipherAlgo) . PHP_EOL;
echo "IV : " . bin2hex($iv) . PHP_EOL;
echo "ENC DATA: " . strlen($sealedData) . ' ' . bin2hex($sealedData) . PHP_EOL;
echo "RESULT: " . ($result ? 'true' : 'false') . PHP_EOL;
echo PHP_EOL;
// Try decrypt
foreach ($keys as $i => $key) {
$decrypted = null; // ;)
$result = openssl_open($sealedData, $decrypted, $sealedKeys[$i], $key, $cipherAlgo, $iv);
echo "OPEN: " . $decrypted . PHP_EOL;
echo "RESULT: " . ($result ? 'true' : 'false') . PHP_EOL;
$result = openssl_private_decrypt($sealedKeys[$i], $unsealedKey, $key);
echo "UNSEAL: " . bin2hex($unsealedKey) . PHP_EOL;
echo "RESULT: " . ($result ? 'true' : 'false') . PHP_EOL;
echo "DECRYPT: " . openssl_decrypt($sealedData, $cipherAlgo, $unsealedKey, OPENSSL_RAW_DATA, $iv) . PHP_EOL;
}
echo PHP_EOL;
}
Resulted in this output:
$ ./openssl-seal-test.php
*** TESTING aes-256-ctr ***
DATA : 16 Test Data String
IV-LEN: 16
IV : 37ff67041864b987b8ec2dcd0879f55e
ENC DATA: 16 2a748aa6ae176caf59cf22868304d65a
RESULT: true
OPEN: Test Data String
RESULT: true
UNSEAL: 8745e00bdf3d88bd1caa8ec0150a9b369eade92e57fc2d26ae283f224c66af14
RESULT: true
DECRYPT: Test Data String
OPEN: Test Data String
RESULT: true
UNSEAL: 8745e00bdf3d88bd1caa8ec0150a9b369eade92e57fc2d26ae283f224c66af14
RESULT: true
DECRYPT: Test Data String
*** TESTING aes-256-gcm ***
DATA : 16 Test Data String
IV-LEN: 12
IV : 033b1589f62bebbfffa3adda
ENC DATA: 16 a531f88fc51e373235c928cae1eb7c29
RESULT: true
OPEN:
RESULT: false
UNSEAL: 600cf6e76cf4ae9d48a881e0649af4682aa9065e63bec515a6b8c9678e398d36
RESULT: true
DECRYPT:
OPEN:
RESULT: false
UNSEAL: 600cf6e76cf4ae9d48a881e0649af4682aa9065e63bec515a6b8c9678e398d36
RESULT: true
DECRYPT:
But I expected this output instead:
[...]
*** TESTING aes-256-gcm ***
DATA : 16 Test Data String
IV-LEN: 12
IV : 033b1589f62bebbfffa3adda
ENC DATA: 16 a531f88fc51e373235c928cae1eb7c29
RESULT: true
OPEN: Test Data String
RESULT: true
UNSEAL: 600cf6e76cf4ae9d48a881e0649af4682aa9065e63bec515a6b8c9678e398d36
RESULT: false
DECRYPT:
OPEN: Test Data String
RESULT: true
UNSEAL: 600cf6e76cf4ae9d48a881e0649af4682aa9065e63bec515a6b8c9678e398d36
RESULT: false
DECRYPT:
The point is that the gcm-cipher need the authentication tag for decrypting the data. This however does not seem to be saved by the openssl_seal() function. I have also placed a question in the OpenSSL issue tracker: https://github.com/openssl/openssl/issues/17235
PHP Version
PHP 8.0.13 (cli) (built: Nov 27 2021 17:17:19) ( ZTS )
Operating System
Gentoo Linux 5.15.6, but should not matter
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
复现所提供的 PHP 脚本,并通过 openssl_seal() 和 openssl_open() 比较 aes-256-ctr 与 aes-256-gcm 路径。阅读这些入口点的实现以及关联的 OpenSSL issue,以确定身份验证标签是如何处理的。当项目预期的 API 行为涵盖 GCM 行为和失败模式时,即视为完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- c, php
- 领域
- backend-api-design, cryptography, security
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100