1'use strict';
2
3const {
4  ObjectKeys,
5  StringPrototypeToLowerCase,
6} = primordials;
7
8const kHashContextNode = 1;
9const kHashContextWebCrypto = 2;
10const kHashContextJwkRsa = 3;
11const kHashContextJwkRsaPss = 4;
12const kHashContextJwkRsaOaep = 5;
13const kHashContextJwkHmac = 6;
14
15// WebCrypto and JWK use a bunch of different names for the
16// standard set of SHA-* digest algorithms... which is ... fun.
17// Here we provide a utility for mapping between them in order
18// make it easier in the code.
19
20const kHashNames = {
21  sha1: {
22    [kHashContextNode]: 'sha1',
23    [kHashContextWebCrypto]: 'SHA-1',
24    [kHashContextJwkRsa]: 'RS1',
25    [kHashContextJwkRsaPss]: 'PS1',
26    [kHashContextJwkRsaOaep]: 'RSA-OAEP',
27    [kHashContextJwkHmac]: 'HS1',
28  },
29  sha256: {
30    [kHashContextNode]: 'sha256',
31    [kHashContextWebCrypto]: 'SHA-256',
32    [kHashContextJwkRsa]: 'RS256',
33    [kHashContextJwkRsaPss]: 'PS256',
34    [kHashContextJwkRsaOaep]: 'RSA-OAEP-256',
35    [kHashContextJwkHmac]: 'HS256',
36  },
37  sha384: {
38    [kHashContextNode]: 'sha384',
39    [kHashContextWebCrypto]: 'SHA-384',
40    [kHashContextJwkRsa]: 'RS384',
41    [kHashContextJwkRsaPss]: 'PS384',
42    [kHashContextJwkRsaOaep]: 'RSA-OAEP-384',
43    [kHashContextJwkHmac]: 'HS384',
44  },
45  sha512: {
46    [kHashContextNode]: 'sha512',
47    [kHashContextWebCrypto]: 'SHA-512',
48    [kHashContextJwkRsa]: 'RS512',
49    [kHashContextJwkRsaPss]: 'PS512',
50    [kHashContextJwkRsaOaep]: 'RSA-OAEP-512',
51    [kHashContextJwkHmac]: 'HS512',
52  },
53};
54
55{
56  // Index the aliases
57  const keys = ObjectKeys(kHashNames);
58  for (let n = 0; n < keys.length; n++) {
59    const contexts = ObjectKeys(kHashNames[keys[n]]);
60    for (let i = 0; i < contexts.length; i++) {
61      const alias =
62        StringPrototypeToLowerCase(kHashNames[keys[n]][contexts[i]]);
63      if (kHashNames[alias] === undefined)
64        kHashNames[alias] = kHashNames[keys[n]];
65    }
66  }
67}
68
69function normalizeHashName(name, context = kHashContextNode) {
70  if (typeof name !== 'string')
71    return name;
72  name = StringPrototypeToLowerCase(name);
73  const alias = kHashNames[name] && kHashNames[name][context];
74  return alias || name;
75}
76
77normalizeHashName.kContextNode = kHashContextNode;
78normalizeHashName.kContextWebCrypto = kHashContextWebCrypto;
79normalizeHashName.kContextJwkRsa = kHashContextJwkRsa;
80normalizeHashName.kContextJwkRsaPss = kHashContextJwkRsaPss;
81normalizeHashName.kContextJwkRsaOaep = kHashContextJwkRsaOaep;
82normalizeHashName.kContextJwkHmac = kHashContextJwkHmac;
83
84module.exports = normalizeHashName;
85