true, 'data' => $data, 'data_type' => $data_type, 'encoding' => $encoding, 'alg' => $algorithm, 'sigs' => [ 'value' => $signature, 'key_id' => base64url_encode($key_id) ] ]); } public static function verify($x): array|bool { logger('verify'); $ret = ['results' => []]; if (!is_array($x)) { return false; } if (!(array_key_exists('signed', $x) && $x['signed'])) { return false; } $signed_data = preg_replace('/\s+/', '', $x['data']) . '.' . base64url_encode($x['data_type']) . '.' . base64url_encode($x['encoding']) . '.' . base64url_encode($x['alg']); $key = HTTPSig::get_key(EMPTY_STR, 'zot6', base64url_decode($x['sigs']['key_id'])); logger('key: ' . print_r($key, true)); if ($key['portable_id'] && $key['public_key']) { if (Crypto::verify($signed_data, base64url_decode($x['sigs']['value']), $key['public_key'])) { logger('verified'); $ret = ['success' => true, 'signer' => $key['portable_id'], 'hubloc' => $key['hubloc']]; } } return $ret; } public static function unpack($data) { return json_decode(base64url_decode($data), true); } }