Skip to content

Commit ef242a2

Browse files
committed
brand new format
1 parent 8358d86 commit ef242a2

File tree

9 files changed

+203
-256
lines changed

9 files changed

+203
-256
lines changed

deno.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@tls/param",
3-
"version": "0.2.1",
3+
"version": "0.2.2",
44
"exports": "./src/mod.ts",
55
"publish": {
66
"exclude": ["dist/"]
@@ -14,9 +14,9 @@
1414
},
1515
"imports": {
1616
"@std/assert": "jsr:@std/assert@^1.0.2",
17-
"@tls/enum": "jsr:@tls/enum@^0.7.3",
18-
"@tls/extension": "jsr:@tls/extension@^0.3.0",
19-
"@tls/handshake": "jsr:@tls/handshake@^0.0.5",
20-
"@tls/struct": "jsr:@tls/struct@^0.3.7"
17+
"@tls/enum": "jsr:@tls/enum@^0.7.7",
18+
"@tls/extension": "jsr:@tls/extension@^0.3.9",
19+
"@tls/handshake": "jsr:@tls/handshake@^0.0.8",
20+
"@tls/struct": "jsr:@tls/struct@^0.3.8"
2121
}
2222
}

deno.lock

Lines changed: 34 additions & 48 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/certificatereq.js

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
//@ts-self-types="../type/certificatereq.d.ts"
22

3-
import { Constrained, Uint16, Extension, Struct } from "./dep.ts";
3+
import { Uint16, Extension, parseItems } from "./dep.ts";
4+
import { parseExtension } from "./utils.js";
45

