note 130575 added to function.openssl-verify

From: Date: Mon, 15 Dec 2025 05:43:59 +0000
Subject: note 130575 added to function.openssl-verify
Groups: php.notes 
Request: Send a blank email to php-notes+get-222458@lists.php.net to get a copy of this message
PHP is the most efficient language for handling web requests. I have tested it, and PHP's OpenSSL library can decrypt data encrypted by JS using AES, OAEP, and EC-DH, and it can also verify data signed by JS using HMAC and RSA-PKCS#1.5. However, it cannot verify data signed by JS using EC-DSA or RSA-PSS. Verifying data signed with EC-DSA and RSA-PSS is necessary. Does PHP's OpenSSL library still not support verifying EC-DSA and RSA-PSS signatures? // JS EC-DSA sign crypto.subtle.generateKey( { name: 'ECDSA', namedCurve: 'P-256' // P-521 corresponds to secp521r1, P-384 corresponds to secp384r1, p-256 corresponds to prime256v1 }, true, ['sign', 'verify'] ).then(pair => { return { publicKey: crypto.subtle.exportKey('spki', pair.publicKey), signature: crypto.subtle.sign( { name: 'ECDSA', hash: { name: 'SHA-1' // or SHA-256, SHA-384, SHA-512 } }, pair.privateKey, (new TextEncoder()).encode('test data') ) }; }).then(data => { // await crypto.subtle.verify(...) is true; // convert data.publicKey ArrayBuffer to PEM publicKey and encodeURIComponent it; // convert data.signature ArrayBuffer to base64 string; // send data object to PHP }); // PHP receives the above data and executes openssl_verify openssl_verify( base64_decode($_POST['signature']), 'test data', urldecode($_POST['publicKey']), OPENSSL_ALGO_SHA1 // or OPENSSL_ALGO_SHA256, OPENSSL_ALGO_SHA384, OPENSSL_ALGO_SHA512 ); // result: -1 // JS RSA-PSS sign crypto.subtle.generateKey( { name: 'RSA-PSS', modulusLength: 2048, publicExponent: new Uint8Array([1, 0, 1]), hash: 'SHA-256' // or SHA-1, SHA-384, SHA-512 }, true, ['sign', 'verify'] ).then(pair => { return { publicKey: crypto.subtle.exportKey('spki', pair.publicKey), signature: crypto.subtle.sign( { name: 'RSA-PSS', saltLength: 32 }, pair.privateKey, (new TextEncoder()).encode('test data') ) }; }).then(data => { console.log(data) // await crypto.subtle.verify(...) is true; // convert data.publicKey ArrayBuffer to PEM publicKey and encodeURIComponent it; // convert data.signature ArrayBuffer to base64 string; // send data object to PHP }); // PHP receives the above data and executes openssl_verify openssl_verify( base64_decode($_POST['signature']), 'test data', urldecode($_POST['publicKey']), OPENSSL_ALGO_SHA256 // or OPENSSL_ALGO_SHA1, OPENSSL_ALGO_SHA384, OPENSSL_ALGO_SHA512 ); // result: -1, but RSA-PKCS#1.5 is OK ---- Server IP: 206.189.2.9 Probable Submitter: 123.121.7.59 ---- Manual Page -- https://php.net/manual/en/function.openssl-verify.php Edit -- https://main.php.net/note/edit/130575 Del: integrated -- https://main.php.net/note/delete/130575/integrated Del: useless -- https://main.php.net/note/delete/130575/useless Del: bad code -- https://main.php.net/note/delete/130575/bad+code Del: spam -- https://main.php.net/note/delete/130575/spam Del: non-english -- https://main.php.net/note/delete/130575/non-english Del: in docs -- https://main.php.net/note/delete/130575/in+docs Del: other reasons-- https://main.php.net/note/delete/130575 Reject -- https://main.php.net/note/reject/130575 Search -- https://main.php.net/manage/user-notes.php

« previous php.notes (#222458) next »