From b9bfe19b64b1b0a16b955ed1b10a7a662a806e4e Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Sun, 13 Apr 2025 23:17:50 +0400 Subject: [PATCH] feat(kms/signing): better error handling --- backend/src/lib/crypto/sign/signing.ts | 33 ++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/backend/src/lib/crypto/sign/signing.ts b/backend/src/lib/crypto/sign/signing.ts index 7dd71b5f6..66f36dc0f 100644 --- a/backend/src/lib/crypto/sign/signing.ts +++ b/backend/src/lib/crypto/sign/signing.ts @@ -118,7 +118,12 @@ export const signingService = (algorithm: AsymmetricKeyAlgorithm): TAsymmetricSi } }; - const $signRsaDigest = async (digest: Buffer, privateKey: Buffer, hashAlgorithm: SupportedHashAlgorithm) => { + const $signRsaDigest = async ( + digest: Buffer, + privateKey: Buffer, + hashAlgorithm: SupportedHashAlgorithm, + signingAlgorithm: SigningAlgorithm + ) => { const tempDir = await createTemporaryDirectory("kms-rsa-sign"); const digestPath = path.join(tempDir, "digest.bin"); const sigPath = path.join(tempDir, "signature.bin"); @@ -164,12 +169,22 @@ export const signingService = (algorithm: AsymmetricKeyAlgorithm): TAsymmetricSi } return signature; + } catch (err) { + logger.error(err, "KMS: Failed to sign RSA digest"); + throw new BadRequestError({ + message: `Failed to sign RSA digest with ${signingAlgorithm} due to signing error. Ensure that your digest is hashed with ${hashAlgorithm.toUpperCase()}.` + }); } finally { await cleanTemporaryDirectory(tempDir); } }; - const $signEccDigest = async (digest: Buffer, privateKey: Buffer, hashAlgorithm: SupportedHashAlgorithm) => { + const $signEccDigest = async ( + digest: Buffer, + privateKey: Buffer, + hashAlgorithm: SupportedHashAlgorithm, + signingAlgorithm: SigningAlgorithm + ) => { const tempDir = await createTemporaryDirectory("ecc-sign"); const digestPath = path.join(tempDir, "digest.bin"); const keyPath = path.join(tempDir, "key.pem"); @@ -216,6 +231,11 @@ export const signingService = (algorithm: AsymmetricKeyAlgorithm): TAsymmetricSi } return signature; + } catch (err) { + logger.error(err, "KMS: Failed to sign ECC digest"); + throw new BadRequestError({ + message: `Failed to sign ECC digest with ${signingAlgorithm} due to signing error. Ensure that your digest is hashed with ${hashAlgorithm.toUpperCase()}.` + }); } finally { await cleanTemporaryDirectory(tempDir); } @@ -329,7 +349,12 @@ export const signingService = (algorithm: AsymmetricKeyAlgorithm): TAsymmetricSi const signDigestFunctionsMap: Record< AsymmetricKeyAlgorithm, - (data: Buffer, privateKey: Buffer, hashAlgorithm: SupportedHashAlgorithm) => Promise + ( + data: Buffer, + privateKey: Buffer, + hashAlgorithm: SupportedHashAlgorithm, + signingAlgorithm: SigningAlgorithm + ) => Promise > = { [AsymmetricKeyAlgorithm.ECC_NIST_P256]: $signEccDigest, [AsymmetricKeyAlgorithm.RSA_4096]: $signRsaDigest @@ -360,7 +385,7 @@ export const signingService = (algorithm: AsymmetricKeyAlgorithm): TAsymmetricSi }); } - const signature = await signFunction(data, privateKey, hashAlgorithm); + const signature = await signFunction(data, privateKey, hashAlgorithm, signingAlgorithm); return signature; }