php / php/php-src

Include JS WebCrypto raw format for openssl_get_publicKey

Open
#13,995 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Extension: openssl Feature Status: Needs Triage
Dominant language
C
Stars
40.4k
Forks
8.1k
Avg merge
2d 13h
Merged PRs (30d)
96

Description

Description

With the inclusion of JS WebCrypto API, I believe it is necessary to support the exported raw format when client sends their own public EC keys to the server.


const { publicKey } = await crypto.subtle.generateKey({
  name : 'ECDH',  
  namedCurve : 'P-256'
}, true, ['deriveBits'])

const exported_key = new Uint8Array(await crypto.subtle.exportKey('raw', publicKey))

fetch('key.php', {
  method : 'post', 
  body :  btoa(String.fromCharCode(...exported_key))
}).then(e=>e.text())

However, openssl_pkey_get_public only accepts PEM formatted string. This would mean a whole lot of concatenating to do before we are able to get the public OpenSSLAsymmetricKey

$raw_format = base64_decode(file_get_content("php://input"));
// This header is only for P-256
$asn_1_header = pack('C*', ...[48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0]);

var_dump(openssl_get_publicKey("-----BEGIN PUBLIC KEY-----\n".base64_encode($asn_1_header.$raw_format)."\n-----END PUBLIC KEY-----"));

It would be pretty cool to simplify it so that it becomes the following.

openssl_get_publicKey($raw_format);

I think alternatively we can make a new function for openssl to load what JS Web Crypto generated as "raw" type.

Note

I know that WebCrypto API does allow exporting SPKI key but that is besides the point. To add to this, when you subscribe to pushmanager, a p256dh is given in "raw" format as defined by WebCrypto API.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at the openssl_get_publicKey and openssl_pkey_get_public entry points and review how OpenSSL public keys are currently accepted. Determine how raw WebCrypto EC public-key input should be recognized and supported, including the stated P-256 example; done means the raw input can produce an OpenSSLAsymmetricKey without manual ASN.1 or PEM wrapping.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, php
Domain
cryptography
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.