common.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. // **Github:** https://github.com/fidm/x509
  4. //
  5. // **License:** MIT
  6. const net_1 = require("net");
  7. /**
  8. * Converts IP string into buffer, 4 bytes for IPv4, and 16 bytes for IPv6.
  9. * It will return null when IP string invalid.
  10. *
  11. * ```js
  12. * console.log(bytesFromIP('::1')) // <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01>
  13. * ```
  14. * @param ip IP string to convert
  15. */
  16. function bytesFromIP(ip) {
  17. switch (net_1.isIP(ip)) {
  18. case 4:
  19. return Buffer.from(ip.split('.').map((val) => parseInt(val, 10)));
  20. case 6:
  21. const vals = ip.split(':');
  22. const buf = Buffer.alloc(16);
  23. let offset = 0;
  24. if (vals[vals.length - 1] === '') {
  25. vals[vals.length - 1] = '0';
  26. }
  27. for (let i = 0; i < vals.length; i++) {
  28. if (vals[i] === '') {
  29. if (i + 1 < vals.length && vals[i + 1] !== '') {
  30. // reset offset for non-zero values
  31. offset = 16 - (vals.length - i - 1) * 2;
  32. }
  33. // skip zero bytes
  34. continue;
  35. }
  36. buf.writeUInt16BE(parseInt(vals[i], 16), offset);
  37. offset += 2;
  38. }
  39. return buf;
  40. default:
  41. return null;
  42. }
  43. }
  44. exports.bytesFromIP = bytesFromIP;
  45. /**
  46. * Converts 4-bytes into an IPv4 string representation or 16-bytes into
  47. * an IPv6 string representation. The bytes must be in network order.
  48. *
  49. * ```js
  50. * console.log(bytesToIP(Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]))) // '::1'
  51. * ```
  52. * @param bytes buffer to convert
  53. */
  54. function bytesToIP(bytes) {
  55. switch (bytes.length) {
  56. case 4:
  57. return [bytes[0], bytes[1], bytes[2], bytes[3]].join('.');
  58. case 16:
  59. const ip = [];
  60. let zeroAt = -1;
  61. let zeroLen = 0;
  62. let maxAt = -1;
  63. let maxLen = 0;
  64. for (let i = 0; i < bytes.length; i += 2) {
  65. const hex = (bytes[i] << 8) | bytes[i + 1];
  66. if (hex === 0) {
  67. zeroLen++;
  68. if (zeroAt === -1) {
  69. zeroAt = ip.length;
  70. }
  71. if (zeroLen > maxLen) {
  72. maxLen = zeroLen;
  73. maxAt = zeroAt;
  74. }
  75. }
  76. else {
  77. zeroAt = -1;
  78. zeroLen = 0;
  79. }
  80. ip.push(hex.toString(16));
  81. }
  82. if (maxLen > 0) {
  83. let padding = '';
  84. const rest = ip.slice(maxAt + maxLen);
  85. ip.length = maxAt;
  86. if (ip.length === 0) {
  87. padding += ':';
  88. }
  89. if (rest.length === 0) {
  90. padding += ':';
  91. }
  92. ip.push(padding, ...rest);
  93. }
  94. return ip.join(':');
  95. default:
  96. return '';
  97. }
  98. }
  99. exports.bytesToIP = bytesToIP;
  100. const oids = Object.create(null);
  101. const oidReg = /^[0-9.]+$/;
  102. /**
  103. * Returns Object Identifier (dot-separated numeric string) that registered by initOID function.
  104. * It will return empty string if not exists.
  105. * @param nameOrId OID name or OID
  106. */
  107. function getOID(nameOrId) {
  108. if (oidReg.test(nameOrId) && oids[nameOrId] !== '') {
  109. return nameOrId;
  110. }
  111. return oids[nameOrId] == null ? '' : oids[nameOrId];
  112. }
  113. exports.getOID = getOID;
  114. /**
  115. * Returns Object Identifier name that registered by initOID function.
  116. * It will return the argument nameOrId if not exists.
  117. * @param nameOrId OID name or OID
  118. */
  119. function getOIDName(nameOrId) {
  120. if (!oidReg.test(nameOrId) && oids[nameOrId] !== '') {
  121. return nameOrId;
  122. }
  123. return oids[nameOrId] == null ? nameOrId : oids[nameOrId];
  124. }
  125. exports.getOIDName = getOIDName;
  126. /**
  127. * Register OID and name
  128. * @param oid Object Identifier
  129. * @param name Object Identifier name
  130. */
  131. function initOID(oid, name) {
  132. oids[oid] = name;
  133. oids[name] = oid;
  134. }
  135. // algorithm OIDs
  136. initOID('1.2.840.113549.1.1.1', 'rsaEncryption');
  137. initOID('1.2.840.113549.1.1.4', 'md5WithRsaEncryption');
  138. initOID('1.2.840.113549.1.1.5', 'sha1WithRsaEncryption');
  139. initOID('1.2.840.113549.1.1.8', 'mgf1');
  140. initOID('1.2.840.113549.1.1.10', 'RSASSA-PSS');
  141. initOID('1.2.840.113549.1.1.11', 'sha256WithRsaEncryption');
  142. initOID('1.2.840.113549.1.1.12', 'sha384WithRsaEncryption');
  143. initOID('1.2.840.113549.1.1.13', 'sha512WithRsaEncryption');
  144. initOID('1.2.840.10045.2.1', 'ecEncryption'); // ECDSA and ECDH Public Key
  145. initOID('1.2.840.10045.4.1', 'ecdsaWithSha1');
  146. initOID('1.2.840.10045.4.3.2', 'ecdsaWithSha256');
  147. initOID('1.2.840.10045.4.3.3', 'ecdsaWithSha384');
  148. initOID('1.2.840.10045.4.3.4', 'ecdsaWithSha512');
  149. initOID('1.2.840.10040.4.3', 'dsaWithSha1');
  150. initOID('2.16.840.1.101.3.4.3.2', 'dsaWithSha256');
  151. initOID('1.3.14.3.2.7', 'desCBC');
  152. initOID('1.3.14.3.2.26', 'sha1');
  153. initOID('2.16.840.1.101.3.4.2.1', 'sha256');
  154. initOID('2.16.840.1.101.3.4.2.2', 'sha384');
  155. initOID('2.16.840.1.101.3.4.2.3', 'sha512');
  156. initOID('1.2.840.113549.2.5', 'md5');
  157. // Algorithm Identifiers for Ed25519, Ed448, X25519 and X448 for use in the Internet X.509 Public Key Infrastructure
  158. // https://tools.ietf.org/html/draft-ietf-curdle-pkix-10
  159. initOID('1.3.101.110', 'X25519');
  160. initOID('1.3.101.111', 'X448');
  161. initOID('1.3.101.112', 'Ed25519');
  162. initOID('1.3.101.113', 'Ed448');
  163. // pkcs#7 content types
  164. initOID('1.2.840.113549.1.7.1', 'data');
  165. initOID('1.2.840.113549.1.7.2', 'signedData');
  166. initOID('1.2.840.113549.1.7.3', 'envelopedData');
  167. initOID('1.2.840.113549.1.7.4', 'signedAndEnvelopedData');
  168. initOID('1.2.840.113549.1.7.5', 'digestedData');
  169. initOID('1.2.840.113549.1.7.6', 'encryptedData');
  170. // pkcs#9 oids
  171. initOID('1.2.840.113549.1.9.1', 'emailAddress');
  172. initOID('1.2.840.113549.1.9.2', 'unstructuredName');
  173. initOID('1.2.840.113549.1.9.3', 'contentType');
  174. initOID('1.2.840.113549.1.9.4', 'messageDigest');
  175. initOID('1.2.840.113549.1.9.5', 'signingTime');
  176. initOID('1.2.840.113549.1.9.6', 'counterSignature');
  177. initOID('1.2.840.113549.1.9.7', 'challengePassword');
  178. initOID('1.2.840.113549.1.9.8', 'unstructuredAddress');
  179. initOID('1.2.840.113549.1.9.14', 'extensionRequest');
  180. initOID('1.2.840.113549.1.9.20', 'friendlyName');
  181. initOID('1.2.840.113549.1.9.21', 'localKeyId');
  182. initOID('1.2.840.113549.1.9.22.1', 'x509Certificate');
  183. // pkcs#12 safe bags
  184. initOID('1.2.840.113549.1.12.10.1.1', 'keyBag');
  185. initOID('1.2.840.113549.1.12.10.1.2', 'pkcs8ShroudedKeyBag');
  186. initOID('1.2.840.113549.1.12.10.1.3', 'certBag');
  187. initOID('1.2.840.113549.1.12.10.1.4', 'crlBag');
  188. initOID('1.2.840.113549.1.12.10.1.5', 'secretBag');
  189. initOID('1.2.840.113549.1.12.10.1.6', 'safeContentsBag');
  190. // password-based-encryption for pkcs#12
  191. initOID('1.2.840.113549.1.5.13', 'pkcs5PBES2');
  192. initOID('1.2.840.113549.1.5.12', 'pkcs5PBKDF2');
  193. // hmac OIDs
  194. initOID('1.2.840.113549.2.7', 'hmacWithSha1');
  195. initOID('1.2.840.113549.2.9', 'hmacWithSha256');
  196. initOID('1.2.840.113549.2.10', 'hmacWithSha384');
  197. initOID('1.2.840.113549.2.11', 'hmacWithSha512');
  198. // symmetric key algorithm oids
  199. initOID('1.2.840.113549.3.7', '3desCBC');
  200. initOID('2.16.840.1.101.3.4.1.2', 'aesCBC128');
  201. initOID('2.16.840.1.101.3.4.1.42', 'aesCBC256');
  202. // certificate issuer/subject OIDs
  203. initOID('2.5.4.3', 'commonName');
  204. initOID('2.5.4.5', 'serialName');
  205. initOID('2.5.4.6', 'countryName');
  206. initOID('2.5.4.7', 'localityName');
  207. initOID('2.5.4.8', 'stateOrProvinceName');
  208. initOID('2.5.4.10', 'organizationName');
  209. initOID('2.5.4.11', 'organizationalUnitName');
  210. initOID('2.5.4.15', 'businessCategory');
  211. // X.509 extension OIDs
  212. initOID('2.16.840.1.113730.1.1', 'nsCertType');
  213. initOID('2.5.29.2', 'keyAttributes'); // obsolete, use .37 or .15
  214. initOID('2.5.29.4', 'keyUsageRestriction'); // obsolete, use .37 or .15
  215. initOID('2.5.29.6', 'subtreesConstraint'); // obsolete, use .30
  216. initOID('2.5.29.9', 'subjectDirectoryAttributes');
  217. initOID('2.5.29.14', 'subjectKeyIdentifier');
  218. initOID('2.5.29.15', 'keyUsage');
  219. initOID('2.5.29.16', 'privateKeyUsagePeriod');
  220. initOID('2.5.29.17', 'subjectAltName');
  221. initOID('2.5.29.18', 'issuerAltName');
  222. initOID('2.5.29.19', 'basicConstraints');
  223. initOID('2.5.29.20', 'cRLNumber');
  224. initOID('2.5.29.21', 'cRLReason');
  225. initOID('2.5.29.22', 'expirationDate');
  226. initOID('2.5.29.23', 'instructionCode');
  227. initOID('2.5.29.24', 'invalidityDate');
  228. initOID('2.5.29.27', 'deltaCRLIndicator');
  229. initOID('2.5.29.28', 'issuingDistributionPoint');
  230. initOID('2.5.29.29', 'certificateIssuer');
  231. initOID('2.5.29.30', 'nameConstraints');
  232. initOID('2.5.29.31', 'cRLDistributionPoints');
  233. initOID('2.5.29.32', 'certificatePolicies');
  234. initOID('2.5.29.33', 'policyMappings');
  235. initOID('2.5.29.35', 'authorityKeyIdentifier');
  236. initOID('2.5.29.36', 'policyConstraints');
  237. initOID('2.5.29.37', 'extKeyUsage');
  238. initOID('2.5.29.46', 'freshestCRL');
  239. initOID('2.5.29.54', 'inhibitAnyPolicy');
  240. // extKeyUsage purposes
  241. initOID('1.3.6.1.4.1.311.60.2.1.2', 'jurisdictionST');
  242. initOID('1.3.6.1.4.1.311.60.2.1.3', 'jurisdictionC');
  243. initOID('1.3.6.1.4.1.11129.2.4.2', 'timestampList');
  244. initOID('1.3.6.1.5.5.7.1.1', 'authorityInfoAccess');
  245. initOID('1.3.6.1.5.5.7.3.1', 'serverAuth');
  246. initOID('1.3.6.1.5.5.7.3.2', 'clientAuth');
  247. initOID('1.3.6.1.5.5.7.3.3', 'codeSigning');
  248. initOID('1.3.6.1.5.5.7.3.4', 'emailProtection');
  249. initOID('1.3.6.1.5.5.7.3.8', 'timeStamping');
  250. initOID('1.3.6.1.5.5.7.48.1', 'authorityInfoAccessOcsp');
  251. initOID('1.3.6.1.5.5.7.48.2', 'authorityInfoAccessIssuers');
  252. //# sourceMappingURL=common.js.map