@naylence/advanced-security 0.3.5-test.101 → 0.3.5-test.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/browser/index.js +13385 -12988
  2. package/dist/browser/index.js.map +1 -1
  3. package/dist/cjs/browser.js +1 -0
  4. package/dist/cjs/browser.js.map +1 -1
  5. package/dist/cjs/naylence/fame/factory-manifest.js +14 -0
  6. package/dist/cjs/naylence/fame/factory-manifest.js.map +1 -1
  7. package/dist/cjs/naylence/fame/security/cert/browser-csr.js +103 -0
  8. package/dist/cjs/naylence/fame/security/cert/browser-csr.js.map +1 -0
  9. package/dist/cjs/naylence/fame/security/cert/ca-service-client.js +331 -24
  10. package/dist/cjs/naylence/fame/security/cert/ca-service-client.js.map +1 -1
  11. package/dist/cjs/naylence/fame/security/cert/ca-types.js +8 -0
  12. package/dist/cjs/naylence/fame/security/cert/ca-types.js.map +1 -1
  13. package/dist/cjs/naylence/fame/security/cert/csr-types.js +2 -0
  14. package/dist/cjs/naylence/fame/security/cert/csr-types.js.map +1 -0
  15. package/dist/cjs/naylence/fame/security/cert/default-ca-service.js +102 -1
  16. package/dist/cjs/naylence/fame/security/cert/default-ca-service.js.map +1 -1
  17. package/dist/cjs/naylence/fame/security/cert/default-certificate-manager.js +240 -45
  18. package/dist/cjs/naylence/fame/security/cert/default-certificate-manager.js.map +1 -1
  19. package/dist/cjs/naylence/fame/security/cert/index.js +4 -1
  20. package/dist/cjs/naylence/fame/security/cert/index.js.map +1 -1
  21. package/dist/cjs/naylence/fame/security/cert/internal-ca-service.js +2 -5
  22. package/dist/cjs/naylence/fame/security/cert/internal-ca-service.js.map +1 -1
  23. package/dist/cjs/naylence/fame/security/cert/node-ed25519-csr.js +156 -0
  24. package/dist/cjs/naylence/fame/security/cert/node-ed25519-csr.js.map +1 -0
  25. package/dist/cjs/naylence/fame/security/cert/oid-constants.js +7 -0
  26. package/dist/cjs/naylence/fame/security/cert/oid-constants.js.map +1 -0
  27. package/dist/cjs/naylence/fame/security/cert/trust-store/anchor-utils.js +119 -0
  28. package/dist/cjs/naylence/fame/security/cert/trust-store/anchor-utils.js.map +1 -0
  29. package/dist/cjs/naylence/fame/security/cert/trust-store/env-provider.js +123 -0
  30. package/dist/cjs/naylence/fame/security/cert/trust-store/env-provider.js.map +1 -0
  31. package/dist/cjs/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js +220 -0
  32. package/dist/cjs/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js.map +1 -0
  33. package/dist/cjs/naylence/fame/security/cert/trust-store/http-bundle-provider.js +411 -0
  34. package/dist/cjs/naylence/fame/security/cert/trust-store/http-bundle-provider.js.map +1 -0
  35. package/dist/cjs/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js +2 -0
  36. package/dist/cjs/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js.map +1 -0
  37. package/dist/cjs/naylence/fame/security/cert/trust-store/static-bundle-provider.js +37 -0
  38. package/dist/cjs/naylence/fame/security/cert/trust-store/static-bundle-provider.js.map +1 -0
  39. package/dist/cjs/naylence/fame/security/cert/trust-store/trust-store-provider.js +2 -0
  40. package/dist/cjs/naylence/fame/security/cert/trust-store/trust-store-provider.js.map +1 -0
  41. package/dist/cjs/naylence/fame/security/cert/util.js +1 -2
  42. package/dist/cjs/naylence/fame/security/cert/util.js.map +1 -1
  43. package/dist/cjs/version.js +2 -2
  44. package/dist/esm/browser.js +1 -0
  45. package/dist/esm/browser.js.map +1 -1
  46. package/dist/esm/naylence/fame/factory-manifest.js +14 -0
  47. package/dist/esm/naylence/fame/factory-manifest.js.map +1 -1
  48. package/dist/esm/naylence/fame/security/cert/browser-csr.js +103 -0
  49. package/dist/esm/naylence/fame/security/cert/browser-csr.js.map +1 -0
  50. package/dist/esm/naylence/fame/security/cert/ca-server.js +35 -0
  51. package/dist/esm/naylence/fame/security/cert/ca-server.js.map +1 -1
  52. package/dist/esm/naylence/fame/security/cert/ca-service-client.js +331 -24
  53. package/dist/esm/naylence/fame/security/cert/ca-service-client.js.map +1 -1
  54. package/dist/esm/naylence/fame/security/cert/ca-types.js +8 -0
  55. package/dist/esm/naylence/fame/security/cert/ca-types.js.map +1 -1
  56. package/dist/esm/naylence/fame/security/cert/csr-types.js +2 -0
  57. package/dist/esm/naylence/fame/security/cert/csr-types.js.map +1 -0
  58. package/dist/esm/naylence/fame/security/cert/default-ca-service.js +102 -1
  59. package/dist/esm/naylence/fame/security/cert/default-ca-service.js.map +1 -1
  60. package/dist/esm/naylence/fame/security/cert/default-certificate-manager.js +240 -45
  61. package/dist/esm/naylence/fame/security/cert/default-certificate-manager.js.map +1 -1
  62. package/dist/esm/naylence/fame/security/cert/index.js +4 -1
  63. package/dist/esm/naylence/fame/security/cert/index.js.map +1 -1
  64. package/dist/esm/naylence/fame/security/cert/internal-ca-service.js +2 -5
  65. package/dist/esm/naylence/fame/security/cert/internal-ca-service.js.map +1 -1
  66. package/dist/esm/naylence/fame/security/cert/node-ed25519-csr.js +156 -0
  67. package/dist/esm/naylence/fame/security/cert/node-ed25519-csr.js.map +1 -0
  68. package/dist/esm/naylence/fame/security/cert/oid-constants.js +7 -0
  69. package/dist/esm/naylence/fame/security/cert/oid-constants.js.map +1 -0
  70. package/dist/esm/naylence/fame/security/cert/trust-store/anchor-utils.js +119 -0
  71. package/dist/esm/naylence/fame/security/cert/trust-store/anchor-utils.js.map +1 -0
  72. package/dist/esm/naylence/fame/security/cert/trust-store/env-provider.js +123 -0
  73. package/dist/esm/naylence/fame/security/cert/trust-store/env-provider.js.map +1 -0
  74. package/dist/esm/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js +220 -0
  75. package/dist/esm/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js.map +1 -0
  76. package/dist/esm/naylence/fame/security/cert/trust-store/http-bundle-provider.js +411 -0
  77. package/dist/esm/naylence/fame/security/cert/trust-store/http-bundle-provider.js.map +1 -0
  78. package/dist/esm/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js +2 -0
  79. package/dist/esm/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js.map +1 -0
  80. package/dist/esm/naylence/fame/security/cert/trust-store/static-bundle-provider.js +37 -0
  81. package/dist/esm/naylence/fame/security/cert/trust-store/static-bundle-provider.js.map +1 -0
  82. package/dist/esm/naylence/fame/security/cert/trust-store/trust-store-provider.js +2 -0
  83. package/dist/esm/naylence/fame/security/cert/trust-store/trust-store-provider.js.map +1 -0
  84. package/dist/esm/naylence/fame/security/cert/util.js +1 -2
  85. package/dist/esm/naylence/fame/security/cert/util.js.map +1 -1
  86. package/dist/esm/version.js +2 -2
  87. package/dist/types/browser.d.ts +2 -0
  88. package/dist/types/browser.d.ts.map +1 -1
  89. package/dist/types/naylence/fame/factory-manifest.d.ts +2 -0
  90. package/dist/types/naylence/fame/factory-manifest.d.ts.map +1 -1
  91. package/dist/types/naylence/fame/security/cert/browser-csr.d.ts +9 -0
  92. package/dist/types/naylence/fame/security/cert/browser-csr.d.ts.map +1 -0
  93. package/dist/types/naylence/fame/security/cert/ca-server.d.ts.map +1 -1
  94. package/dist/types/naylence/fame/security/cert/ca-service-client.d.ts.map +1 -1
  95. package/dist/types/naylence/fame/security/cert/ca-types.d.ts +32 -0
  96. package/dist/types/naylence/fame/security/cert/ca-types.d.ts.map +1 -1
  97. package/dist/types/naylence/fame/security/cert/csr-types.d.ts +5 -0
  98. package/dist/types/naylence/fame/security/cert/csr-types.d.ts.map +1 -0
  99. package/dist/types/naylence/fame/security/cert/default-ca-service.d.ts +2 -1
  100. package/dist/types/naylence/fame/security/cert/default-ca-service.d.ts.map +1 -1
  101. package/dist/types/naylence/fame/security/cert/default-certificate-manager.d.ts +33 -1
  102. package/dist/types/naylence/fame/security/cert/default-certificate-manager.d.ts.map +1 -1
  103. package/dist/types/naylence/fame/security/cert/index.d.ts +5 -1
  104. package/dist/types/naylence/fame/security/cert/index.d.ts.map +1 -1
  105. package/dist/types/naylence/fame/security/cert/internal-ca-service.d.ts +0 -3
  106. package/dist/types/naylence/fame/security/cert/internal-ca-service.d.ts.map +1 -1
  107. package/dist/types/naylence/fame/security/cert/node-ed25519-csr.d.ts +9 -0
  108. package/dist/types/naylence/fame/security/cert/node-ed25519-csr.d.ts.map +1 -0
  109. package/dist/types/naylence/fame/security/cert/oid-constants.d.ts +7 -0
  110. package/dist/types/naylence/fame/security/cert/oid-constants.d.ts.map +1 -0
  111. package/dist/types/naylence/fame/security/cert/trust-store/anchor-utils.d.ts +12 -0
  112. package/dist/types/naylence/fame/security/cert/trust-store/anchor-utils.d.ts.map +1 -0
  113. package/dist/types/naylence/fame/security/cert/trust-store/env-provider.d.ts +7 -0
  114. package/dist/types/naylence/fame/security/cert/trust-store/env-provider.d.ts.map +1 -0
  115. package/dist/types/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.d.ts +9 -0
  116. package/dist/types/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.d.ts.map +1 -0
  117. package/dist/types/naylence/fame/security/cert/trust-store/http-bundle-provider.d.ts +31 -0
  118. package/dist/types/naylence/fame/security/cert/trust-store/http-bundle-provider.d.ts.map +1 -0
  119. package/dist/types/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.d.ts +2 -0
  120. package/dist/types/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.d.ts.map +1 -0
  121. package/dist/types/naylence/fame/security/cert/trust-store/static-bundle-provider.d.ts +13 -0
  122. package/dist/types/naylence/fame/security/cert/trust-store/static-bundle-provider.d.ts.map +1 -0
  123. package/dist/types/naylence/fame/security/cert/trust-store/trust-store-provider.d.ts +37 -0
  124. package/dist/types/naylence/fame/security/cert/trust-store/trust-store-provider.d.ts.map +1 -0
  125. package/dist/types/naylence/fame/security/cert/util.d.ts.map +1 -1
  126. package/dist/types/version.d.ts +1 -1
  127. package/package.json +8 -5
