0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-18 07:50:57 +01:00
construct/modules/key/server.cc

125 lines
2.6 KiB
C++

/*
* Copyright (C) 2017 Charybdis Development Team
* Copyright (C) 2017 Jason Volk <jason@zemos.net>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
using namespace ircd;
mapi::header IRCD_MODULE
{
"federation 2.2.1.1: Publishing Keys"
};
struct server
:resource
{
using resource::resource;
}
server_resource
{
"/_matrix/key/v2/server/", resource::opts
{
resource::DIRECTORY,
"federation 2.2.1.1: Publishing Keys"
}
};
resource::response
handle_get(client &client,
const resource::request &request)
{
char key_id_buf[256];
const auto key_id
{
urldecode(request.parv[0], key_id_buf)
};
std::string my_key;
m::keys::get(my_host(), key_id, [&my_key](const auto &key)
{
my_key = json::string(key);
});
return resource::response
{
client, json::object{my_key}
};
}
resource::method method_get
{
server_resource, "GET", handle_get
};
// __attribute__((constructor))
static
void foop()
{
using namespace ircd;
uint8_t seed_buf[ed25519::SEED_SZ + 10];
const auto seed
{
b64decode(seed_buf, "YJDBA9Xnr2sVqXD9Vj7XVUnmFZcZrlw8Md7kMW+3XA1")
};
ed25519::pk pk;
ed25519::sk sk{&pk, seed};
const auto SERVER_NAME {"domain"};
const auto KEY_ID {"ed25519:1"};
const auto test{[&](const std::string &object)
{
const auto sig
{
sk.sign(const_raw_buffer{object})
};
char sigb64_buf[128];
const auto sigb64
{
b64encode_unpadded(sigb64_buf, sig)
};
std::cout << "sig: " << sigb64 << std::endl;
ed25519::sig unsig; const auto unsigb64
{
b64decode(unsig, sigb64)
};
return pk.verify(const_raw_buffer{object}, unsig);
}};
std::cout <<
test(std::string{json::object
{
"{}"
}})
<< std::endl;
std::cout <<
test(json::string(json::members
{
{ "one", 1 },
{ "two", "Two" }
}))
<< std::endl;
}