Skip to content

Commit a9a42e7

Browse files
committed
Add a simple structure & working test outline
1 parent f818168 commit a9a42e7

File tree

4 files changed

+43
-15
lines changed

4 files changed

+43
-15
lines changed

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "read-tls-fingerprint",
3-
"version": "1.0.0",
3+
"version": "0.0.0",
44
"author": "Tim Perry <[email protected]>",
55
"description": "A pure-JS module to read TLS fingerprints from an incoming socket connection",
66
"main": "./dist/index.js",
@@ -36,7 +36,8 @@
3636
"url": "http://github.com/httptoolkit/read-tls-fingerprint.git"
3737
},
3838
"dependencies": {
39-
"@types/node": "^16.7.10"
39+
"@types/node": "^16.7.10",
40+
"destroyable-server": "^1.0.0"
4041
},
4142
"devDependencies": {
4243
"@types/chai": "^4.2.21",

src/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import * as stream from "stream";
2+
3+
export async function getTlsFingerprint(data: stream.Readable) {
4+
const firstData: any = await new Promise((resolve) => data.on('data', resolve));
5+
return firstData[0].toString();
6+
}

test/test-util.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import * as stream from 'stream';
21
import * as fs from 'fs';
32

43
export const testKey = fs.readFileSync(__dirname + '/fixtures/server.key');
@@ -20,14 +19,4 @@ export function getDeferred<T>(): Deferred<T> {
2019
result.reject = rejectCallback!;
2120

2221
return result;
23-
}
24-
25-
export async function streamToBuffer(stream: stream.Readable): Promise<Buffer> {
26-
const data: Buffer[] = [];
27-
stream.on('data', (d) => data.push(d));
28-
29-
return new Promise((resolve, reject) => {
30-
stream.on('end', () => resolve(Buffer.concat(data)));
31-
stream.on('error', reject);
32-
});
3322
}

test/test.spec.ts

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,37 @@
1+
import * as net from 'net';
2+
import * as tls from 'tls';
3+
import { makeDestroyable, DestroyableServer } from 'destroyable-server';
4+
5+
import { getDeferred } from './test-util';
6+
7+
import { getTlsFingerprint } from '../src/index';
8+
import { expect } from 'chai';
9+
110
describe("Read-TLS-Fingerprint", () => {
2-
it("runs a test", () => {
3-
// no-op
11+
12+
let server: DestroyableServer<net.Server>;
13+
14+
afterEach(() => server?.destroy());
15+
16+
it("can read Node's fingerprint", async () => {
17+
server = makeDestroyable(new net.Server());
18+
19+
server.listen();
20+
await new Promise((resolve) => server.on('listening', resolve));
21+
22+
let incomingSocketPromise = getDeferred<net.Socket>();
23+
server.on('connection', (socket) => incomingSocketPromise.resolve(socket));
24+
25+
console.log(server.address());
26+
const port = (server.address() as net.AddressInfo).port;
27+
tls.connect({
28+
host: '127.0.0.1',
29+
port
30+
}).on('error', () => {}); // Socket will fail, since server never responds, that's OK
31+
32+
const incomingSocket = await incomingSocketPromise;
33+
const fingerprint = await getTlsFingerprint(incomingSocket);
34+
35+
expect(fingerprint).to.equal('22'); // Basic WIP test: yes, this is TLS
436
});
537
});

0 commit comments

Comments
 (0)