@@ -1 +1 @@
1
- {"version":3,"file":"factory-manifest.js","sourceRoot":"","sources":["../../../../src/naylence/fame/factory-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,+CAA+C;IAC/C,wDAAwD;IACxD,qEAAqE;IACrE,+DAA+D;IAC/D,iEAAiE;IACjE,mEAAmE;IACnE,4CAA4C;IAC5C,qDAAqD;IACrD,uDAAuD;IACvD,8DAA8D;IAC9D,wDAAwD;IACxD,+CAA+C;CACvC,CAAC"}
1
+ {"version":3,"file":"factory-manifest.js","sourceRoot":"","sources":["../../../../src/naylence/fame/factory-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,+CAA+C;IAC/C,wDAAwD;IACxD,qEAAqE;IACrE,+DAA+D;IAC/D,iEAAiE;IACjE,mEAAmE;IACnE,4CAA4C;IAC5C,qDAAqD;IACrD,uDAAuD;IACvD,8DAA8D;IAC9D,wDAAwD;IACxD,+CAA+C;CACvC,CAAC;AAKX,MAAM,CAAC,MAAM,cAAc,GAAmD;IAC5E,+CAA+C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,+CAA+C,CAAC;IAC9G,wDAAwD,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,wDAAwD,CAAC;IAChI,qEAAqE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,qEAAqE,CAAC;IAC1J,+DAA+D,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,+DAA+D,CAAC;IAC9I,iEAAiE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iEAAiE,CAAC;IAClJ,mEAAmE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mEAAmE,CAAC;IACtJ,4CAA4C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,4CAA4C,CAAC;IACxG,qDAAqD,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,qDAAqD,CAAC;IAC1H,uDAAuD,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,uDAAuD,CAAC;IAC9H,8DAA8D,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,8DAA8D,CAAC;IAC5I,wDAAwD,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,wDAAwD,CAAC;IAChI,+CAA+C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,+CAA+C,CAAC;CAC/G,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { AsnConvert, OctetString } from "@peculiar/asn1-schema";
2
+ import { Attributes, CertificationRequest, CertificationRequestInfo, } from "@peculiar/asn1-csr";
3
+ import { AlgorithmIdentifier, Attribute, AttributeTypeAndValue, AttributeValue, Extension, Extensions, GeneralName, Name, RelativeDistinguishedName, SubjectAlternativeName, SubjectPublicKeyInfo, id_ce_subjectAltName, } from "@peculiar/asn1-x509";
4
+ const ED25519_OID = "1.3.101.112";
5
+ const OID_COMMON_NAME = "2.5.4.3";
6
+ const LOGICAL_URI_PREFIX = "naylence://";
7
+ function ensureSubtleCrypto() {
8
+ const instance = globalThis.crypto?.subtle;
9
+ if (!instance) {
10
+ throw new Error("WebCrypto subtle API is required to create a CSR");
11
+ }
12
+ return instance;
13
+ }
14
+ function buildSubject(commonName) {
15
+ if (!commonName || typeof commonName !== "string") {
16
+ throw new Error("commonName must be a non-empty string");
17
+ }
18
+ return new Name([
19
+ new RelativeDistinguishedName([
20
+ new AttributeTypeAndValue({
21
+ type: OID_COMMON_NAME,
22
+ value: new AttributeValue({ utf8String: commonName }),
23
+ }),
24
+ ]),
25
+ ]);
26
+ }
27
+ function arrayBufferToBase64(buffer) {
28
+ const bytes = new Uint8Array(buffer);
29
+ if (typeof globalThis.Buffer?.from === "function") {
30
+ return globalThis.Buffer.from(bytes).toString("base64");
31
+ }
32
+ let binary = "";
33
+ const chunkSize = 0x8000;
34
+ for (let offset = 0; offset < bytes.length; offset += chunkSize) {
35
+ const slice = bytes.subarray(offset, offset + chunkSize);
36
+ binary += String.fromCharCode(...slice);
37
+ }
38
+ if (typeof globalThis.btoa !== "function") {
39
+ throw new Error("Base64 encoding not available in this environment");
40
+ }
41
+ return globalThis.btoa(binary);
42
+ }
43
+ function derToPem(der, label) {
44
+ const base64 = arrayBufferToBase64(der);
45
+ const lines = [];
46
+ for (let index = 0; index < base64.length; index += 64) {
47
+ lines.push(base64.slice(index, index + 64));
48
+ }
49
+ return `-----BEGIN ${label}-----\n${lines.join("\n")}\n-----END ${label}-----\n`;
50
+ }
51
+ export async function createEd25519Csr(options) {
52
+ const subtle = ensureSubtleCrypto();
53
+ const { privateKey, publicKey, commonName } = options;
54
+ if (!(privateKey instanceof CryptoKey) || privateKey.type !== "private") {
55
+ throw new Error("privateKey must be a CryptoKey of type 'private'");
56
+ }
57
+ if (!(publicKey instanceof CryptoKey) || publicKey.type !== "public") {
58
+ throw new Error("publicKey must be a CryptoKey of type 'public'");
59
+ }
60
+ const subject = buildSubject(commonName);
61
+ const spkiDer = await subtle.exportKey("spki", publicKey);
62
+ const subjectPublicKeyInfo = AsnConvert.parse(spkiDer, SubjectPublicKeyInfo);
63
+ const attributes = new Attributes();
64
+ const sanitizedLogicals = Array.isArray(options.logicals)
65
+ ? options.logicals
66
+ .map((logical) => logical.trim())
67
+ .filter((logical) => logical.length > 0)
68
+ : [];
69
+ if (sanitizedLogicals.length > 0) {
70
+ const san = new SubjectAlternativeName(sanitizedLogicals.map((logical) => new GeneralName({
71
+ uniformResourceIdentifier: `${LOGICAL_URI_PREFIX}${logical}`,
72
+ })));
73
+ const extensions = new Extensions([
74
+ new Extension({
75
+ extnID: id_ce_subjectAltName,
76
+ critical: false,
77
+ extnValue: new OctetString(AsnConvert.serialize(san)),
78
+ }),
79
+ ]);
80
+ attributes.push(new Attribute({
81
+ type: "1.2.840.113549.1.9.14",
82
+ values: [AsnConvert.serialize(extensions)],
83
+ }));
84
+ }
85
+ const requestInfo = new CertificationRequestInfo({
86
+ subject,
87
+ subjectPKInfo: subjectPublicKeyInfo,
88
+ attributes,
89
+ });
90
+ const requestInfoDer = AsnConvert.serialize(requestInfo);
91
+ const signature = await subtle.sign("Ed25519", privateKey, requestInfoDer);
92
+ const certificationRequest = new CertificationRequest({
93
+ certificationRequestInfo: requestInfo,
94
+ signatureAlgorithm: new AlgorithmIdentifier({
95
+ algorithm: ED25519_OID,
96
+ }),
97
+ signature,
98
+ });
99
+ const csrDer = AsnConvert.serialize(certificationRequest);
100
+ const csrPem = derToPem(csrDer, "CERTIFICATE REQUEST");
101
+ return { csrPem, csrDer };
102
+ }
103
+ //# sourceMappingURL=browser-csr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-csr.js","sourceRoot":"","sources":["../../../../../../src/naylence/fame/security/cert/browser-csr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EACN,UAAU,EACV,oBAAoB,EACpB,wBAAwB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACrB,cAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,IAAI,EACJ,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AASzC,SAAS,kBAAkB;IAC1B,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB;IACvC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,IAAI,CAAC;QACf,IAAI,yBAAyB,CAAC;YAC7B,IAAI,qBAAqB,CAAC;gBACzB,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;aACrD,CAAC;SACF,CAAC;KACF,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,OAAO,UAAU,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;QACnD,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,SAAS,GAAG,MAAM,CAAC;IACzB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QACzD,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAgB,EAAE,KAAa;IAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,cAAc,KAAK,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAAgC;IAEhC,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEtD,IAAI,CAAC,CAAC,UAAU,YAAY,SAAS,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,CAAC,SAAS,YAAY,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,oBAAoB,GAAG,UAAU,CAAC,KAAK,CAC5C,OAAO,EACP,oBAAoB,CACpB,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxD,CAAC,CAAC,OAAO,CAAC,QAAQ;aACf,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;aAChC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;IAEN,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,sBAAsB,CACrC,iBAAiB,CAAC,GAAG,CACpB,CAAC,OAAO,EAAE,EAAE,CACX,IAAI,WAAW,CAAC;YACf,yBAAyB,EAAE,GAAG,kBAAkB,GAAG,OAAO,EAAE;SAC5D,CAAC,CACH,CACD,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC;YACjC,IAAI,SAAS,CAAC;gBACb,MAAM,EAAE,oBAAoB;gBAC5B,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;aACrD,CAAC;SACF,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CACd,IAAI,SAAS,CAAC;YACb,IAAI,EAAE,uBAAuB;YAC7B,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;SAC1C,CAAC,CACF,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,wBAAwB,CAAC;QAChD,OAAO;QACP,aAAa,EAAE,oBAAoB;QACnC,UAAU;KACV,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAE3E,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,CAAC;QACrD,wBAAwB,EAAE,WAAW;QACrC,kBAAkB,EAAE,IAAI,mBAAmB,CAAC;YAC3C,SAAS,EAAE,WAAW;SACtB,CAAC;QACF,SAAS;KACT,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC"}
@@ -5,6 +5,7 @@
5
5
  * Provides certificate issuance via HTTP using Fastify.
6
6
  * Mirrors the Python ca_server.py implementation.
7
7
  */
8
+ import { sha256 } from "@noble/hashes/sha256.js";
8
9
  import Fastify from "fastify";
9
10
  import { CAServiceFactory } from "./ca-service-factory.js";
10
11
  // Simple console logger for CA server
@@ -97,6 +98,30 @@ function createCaRouter(fastify, caService, prefix = "/fame/v1/ca") {
97
98
  fastify.get("/health", async () => {
98
99
  return { status: "healthy", service: "ca-server" };
99
100
  });
101
+ const trustBundlePath = "/.well-known/naylence/trust-bundle.json";
102
+ fastify.get(trustBundlePath, async (request, reply) => {
103
+ const bundle = await caService.getTrustBundle();
104
+ if (!bundle) {
105
+ return reply.status(404).send({
106
+ error: "trust_bundle_unavailable",
107
+ });
108
+ }
109
+ const payload = JSON.stringify(bundle);
110
+ const etag = `"${computeEtag(payload)}"`;
111
+ const requestEtag = request.headers["if-none-match"];
112
+ if (typeof requestEtag === "string" && requestEtag.replace(/W\//u, "") === etag.replace(/W\//u, "")) {
113
+ return reply
114
+ .status(304)
115
+ .header("ETag", etag)
116
+ .header("Cache-Control", trustBundleCacheControl())
117
+ .send();
118
+ }
119
+ return reply
120
+ .header("Content-Type", "application/json")
121
+ .header("Cache-Control", trustBundleCacheControl())
122
+ .header("ETag", etag)
123
+ .send(bundle);
124
+ });
100
125
  }
101
126
  /**
102
127
  * Create Fastify application with CA service lifespan management.
@@ -150,4 +175,14 @@ if (import.meta.url === `file://${process.argv[1]}`) {
150
175
  });
151
176
  }
152
177
  export { createApp };
178
+ function computeEtag(payload) {
179
+ const encoder = new TextEncoder();
180
+ const digest = sha256(encoder.encode(payload));
181
+ return Array.from(digest)
182
+ .map((byte) => byte.toString(16).padStart(2, "0"))
183
+ .join("");
184
+ }
185
+ function trustBundleCacheControl() {
186
+ return "public, max-age=3600, stale-while-revalidate=86400";
187
+ }
153
188
  //# sourceMappingURL=ca-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ca-server.js","sourceRoot":"","sources":["../../../../../../src/naylence/fame/security/cert/ca-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ca-server.js","sourceRoot":"","sources":["../../../../../../src/naylence/fame/security/cert/ca-server.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,11 @@
3
3
  *
4
4
  * Provides async HTTP client to request certificates from the CA signing service.
5
5
  */
6
+ import { AsnConvert } from "@peculiar/asn1-schema";
7
+ import { Certificate, SubjectAlternativeName } from "@peculiar/asn1-x509";
8
+ import { X509Certificate } from "@peculiar/x509";
6
9
  import { CertificateRequestError } from "./ca-types.js";
10
+ import { LOGICALS_OID, NODE_ID_OID, SID_OID } from "./oid-constants.js";
7
11
  // Simple logger for now - TODO: integrate with runtime logging
8
12
  const logger = {
9
13
  debug: (_event, _meta) => {
@@ -24,16 +28,104 @@ export const ENV_VAR_FAME_CA_SERVICE_URL = "FAME_CA_SERVICE_URL";
24
28
  */
25
29
  export function extractCertificateInfo(_certPem) {
26
30
  try {
27
- // TODO: Implement using node-forge or similar library
28
- // For now, return a placeholder
29
- return {
30
- subject: "TODO: Parse certificate",
31
- issuer: "TODO: Parse certificate",
32
- serialNumber: "TODO",
33
- validFrom: new Date().toISOString(),
34
- validUntil: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
31
+ const pemBlock = extractFirstCertificatePem(_certPem);
32
+ if (!pemBlock) {
33
+ throw new Error("certificate PEM block not found");
34
+ }
35
+ const certDer = pemToArrayBuffer(pemBlock);
36
+ const certificate = new X509Certificate(certDer);
37
+ const certificateRecord = certificate;
38
+ const parsedCertificate = AsnConvert.parse(certDer, Certificate);
39
+ const subject = readOptionalStringProperty(certificateRecord, "subject") ??
40
+ formatDistinguishedName(parsedCertificate.tbsCertificate.subject);
41
+ const issuer = readOptionalStringProperty(certificateRecord, "issuer") ??
42
+ formatDistinguishedName(parsedCertificate.tbsCertificate.issuer);
43
+ const serialNumber = readOptionalStringProperty(certificateRecord, "serialNumber") ??
44
+ bytesToHex(parsedCertificate.tbsCertificate.serialNumber);
45
+ const validFromDate = readOptionalDateProperty(certificateRecord, "notBefore") ??
46
+ readValidityDate(parsedCertificate.tbsCertificate.validity.notBefore);
47
+ const validUntilDate = readOptionalDateProperty(certificateRecord, "notAfter") ??
48
+ readValidityDate(parsedCertificate.tbsCertificate.validity.notAfter);
49
+ if (!validFromDate || !validUntilDate) {
50
+ throw new Error("certificate validity period is missing");
51
+ }
52
+ const info = {
53
+ subject,
54
+ issuer,
55
+ serialNumber,
56
+ validFrom: validFromDate.toISOString(),
57
+ validUntil: validUntilDate.toISOString(),
35
58
  status: "unknown",
36
59
  };
60
+ const now = new Date();
61
+ if (now < validFromDate) {
62
+ info.status = "not_yet_valid";
63
+ }
64
+ else if (now > validUntilDate) {
65
+ info.status = "expired";
66
+ }
67
+ else {
68
+ info.status = "valid";
69
+ const diffMs = validUntilDate.getTime() - now.getTime();
70
+ info.daysRemaining = Math.floor(diffMs / (24 * 60 * 60 * 1000));
71
+ const hoursRemainder = diffMs % (24 * 60 * 60 * 1000);
72
+ info.hoursRemaining = Math.floor(hoursRemainder / (60 * 60 * 1000));
73
+ const minutesRemainder = hoursRemainder % (60 * 60 * 1000);
74
+ info.minutesRemaining = Math.floor(minutesRemainder / (60 * 1000));
75
+ }
76
+ const sanExtension = getExtensionValue(certificate, "2.5.29.17");
77
+ if (sanExtension && toUint8Array(sanExtension).length > 0) {
78
+ const san = AsnConvert.parse(sanExtension, SubjectAlternativeName);
79
+ const altNames = [];
80
+ for (const generalName of san) {
81
+ const name = generalName;
82
+ if (typeof name.uniformResourceIdentifier === "string") {
83
+ altNames.push(name.uniformResourceIdentifier);
84
+ }
85
+ else if (typeof name.dNSName === "string") {
86
+ altNames.push(name.dNSName);
87
+ }
88
+ else if (typeof name.rfc822Name === "string") {
89
+ altNames.push(name.rfc822Name);
90
+ }
91
+ else if (name.iPAddress instanceof ArrayBuffer) {
92
+ altNames.push(formatIpAddress(toUint8Array(name.iPAddress)));
93
+ }
94
+ else if (name.iPAddress && ArrayBuffer.isView(name.iPAddress)) {
95
+ const view = name.iPAddress;
96
+ altNames.push(formatIpAddress(new Uint8Array(view.buffer, view.byteOffset, view.byteLength)));
97
+ }
98
+ }
99
+ if (altNames.length > 0) {
100
+ info.subjectAlternativeNames = altNames;
101
+ const spiffe = altNames.find((value) => value.startsWith("spiffe://"));
102
+ if (spiffe) {
103
+ info.spiffeId = spiffe;
104
+ }
105
+ }
106
+ }
107
+ const sidExtension = getExtensionValue(certificate, SID_OID);
108
+ if (sidExtension) {
109
+ info.nodeSid = decodeUtf8(sidExtension);
110
+ }
111
+ const nodeIdExtension = getExtensionValue(certificate, NODE_ID_OID);
112
+ if (nodeIdExtension) {
113
+ info.nodeId = decodeUtf8(nodeIdExtension);
114
+ }
115
+ const logicalsExtension = getExtensionValue(certificate, LOGICALS_OID);
116
+ if (logicalsExtension) {
117
+ try {
118
+ const logicalsJson = decodeUtf8(logicalsExtension);
119
+ const parsed = JSON.parse(logicalsJson);
120
+ if (Array.isArray(parsed)) {
121
+ info.logicalHosts = parsed.filter((entry) => typeof entry === "string");
122
+ }
123
+ }
124
+ catch {
125
+ // Ignore malformed extension payload – certificate remains valid.
126
+ }
127
+ }
128
+ return info;
37
129
  }
38
130
  catch (error) {
39
131
  return {
@@ -43,7 +135,7 @@ export function extractCertificateInfo(_certPem) {
43
135
  validFrom: "",
44
136
  validUntil: "",
45
137
  status: "unknown",
46
- error: `Failed to parse certificate: ${error}`,
138
+ error: `Failed to parse certificate: ${error instanceof Error ? error.message : String(error)}`,
47
139
  };
48
140
  }
49
141
  }
@@ -67,7 +159,7 @@ export function formatCertificateInfo(certPem, certType = "Certificate") {
67
159
  `Valid From: ${info.validFrom}`,
68
160
  `Valid Until: ${info.validUntil}`,
69
161
  ];
70
- if (info.subjectAlternativeNames && info.subjectAlternativeNames.length > 0) {
162
+ if (info.subjectAlternativeNames?.length) {
71
163
  lines.push(`Subject Alternative Names: ${info.subjectAlternativeNames.join(", ")}`);
72
164
  }
73
165
  if (info.spiffeId) {
@@ -79,24 +171,27 @@ export function formatCertificateInfo(certPem, certType = "Certificate") {
79
171
  if (info.nodeId) {
80
172
  lines.push(`Node ID: ${info.nodeId}`);
81
173
  }
82
- if (info.logicalHosts && info.logicalHosts.length > 0) {
174
+ if (info.logicalHosts?.length) {
83
175
  lines.push(`Logical Hosts: ${info.logicalHosts.join(", ")}`);
84
176
  }
85
- // Add validity status
86
- if (info.status === "valid" && info.daysRemaining !== undefined) {
87
- if (info.daysRemaining > 0) {
88
- lines.push(`Status: Valid (${info.daysRemaining} days remaining)`);
177
+ if (info.status === "valid") {
178
+ const pieces = [];
179
+ if (typeof info.daysRemaining === "number" && info.daysRemaining > 0) {
180
+ pieces.push(`${info.daysRemaining} days`);
89
181
  }
90
- else if (info.hoursRemaining !== undefined && info.hoursRemaining > 0) {
91
- if (info.minutesRemaining !== undefined && info.minutesRemaining > 0) {
92
- lines.push(`Status: Valid (${info.hoursRemaining} hours, ${info.minutesRemaining} minutes remaining)`);
93
- }
94
- else {
95
- lines.push(`Status: Valid (${info.hoursRemaining} hours remaining)`);
96
- }
182
+ if (typeof info.hoursRemaining === "number" && info.hoursRemaining > 0) {
183
+ pieces.push(`${info.hoursRemaining} hours`);
184
+ }
185
+ if (typeof info.minutesRemaining === "number" &&
186
+ info.minutesRemaining > 0 &&
187
+ pieces.length === 0) {
188
+ pieces.push(`${info.minutesRemaining} minutes`);
97
189
  }
98
- else if (info.minutesRemaining !== undefined) {
99
- lines.push(`Status: Valid (${info.minutesRemaining} minutes remaining)`);
190
+ if (pieces.length > 0) {
191
+ lines.push(`Status: Valid (${pieces.join(", ")})`);
192
+ }
193
+ else {
194
+ lines.push("Status: Valid");
100
195
  }
101
196
  }
102
197
  else if (info.status === "expired") {
@@ -105,8 +200,220 @@ export function formatCertificateInfo(certPem, certType = "Certificate") {
105
200
  else if (info.status === "not_yet_valid") {
106
201
  lines.push("Status: Not yet valid");
107
202
  }
203
+ else {
204
+ lines.push("Status: Unknown");
205
+ }
108
206
  return lines.join("\n");
109
207
  }
208
+ function extractFirstCertificatePem(pem) {
209
+ const match = pem.match(/-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/);
210
+ return match ? match[0] : null;
211
+ }
212
+ function pemToArrayBuffer(pem) {
213
+ const base64 = pem
214
+ .replace(/-----BEGIN CERTIFICATE-----/g, "")
215
+ .replace(/-----END CERTIFICATE-----/g, "")
216
+ .replace(/\s+/g, "");
217
+ if (typeof Buffer !== "undefined") {
218
+ const buffer = Buffer.from(base64, "base64");
219
+ const array = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
220
+ return array;
221
+ }
222
+ if (typeof globalThis.atob === "function") {
223
+ const binary = globalThis.atob(base64);
224
+ const length = binary.length;
225
+ const bytes = new Uint8Array(length);
226
+ for (let index = 0; index < length; index += 1) {
227
+ bytes[index] = binary.charCodeAt(index);
228
+ }
229
+ return bytes.buffer;
230
+ }
231
+ throw new Error("Base64 decoding not supported in this environment");
232
+ }
233
+ function formatIpAddress(bytes) {
234
+ if (bytes.length === 4) {
235
+ return Array.from(bytes).join(".");
236
+ }
237
+ if (bytes.length === 16) {
238
+ const hextets = [];
239
+ for (let index = 0; index < 16; index += 2) {
240
+ const value = (bytes[index] << 8) | bytes[index + 1];
241
+ hextets.push(value.toString(16));
242
+ }
243
+ return hextets.join(":");
244
+ }
245
+ return Array.from(bytes)
246
+ .map((value) => value.toString(16).padStart(2, "0"))
247
+ .join("");
248
+ }
249
+ function toUint8Array(source) {
250
+ if (source instanceof ArrayBuffer) {
251
+ return new Uint8Array(source);
252
+ }
253
+ return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
254
+ }
255
+ function decodeUtf8(data) {
256
+ if (typeof TextDecoder !== "undefined") {
257
+ return new TextDecoder().decode(data);
258
+ }
259
+ if (typeof Buffer !== "undefined") {
260
+ const buffer = Buffer.from(data);
261
+ return buffer.toString("utf8");
262
+ }
263
+ throw new Error("TextDecoder not available in this environment");
264
+ }
265
+ function getExtensionValue(certificate, oid) {
266
+ const candidate = certificate;
267
+ if (typeof candidate.getExtension === "function") {
268
+ const result = candidate.getExtension(oid);
269
+ const buffer = tryExtractExtensionBuffer(result);
270
+ if (buffer) {
271
+ return buffer;
272
+ }
273
+ }
274
+ const { extensions } = candidate;
275
+ if (extensions) {
276
+ const iterable = toIterable(extensions);
277
+ for (const entry of iterable) {
278
+ const extensionRecord = entry;
279
+ if (!extensionRecord || extensionRecord.oid !== oid) {
280
+ continue;
281
+ }
282
+ const buffer = tryExtractExtensionBuffer(entry);
283
+ if (buffer) {
284
+ return buffer;
285
+ }
286
+ }
287
+ }
288
+ return null;
289
+ }
290
+ function readOptionalStringProperty(source, key) {
291
+ const value = source[key];
292
+ if (typeof value === "string" && value.length > 0) {
293
+ return value;
294
+ }
295
+ return undefined;
296
+ }
297
+ function readOptionalDateProperty(source, key) {
298
+ const value = source[key];
299
+ if (value instanceof Date) {
300
+ return value;
301
+ }
302
+ if (typeof value === "number" || typeof value === "string") {
303
+ const date = new Date(value);
304
+ if (!Number.isNaN(date.getTime())) {
305
+ return date;
306
+ }
307
+ }
308
+ return undefined;
309
+ }
310
+ function readValidityDate(candidate) {
311
+ if (!candidate) {
312
+ return undefined;
313
+ }
314
+ if (candidate instanceof Date) {
315
+ return candidate;
316
+ }
317
+ if (typeof candidate === "object" &&
318
+ candidate !== null &&
319
+ candidate) {
320
+ const timeObject = candidate;
321
+ if (timeObject.utcTime instanceof Date) {
322
+ return timeObject.utcTime;
323
+ }
324
+ if (timeObject.generalizedTime instanceof Date) {
325
+ return timeObject.generalizedTime;
326
+ }
327
+ }
328
+ return undefined;
329
+ }
330
+ function formatDistinguishedName(name) {
331
+ const rdns = Array.from(name);
332
+ if (rdns.length === 0) {
333
+ return "";
334
+ }
335
+ return rdns
336
+ .map((rdn) => Array.from(rdn)
337
+ .map((attribute) => `${oidToLabel(attribute.type)}=${attribute.value.toString()}`)
338
+ .join("+"))
339
+ .join(",");
340
+ }
341
+ function oidToLabel(oid) {
342
+ switch (oid) {
343
+ case "2.5.4.3":
344
+ return "CN";
345
+ case "2.5.4.6":
346
+ return "C";
347
+ case "2.5.4.7":
348
+ return "L";
349
+ case "2.5.4.8":
350
+ return "ST";
351
+ case "2.5.4.10":
352
+ return "O";
353
+ case "2.5.4.11":
354
+ return "OU";
355
+ default:
356
+ return oid;
357
+ }
358
+ }
359
+ function bytesToHex(data) {
360
+ const view = toUint8Array(data);
361
+ if (view.length === 0) {
362
+ return "";
363
+ }
364
+ return Array.from(view)
365
+ .map((byte) => byte.toString(16).padStart(2, "0"))
366
+ .join("");
367
+ }
368
+ function tryExtractExtensionBuffer(source) {
369
+ if (!source) {
370
+ return null;
371
+ }
372
+ if (isArrayBufferLike(source)) {
373
+ return cloneArrayBuffer(source);
374
+ }
375
+ if (typeof source === "object") {
376
+ const record = source;
377
+ const directValue = record.value;
378
+ if (isArrayBufferLike(directValue)) {
379
+ return cloneArrayBuffer(directValue);
380
+ }
381
+ const asn = record.asn;
382
+ if (asn) {
383
+ const extnValue = asn.extnValue;
384
+ if (isArrayBufferLike(extnValue)) {
385
+ return cloneArrayBuffer(extnValue);
386
+ }
387
+ if (extnValue &&
388
+ typeof extnValue === "object" &&
389
+ isArrayBufferLike(extnValue.buffer)) {
390
+ return cloneArrayBuffer(extnValue.buffer);
391
+ }
392
+ }
393
+ }
394
+ return null;
395
+ }
396
+ function isArrayBufferLike(value) {
397
+ return value instanceof ArrayBuffer || ArrayBuffer.isView(value);
398
+ }
399
+ function cloneArrayBuffer(value) {
400
+ const view = toUint8Array(value);
401
+ if (view.byteOffset === 0 &&
402
+ view.byteLength === view.buffer.byteLength &&
403
+ view.buffer instanceof ArrayBuffer) {
404
+ return view.buffer;
405
+ }
406
+ return view.slice().buffer;
407
+ }
408
+ function toIterable(value) {
409
+ if (typeof value === "object" && value && Symbol.iterator in value) {
410
+ return value;
411
+ }
412
+ if (Array.isArray(value)) {
413
+ return value;
414
+ }
415
+ return [];
416
+ }
110
417
  /**
111
418
  * Client for requesting certificates from a CA signing service.
112
419
  */