Skip to content

Commit

Permalink
Add support for ecdsa-p384-sha384 signatures
Browse files Browse the repository at this point in the history
  • Loading branch information
dhensby committed Oct 3, 2022
1 parent 8f18da0 commit 0ab1c6e
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 85 deletions.
6 changes: 6 additions & 0 deletions src/algorithm/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ export function createSigner(key: BinaryLike | KeyLike | SignKeyObjectInput | Si
case 'ecdsa-p256-sha256':
signer.sign = async (data: Buffer) => createSign('sha256').update(data).sign(key as KeyLike);
break;
case 'ecdsa-p384-sha384':
signer.sign = async (data: Buffer) => createSign('sha384').update(data).sign(key as KeyLike);
break;
case 'ed25519':
signer.sign = async (data: Buffer) => sign(null, data, key as KeyLike);
// signer.sign = async (data: Buffer) => createSign('ed25519').update(data).sign(key as KeyLike);
Expand Down Expand Up @@ -106,6 +109,9 @@ export function createVerifier(key: BinaryLike | KeyLike | VerifyKeyObjectInput
case 'ecdsa-p256-sha256':
verifier = async (data: Buffer, signature: Buffer) => createVerify('sha256').update(data).verify(key as KeyLike, signature);
break;
case 'ecdsa-p384-sha384':
verifier = async (data: Buffer, signature: Buffer) => createVerify('sha384').update(data).verify(key as KeyLike, signature);
break;
case 'ed25519':
verifier = async (data: Buffer, signature: Buffer) => verify(null, data, key as KeyLike, signature) as unknown as boolean;
break;
Expand Down
2 changes: 1 addition & 1 deletion test/algorithm/ecdsa-p256-sha256.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ describe('ecdsa-p256-sha256', () => {
it('verifies a signature', async () => {
const verifier = createVerifier(ecdsaKeyPair.publicKey, 'ecdsa-p256-sha256');
const data = Buffer.from('some random data');
const sig = sign('sha512', data, ecdsaKeyPair.privateKey);
const sig = sign('sha256', data, ecdsaKeyPair.privateKey);
expect(sig).to.satisfy((arg: Buffer) => verifier(data, arg));
});
});
Expand Down
40 changes: 40 additions & 0 deletions test/algorithm/ecdsa-p384-sha384.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { generateKeyPair, sign, verify } from 'crypto';
import { promisify } from 'util';
import { createSigner, createVerifier } from '../../src';
import { expect } from 'chai';

describe('ecdsa-p384-sha384', () => {
describe('internal tests', () => {
let ecdsaKeyPair: { publicKey: string, privateKey: string };
before('generate key pair', async () => {
ecdsaKeyPair = await promisify(generateKeyPair)('ec', {
namedCurve: 'P-384',
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
},
});
});
describe('signing', () => {
it('signs a payload', async () => {
const signer = createSigner(ecdsaKeyPair.privateKey, 'ecdsa-p384-sha384');
const data = Buffer.from('some random data');
const sig = await signer.sign(data);
expect(signer.alg).to.equal('ecdsa-p384-sha384');
expect(sig).to.satisfy((arg: Buffer) => verify('sha384', data, ecdsaKeyPair.publicKey, arg));
});
});
describe('verifying', () => {
it('verifies a signature', async () => {
const verifier = createVerifier(ecdsaKeyPair.publicKey, 'ecdsa-p384-sha384');
const data = Buffer.from('some random data');
const sig = sign('sha384', data, ecdsaKeyPair.privateKey);
expect(sig).to.satisfy((arg: Buffer) => verifier(data, arg));
});
});
});
});
17 changes: 17 additions & 0 deletions test/httpbis/new.spec.ts → test/httpbis/httpbis.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,23 @@ describe('httpbis', () => {
});
});
describe('.extractHeader', () => {
describe('general header extraction', () => {
const headers = {
'testheader': 'test',
'test-header-1': 'test1',
'Test-Header-2': 'test2',
'test-Header-3': 'test3',
'TEST-HEADER-4': 'test4',
};
Object.entries(headers).forEach(([headerName, expectedValue]) => {
it(`successfully extracts a matching header (${headerName})`, () => {
expect(httpbis.extractHeader(headerName.toLowerCase(), new Map(), { headers } as unknown as Request)).to.deep.equal([expectedValue]);
});
});
it('throws on missing headers', () => {
expect(() => httpbis.extractHeader('missing', new Map(), { headers } as unknown as Request)).to.throw(Error, 'No header "missing" found in headers');
});
});
describe('raw headers', () => {
const request: Request = {
method: 'POST',
Expand Down
84 changes: 0 additions & 84 deletions test/httpbis/httpbis.ts

This file was deleted.

0 comments on commit 0ab1c6e

Please sign in to comment.