| ... |
... |
@@ -40,6 +40,7 @@ use rkv::{StoreError, StoreOptions, Value}; |
|
40
|
40
|
use rust_cascade::Cascade;
|
|
41
|
41
|
use sha2::{Digest, Sha256};
|
|
42
|
42
|
use std::collections::{HashMap, HashSet};
|
|
|
43
|
+use std::convert::TryInto;
|
|
43
|
44
|
use std::ffi::CString;
|
|
44
|
45
|
use std::fmt::Display;
|
|
45
|
46
|
use std::fs::{create_dir_all, remove_file, File, OpenOptions};
|
| ... |
... |
@@ -266,10 +267,10 @@ impl SecurityState { |
|
266
|
267
|
};
|
|
267
|
268
|
let reader = env_and_store.env.read()?;
|
|
268
|
269
|
match env_and_store.store.get(&reader, key) {
|
|
269
|
|
- Ok(Some(Value::I64(i)))
|
|
270
|
|
- if i <= (std::i16::MAX as i64) && i >= (std::i16::MIN as i64) =>
|
|
271
|
|
- {
|
|
272
|
|
- Ok(Some(i as i16))
|
|
|
270
|
+ Ok(Some(Value::I64(i))) => {
|
|
|
271
|
+ Ok(Some(i.try_into().map_err(|_| {
|
|
|
272
|
+ SecurityStateError::from("Stored value out of range for i16")
|
|
|
273
|
+ })?))
|
|
273
|
274
|
}
|
|
274
|
275
|
Ok(None) => Ok(None),
|
|
275
|
276
|
Ok(_) => Err(SecurityStateError::from(
|
| ... |
... |
@@ -893,10 +894,10 @@ struct Cert<'a> { |
|
893
|
894
|
|
|
894
|
895
|
impl<'a> Cert<'a> {
|
|
895
|
896
|
fn new(der: &'a [u8], subject: &'a [u8], trust: i16) -> Result<Cert<'a>, SecurityStateError> {
|
|
896
|
|
- if der.len() > u16::max as usize {
|
|
|
897
|
+ if der.len() > u16::MAX.into() {
|
|
897
|
898
|
return Err(SecurityStateError::from("certificate is too long"));
|
|
898
|
899
|
}
|
|
899
|
|
- if subject.len() > u16::max as usize {
|
|
|
900
|
+ if subject.len() > u16::MAX.into() {
|
|
900
|
901
|
return Err(SecurityStateError::from("subject is too long"));
|
|
901
|
902
|
}
|
|
902
|
903
|
Ok(Cert {
|
| ... |
... |
@@ -920,7 +921,7 @@ impl<'a> Cert<'a> { |
|
920
|
921
|
return Err(SecurityStateError::from("invalid Cert: no der len?"));
|
|
921
|
922
|
}
|
|
922
|
923
|
let (mut der_len, rest) = rest.split_at(size_of::<u16>());
|
|
923
|
|
- let der_len = der_len.read_u16::<NetworkEndian>()? as usize;
|
|
|
924
|
+ let der_len = der_len.read_u16::<NetworkEndian>()?.into();
|
|
924
|
925
|
if rest.len() < der_len {
|
|
925
|
926
|
return Err(SecurityStateError::from("invalid Cert: no der?"));
|
|
926
|
927
|
}
|
| ... |
... |
@@ -930,7 +931,7 @@ impl<'a> Cert<'a> { |
|
930
|
931
|
return Err(SecurityStateError::from("invalid Cert: no subject len?"));
|
|
931
|
932
|
}
|
|
932
|
933
|
let (mut subject_len, rest) = rest.split_at(size_of::<u16>());
|
|
933
|
|
- let subject_len = subject_len.read_u16::<NetworkEndian>()? as usize;
|
|
|
934
|
+ let subject_len = subject_len.read_u16::<NetworkEndian>()?.into();
|
|
934
|
935
|
if rest.len() < subject_len {
|
|
935
|
936
|
return Err(SecurityStateError::from("invalid Cert: no subject?"));
|
|
936
|
937
|
}
|
| ... |
... |
@@ -961,15 +962,19 @@ impl<'a> Cert<'a> { |
|
961
|
962
|
+ size_of::<i16>(),
|
|
962
|
963
|
);
|
|
963
|
964
|
bytes.write_u8(CERT_SERIALIZATION_VERSION_1)?;
|
|
964
|
|
- if self.der.len() > u16::max as usize {
|
|
965
|
|
- return Err(SecurityStateError::from("certificate is too long"));
|
|
966
|
|
- }
|
|
967
|
|
- bytes.write_u16::<NetworkEndian>(self.der.len() as u16)?;
|
|
|
965
|
+ bytes.write_u16::<NetworkEndian>(
|
|
|
966
|
+ self.der
|
|
|
967
|
+ .len()
|
|
|
968
|
+ .try_into()
|
|
|
969
|
+ .map_err(|_| SecurityStateError::from("certificate is too long"))?,
|
|
|
970
|
+ )?;
|
|
968
|
971
|
bytes.extend_from_slice(&self.der);
|
|
969
|
|
- if self.subject.len() > u16::max as usize {
|
|
970
|
|
- return Err(SecurityStateError::from("subject is too long"));
|
|
971
|
|
- }
|
|
972
|
|
- bytes.write_u16::<NetworkEndian>(self.subject.len() as u16)?;
|
|
|
972
|
+ bytes.write_u16::<NetworkEndian>(
|
|
|
973
|
+ self.subject
|
|
|
974
|
+ .len()
|
|
|
975
|
+ .try_into()
|
|
|
976
|
+ .map_err(|_| SecurityStateError::from("subject is too long"))?,
|
|
|
977
|
+ )?;
|
|
973
|
978
|
bytes.extend_from_slice(&self.subject);
|
|
974
|
979
|
bytes.write_i16::<NetworkEndian>(self.trust)?;
|
|
975
|
980
|
Ok(bytes)
|
| ... |
... |
@@ -1183,7 +1188,7 @@ fn load_crlite_stash_from_reader_into_map( |
|
1183
|
1188
|
let issuer_spki_hash_len = reader.read_u8().map_err(|e| {
|
|
1184
|
1189
|
SecurityStateError::from(format!("error reading stash issuer_spki_hash_len: {}", e))
|
|
1185
|
1190
|
})?;
|
|
1186
|
|
- let mut issuer_spki_hash = vec![0; issuer_spki_hash_len as usize];
|
|
|
1191
|
+ let mut issuer_spki_hash = vec![0; issuer_spki_hash_len.into()];
|
|
1187
|
1192
|
reader.read_exact(&mut issuer_spki_hash).map_err(|e| {
|
|
1188
|
1193
|
SecurityStateError::from(format!("error reading stash issuer_spki_hash: {}", e))
|
|
1189
|
1194
|
})?;
|
| ... |
... |
@@ -1192,7 +1197,7 @@ fn load_crlite_stash_from_reader_into_map( |
|
1192
|
1197
|
let serial_len = reader.read_u8().map_err(|e| {
|
|
1193
|
1198
|
SecurityStateError::from(format!("error reading stash serial_len: {}", e))
|
|
1194
|
1199
|
})?;
|
|
1195
|
|
- let mut serial = vec![0; serial_len as usize];
|
|
|
1200
|
+ let mut serial = vec![0; serial_len.into()];
|
|
1196
|
1201
|
reader.read_exact(&mut serial).map_err(|e| {
|
|
1197
|
1202
|
SecurityStateError::from(format!("error reading stash serial: {}", e))
|
|
1198
|
1203
|
})?;
|