import { readFileSync } from "node:fs" import { createSign } from "node:crypto"; import Fastify from "fastify"; const { private: M2M_PRIVATE_KEY, public: M2M_PUBLIC_KEY } = loadM2MKeys() const M2M_ALGORITHM = "RSA-SHA512" const ASSETS_FOLDER = "~/.assets/" const ASSET_API_LANDING_MESSAGE = "asset-api v1.0.0" const IDENTITY_API_ENDPOINT = "http://localhost:3000" const fastify = new Fastify({ logger: true, }) fastify.get("/", async (request, reply) => { return signString(ASSET_API_LANDING_MESSAGE) }) fastify.get("/crypto/cert", async (request, reply) => { return M2M_PUBLIC_KEY }) fastify.get("/crypto/algo", (request, reply) => { return M2M_ALGORITHM }) fastify.get("/asset", { async handler(request, reply) { let url = new URL(IDENTITY_API_ENDPOINT) url.pathname = "/auth/account/fromkey" let res = await fetch(url, { method: "POST", body: signString(JSON.stringify({ session_key: request.query.session_key, })) }) return await res.text() }, schema: { query: { type: "object", properties: { id: { type: "string" }, session_key: { type: "string" }, }, required: ["id", "session_key"], }, }, }) fastify.listen({ port: 3001 }) function loadM2MKeys() { return { private: readFileSync("../.keys/m2m-dev.pem").toString("ascii"), public: readFileSync("../.keys/m2m-dev.pub").toString("ascii"), } } function signString(content) { let sign = createSign(M2M_ALGORITHM) sign.update(content) return `-----BEGIN SIGNED MESSAGE-----\n\n${content}\n\n-----BEGIN SIGNATURE-----\n\n${sign.sign(M2M_PRIVATE_KEY, "base64")}\n-----END SIGNATURE-----` }