@appforge-ci/core 0.2.3 → 0.3.1

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 (125) hide show
  1. package/dist/agent-readiness.d.ts +240 -1
  2. package/dist/agent-readiness.d.ts.map +1 -1
  3. package/dist/agent-readiness.js +304 -1
  4. package/dist/agent-readiness.js.map +1 -1
  5. package/dist/agent-readiness.test.js +277 -19
  6. package/dist/agent-readiness.test.js.map +1 -1
  7. package/dist/api-client.d.ts +80 -3
  8. package/dist/api-client.d.ts.map +1 -1
  9. package/dist/api-client.js +79 -0
  10. package/dist/api-client.js.map +1 -1
  11. package/dist/api-client.test.js +22 -0
  12. package/dist/api-client.test.js.map +1 -1
  13. package/dist/appforge-verify.test.d.ts +2 -0
  14. package/dist/appforge-verify.test.d.ts.map +1 -0
  15. package/dist/appforge-verify.test.js +958 -0
  16. package/dist/appforge-verify.test.js.map +1 -0
  17. package/dist/attestation-keys.d.ts +20 -0
  18. package/dist/attestation-keys.d.ts.map +1 -0
  19. package/dist/attestation-keys.js +27 -0
  20. package/dist/attestation-keys.js.map +1 -0
  21. package/dist/attestation-keys.test.d.ts +2 -0
  22. package/dist/attestation-keys.test.d.ts.map +1 -0
  23. package/dist/attestation-keys.test.js +45 -0
  24. package/dist/attestation-keys.test.js.map +1 -0
  25. package/dist/attestation-signing.d.ts +226 -0
  26. package/dist/attestation-signing.d.ts.map +1 -0
  27. package/dist/attestation-signing.js +276 -0
  28. package/dist/attestation-signing.js.map +1 -0
  29. package/dist/attestation-signing.test.d.ts +2 -0
  30. package/dist/attestation-signing.test.d.ts.map +1 -0
  31. package/dist/attestation-signing.test.js +250 -0
  32. package/dist/attestation-signing.test.js.map +1 -0
  33. package/dist/attestation-workerd.test.d.ts +2 -0
  34. package/dist/attestation-workerd.test.d.ts.map +1 -0
  35. package/dist/attestation-workerd.test.js +183 -0
  36. package/dist/attestation-workerd.test.js.map +1 -0
  37. package/dist/attestation.d.ts +412 -0
  38. package/dist/attestation.d.ts.map +1 -0
  39. package/dist/attestation.js +353 -0
  40. package/dist/attestation.js.map +1 -0
  41. package/dist/attestation.test.d.ts +2 -0
  42. package/dist/attestation.test.d.ts.map +1 -0
  43. package/dist/attestation.test.js +218 -0
  44. package/dist/attestation.test.js.map +1 -0
  45. package/dist/build-vpn.d.ts +20 -0
  46. package/dist/build-vpn.d.ts.map +1 -0
  47. package/dist/build-vpn.js +50 -0
  48. package/dist/build-vpn.js.map +1 -0
  49. package/dist/fleet-vpn.d.ts +64 -0
  50. package/dist/fleet-vpn.d.ts.map +1 -0
  51. package/dist/fleet-vpn.js +88 -0
  52. package/dist/fleet-vpn.js.map +1 -0
  53. package/dist/fleet-vpn.test.d.ts +2 -0
  54. package/dist/fleet-vpn.test.d.ts.map +1 -0
  55. package/dist/fleet-vpn.test.js +69 -0
  56. package/dist/fleet-vpn.test.js.map +1 -0
  57. package/dist/index.d.ts +11 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +11 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/schemas-repo-url.test.d.ts +2 -0
  62. package/dist/schemas-repo-url.test.d.ts.map +1 -0
  63. package/dist/schemas-repo-url.test.js +67 -0
  64. package/dist/schemas-repo-url.test.js.map +1 -0
  65. package/dist/schemas.d.ts +360 -7
  66. package/dist/schemas.d.ts.map +1 -1
  67. package/dist/schemas.js +148 -12
  68. package/dist/schemas.js.map +1 -1
  69. package/dist/ssh-deploy-key.d.ts +59 -0
  70. package/dist/ssh-deploy-key.d.ts.map +1 -0
  71. package/dist/ssh-deploy-key.js +124 -0
  72. package/dist/ssh-deploy-key.js.map +1 -0
  73. package/dist/ssh-deploy-key.test.d.ts +2 -0
  74. package/dist/ssh-deploy-key.test.d.ts.map +1 -0
  75. package/dist/ssh-deploy-key.test.js +117 -0
  76. package/dist/ssh-deploy-key.test.js.map +1 -0
  77. package/dist/types.d.ts +204 -0
  78. package/dist/types.d.ts.map +1 -1
  79. package/dist/types.js +0 -5
  80. package/dist/types.js.map +1 -1
  81. package/dist/vpn-attestation-workerd.test.d.ts +2 -0
  82. package/dist/vpn-attestation-workerd.test.d.ts.map +1 -0
  83. package/dist/vpn-attestation-workerd.test.js +184 -0
  84. package/dist/vpn-attestation-workerd.test.js.map +1 -0
  85. package/dist/vpn-attestation.d.ts +1015 -0
  86. package/dist/vpn-attestation.d.ts.map +1 -0
  87. package/dist/vpn-attestation.js +963 -0
  88. package/dist/vpn-attestation.js.map +1 -0
  89. package/dist/vpn-attestation.test.d.ts +2 -0
  90. package/dist/vpn-attestation.test.d.ts.map +1 -0
  91. package/dist/vpn-attestation.test.js +613 -0
  92. package/dist/vpn-attestation.test.js.map +1 -0
  93. package/dist/vpn-egress-presets.d.ts +142 -0
  94. package/dist/vpn-egress-presets.d.ts.map +1 -0
  95. package/dist/vpn-egress-presets.js +318 -0
  96. package/dist/vpn-egress-presets.js.map +1 -0
  97. package/dist/vpn-egress-presets.test.d.ts +2 -0
  98. package/dist/vpn-egress-presets.test.d.ts.map +1 -0
  99. package/dist/vpn-egress-presets.test.js +210 -0
  100. package/dist/vpn-egress-presets.test.js.map +1 -0
  101. package/dist/vpn-egress.d.ts +57 -0
  102. package/dist/vpn-egress.d.ts.map +1 -0
  103. package/dist/vpn-egress.js +126 -0
  104. package/dist/vpn-egress.js.map +1 -0
  105. package/dist/vpn-egress.test.d.ts +2 -0
  106. package/dist/vpn-egress.test.d.ts.map +1 -0
  107. package/dist/vpn-egress.test.js +133 -0
  108. package/dist/vpn-egress.test.js.map +1 -0
  109. package/dist/vpn-sandbox.d.ts +67 -0
  110. package/dist/vpn-sandbox.d.ts.map +1 -0
  111. package/dist/vpn-sandbox.js +22 -0
  112. package/dist/vpn-sandbox.js.map +1 -0
  113. package/dist/vpn-sandbox.test.d.ts +2 -0
  114. package/dist/vpn-sandbox.test.d.ts.map +1 -0
  115. package/dist/vpn-sandbox.test.js +34 -0
  116. package/dist/vpn-sandbox.test.js.map +1 -0
  117. package/dist/vpn-ssh.d.ts +138 -0
  118. package/dist/vpn-ssh.d.ts.map +1 -0
  119. package/dist/vpn-ssh.js +320 -0
  120. package/dist/vpn-ssh.js.map +1 -0
  121. package/dist/vpn-ssh.test.d.ts +2 -0
  122. package/dist/vpn-ssh.test.d.ts.map +1 -0
  123. package/dist/vpn-ssh.test.js +274 -0
  124. package/dist/vpn-ssh.test.js.map +1 -0
  125. package/package.json +1 -1
