@ai-ecoverse/slicc-kernel 1.151.1 → 1.152.0

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.
@@ -36,7 +36,7 @@ export type { ProcessMountPolicy, ProcessMountRequest } from './mount/syscall.js
36
36
  export type { JsChild, JsExited, JsSpawnOptions, JsStdio } from './process/js/js-children.js';
37
37
  export type { JsCrontabAnswer, JsCrontabCall, JsFdStatus, JsFdType, JsFile, JsOpenOptions, JsProgramContext, JsSelected, JsSelectSets, JsSignal, JsSudoAnswer, JsWriteOptions, } from './process/js/js-context.js';
38
38
  export type { JsStatFs } from './process/js/js-io.js';
39
- export type { JsAddress, JsConnection, JsConnectOptions, JsListener, JsListenOptions, JsNet, JsResolveOptions, JsTlsCipher, JsTlsOptions, JsTlsSession, } from './process/js/js-net.js';
39
+ export type { JsAddress, JsConnection, JsConnectOptions, JsListener, JsListenOptions, JsNet, JsResolveOptions, JsTlsChoice, JsTlsCipher, JsTlsContext, JsTlsContextOptions, JsTlsOffer, JsTlsOptions, JsTlsSelect, JsTlsServerSession, JsTlsSession, } from './process/js/js-net.js';
40
40
  export type { JsRunOptions, JsRunResult, JsRunStdio } from './process/js/js-run.js';
41
41
  export type { JsCred, JsSyncContext, JsSyncFile } from './process/js/js-sync.js';
42
42
  export type { JsThread, JsThreadContext, JsThreadSpawnOptions } from './process/js/js-thread.js';
@@ -1,5 +1,5 @@
1
1
  import { type TlsCipher } from './tls-ciphers.js';
2
- import { type TlsEngine, type TlsSession, type TlsStore } from './tls-engine.js';
2
+ import { type TlsEngine, type TlsLeaf, type TlsSession, type TlsStore } from './tls-engine.js';
3
3
  import type { UplinkConn } from './uplink.js';
4
4
  export declare function verifyCode(flags: number): string | undefined;
