|
1 | 1 | import { TestServer } from "@ndn/node-transport/test-fixture/net-server"; |
2 | | -import { assert } from "@ndn/util"; |
3 | | -import { type ClientSession, createServer, type ServerSession, type WebTransportServer } from "@webtransport-bun/webtransport"; |
| 2 | +import { assert, sha256 } from "@ndn/util"; |
| 3 | +import { type ClientSession, createServer, type ServerSession, type ServerTlsSniEntry, type WebTransportServer } from "@webtransport-bun/webtransport"; |
| 4 | +import selfsigned from "selfsigned"; |
| 5 | + |
| 6 | +export async function makeSelfSigned(): Promise<ServerTlsSniEntry & { certHash: Uint8Array<ArrayBuffer> }> { |
| 7 | + const serverName = "127.0.0.1"; |
| 8 | + const notBeforeDate = new Date(); |
| 9 | + const notAfterDate = new Date(notBeforeDate.getTime() + 86400_000); |
| 10 | + const generated = await selfsigned.generate([ |
| 11 | + { name: "commonName", value: serverName }, |
| 12 | + ], { |
| 13 | + notBeforeDate, |
| 14 | + notAfterDate, |
| 15 | + keyType: "ec", |
| 16 | + curve: "P-256", |
| 17 | + algorithm: "sha256", |
| 18 | + extensions: [ |
| 19 | + { name: "subjectAltName", altNames: [{ type: 7, ip: serverName }] }, |
| 20 | + ], |
| 21 | + }); |
| 22 | + |
| 23 | + const certDer = Buffer.from(generated.cert.replaceAll(/(-----(BEGIN|END) CERTIFICATE-----)|\s/g, ""), "base64"); |
| 24 | + return { |
| 25 | + serverName, |
| 26 | + certPem: generated.cert, |
| 27 | + keyPem: generated.private, |
| 28 | + certHash: await sha256(certDer), |
| 29 | + }; |
| 30 | +} |
4 | 31 |
|
5 | 32 | /** WebTransport test server. */ |
6 | 33 | export class WtServer extends TestServer<WebTransportServer, ServerSession> { |
7 | 34 | public static async create(): Promise<WtServer> { |
8 | 35 | let self!: WtServer; // eslint-disable-line prefer-const |
9 | 36 |
|
| 37 | + const { certHash, ...tls } = await makeSelfSigned(); |
10 | 38 | const port = 16384 + Math.trunc(Math.random() * 16384); |
11 | 39 | const server = createServer({ |
12 | 40 | port, |
13 | | - tls: { certPem: "", keyPem: "", allowSelfSigned: true }, |
| 41 | + tls, |
14 | 42 | onSession: (sess) => self.onSession(sess), |
15 | 43 | }); |
16 | 44 |
|
17 | | - self = new WtServer(server, port); |
| 45 | + self = new WtServer(server, `https://127.0.0.1:${port}`, certHash); |
18 | 46 | return self; |
19 | 47 | } |
20 | 48 |
|
21 | | - /** WebTransport server URI. */ |
22 | | - public readonly uri: string; |
23 | | - |
24 | | - constructor(server: WebTransportServer, port: number) { |
| 49 | + /** |
| 50 | + * @param port - WebTransport server URI. |
| 51 | + * @param certHash - WebTransport server certificate hash. |
| 52 | + */ |
| 53 | + constructor(server: WebTransportServer, public readonly uri: string, public readonly certHash: Uint8Array<ArrayBuffer>) { |
25 | 54 | super(server); |
26 | | - this.uri = `https://127.0.0.1:${port}`; |
| 55 | + } |
| 56 | + |
| 57 | + public get serverCertificateHashes(): WebTransportHash[] { |
| 58 | + return [{ algorithm: "sha-256", value: this.certHash }]; |
27 | 59 | } |
28 | 60 |
|
29 | 61 | private waitNewSession?: () => void; |
|
0 commit comments