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
0 commit comments