zeroize: potetial redesign ideas
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 20/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Necesita aclaración
- Estado de actividad
- Estancado
- Stack tecnológico
- rust
- Área
- cryptography, security
Línea de trabajo
Empieza revisando la API propuesta en este issue y el debate sobre la zeroización plana en #1045. Aclara si el proyecto quiere un rediseño, una adición compatible con versiones anteriores o un cambio para v2.0; se considera terminado cuando se hayan acordado la dirección de la API y el alcance de la migración.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Right now I see the following issues with public API of zeroize:
- Derived and manually implemented
Zeroizecan be inefficient since they rely on zeroization of fields one by one or on zeroizingDropimpls. - Procedural macros are relatively heavy compile time-wise, so usually we do not derive
Zeroizead rely on manual implementations. ZeroizeOnDropis a somewhat useless trait, I haven't seen it used in practice.Zeroizingusefulness is limited. It can be used only for "primitive" types (e.g. raw keys), complex types do not implementZeroizeand instead implement zeroizingDrop.- Zeroization is enabled for a whole crate using features. It's not possible to use selective zeroization and zeroization is not reflected in any way in user code.
I think most structures should be zeroized using the "flat" zeroization (see #1045) and that it can be useful to have explicit indication in user code of structs being zeroized on drop.
So I would like to suggest roughly this API:
/// Zeroizes memory pointed by `data_ptr`, but not memory
/// potentially reference by `T`.
pub unsafe fn zeroize_flat<T>(data_ptr: *mut T) {
// ...
}
/// Zeroize-on-drop wrapper.
///
/// Note that this wrapper zeroizes only data owned by `T`
/// and does nothing with data referenced by it.
#[repr(transparent)]
pub struct ZeroizeOnDrop<T, const IS_ENABLED: bool = true>(T);
/// Abbreviated alias for `ZeroizeOnDrop`.
pub type Zod<T, const IS_ENABLED: bool = true> = ZeroizeOnDrop<T, IS_ENABLED>;
impl<T, const IS_ENABLED: bool> Drop for ZeroizeOnDrop<T, IS_ENABLED> {
fn drop (&mut self) {
unsafe {
std::ptr::drop_in_place(&mut self.0);
if IS_ENABLED { zeroize_flat(&mut self.0); }
}
}
}
// Impl Deref and DerefMut for `ZeroizeOnDrop`
UPD: FlatPod and FlatZod are removed.
It can be introduced in a backward-compatible way, but for clarity it's probably worth to release it as v2.0.
Users would write code like this:
pub struct Foo {
secret_cipher: Zod<Aes128>,
secret_key: Box<Zod<[u8; 16]>>,
non_secret_hasher: Sha256,
// other fields
}
const ZOD: bool = cfg!(feature = "zeroize");
pub struct Bar1 {
// This field will be zeroized only if `zeroize` feature is enabled
cipher: Zod<Aes128, ZOD>,
}
// Alternatively:
pub struct Bar2<const ZOD: bool = true> {
cipher: Zod<Aes128, ZOD>,
}
While it will be a bit less convinient, I think it's useful to have explicit indication in source code that secret types will be zeroized on drop. We may provide aliases like type ZodAes128 = Zod<Aes128> to improve visibility, but I don't think they are worth the trouble and it should be sufficient to simply references zeroize in docs.
- Lenguaje dominante
- Rust
- Estrellas
- 674
- Forks
- 170
- Merge medio
- 1 d 12 h
- PR fusionados (30 d)
- 10
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de RustCrypto/utils
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
RustCrypto/utils#1546 · 1 comentario ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 55/100
RustCrypto/utils#1537 · 7 comentarios ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
RustCrypto/utils#1534 · 2 comentarios ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 45/100
RustCrypto/utils#1529 · 4 comentarios ·
-
x86: guard CPUID leaf 7 by the maximum basic leaf; AVX detection may need XMM+YMM XCR0 state Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
RustCrypto/utils#1510 · 1 comentario ·
Todos los issues de RustCrypto/utils
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
TheLarkInn/aipm#2413 ·
-
documentation
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
alexgorbatchev/simple-ptt#15 ·
-
tooling
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
todo:ticket
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
taikoxyz/taiko-mono#22168 · 1 comentario ·