@@ -541,33 +541,43 @@ pub(crate) fn decrypt_header(
541541 aead : & Open ,
542542 plaintext_mode : bool ,
543543) -> Result < ( ) > {
544- if pkt_buf. len ( ) < pkt_num_offset + MAX_PKT_NUM_LEN + SAMPLE_LEN {
544+ let pkt_buf_min = if !plaintext_mode {
545+ pkt_num_offset + MAX_PKT_NUM_LEN + SAMPLE_LEN
546+ } else {
547+ // All aspects of encryption on 1-RTT packets are removed and it is no
548+ // longer including an AEAD tag.
549+ pkt_num_offset + MAX_PKT_NUM_LEN
550+ } ;
551+ if pkt_buf. len ( ) < pkt_buf_min {
545552 return Err ( Error :: BufferTooShort ) ;
546553 }
547554
555+ // Decrypt packet haader if needed
548556 let mut first = pkt_buf[ 0 ] ;
549- let sample_start = pkt_num_offset + MAX_PKT_NUM_LEN ;
550- let sample = & pkt_buf[ sample_start..sample_start + SAMPLE_LEN ] ;
551- let mask = aead. new_mask ( sample) ?;
552-
553- // Remove protection of bits in the first byte
554- if !plaintext_mode {
557+ let ( pkt_num_len, pkt_num_buf) = if !plaintext_mode {
558+ // Remove protection of bits in the first byte
559+ let sample_start = pkt_num_offset + MAX_PKT_NUM_LEN ;
560+ let sample = & pkt_buf[ sample_start..sample_start + SAMPLE_LEN ] ;
561+ let mask = aead. new_mask ( sample) ?;
555562 if PacketHeader :: long_header ( first) {
556563 first ^= mask[ 0 ] & 0x0f ;
557564 } else {
558565 first ^= mask[ 0 ] & 0x1f ;
559566 }
560- }
561567
562- let pkt_num_len = usize:: from ( ( first & PKT_NUM_LEN_MASK ) + 1 ) ;
563- let pkt_num_buf = & mut pkt_buf[ pkt_num_offset..pkt_num_offset + pkt_num_len] ;
568+ let pkt_num_len = usize:: from ( ( first & PKT_NUM_LEN_MASK ) + 1 ) ;
569+ let pkt_num_buf = & mut pkt_buf[ pkt_num_offset..pkt_num_offset + pkt_num_len] ;
564570
565- // Remove protection of packet number field
566- if !plaintext_mode {
571+ // Remove protection of packet number field
567572 for i in 0 ..pkt_num_len {
568573 pkt_num_buf[ i] ^= mask[ i + 1 ] ;
569574 }
570- }
575+ ( pkt_num_len, pkt_num_buf)
576+ } else {
577+ let pkt_num_len = usize:: from ( ( first & PKT_NUM_LEN_MASK ) + 1 ) ;
578+ let pkt_num_buf = & mut pkt_buf[ pkt_num_offset..pkt_num_offset + pkt_num_len] ;
579+ ( pkt_num_len, pkt_num_buf)
580+ } ;
571581
572582 // Extract packet number corresponding to the length.
573583 let pkt_num = {
0 commit comments