5-
class Extensions extends Constrained {
6+
/* class Extensions extends Constrained {
67
static from(array) {
78
const copy = Uint8Array.from(array);
89
const lengthOf = Uint16.from(copy.subarray(0, 2)).value;
@@ -11,7 +12,7 @@ class Extensions extends Constrained {
1112
for (let offset = 2; offset < lengthOf + 2;) {
1213
const extension = Extension.from(copy.subarray(offset))
1314
extensions.push(extension);
14-
offset+= extension.length;
15+
offset += extension.length;
1516
}
1617
return new Extensions(...extensions)
1718
}
@@ -33,16 +34,46 @@ class Certificate_request_context extends Constrained {
3334
super(0, 255, opaque)
3435
this.opaque = opaque
3536
}
36-
}
37+
} */
3738
/**
3839
* https://datatracker.ietf.org/doc/html/rfc8446#section-4.3.2
3940
*/
40-
export class CertificateRequest extends Struct {
41-
static from(array){
41+
export class CertificateRequest extends Uint8Array {
42+
#context
43+
#extensions
44+
static sanitize(array) {
45+
const lengthOf_1 = array.at(0);
46+
if (lengthOf_1 > 255) throw Error(`Context must less than 256 byte`)
47+
const lengthOf_2 = Uint16.from(array.subarray(1 + lengthOf_1)).value;
48+
if (lengthOf_2 > 65535) throw Error(`Extension must less than 65536`)
49+
const output = array.slice(0, lengthOf_1 + lengthOf_2 + 3)
50+
return [output]
51+
}
52+
static from(array) { return new CertificateRequest(array) }
53+
constructor(...args) {
54+
args = (args[0] instanceof Uint8Array) ? CertificateRequest.sanitize(args[0]) : args
55+
super(...args)
56+
}
57+
get context() {
58+
if (this.#context) return this.#context;
59+
const lengthOf = this.at(0);
60+
this.#context ||= this.subarray(1, 1 + lengthOf);
61+
return this.#context;
62+
}
63+
get extensions() {
64+
if (this.#extensions) return this.#extensions;
65+
const lengthOf = Uint16.from(this.subarray(1 + this.context.length)).value;
66+
this.#extensions ||= parseItems(this, this.context.length + 3, lengthOf, Extension, parseExtension);
67+
return this.#extensions
68+
}
69+
}
70+
71+
/* export class CertificateRequest_0 extends Struct {
72+
static from(array) {
4273
const copy = Uint8Array.from(array);
4374
const certificate_request_context = Certificate_request_context.from(copy);
4475
const extensions = Extensions.from(copy.subarray(certificate_request_context.length))
45-
return new CertificateRequest(certificate_request_context.opaque,...extensions.extensions)
76+
return new CertificateRequest(certificate_request_context.opaque, ...extensions.extensions)
4677
}
4778
constructor(certificate_request_context, ...extension) {
4879
super(
@@ -52,5 +83,5 @@ export class CertificateRequest extends Struct {
5283
}
5384
static extensions = Extensions
5485
static certificate_request_context = Certificate_request_context
55-
}
86+
} */
5687

src/encrypted.js

Lines changed: 25 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,32 @@
11
// deno-lint-ignore-file no-slow-types
22
// @ts-self-types="../type/encrypted.d.ts"
3-
import { Handshake, HandshakeType } from "./dep.ts";
4-
import { Uint16, Constrained, Uint24, parseItems } from "./dep.ts";
5-
import {
6-
Extension, ExtensionType,
7-
NamedGroupList, RecordSizeLimit,
8-
KeyShareClientHello, SupportedVersions, ServerNameList, PskKeyExchangeModes,
9-
Cookie, Supported_signature_algorithms,
10-
OfferedPsks,
11-
EarlyDataIndication,
12-
Padding,
13-
} from "./dep.ts"
3+
import { Uint16, parseItems } from "./dep.ts";
4+
import { Extension } from "./dep.ts"
5+
import { parseExtension } from "./utils.js";
6+
7+
export class EncryptedExtensions extends Uint8Array {
8+
#extensions
9+
static sanitize(array) {
10+
const lengthOf = Uint16.from(array).value;
11+
if (lengthOf > 65535) throw Error(`Length exceeding max. 65535`)
12+
return [array.slice(0, 2 + lengthOf)]
13+
}
14+
static from(array){ return new EncryptedExtensions(array)}
15+
constructor(...args) {
16+
args = (args.at(0) instanceof Uint8Array) ? EncryptedExtensions.sanitize(args.at(0)) : args
17+
super(...args)
18+
}
19+
get extensions() {
20+
this.#extensions ||= parseItems(this, 2, this.length - 2, Extension, parseExtension);
21+
return this.#extensions
22+
}
23+
}
24+
1425

1526
/**
1627
* https://datatracker.ietf.org/doc/html/rfc8446#section-4.3.1
1728
*/
18-
export class EncryptedExtensions extends Constrained {
29+
/* export class EncryptedExtensions_0 extends Constrained {
1930
ext = new Set;
2031
static fromExtensions(...extensions) { return new EncryptedExtensions(...extensions) }
2132
static fromHandshake(array) {
@@ -30,7 +41,7 @@ export class EncryptedExtensions extends Constrained {
3041
const copy = Uint8Array.from(array)
3142
const lengthOf = Uint16.from(copy).value;
3243
if (lengthOf == 0) return new EncryptedExtensions
33-
const extensions = parseItems(copy, 2, lengthOf, Extension);//_Extensions.from(copy.subarray());
44+
const extensions = parseItems(copy, 2, lengthOf, Extension, parseExtension);//_Extensions.from(copy.subarray());
3445
return new EncryptedExtensions(...extensions)
3546
}
3647
@@ -70,45 +81,6 @@ class _Extensions extends Constrained {
7081
this.extensions = extensions
7182
}
7283
}
84+
*/
7385

74-
function parseExtension(extension) {
75-
const { extension_type, extension_data } = extension;
76-
switch (extension_type) {
77-
case ExtensionType.SUPPORTED_GROUPS: {
78-
extension.extension_data = NamedGroupList.from(extension_data); break;
79-
}
80-
case ExtensionType.KEY_SHARE: {
81-
extension.extension_data = KeyShareClientHello.from(extension_data); break;
82-
}
83-
case ExtensionType.SUPPORTED_VERSIONS: {
84-
extension.extension_data = SupportedVersions.fromClient_hello(extension_data); break;
85-
}
86-
case ExtensionType.SIGNATURE_ALGORITHMS: {
87-
extension.extension_data = Supported_signature_algorithms.from(extension_data); break;
88-
}
89-
case ExtensionType.SERVER_NAME: {
90-
extension.extension_data = extension_data.length ? ServerNameList.from(extension_data) : extension_data; break;
91-
}
92-
case ExtensionType.PSK_KEY_EXCHANGE_MODES: {
93-
extension.extension_data = PskKeyExchangeModes.from(extension_data); break;
94-
}
95-
case ExtensionType.COOKIE: {
96-
extension.extension_data = Cookie.from(extension_data); break;
97-
}
98-
case ExtensionType.RECORD_SIZE_LIMIT: {
99-
extension.extension_data = RecordSizeLimit.from(extension_data); break;
100-
}
101-
case ExtensionType.EARLY_DATA: {
102-
extension.extension_data = EarlyDataIndication.from(extension_data); break;
103-
}
104-
case ExtensionType.PADDING: {
105-
extension.extension_data = Padding.from(extension_data); break;
106-
}
107-
case ExtensionType.PRE_SHARED_KEY: {
108-
extension.extension_data = OfferedPsks.from(extension_data); break;
109-
}
110-
default:
111-
break;
112-
}
113-
}
11486

src/utils.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import {
2+
ExtensionType,
3+
NamedGroupList, RecordSizeLimit,
4+
KeyShareClientHello, ServerNameList, PskKeyExchangeModes,
5+
Cookie, Supported_signature_algorithms,
6+
OfferedPsks,
7+
EarlyDataIndication,
8+
Padding,
9+
Versions
10+
} from "./dep.ts"
11+
12+
export function parseExtension(extension) {
13+
switch (extension.type) {
14+
case ExtensionType.SUPPORTED_GROUPS: {
15+
extension.parser = NamedGroupList; break;
16+
}
17+
case ExtensionType.KEY_SHARE: {
18+
extension.parser = KeyShareClientHello; break;
19+
}
20+
case ExtensionType.SUPPORTED_VERSIONS: {
21+
extension.parser = Versions; break;
22+
}
23+
case ExtensionType.SIGNATURE_ALGORITHMS: {
24+
extension.parser = Supported_signature_algorithms; break;
25+
}
26+
case ExtensionType.SERVER_NAME: {
27+
extension.parser = extension.data.length ? ServerNameList : extension.data; break;
28+
}
29+
case ExtensionType.PSK_KEY_EXCHANGE_MODES: {
30+
extension.parser = PskKeyExchangeModes; break;
31+
}
32+
case ExtensionType.COOKIE: {
33+
extension.parser = Cookie; break;
34+
}
35+
case ExtensionType.RECORD_SIZE_LIMIT: {
36+
extension.parser = RecordSizeLimit; break;
37+
}
38+
case ExtensionType.EARLY_DATA: {
39+
extension.parser = EarlyDataIndication; break;
40+
}
41+
case ExtensionType.PADDING: {
42+
extension.parser = Padding; break;
43+
}
44+
case ExtensionType.PRE_SHARED_KEY: {
45+
extension.parser = OfferedPsks; break;
46+
}
47+
default:
48+
break;
49+
}
50+
}

test/certificatereq_test.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ import { ExtensionType } from "@tls/enum";
22
import { CertificateRequest } from "../src/certificatereq.js";
33
import { assertEquals } from "jsr:@std/assert";
44

5-
Deno.test("CertificateRequest", () => {
6-
const test = new CertificateRequest(new CertificateRequest.certificate_request_context(Uint8Array.of(1, 3, 5)),
7-
ExtensionType.SERVER_NAME.extension(Uint8Array.of(5, 8, 9)))
8-
const back = CertificateRequest.from(test);
9-
assertEquals(test, back)
10-
})
5+
const test = Uint8Array.of(1, 1, 0, 6, 0, 13, 0, 2, 4, 3)
6+
const back = CertificateRequest.from(test);
7+
const exts = back.extensions
118

0 commit comments

Comments
 (0)