package/dist/schemas.js CHANGED
@@ -1,4 +1,7 @@
1
1
  import { z } from "zod";
2
+ import { ENFORCEMENT_LEVELS, MAX_VPN_FEATURES, VPN_FEATURE_ID_PATTERN, VPN_HOST_POLICIES } from "./agent-readiness.js";
3
+ import { looksLikeSshGitRemote, MAX_KNOWN_HOSTS_LINE_LENGTH, parseGitRemote } from "./vpn-ssh.js";
4
+ import { VPN_COMPLIANCE_MODES, VPN_EGRESS_MAX_CUSTOM_RULES, VPN_EGRESS_MAX_PRESETS, validateEgressSettings } from "./vpn-egress-presets.js";
2
5
  export const platformSchema = z.enum(["ios", "android", "flutter", "react-native"]);
3
6
  export const appforgeWorkflowSchema = z.object({
4
7
  name: z.string().optional(),
@@ -188,22 +191,58 @@ export const resetPasswordSchema = z.object({
188
191
  // transport ever reaches a real `git clone` on shared, multi-tenant
189
192
  // infrastructure (`agents.ts`'s own docblock: "the fleet is a shared
190
193
  // pool... not one Mac mini per customer"). This product only ever
191
- // integrates public GitHub repos over HTTPS (no SSH-deploy-key feature
192
- // exists anywhere in this codebase), so restricting to exactly `https:`
193
- // isn't just "safe enough," it's the only scheme any legitimate caller
194
- // ever needs. See `packages/agent/src/lib/builder.ts`'s own `runScript`
195
- // git-clone call for the matching defense-in-depth restriction applied
196
- // at the point of the actual clone, in case a repoUrl ever reaches the
194
+ // integrates public GitHub repos over HTTPS, and a private git server only
195
+ // through a customer's site-to-site VPN tunnel (see below), so the set of
196
+ // transports is exactly those two. See `packages/agent/src/lib/builder.ts`'s own
197
+ // `runScript` git-clone call for the matching defense-in-depth restriction
198
+ // applied at the point of the actual clone, in case a repoUrl ever reaches the
197
199
  // agent by some path other than this schema.
198
- const repoUrlSchema = z
199
- .string()
200
- .url()
201
- .refine((v) => new URL(v).protocol === "https:", "must be an https:// URL — no other transport (file:, ext:, ssh:, git:, ...) is supported");
200
+ //
201
+ // Regulated-VPN program, PR-G: an `ssh://user@host[:port]/path` or scp-like
202
+ // `user@host:path` remote is now SYNTACTICALLY accepted (strict grammar, see
203
+ // `parseGitRemote` in vpn-ssh.ts: a user is required, the host is a DNS name or
204
+ // IPv4 address, nothing an ssh client could read as an option or a command).
205
+ // That is only the shape check. Whether THIS app may use one is a cross-resource
206
+ // rule this schema cannot know and the routes enforce (`POST /orgs/:orgId/apps`,
207
+ // `PATCH /apps/:appId`): the app must use the org's VPN tunnel, the tunnel must
208
+ // not be disabled and must have pinned SSH host keys, and the change needs an org
209
+ // owner/admin. The lease re-checks all of it, and the agent clones an ssh remote
210
+ // only through the build's pinned-host-key ssh config (never directly, never over
211
+ // https instead). `file:`, `git:`, `ext::`, plain `http:` and every other scheme
212
+ // stay refused.
213
+ const repoUrlSchema = z.string().superRefine((v, ctx) => {
214
+ if (looksLikeSshGitRemote(v)) {
215
+ if (parseGitRemote(v)?.kind !== "ssh") {
216
+ ctx.addIssue({
217
+ code: z.ZodIssueCode.custom,
218
+ message: "not a valid ssh remote: use ssh://user@host[:port]/path or user@host:path (a user name is required; the host is a DNS name or IPv4 address)",
219
+ });
220
+ }
221
+ return;
222
+ }
223
+ let protocol = null;
224
+ try {
225
+ protocol = new URL(v).protocol;
226
+ }
227
+ catch {
228
+ ctx.addIssue({ code: z.ZodIssueCode.invalid_string, validation: "url", message: "Invalid url" });
229
+ return;
230
+ }
231
+ if (protocol !== "https:") {
232
+ ctx.addIssue({
233
+ code: z.ZodIssueCode.custom,
234
+ message: "must be an https:// URL, or an ssh remote for an app that builds through a VPN tunnel with SSH host keys — no other transport (file:, ext:, git:, http:, ...) is supported",
235
+ });
236
+ }
237
+ });
202
238
  export const createAppSchema = z.object({
203
239
  name: z.string().min(1).max(255, "must be at most 255 characters"),
204
240
  platform: platformSchema,
205
241
  repoUrl: repoUrlSchema,
206
242
  defaultBranch: z.string().min(1).default("main"),
243
+ /** Build through the org's site-to-site VPN tunnel from the start. Needed to create an app with an ssh
244
+ * `repoUrl` (the route requires it, and an owner/admin); the same rules as `PATCH /apps/:appId`'s `useVpn`. */
245
+ useVpn: z.boolean().optional(),
207
246
  });
208
247
  // `platform` is deliberately excluded — see updateApp's own docblock in
209
248
  // packages/db/src/apps.ts. Every field optional; the route only applies
@@ -456,6 +495,20 @@ export const agentHeartbeatSchema = z.object({
456
495
  * predates the VPN feature omits it and stays `vpnCapable = 0`, so it
457
496
  * is never offered a VPN build. */
458
497
  vpnCapable: z.boolean().optional(),
498
+ /** VPN features this agent can enforce (migrations/0043) — ids matching
499
+ * `VPN_FEATURE_ID_PATTERN`, at most `MAX_VPN_FEATURES`. Like `vpnCapable`
500
+ * the stored value is derived from THIS heartbeat alone: omitting it (an
501
+ * older agent) means "no features", never "keep the last value". A
502
+ * malformed list is rejected (400) rather than half-trusted. */
503
+ vpnFeatures: z.array(z.string().regex(VPN_FEATURE_ID_PATTERN)).max(MAX_VPN_FEATURES).optional(),
504
+ /** Build-isolation level this agent enforces (migrations/0043). Same
505
+ * omit-means-default (`none`) rule as `vpnFeatures`. */
506
+ enforcementLevel: z.enum(ENFORCEMENT_LEVELS).optional(),
507
+ /** Whether a GitHub Actions self-hosted runner shares this machine
508
+ * (migrations/0047). Like `vpnFeatures`, stored from THIS heartbeat alone:
509
+ * omitted (an older agent, or a check that failed) means "unknown", never
510
+ * "keep the last value", and unknown refuses a dedicated host. */
511
+ coHostedRunner: z.boolean().optional(),
459
512
  });
460
513
  // `POST /builds/:buildId/logs` (apps/admin-api/src/routes/agents.ts) —
461
514
  // one call per flushed line/burst from `packages/agent/src/lib/
@@ -543,6 +596,21 @@ export const setAgentRemoteControlSchema = z.object({
543
596
  export const setAgentVpnApprovedSchema = z.object({
544
597
  approved: z.boolean(),
545
598
  });
599
+ /** `PATCH /orgs/:orgId/agents/:agentId/dedicated` (apps/admin-api) — the
600
+ * only way `Agent.dedicatedOrgId` ever changes (migrations/0043). An
601
+ * operator taint, deliberately not in agentHeartbeatSchema/agentEnrollSchema:
602
+ * an agent must never be able to widen or lift its own restriction. `null`
603
+ * clears it (the Mac goes back to being shared). */
604
+ export const setAgentDedicatedOrgSchema = z.object({
605
+ dedicatedOrgId: z.string().min(1).max(128).nullable(),
606
+ });
607
+ /** `PATCH /orgs/:orgId/vpn-hosts/:tunnelOrgId/policy` (apps/admin-api, platform
608
+ * admins only) — the only way `VpnTunnel.hostPolicy` ever changes
609
+ * (migrations/0047). Deliberately not in `updateVpnTunnelSchema`: an org
610
+ * admin must not be able to loosen the placement the operator set. */
611
+ export const setVpnHostPolicySchema = z.object({
612
+ hostPolicy: z.enum(VPN_HOST_POLICIES),
613
+ });
546
614
  /** `PATCH /orgs/:orgId/agents/:agentId/device-stream-hostname` (apps/
547
615
  * admin-api)'s request body — `hostname: null` clears it, going back
548
616
  * to the global DEVICE_STREAM_WS_URL fallback (see migrations/0034's
@@ -569,7 +637,45 @@ export const startVncSessionSchema = z.object({
569
637
  // and the route all apply the identical checks, with every problem
570
638
  // reported at once.
571
639
  const vpnNameSchema = z.string().min(1).max(64, "must be at most 64 characters");
572
- export const createVpnTunnelSchema = z.object({
640
+ /**
641
+ * The egress-policy fields of a tunnel (migrations/0045), shared by create and
642
+ * update. The field shapes here are shape and size bounds only; which preset ids
643
+ * exist and which hosts are acceptable (no bare `*`, no IP literals ...) is
644
+ * `validateEgressSettings` (vpn-egress-presets.ts), which `refineVpnEgressSettings`
645
+ * applies on top so a caller that relies on these schemas alone cannot accept
646
+ * what the route would refuse. Whether `regulated` may be set at all is the
647
+ * route's call (an operator flag), not the schema's.
648
+ */
649
+ const vpnEgressSettingsFields = {
650
+ /** `regulated` needs `strictEgress`, and the operator's REGULATED_VPN_ENABLED flag. */
651
+ complianceMode: z.enum(VPN_COMPLIANCE_MODES).optional(),
652
+ strictEgress: z.boolean().optional(),
653
+ /** Preset ids; replaces the list. */
654
+ egressPresets: z.array(z.string().min(1).max(64)).max(VPN_EGRESS_MAX_PRESETS).optional(),
655
+ /** Custom hosts (exact or `*.suffix`, port 443 unless `ports` says otherwise); replaces the list. */
656
+ egressAllow: z
657
+ .array(z.object({
658
+ host: z.string().min(1).max(253),
659
+ ports: z.array(z.number().int().min(1).max(65535)).max(16).optional(),
660
+ }))
661
+ .max(VPN_EGRESS_MAX_CUSTOM_RULES)
662
+ .optional(),
663
+ };
664
+ /** Adds `validateEgressSettings`' host/preset/merge rules to a tunnel schema. Problem strings never echo a rejected value. */
665
+ function refineVpnEgressSettings(input, ctx) {
666
+ for (const message of validateEgressSettings({ egressPresets: input.egressPresets, egressAllow: input.egressAllow })) {
667
+ const field = message.startsWith("egressPresets") ? "egressPresets" : message.startsWith("egressAllow") ? "egressAllow" : null;
668
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message, path: field ? [field] : [] });
669
+ }
670
+ }
671
+ /**
672
+ * The shape-only form of the create/update bodies, WITHOUT the egress rules. The
673
+ * API route parses with these and then runs `resolveEgressChange`, which applies
674
+ * the same `validateEgressSettings` but answers with a structured 400 listing
675
+ * every problem (`errors`) rather than a generic schema error. Anything else
676
+ * should use `createVpnTunnelSchema` / `updateVpnTunnelSchema` below.
677
+ */
678
+ export const createVpnTunnelBodySchema = z.object({
573
679
  name: vpnNameSchema,
574
680
  gatewayEndpoint: z.string().min(1).max(300),
575
681
  gatewayPublicKey: z.string().min(1).max(64),
@@ -582,8 +688,9 @@ export const createVpnTunnelSchema = z.object({
582
688
  /** Lab mode — allow a private (RFC1918/CGNAT) gateway endpoint. Setting it
583
689
  * `true` is platform-admin only (enforced by the route, not here). */
584
690
  allowPrivateEndpoint: z.boolean().optional(),
691
+ ...vpnEgressSettingsFields,
585
692
  });
586
- export const updateVpnTunnelSchema = z.object({
693
+ export const updateVpnTunnelBodySchema = z.object({
587
694
  name: vpnNameSchema.optional(),
588
695
  gatewayEndpoint: z.string().min(1).max(300).optional(),
589
696
  gatewayPublicKey: z.string().min(1).max(64).optional(),
@@ -598,6 +705,26 @@ export const updateVpnTunnelSchema = z.object({
598
705
  * instead of queueing); `true` re-enables it, back to `pending` until
599
706
  * the next handshake proves it works. */
600
707
  enabled: z.boolean().optional(),
708
+ ...vpnEgressSettingsFields,
709
+ });
710
+ /** The create body, with the egress rules (bare `*`, IP literals, unknown presets, merged port limit) enforced too. */
711
+ export const createVpnTunnelSchema = createVpnTunnelBodySchema.superRefine(refineVpnEgressSettings);
712
+ /** The update body, with the egress rules enforced too. */
713
+ export const updateVpnTunnelSchema = updateVpnTunnelBodySchema.superRefine(refineVpnEgressSettings);
714
+ /**
715
+ * The strict-egress allow-list (`VpnJobConfig.egress`; docs in vpn-egress.ts).
716
+ * Field-level shape and size bounds only; the host rules (no IP literals, no
717
+ * bare `*`, no trailing dot ...) live in `validateVpnEgressPolicy` so the
718
+ * server, the CLI and the agent apply the identical checks and report every
719
+ * problem at once. Tunnel settings (PR-D) will embed this.
720
+ */
721
+ export const vpnEgressPolicySchema = z.object({
722
+ allow: z
723
+ .array(z.object({
724
+ host: z.string().min(1).max(253),
725
+ ports: z.array(z.number().int().min(1).max(65535)).max(16).optional(),
726
+ }))
727
+ .max(512),
601
728
  });
602
729
  /** `POST /agents/vpn/report` (apps/admin-api) — what the agent that holds
603
730
  * an org's tunnel for a build tells the control plane about it. The
@@ -609,4 +736,13 @@ export const reportVpnEventSchema = z.object({
609
736
  event: z.enum(["tunnel_up", "tunnel_down", "handshake_ok", "handshake_failed"]),
610
737
  detail: z.string().max(300).optional(),
611
738
  });
739
+ /**
740
+ * `PUT /orgs/:orgId/vpn/ssh-hosts` (regulated-VPN program, PR-G): replaces the
741
+ * tunnel's pinned SSH host keys. Only the SHAPE is checked here (bounded array of
742
+ * bounded strings); the content rules, with their per-line error messages, are
743
+ * `validateKnownHostsInput` in vpn-ssh.ts, run by the route. `[]` clears them.
744
+ */
745
+ export const setVpnSshHostsSchema = z.object({
746
+ knownHosts: z.array(z.string().max(MAX_KNOWN_HOSTS_LINE_LENGTH * 2)).max(512),
747
+ });
612
748
  //# sourceMappingURL=schemas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Per-app git deploy keys (regulated-VPN program, PR-G).
3
+ *
4
+ * AppForge generates the key pair SERVER-SIDE (Ed25519, WebCrypto) so the
5
+ * customer never has to hand over a private key: they get only the PUBLIC half,
6
+ * to install as a read-only deploy key on their git server. The private half is
7
+ * stored encrypted (the same AES-GCM envelope as tunnel keys and app secrets),
8
+ * decrypted only by the lease-job Worker for the one build that needs it, and
9
+ * handed to the agent, which loads it into a per-build ssh-agent over stdin
10
+ * (packages/agent/src/lib/vpn-ssh.ts). It is never shown, logged or audited.
11
+ *
12
+ * Why this file serialises OpenSSH's own private-key format rather than PKCS#8:
13
+ * `ssh-add` and `ssh` read PKCS#8 only for some key types and builds; the
14
+ * `openssh-key-v1` container is what `ssh-keygen` writes and every OpenSSH
15
+ * release since 6.5 reads. It is small (PROTOCOL.key in the OpenSSH sources):
16
+ *
17
+ * "openssh-key-v1\0"
18
+ * string ciphername ("none"), string kdfname ("none"), string kdfoptions ("")
19
+ * uint32 number-of-keys (1)
20
+ * string public key blob = string "ssh-ed25519", string <32-byte public key>
21
+ * string private section = uint32 check, uint32 check (equal, a decryption sanity
22
+ * check), string "ssh-ed25519", string <public key>,
23
+ * string <seed || public key> (64 bytes), string comment,
24
+ * padding 1,2,3,... to a multiple of the cipher block size (8)
25
+ *
26
+ * base64 of that, wrapped at 70 columns, between the OPENSSH PRIVATE KEY armor.
27
+ * The tests prove it against the real `ssh-keygen -y` and `ssh-add`.
28
+ */
29
+ /** The SSH wire-format public key blob of an Ed25519 key. */
30
+ export declare function ed25519PublicBlob(publicKey: Uint8Array): Uint8Array;
31
+ /** `ssh-ed25519 <base64> <comment>`: the line a git server's deploy-key form takes. */
32
+ export declare function formatOpenSshPublicKey(publicKey: Uint8Array, comment: string): string;
33
+ /**
34
+ * Serialises an unencrypted Ed25519 key as an `openssh-key-v1` PEM.
35
+ * `random` supplies the 4 check bytes (a parameter so tests can be deterministic).
36
+ */
37
+ export declare function serializeOpenSshEd25519PrivateKey(seed: Uint8Array, publicKey: Uint8Array, comment: string, random?: (n: number) => Uint8Array): string;
38
+ export interface GeneratedDeployKey {
39
+ /** The OpenSSH PEM. A secret: encrypt it before it is stored, never log it. */
40
+ privateKey: string;
41
+ /** `ssh-ed25519 <base64> <comment>`: public, safe to show. */
42
+ publicKey: string;
43
+ /** `SHA256:<base64>` of the public key, as the git server's UI prints it. */
44
+ fingerprint: string;
45
+ }
46
+ /**
47
+ * Generates an Ed25519 deploy key. `comment` ends up in both halves, so it should
48
+ * say what the key is for and carry nothing secret (e.g. `appforge-deploy-<appId>`).
49
+ * Works in the Workers runtime and in Node 20+ (WebCrypto Ed25519).
50
+ */
51
+ export declare function generateDeployKey(comment: string): Promise<GeneratedDeployKey>;
52
+ /**
53
+ * Validates and fingerprints a public key line (`ssh-ed25519 <base64> [comment]`)
54
+ * read back from storage, or null when it is not an Ed25519 public key. Used to
55
+ * fingerprint what is displayed, so the shown fingerprint is computed from the
56
+ * shown key and cannot disagree with it.
57
+ */
58
+ export declare function deployKeyFingerprint(publicKeyLine: string): Promise<string | null>;
59
+ //# sourceMappingURL=ssh-deploy-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-deploy-key.d.ts","sourceRoot":"","sources":["../src/ssh-deploy-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA8BH,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAGnE;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrF;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,UAAU,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,UAA6D,GACnF,MAAM,CAkBR;AAED,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAcpF;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxF"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Per-app git deploy keys (regulated-VPN program, PR-G).
3
+ *
4
+ * AppForge generates the key pair SERVER-SIDE (Ed25519, WebCrypto) so the
5
+ * customer never has to hand over a private key: they get only the PUBLIC half,
6
+ * to install as a read-only deploy key on their git server. The private half is
7
+ * stored encrypted (the same AES-GCM envelope as tunnel keys and app secrets),
8
+ * decrypted only by the lease-job Worker for the one build that needs it, and
9
+ * handed to the agent, which loads it into a per-build ssh-agent over stdin
10
+ * (packages/agent/src/lib/vpn-ssh.ts). It is never shown, logged or audited.
11
+ *
12
+ * Why this file serialises OpenSSH's own private-key format rather than PKCS#8:
13
+ * `ssh-add` and `ssh` read PKCS#8 only for some key types and builds; the
14
+ * `openssh-key-v1` container is what `ssh-keygen` writes and every OpenSSH
15
+ * release since 6.5 reads. It is small (PROTOCOL.key in the OpenSSH sources):
16
+ *
17
+ * "openssh-key-v1\0"
18
+ * string ciphername ("none"), string kdfname ("none"), string kdfoptions ("")
19
+ * uint32 number-of-keys (1)
20
+ * string public key blob = string "ssh-ed25519", string <32-byte public key>
21
+ * string private section = uint32 check, uint32 check (equal, a decryption sanity
22
+ * check), string "ssh-ed25519", string <public key>,
23
+ * string <seed || public key> (64 bytes), string comment,
24
+ * padding 1,2,3,... to a multiple of the cipher block size (8)
25
+ *
26
+ * base64 of that, wrapped at 70 columns, between the OPENSSH PRIVATE KEY armor.
27
+ * The tests prove it against the real `ssh-keygen -y` and `ssh-add`.
28
+ */
29
+ const MAGIC = new TextEncoder().encode("openssh-key-v1\0");
30
+ const KEY_TYPE = "ssh-ed25519";
31
+ function u32(n) {
32
+ return new Uint8Array([(n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff]);
33
+ }
34
+ function sshString(data) {
35
+ const bytes = typeof data === "string" ? new TextEncoder().encode(data) : data;
36
+ return concat(u32(bytes.length), bytes);
37
+ }
38
+ function concat(...parts) {
39
+ const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));
40
+ let o = 0;
41
+ for (const p of parts) {
42
+ out.set(p, o);
43
+ o += p.length;
44
+ }
45
+ return out;
46
+ }
47
+ function b64(bytes) {
48
+ let bin = "";
49
+ for (const b of bytes)
50
+ bin += String.fromCharCode(b);
51
+ return btoa(bin);
52
+ }
53
+ /** The SSH wire-format public key blob of an Ed25519 key. */
54
+ export function ed25519PublicBlob(publicKey) {
55
+ if (publicKey.length !== 32)
56
+ throw new Error("an Ed25519 public key is 32 bytes");
57
+ return concat(sshString(KEY_TYPE), sshString(publicKey));
58
+ }
59
+ /** `ssh-ed25519 <base64> <comment>`: the line a git server's deploy-key form takes. */
60
+ export function formatOpenSshPublicKey(publicKey, comment) {
61
+ const c = comment.replace(/[^\x21-\x7e]+/g, "-").slice(0, 100);
62
+ return `${KEY_TYPE} ${b64(ed25519PublicBlob(publicKey))}${c ? ` ${c}` : ""}`;
63
+ }
64
+ /**
65
+ * Serialises an unencrypted Ed25519 key as an `openssh-key-v1` PEM.
66
+ * `random` supplies the 4 check bytes (a parameter so tests can be deterministic).
67
+ */
68
+ export function serializeOpenSshEd25519PrivateKey(seed, publicKey, comment, random = (n) => crypto.getRandomValues(new Uint8Array(n))) {
69
+ if (seed.length !== 32)
70
+ throw new Error("an Ed25519 seed is 32 bytes");
71
+ const check = random(4);
72
+ const checkInt = ((check[0] << 24) | (check[1] << 16) | (check[2] << 8) | check[3]) >>> 0;
73
+ let priv = concat(u32(checkInt), u32(checkInt), sshString(KEY_TYPE), sshString(publicKey), sshString(concat(seed, publicKey)), sshString(comment));
74
+ // Pad to the (null) cipher's block size of 8 with 1, 2, 3, ...
75
+ const pad = (8 - (priv.length % 8)) % 8;
76
+ if (pad > 0)
77
+ priv = concat(priv, Uint8Array.from({ length: pad }, (_, i) => i + 1));
78
+ const body = concat(MAGIC, sshString("none"), sshString("none"), sshString(""), u32(1), sshString(ed25519PublicBlob(publicKey)), sshString(priv));
79
+ const wrapped = b64(body).match(/.{1,70}/g).join("\n");
80
+ return `-----BEGIN OPENSSH PRIVATE KEY-----\n${wrapped}\n-----END OPENSSH PRIVATE KEY-----\n`;
81
+ }
82
+ /**
83
+ * Generates an Ed25519 deploy key. `comment` ends up in both halves, so it should
84
+ * say what the key is for and carry nothing secret (e.g. `appforge-deploy-<appId>`).
85
+ * Works in the Workers runtime and in Node 20+ (WebCrypto Ed25519).
86
+ */
87
+ export async function generateDeployKey(comment) {
88
+ // Typed loosely on purpose: this package compiles without the DOM lib (it also runs in Node and Workers).
89
+ const pair = (await crypto.subtle.generateKey({ name: "Ed25519" }, true, ["sign", "verify"]));
90
+ const pkcs8 = new Uint8Array((await crypto.subtle.exportKey("pkcs8", pair.privateKey)));
91
+ const publicKey = new Uint8Array((await crypto.subtle.exportKey("raw", pair.publicKey)));
92
+ // PKCS#8 of an Ed25519 key is a fixed 16-byte prefix (version, algorithm OID, the
93
+ // OCTET STRING wrappers) followed by the 32-byte seed. Refuse a runtime that
94
+ // returns anything else instead of serialising garbage.
95
+ if (pkcs8.length !== 48 || publicKey.length !== 32)
96
+ throw new Error("unexpected Ed25519 key encoding from the runtime");
97
+ const seed = pkcs8.slice(16);
98
+ const privateKey = serializeOpenSshEd25519PrivateKey(seed, publicKey, comment);
99
+ const publicLine = formatOpenSshPublicKey(publicKey, comment);
100
+ const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", ed25519PublicBlob(publicKey)));
101
+ return { privateKey, publicKey: publicLine, fingerprint: `SHA256:${b64(digest).replace(/=+$/, "")}` };
102
+ }
103
+ /**
104
+ * Validates and fingerprints a public key line (`ssh-ed25519 <base64> [comment]`)
105
+ * read back from storage, or null when it is not an Ed25519 public key. Used to
106
+ * fingerprint what is displayed, so the shown fingerprint is computed from the
107
+ * shown key and cannot disagree with it.
108
+ */
109
+ export async function deployKeyFingerprint(publicKeyLine) {
110
+ const m = /^ssh-ed25519 ([A-Za-z0-9+/]{20,}={0,3})(?: [\x20-\x7e]*)?$/.exec(publicKeyLine);
111
+ if (!m)
112
+ return null;
113
+ let bin;
114
+ try {
115
+ bin = atob(m[1]);
116
+ }
117
+ catch {
118
+ return null;
119
+ }
120
+ const bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0));
121
+ const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
122
+ return `SHA256:${b64(digest).replace(/=+$/, "")}`;
123
+ }
124
+ //# sourceMappingURL=ssh-deploy-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-deploy-key.js","sourceRoot":"","sources":["../src/ssh-deploy-key.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ssh-deploy-key.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-deploy-key.test.d.ts","sourceRoot":"","sources":["../src/ssh-deploy-key.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,117 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { execFileSync, spawn } from "node:child_process";
4
+ import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
+ import { deployKeyFingerprint, ed25519PublicBlob, formatOpenSshPublicKey, generateDeployKey, serializeOpenSshEd25519PrivateKey } from "./ssh-deploy-key.js";
8
+ import { isPlausibleSshPrivateKey } from "./vpn-ssh.js";
9
+ const have = (bin) => ["/usr/bin", "/usr/local/bin", "/opt/homebrew/bin", "/bin"].some((d) => existsSync(join(d, bin)));
10
+ const haveSsh = have("ssh-keygen") && have("ssh-add") && have("ssh-agent");
11
+ function scratch() {
12
+ // Short on purpose: a unix-socket path is limited to ~104 bytes on macOS.
13
+ return mkdtempSync(join(tmpdir(), "afdk-"));
14
+ }
15
+ test("generateDeployKey returns an OpenSSH PEM, a matching ssh-ed25519 public line and its SHA256 fingerprint", async () => {
16
+ const k = await generateDeployKey("appforge-deploy-app1");
17
+ assert.match(k.privateKey, /^-----BEGIN OPENSSH PRIVATE KEY-----\n[A-Za-z0-9+/=\n]+\n-----END OPENSSH PRIVATE KEY-----\n$/);
18
+ assert.match(k.publicKey, /^ssh-ed25519 [A-Za-z0-9+/]{68} appforge-deploy-app1$/);
19
+ assert.match(k.fingerprint, /^SHA256:[A-Za-z0-9+/]{43}$/);
20
+ assert.equal(await deployKeyFingerprint(k.publicKey), k.fingerprint);
21
+ // The shape check the agent and the lease apply to a deploy key.
22
+ assert.equal(isPlausibleSshPrivateKey(k.privateKey), true);
23
+ // PEM lines are wrapped at 70 columns like ssh-keygen's.
24
+ for (const l of k.privateKey.trimEnd().split("\n").slice(1, -1))
25
+ assert.ok(l.length <= 70);
26
+ });
27
+ test("two generated keys differ, and the private key never appears in the public one", async () => {
28
+ const a = await generateDeployKey("c");
29
+ const b = await generateDeployKey("c");
30
+ assert.notEqual(a.publicKey, b.publicKey);
31
+ assert.notEqual(a.privateKey, b.privateKey);
32
+ assert.equal(a.publicKey.includes("PRIVATE"), false);
33
+ });
34
+ test("serialisation is deterministic for fixed inputs and pads the private section to 8 bytes", () => {
35
+ const seed = new Uint8Array(32).fill(7);
36
+ const pub = new Uint8Array(32).fill(9);
37
+ const fixed = () => new Uint8Array([1, 2, 3, 4]);
38
+ const a = serializeOpenSshEd25519PrivateKey(seed, pub, "x", fixed);
39
+ assert.equal(a, serializeOpenSshEd25519PrivateKey(seed, pub, "x", fixed));
40
+ for (const comment of ["", "a", "abcd", "a-much-longer-comment-for-padding"]) {
41
+ const pem = serializeOpenSshEd25519PrivateKey(seed, pub, comment, fixed);
42
+ const body = Buffer.from(pem.split("\n").slice(1, -2).join(""), "base64");
43
+ let pos = "openssh-key-v1\0".length;
44
+ const str = () => {
45
+ const len = body.readUInt32BE(pos);
46
+ const out = body.subarray(pos + 4, pos + 4 + len);
47
+ pos += 4 + len;
48
+ return out;
49
+ };
50
+ assert.equal(str().toString(), "none"); // cipher
51
+ assert.equal(str().toString(), "none"); // kdf
52
+ assert.equal(str().length, 0); // kdf options
53
+ assert.equal(body.readUInt32BE(pos), 1); // one key
54
+ pos += 4;
55
+ assert.equal(str().length, 4 + 11 + 4 + 32); // public blob
56
+ const priv = str();
57
+ assert.equal(pos, body.length, "nothing may follow the private section");
58
+ assert.equal(priv.length % 8, 0);
59
+ assert.equal(priv.readUInt32BE(0), priv.readUInt32BE(4), "the two check ints are equal");
60
+ // Padding is 1, 2, 3, ... after the comment.
61
+ const pad = priv.length - (8 + 4 + 11 + 4 + 32 + 4 + 64 + 4 + comment.length);
62
+ assert.ok(pad >= 0 && pad < 8);
63
+ for (let i = 0; i < pad; i++)
64
+ assert.equal(priv[priv.length - pad + i], i + 1);
65
+ }
66
+ assert.throws(() => serializeOpenSshEd25519PrivateKey(new Uint8Array(31), pub, "x"), /32 bytes/);
67
+ assert.throws(() => ed25519PublicBlob(new Uint8Array(31)), /32 bytes/);
68
+ });
69
+ test("formatOpenSshPublicKey strips anything that could break the line out of the comment", () => {
70
+ const line = formatOpenSshPublicKey(new Uint8Array(32).fill(1), "evil\nkey with spaces\u0000");
71
+ assert.equal(line.includes("\n"), false);
72
+ assert.match(line, /^ssh-ed25519 [A-Za-z0-9+/]+ evil-key-with-spaces-$/);
73
+ });
74
+ test("deployKeyFingerprint refuses what is not an ed25519 public key line", async () => {
75
+ assert.equal(await deployKeyFingerprint("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB"), null);
76
+ assert.equal(await deployKeyFingerprint("ssh-ed25519 !!!!"), null);
77
+ assert.equal(await deployKeyFingerprint("-----BEGIN OPENSSH PRIVATE KEY-----"), null);
78
+ });
79
+ test("ssh-keygen -y accepts the generated private key and prints the same public key; ssh-keygen -l prints our fingerprint", { skip: !haveSsh }, async () => {
80
+ const dir = scratch();
81
+ try {
82
+ const k = await generateDeployKey("appforge-deploy-test");
83
+ const file = join(dir, "id");
84
+ writeFileSync(file, k.privateKey, { mode: 0o600 });
85
+ const derived = execFileSync("ssh-keygen", ["-y", "-f", file], { encoding: "utf8" }).trim();
86
+ // `ssh-keygen -y` prints the comment stored in the key.
87
+ assert.equal(derived, k.publicKey);
88
+ const pubFile = join(dir, "id.pub");
89
+ writeFileSync(pubFile, k.publicKey + "\n");
90
+ const l = execFileSync("ssh-keygen", ["-l", "-f", pubFile], { encoding: "utf8" });
91
+ assert.ok(l.includes(k.fingerprint), `ssh-keygen -l said ${l}`);
92
+ }
93
+ finally {
94
+ rmSync(dir, { recursive: true, force: true });
95
+ }
96
+ });
97
+ test("ssh-add loads the generated key from stdin into a real ssh-agent and lists the same public key", { skip: !haveSsh }, async () => {
98
+ const dir = scratch();
99
+ const sock = join(dir, "a.sock");
100
+ const agent = spawn("ssh-agent", ["-D", "-a", sock], { stdio: "ignore" });
101
+ try {
102
+ const deadline = Date.now() + 5000;
103
+ while (!existsSync(sock) && Date.now() < deadline)
104
+ await new Promise((r) => setTimeout(r, 25));
105
+ assert.ok(existsSync(sock), "ssh-agent did not start");
106
+ const k = await generateDeployKey("appforge-deploy-test");
107
+ const env = { PATH: process.env.PATH ?? "/usr/bin:/bin", SSH_AUTH_SOCK: sock, SSH_ASKPASS: "/usr/bin/false", SSH_ASKPASS_REQUIRE: "force" };
108
+ execFileSync("ssh-add", ["-q", "-"], { input: k.privateKey, env });
109
+ const listed = execFileSync("ssh-add", ["-L"], { env, encoding: "utf8" }).trim();
110
+ assert.equal(listed.split(" ").slice(0, 2).join(" "), k.publicKey.split(" ").slice(0, 2).join(" "));
111
+ }
112
+ finally {
113
+ agent.kill("SIGTERM");
114
+ rmSync(dir, { recursive: true, force: true });
115
+ }
116
+ });
117
+ //# sourceMappingURL=ssh-deploy-key.test.js.map