openssl_seal()/_open() is not able to handle gcm cipers, e.g. aes-256-gcm
Personne n'a encore pris cette issue.
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.2k
- Merge moyen
- 2 j 13 h
- PR mergées (30 j)
- 96
Description
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
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez le script PHP fourni et comparez les chemins aes-256-ctr et aes-256-gcm via openssl_seal() et openssl_open(). Lisez les implémentations de ces points d’entrée ainsi que l’issue OpenSSL liée afin de déterminer comment le tag d’authentification est géré. Le travail est considéré comme terminé lorsque le comportement de GCM et le mode d’échec sont couverts par le comportement attendu de l’API du projet.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, php
- Domaine
- backend-api-design, cryptography, security
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100