verify.js 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import * as crypto from 'crypto';
  2. import { promisify } from 'util';
  3. import nodeDigest from './dsa_digest.js';
  4. import nodeKey from './node_key.js';
  5. import sign from './sign.js';
  6. import getVerifyKey from './get_sign_verify_key.js';
  7. import { oneShotCallback } from './flags.js';
  8. let oneShotVerify;
  9. if (crypto.verify.length > 4 && oneShotCallback) {
  10. oneShotVerify = promisify(crypto.verify);
  11. }
  12. else {
  13. oneShotVerify = crypto.verify;
  14. }
  15. const verify = async (alg, key, signature, data) => {
  16. const keyObject = getVerifyKey(alg, key, 'verify');
  17. if (alg.startsWith('HS')) {
  18. const expected = await sign(alg, keyObject, data);
  19. const actual = signature;
  20. try {
  21. return crypto.timingSafeEqual(actual, expected);
  22. }
  23. catch {
  24. return false;
  25. }
  26. }
  27. const algorithm = nodeDigest(alg);
  28. const keyInput = nodeKey(alg, keyObject);
  29. try {
  30. return await oneShotVerify(algorithm, data, keyInput, signature);
  31. }
  32. catch {
  33. return false;
  34. }
  35. };
  36. export default verify;