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