5
5
  export interface TlsClientInfo {
@@ -47,7 +47,18 @@ export interface TlsServerInfo {
47
47
  peerCertificates: Uint8Array[];
48
48
  cipher: TlsCipher;
49
49
  }
50
- export declare function tlsServer(conn: UplinkConn, session: TlsSession, clientCerts: boolean): Promise<{
50
+ export interface ServerOffer {
51
+ servername: string;
52
+ protocols: string[];
53
+ }
54
+ export interface ServerChoice {
55
+ leaf?: TlsLeaf;
56
+ alpn?: string;
57
+ refuse?: number;
58
+ done?: () => void;
59
+ }
60
+ export type ServerSelect = (offer: ServerOffer) => Promise<ServerChoice>;
61
+ export declare function tlsServer(conn: UplinkConn, session: TlsSession, clientCerts: boolean, select?: ServerSelect): Promise<{
51
62
  conn: UplinkConn;
52
63
  info: TlsServerInfo;
53
64
  }>;
@@ -1,6 +1,6 @@
1
1
  type TlsExport = 'malloc' | 'free' | 'tls_last_error' | 'tls_strerror' | 'tls_leaf_new' | 'tls_leaf_spki' | 'tls_leaf_add_cert' | 'tls_leaf_free' | 'tls_session_new' | 'tls_feed' | 'tls_feed_eof' | 'tls_in_room' | 'tls_read' | 'tls_write' | 'tls_out_size' | 'tls_out_take' | 'tls_close' | 'tls_alpn_http11' | 'tls_session_free';
2
2
  type TlsClientExport = 'tls_ca_new' | 'tls_ca_add_der' | 'tls_ca_add_bundle' | 'tls_ca_free' | 'tls_client_new' | 'tls_handshake' | 'tls_verify_result' | 'tls_verify_info' | 'tls_alpn' | 'tls_version' | 'tls_peer_count' | 'tls_peer_der';
3
- type TlsSessionExport = 'tls_leaf_import' | 'tls_server_new' | 'tls_sni' | 'tls_client_cert' | 'tls_ciphersuite' | 'tls_name_mismatch' | 'tls_last_alert' | 'tls_chain_verify';
3
+ type TlsSessionExport = 'tls_leaf_import' | 'tls_server_new' | 'tls_sni' | 'tls_server_select' | 'tls_server_refuse' | 'tls_client_alpn' | 'tls_client_cert' | 'tls_ciphersuite' | 'tls_name_mismatch' | 'tls_last_alert' | 'tls_chain_verify';
4
4
  export type TlsEngineModule = {
5
5
  readonly HEAPU8: Uint8Array;
6
6
  } & {
@@ -18,6 +18,8 @@ export declare const TLS_CLIENT_NO_SNI = 2;
18
18
  export declare const TLS_CLIENT_VERIFY_CHAIN_ONLY = 4;
19
19
  export declare const TLS_SERVER_REQUEST_CERT = 1;
20
20
  export declare const TLS_SERVER_REQUIRE_CERT = 2;
21
+ export declare const TLS_SERVER_SELECT = 4;
22
+ export declare const TLS_HANDSHAKE_SELECT = 2;
21
23
  export declare class TlsError extends Error {
22
24
  readonly code: number;
23
25
  constructor(code: number, message: string);
@@ -33,7 +35,8 @@ export declare class TlsEngine {
33
35
  session(leaf: TlsLeaf, host: string): TlsSession;
34
36
  get serverSessions(): boolean;
35
37
  importLeaf(chain: Uint8Array, key: Uint8Array, pass: Uint8Array): TlsLeaf;
36
- serverSession(leaf: TlsLeaf, alpn: readonly string[], clientCa: TlsStore | undefined, flags: number): TlsSession;
38
+ get serverSelect(): boolean;
39
+ serverSession(leaf: TlsLeaf | undefined, alpn: readonly string[], clientCa: TlsStore | undefined, flags: number): TlsSession;
37
40
  withBytes<T>(bytes: Uint8Array, fn: (ptr: number) => T): T;
38
41
  withSecret<T>(bytes: Uint8Array, fn: (ptr: number) => T): T;
39
42
  intoScratch(fn: (ptr: number, max: number) => number): number | Uint8Array;
@@ -78,6 +81,10 @@ export declare class TlsSession {
78
81
  free(): void;
79
82
  private get c();
80
83
  handshake(): boolean;
84
+ step(): number;
85
+ clientAlpn(): string[];
86
+ select(leaf: TlsLeaf | undefined, alpn: string | undefined): void;
87
+ refuse(alert: number): void;
81
88
  get verifyResult(): number;
82
89
  get version(): number;
83
90
  get sni(): string;
@@ -1,5 +1,7 @@
1
+ import { type FdTable } from '../fd-table.js';
1
2
  import type { KernelSocket } from '../socket.js';
2
3
  import type { TlsCipher } from './tls-ciphers.js';
4
+ import { type ServerOffer } from './tls-client.js';
3
5
  import { type TlsEngine, type TlsLeaf, type TlsStore } from './tls-engine.js';
4
6
  import { type ClientCertRequest, type SecureProcess } from './tls-uplink.js';
5
7
  export interface ServeRequest {
@@ -9,8 +11,14 @@ export interface ServeRequest {
9
11
  rejectUnauthorized?: boolean;
10
12
  alpn?: string[];
11
13
  handshakeTimeout?: number;
14
+ select?: boolean;
12
15
  listener?: KernelSocket;
13
16
  }
17
+ export interface SelectRequest {
18
+ context?: number;
19
+ alpn?: string;
20
+ refuse?: number;
21
+ }
14
22
  export interface ServedSession {
15
23
  path: 'kernel';
16
24
  protocol: 'TLSv1.2' | 'TLSv1.3';
@@ -23,7 +31,7 @@ export interface ServedSession {
23
31
  }
24
32
  interface Server {
25
33
  engine: TlsEngine;
26
- leaf: TlsLeaf;
34
+ leaf: TlsLeaf | undefined;
27
35
  store: TlsStore | undefined;
28
36
  alpn: string[];
29
37
  flags: number;
@@ -32,5 +40,12 @@ interface Server {
32
40
  }
33
41
  export declare function serverOf(proc: SecureProcess, req: ServeRequest): Promise<Server>;
34
42
  export declare function listenSecure(proc: SecureProcess, socket: KernelSocket, req: ServeRequest): Promise<void>;
35
- export declare function serveSecure(proc: SecureProcess, socket: KernelSocket, req: ServeRequest): Promise<ServedSession>;
43
+ export declare function serveSecure(proc: SecureProcess, socket: KernelSocket, req: ServeRequest): Promise<ServedSession | {
44
+ select: ServerOffer;
45
+ }>;
46
+ export declare const TLS_CONTEXTS_MAX = 64;
47
+ export declare function contextSecure(proc: SecureProcess & {
48
+ fds: FdTable;
49
+ }, cert: ClientCertRequest | undefined): Promise<number>;
50
+ export declare function selectSecure(fds: FdTable, socket: KernelSocket, req: SelectRequest): Promise<ServedSession>;
36
51
  export {};
@@ -91,6 +91,16 @@ export type SocketSyscall = {
91
91
  rejectUnauthorized?: boolean;
92
92
  alpn?: string[];
93
93
  handshakeTimeout?: number;
94
+ select?: boolean;
95
+ } | {
96
+ op: 'sock-tls-context';
97
+ cert?: ClientCertRequest;
98
+ } | {
99
+ op: 'sock-tls-select';
100
+ fd: number;
101
+ context?: number;
102
+ alpn?: string;
103
+ refuse?: number;
94
104
  } | {
95
105
  op: 'sock-recvfrom';
96
106
  fd: number;
@@ -94,6 +94,7 @@ export declare class KernelSocket implements KernelFile {
94
94
  serving: {
95
95
  release(): void;
96
96
  } | undefined;
97
+ pending: (() => void) | undefined;
97
98
  private served;
98
99
  get loopbackLinked(): boolean;
99
100
  secureLink<T>(make: (raw: UplinkConn) => Promise<{
@@ -42,6 +42,26 @@ export interface JsTlsOptions {
42
42
  server?: boolean;
43
43
  requestCert?: boolean;
44
44
  handshakeTimeout?: number;
45
+ select?: JsTlsSelect;
46
+ }
47
+ export interface JsTlsOffer {
48
+ servername: string;
49
+ protocols: string[];
50
+ }
51
+ export interface JsTlsChoice {
52
+ context?: JsTlsContext | number;
53
+ alpn?: string;
54
+ refuse?: string | number;
55
+ }
56
+ export type JsTlsSelect = (offer: JsTlsOffer) => JsTlsChoice | undefined | Promise<JsTlsChoice | undefined>;
57
+ export interface JsTlsContext {
58
+ readonly fd: number;
59
+ close(): Promise<void>;
60
+ }
61
+ export interface JsTlsContextOptions {
62
+ cert: unknown;
63
+ key: unknown;
64
+ passphrase?: string;
45
65
  }
46
66
  export interface JsTlsServerSession {
47
67
  readonly path: 'kernel';
@@ -92,6 +112,7 @@ export interface JsNet {
92
112
  listen(options?: JsListenOptions): Promise<JsListener>;
93
113
  connect(options: JsConnectOptions): Promise<JsConnection>;
94
114
  secure(conn: JsConnection, tls: JsTlsOptions): Promise<JsConnection>;
115
+ tlsContext(options: JsTlsContextOptions): Promise<JsTlsContext>;
95
116
  resolve(name: string, options?: JsResolveOptions): Promise<string[]>;
96
117
  }
97
118
  export interface NetIo {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.151.1",
3
+ "version": "1.152.0",
4
4
  "description": "SLICC's wasm-realm kernel: run Emscripten programs in the browser against OPFS, with fork, spawn, pipes and waitpid",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",