API: First steps to support subscriptions

This commit is contained in:
Michael 2021-08-15 00:30:41 +00:00
parent 1e305e748d
commit e28a4265c5
18 changed files with 416 additions and 20 deletions

View file

@ -25,6 +25,7 @@ use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
use ParagonIE\ConstantTime\Base64UrlSafe;
use phpseclib\Crypt\RSA;
use phpseclib\Math\BigInteger;
@ -150,6 +151,48 @@ class Crypto
return $response;
}
/**
* Create a new elliptic curve key pair
*
* @return array with the elements "prvkey", "vapid" and "pubkey"
*/
public static function newECKeypair()
{
$openssl_options = [
'curve_name' => 'prime256v1',
'private_key_type' => OPENSSL_KEYTYPE_EC
];
$conf = DI::config()->get('system', 'openssl_conf_file');
if ($conf) {
$openssl_options['config'] = $conf;
}
$result = openssl_pkey_new($openssl_options);
if (empty($result)) {
Logger::notice('new_keypair: failed');
return [];
}
$response = ['prvkey' => '', 'pubkey' => '', 'vapid' => ''];
// Get private key
openssl_pkey_export($result, $response['prvkey']);
// Get public key
$pkey = openssl_pkey_get_details($result);
$response['pubkey'] = $pkey['key'];
// Create VAPID key
// @see https://github.com/web-push-libs/web-push-php/blob/256a18b2a2411469c94943725fb6eccb9681bd75/src/Utils.php#L60-L62
$hexString = '04';
$hexString .= str_pad(bin2hex($pkey['ec']['x']), 64, '0', STR_PAD_LEFT);
$hexString .= str_pad(bin2hex($pkey['ec']['y']), 64, '0', STR_PAD_LEFT);
$response['vapid'] = Base64UrlSafe::encode(hex2bin($hexString));
return $response;
}
/**
* Encrypt a string with 'aes-256-cbc' cipher method.
*