begin support for ed25519 keys, start with generation and channel storage

This commit is contained in:
Mike Macgirvin 2023-11-09 06:28:16 +11:00
parent 9ae93ba683
commit 1f985ca275
6 changed files with 95 additions and 1 deletions

View file

@ -21,6 +21,8 @@ class Channel extends BaseObject
public $channel_startpage;
public $channel_pubkey;
public $channel_prvkey;
public $channel_epubkey;
public $channel_eprvkey;
public $channel_notifyflags;
public $channel_pageflags;
public $channel_dirdate;
@ -312,6 +314,43 @@ class Channel extends BaseObject
return $this;
}
/**
* @return mixed
*/
public function getEpubkey()
{
return $this->channel_epubkey;
}
/**
* @param mixed $channel_epubkey
* @return Channel
*/
public function setEpubkey($channel_epubkey)
{
$this->channel_epubkey = $channel_epubkey;
return $this;
}
/**
* @return mixed
*/
public function getEprvkey()
{
return $this->channel_eprvkey;
}
/**
* @param mixed $channel_eprvkey
* @return Channel
*/
public function setEprvkey($channel_eprvkey)
{
$this->channel_eprvkey = $channel_eprvkey;
return $this;
}
/**
* @return mixed
*/

View file

@ -366,6 +366,9 @@ class Channel
} else {
$key = Crypto::new_keypair(4096);
}
$eckey = sodium_crypto_sign_keypair();
$ekey['pubkey'] = sodium_bin2base64(sodium_crypto_sign_publickey($eckey),SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING);
$ekey['prvkey'] = sodium_bin2base64(sodium_crypto_sign_secretkey($eckey),SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING);
$sig = Libzot::sign($guid, $key['prvkey']);
$hash = Libzot::make_xchan_hash($guid, $key['pubkey']);
@ -420,6 +423,8 @@ class Channel
->setHash($hash)
->setPrvkey($key['prvkey'])
->setPubkey($key['pubkey'])
->setEprvkey($ekey['prvkey'])
->setEpubkey($ekey['pubkey'])
->setPageflags(intval($pageflags))
->setSystem(intval($system))
->setExpireDays($expire)
@ -2227,6 +2232,8 @@ class Channel
'channel_startpage' => ((array_key_exists('channel_startpage', $arr)) ? $arr['channel_startpage'] : ''),
'channel_pubkey' => ((array_key_exists('channel_pubkey', $arr)) ? $arr['channel_pubkey'] : ''),
'channel_prvkey' => ((array_key_exists('channel_prvkey', $arr)) ? $arr['channel_prvkey'] : ''),
'channel_epubkey' => ((array_key_exists('channel_epubkey', $arr)) ? $arr['channel_epubkey'] : ''),
'channel_eprvkey' => ((array_key_exists('channel_eprvkey', $arr)) ? $arr['channel_eprvkey'] : ''),
'channel_notifyflags' => ((array_key_exists('channel_notifyflags', $arr)) ? $arr['channel_notifyflags'] : '65535'),
'channel_pageflags' => ((array_key_exists('channel_pageflags', $arr)) ? $arr['channel_pageflags'] : '0'),
'channel_dirdate' => ((array_key_exists('channel_dirdate', $arr)) ? $arr['channel_dirdate'] : NULL_DATE),

44
Code/Update/_1271.php Normal file
View file

@ -0,0 +1,44 @@
<?php
namespace Code\Update;
class _1271
{
public function run()
{
q("START TRANSACTION");
$r1 = q("ALTER TABLE channel ADD channel_epubkey text NOT NULL");
$r2 = q("ALTER TABLE channel ADD channel_eprvkey text NOT NULL");
$r3 = q("select channel_id from channel where true");
if ($r3) {
foreach ($r3 as $channel) {
$keys = sodium_crypto_sign_keypair();
$pubkey = sodium_bin2base64(sodium_crypto_sign_publickey($keys),SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING);
$prvkey = sodium_bin2base64(sodium_crypto_sign_secretkey($keys),SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING);
q("update channel set channel_epubkey = '%s', channel_eprvkey = '%s' where channel_id = %d",
dbesc($pubkey),
dbesc($prvkey),
intval($channel['channel_id'])
);
}
}
if ($r1 && $r2) {
q("COMMIT");
return UPDATE_SUCCESS;
}
q("ROLLBACK");
return UPDATE_FAILED;
}
public function verify()
{
$columns = db_columns('channel');
return in_array('epubkey', $columns) && in_array('eprvkey', $columns);
}
}

View file

@ -26,7 +26,7 @@ use Code\Lib\Url;
*/
const REPOSITORY_ID = 'streams';
const DB_UPDATE_VERSION = 1270;
const DB_UPDATE_VERSION = 1271;
const PROJECT_BASE = __DIR__;
const ACTIVITYPUB_ENABLED = true;
const NOMAD_PROTOCOL_VERSION = '12.0';

View file

@ -259,6 +259,8 @@ CREATE TABLE IF NOT EXISTS `channel` (
`channel_startpage` varchar(255) NOT NULL DEFAULT '',
`channel_pubkey` text NOT NULL,
`channel_prvkey` text NOT NULL,
`channel_epubkey` text NOT NULL,
`channel_eprvkey` text NOT NULL,
`channel_notifyflags` int unsigned NOT NULL DEFAULT 1073741823,
`channel_pageflags` int unsigned NOT NULL DEFAULT 0 ,
`channel_dirdate` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',

View file

@ -262,6 +262,8 @@ CREATE TABLE "channel" (
"channel_startpage" text NOT NULL DEFAULT '',
"channel_pubkey" text NOT NULL,
"channel_prvkey" text NOT NULL,
"channel_epubkey" text NOT NULL,
"channel_eprvkey" text NOT NULL,
"channel_notifyflags" bigint NOT NULL DEFAULT '1073741823',
"channel_pageflags" bigint NOT NULL DEFAULT '0',
"channel_dirdate" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',