parser: add sig_alg ext
This commit is contained in:
parent
30492edc39
commit
76a5dc4248
37
src/parse.rs
37
src/parse.rs
@ -599,6 +599,36 @@ fn parse_extension(bytes: &[u8], handshake_type: HandshakeType) -> IResult<&[u8]
|
|||||||
_ => todo!()
|
_ => todo!()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
SignatureAlgorithms => {
|
||||||
|
let (rest, supported_signature_algorithm_length) =
|
||||||
|
take(2_usize)(rest)?;
|
||||||
|
let supported_signature_algorithm_length =
|
||||||
|
NetworkEndian::read_u16(supported_signature_algorithm_length);
|
||||||
|
|
||||||
|
// Take the allocated extension bytes from rest
|
||||||
|
let (rest, mut algorithms) = take(
|
||||||
|
supported_signature_algorithm_length
|
||||||
|
)(rest)?;
|
||||||
|
|
||||||
|
// Parse all algorithms
|
||||||
|
let mut supported_signature_algorithms: Vec<SignatureScheme> =
|
||||||
|
Vec::new();
|
||||||
|
while algorithms.len() != 0 {
|
||||||
|
let (rem, algorithm) = take(2_usize)(algorithms)?;
|
||||||
|
let sig_alg = SignatureScheme::try_from(
|
||||||
|
NetworkEndian::read_u16(algorithm)
|
||||||
|
).unwrap();
|
||||||
|
algorithms = rem;
|
||||||
|
supported_signature_algorithms.push(sig_alg);
|
||||||
|
}
|
||||||
|
|
||||||
|
let signature_scheme_list = crate::tls_packet::SignatureSchemeList {
|
||||||
|
length: supported_signature_algorithm_length,
|
||||||
|
supported_signature_algorithms
|
||||||
|
};
|
||||||
|
|
||||||
|
(rest, ExtensionData::SignatureAlgorithms(signature_scheme_list))
|
||||||
|
}
|
||||||
_ => todo!()
|
_ => todo!()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1623,7 +1653,6 @@ pub fn parse_rsa_ssa_pss_parameters(params: &[u8]) -> IResult<&[u8], (&[u8], usi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse as RSASSA-PSS-params (Sequence: 0x30)
|
// Parse as RSASSA-PSS-params (Sequence: 0x30)
|
||||||
log::info!("sig_alg sequence: {:X?}", params);
|
|
||||||
let (_, rsa_ssa_params) = complete(
|
let (_, rsa_ssa_params) = complete(
|
||||||
parse_asn1_der_sequence
|
parse_asn1_der_sequence
|
||||||
)(params)?;
|
)(params)?;
|
||||||
@ -1637,8 +1666,6 @@ pub fn parse_rsa_ssa_pss_parameters(params: &[u8]) -> IResult<&[u8], (&[u8], usi
|
|||||||
))
|
))
|
||||||
)(rsa_ssa_params)?;
|
)(rsa_ssa_params)?;
|
||||||
|
|
||||||
log::info!("Parser hash algorithm: {:?}", hash_alg);
|
|
||||||
|
|
||||||
let hash_alg = hash_alg.unwrap_or(
|
let hash_alg = hash_alg.unwrap_or(
|
||||||
Asn1DerAlgId { algorithm: ID_SHA1, parameters: &[] }
|
Asn1DerAlgId { algorithm: ID_SHA1, parameters: &[] }
|
||||||
);
|
);
|
||||||
@ -1657,7 +1684,7 @@ pub fn parse_rsa_ssa_pss_parameters(params: &[u8]) -> IResult<&[u8], (&[u8], usi
|
|||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
let mut array_buffer: [u8; core::mem::size_of::<usize>()] = [0; core::mem::size_of::<usize>()];
|
let mut array_buffer: [u8; core::mem::size_of::<usize>()] = [0; core::mem::size_of::<usize>()];
|
||||||
array_buffer[(8-salt_len.len())..].clone_from_slice(salt_len);
|
array_buffer[(core::mem::size_of::<usize>()-salt_len.len())..].clone_from_slice(salt_len);
|
||||||
let salt_len = usize::from_be_bytes(array_buffer);
|
let salt_len = usize::from_be_bytes(array_buffer);
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
@ -1671,7 +1698,6 @@ pub fn parse_rsa_ssa_pss_parameters(params: &[u8]) -> IResult<&[u8], (&[u8], usi
|
|||||||
|
|
||||||
fn parse_hash_algorithm(bytes: &[u8]) -> IResult<&[u8], Asn1DerAlgId> {
|
fn parse_hash_algorithm(bytes: &[u8]) -> IResult<&[u8], Asn1DerAlgId> {
|
||||||
// Parse HashAlgorithm [0]
|
// Parse HashAlgorithm [0]
|
||||||
log::info!("Hash algorithm: {:X?}", bytes);
|
|
||||||
let (rest, (tag_val, _, hash_alg)) = parse_asn1_der_object(bytes)?;
|
let (rest, (tag_val, _, hash_alg)) = parse_asn1_der_object(bytes)?;
|
||||||
// Verify the tag is indeed 0xA0
|
// Verify the tag is indeed 0xA0
|
||||||
if tag_val != 0xA0 {
|
if tag_val != 0xA0 {
|
||||||
@ -1679,7 +1705,6 @@ fn parse_hash_algorithm(bytes: &[u8]) -> IResult<&[u8], Asn1DerAlgId> {
|
|||||||
}
|
}
|
||||||
// Parse the encapsulated algorithm identifier, force completeness
|
// Parse the encapsulated algorithm identifier, force completeness
|
||||||
let (_, hash_alg) = complete(parse_asn1_der_algorithm_identifier)(hash_alg)?;
|
let (_, hash_alg) = complete(parse_asn1_der_algorithm_identifier)(hash_alg)?;
|
||||||
log::info!("Parsed hash algorithm {:?}", hash_alg);
|
|
||||||
Ok((
|
Ok((
|
||||||
rest, hash_alg
|
rest, hash_alg
|
||||||
))
|
))
|
||||||
|
Loading…
Reference in New Issue
Block a user