@@ -147,13 +147,21 @@ impl<T: Size> Size for Vec<T> {
147147 fn tls_serialized_len ( & self ) -> usize {
148148 self . as_slice ( ) . tls_serialized_len ( )
149149 }
150+ #[ inline( always) ]
151+ fn tls_serialized_len_checked ( & self ) -> Option < usize > {
152+ self . as_slice ( ) . tls_serialized_len_checked ( )
153+ }
150154}
151155
152156impl < T : Size > Size for & Vec < T > {
153157 #[ inline( always) ]
154158 fn tls_serialized_len ( & self ) -> usize {
155159 ( * self ) . tls_serialized_len ( )
156160 }
161+ #[ inline( always) ]
162+ fn tls_serialized_len_checked ( & self ) -> Option < usize > {
163+ ( * self ) . tls_serialized_len_checked ( )
164+ }
157165}
158166
159167impl < T : DeserializeBytes > DeserializeBytes for Vec < T > {
@@ -225,17 +233,23 @@ impl<T: SerializeBytes> SerializeBytes for Vec<T> {
225233 }
226234}
227235
236+ fn serialized_len_checked_slice < T : Size > ( s : & [ T ] ) -> Option < usize > {
237+ hax_lib:: fstar!( "admit ()" ) ; // https://github.com/cryspen/hax/issues/1700
238+ let content_length = s. iter ( ) . fold ( Some ( 0usize ) , |acc, e| {
239+ acc?. checked_add ( e. tls_serialized_len_checked ( ) ?)
240+ } ) ?;
241+ let len_len = length_encoding_bytes ( content_length as u64 ) . ok ( ) ?;
242+ content_length. checked_add ( len_len)
243+ }
244+
228245impl < T : Size > Size for & [ T ] {
246+ #[ inline( always) ]
247+ fn tls_serialized_len_checked ( & self ) -> Option < usize > {
248+ serialized_len_checked_slice ( self )
249+ }
229250 #[ inline( always) ]
230251 fn tls_serialized_len ( & self ) -> usize {
231- hax_lib:: fstar!( "admit ()" ) ; // https://github.com/cryspen/hax/issues/1700
232- let content_length = self . iter ( ) . fold ( 0 , |acc, e| acc + e. tls_serialized_len ( ) ) ;
233- let len_len = length_encoding_bytes ( content_length as u64 ) . unwrap_or ( {
234- // We can't do anything about the error unless we change the trait.
235- // Let's say there's no content for now.
236- 0
237- } ) ;
238- content_length + len_len
252+ serialized_len_checked_slice ( self ) . unwrap_or ( 0 )
239253 }
240254}
241255
@@ -338,19 +352,19 @@ impl From<VLBytes> for Vec<u8> {
338352}
339353
340354#[ inline( always) ]
341- fn tls_serialize_bytes_len ( bytes : & [ u8 ] ) -> usize {
355+ fn tls_serialize_bytes_len ( bytes : & [ u8 ] ) -> Option < usize > {
342356 let content_length = bytes. len ( ) ;
343- let len_len = length_encoding_bytes ( content_length as u64 ) . unwrap_or ( {
344- // We can't do anything about the error. Let's say there's no content.
345- 0
346- } ) ;
347- hax_lib:: fstar!( "admit ()" ) ; // overflow
348- content_length + len_len
357+ let len_len = length_encoding_bytes ( content_length as u64 ) . ok ( ) ?;
358+ content_length. checked_add ( len_len)
349359}
350360
351361impl Size for VLBytes {
352362 #[ inline( always) ]
353363 fn tls_serialized_len ( & self ) -> usize {
364+ tls_serialize_bytes_len ( self . as_slice ( ) ) . unwrap_or ( 0 )
365+ }
366+ #[ inline( always) ]
367+ fn tls_serialized_len_checked ( & self ) -> Option < usize > {
354368 tls_serialize_bytes_len ( self . as_slice ( ) )
355369 }
356370}
@@ -399,6 +413,10 @@ impl Size for &VLBytes {
399413 fn tls_serialized_len ( & self ) -> usize {
400414 ( * self ) . tls_serialized_len ( )
401415 }
416+ #[ inline( always) ]
417+ fn tls_serialized_len_checked ( & self ) -> Option < usize > {
418+ ( * self ) . tls_serialized_len_checked ( )
419+ }
402420}
403421
404422pub struct VLByteSlice < ' a > ( pub & ' a [ u8 ] ) ;
@@ -423,15 +441,23 @@ impl VLByteSlice<'_> {
423441impl Size for & VLByteSlice < ' _ > {
424442 #[ inline]
425443 fn tls_serialized_len ( & self ) -> usize {
444+ tls_serialize_bytes_len ( self . 0 ) . unwrap_or ( 0 )
445+ }
446+ #[ inline]
447+ fn tls_serialized_len_checked ( & self ) -> Option < usize > {
426448 tls_serialize_bytes_len ( self . 0 )
427449 }
428450}
429451
430452impl Size for VLByteSlice < ' _ > {
431453 #[ inline]
432- fn tls_serialized_len ( & self ) -> usize {
454+ fn tls_serialized_len_checked ( & self ) -> Option < usize > {
433455 tls_serialize_bytes_len ( self . 0 )
434456 }
457+ #[ inline]
458+ fn tls_serialized_len ( & self ) -> usize {
459+ tls_serialize_bytes_len ( self . 0 ) . unwrap_or ( 0 )
460+ }
435461}
436462
437463#[ cfg( feature = "std" ) ]
@@ -679,6 +705,9 @@ mod secret_bytes {
679705 fn tls_serialized_len ( & self ) -> usize {
680706 self . 0 . tls_serialized_len ( )
681707 }
708+ fn tls_serialized_len_checked ( & self ) -> Option < usize > {
709+ self . 0 . tls_serialized_len_checked ( )
710+ }
682711 }
683712
684713 impl DeserializeBytes for SecretVLBytes {
0 commit comments