diff --git a/src/algorithm/index.ts b/src/algorithm/index.ts index ecec339..6dae820 100644 --- a/src/algorithm/index.ts +++ b/src/algorithm/index.ts @@ -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); @@ -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; diff --git a/test/algorithm/ecdsa-p256-sha256.ts b/test/algorithm/ecdsa-p256-sha256.ts index 8f16dd1..688ca1c 100644 --- a/test/algorithm/ecdsa-p256-sha256.ts +++ b/test/algorithm/ecdsa-p256-sha256.ts @@ -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)); }); }); diff --git a/test/algorithm/ecdsa-p384-sha384.ts b/test/algorithm/ecdsa-p384-sha384.ts new file mode 100644 index 0000000..28ecfef --- /dev/null +++ b/test/algorithm/ecdsa-p384-sha384.ts @@ -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)); + }); + }); + }); +}); diff --git a/test/httpbis/new.spec.ts b/test/httpbis/httpbis.spec.ts similarity index 96% rename from test/httpbis/new.spec.ts rename to test/httpbis/httpbis.spec.ts index adf35dd..e5597b4 100644 --- a/test/httpbis/new.spec.ts +++ b/test/httpbis/httpbis.spec.ts @@ -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', diff --git a/test/httpbis/httpbis.ts b/test/httpbis/httpbis.ts deleted file mode 100644 index bf8b20e..0000000 --- a/test/httpbis/httpbis.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Request } from '../../src'; -import { - deriveComponent, - extractHeader, -} from '../../src/httpbis'; -import { expect } from 'chai'; - -describe('httpbis', () => { - describe('.extractHeader', () => { - 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(extractHeader(headerName.toLowerCase(), new Map(), { headers } as unknown as Request)).to.deep.equal([expectedValue]); - }); - }); - it('throws on missing headers', () => { - expect(() => extractHeader('missing', new Map(), { headers } as unknown as Request)).to.throw(Error, 'No header "missing" found in headers'); - }); - }); - describe('.deriveComponent', () => { - it('correctly extracts the @method', () => { - const result = deriveComponent('@method', new Map(), { - method: 'POST', - url: 'https://www.example.com/path?param=value', - } as unknown as Request); - expect(result).to.deep.equal(['POST']); - }); - it('correctly extracts the @target-uri', () => { - const result = deriveComponent('@target-uri', new Map(), { - method: 'POST', - url: 'https://www.example.com/path?param=value', - } as unknown as Request); - expect(result).to.deep.equal(['https://www.example.com/path?param=value']); - }); - it('correctly extracts the @authority', () => { - const result = deriveComponent('@authority', new Map(), { - method: 'POST', - url: 'https://www.example.com/path?param=value', - } as unknown as Request); - expect(result).to.deep.equal(['www.example.com']); - }); - it('correctly extracts the @scheme', () => { - const result = deriveComponent('@scheme', new Map(), { - method: 'POST', - url: 'http://www.example.com/path?param=value', - } as unknown as Request); - expect(result).to.deep.equal(['http']); - }); - it('correctly extracts the @request-target', () => { - const result = deriveComponent('@request-target', new Map(), { - method: 'POST', - url: 'https://www.example.com/path?param=value', - } as unknown as Request); - expect(result).to.deep.equal(['/path?param=value']); - }); - it('correctly extracts the @path', () => { - const result = deriveComponent('@path', new Map(), { - method: 'POST', - url: 'https://www.example.com/path?param=value', - } as unknown as Request); - expect(result).to.deep.equal(['/path']); - }); - it('correctly extracts the @query', () => { - const result = deriveComponent('@query', new Map(), { - method: 'POST', - url: 'https://www.example.com/path?param=value&foo=bar&baz=batman', - } as unknown as Request); - expect(result).to.deep.equal(['?param=value&foo=bar&baz=batman']); - }); - it('correctly extracts the @query', () => { - const result = deriveComponent('@query', new Map(), { - method: 'POST', - url: 'https://www.example.com/path?queryString', - } as unknown as Request); - expect(result).to.deep.equal(['?queryString']); - }); - }); -});