Unify native output buffer sizing for OCK and OpenSSL in SymmetricCipher
Los mantenedores suelen responder en 2 días
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
- Refactorización
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Área
- cryptography
Línea de trabajo
Start with SymmetricCipher.java (getOutputSizeForOCK, renamed to getNativeOutputSize in PR #2009) and the checkRange checks in the OpenSSL SymmetricCipher.c (len + blockSize for update/decryptFinal, len + 2*blockSize - 1 for encryptFinal). Trace the OCKC native update/doFinal paths to find where the temporary buffer is sized and add the equivalent range check there, then build the stress loop the issue describes (all modes, padding on/off, lengths 0..~100, multiple threads). Done means one buffer calculation shared by both backends and a clean, ideally crashing-revealing, stress run.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
SymmetricCipher allocates a temporary buffer for each native update/doFinal call. OCK and OpenSSL use different sizing today, and OCK's is based on an unproven assumption. We want a single calculation for both backends, backed by each library's real maximum write. Failing to provide a big enough buffer will cause an overlay.
Background
- On
main,getOutputSizeForOCK(inputLen)returns(bufferedCount + inputLen)rounded up to the next block, plusOCK_ENCRYPTION_RESIDUE(16). The 16 comes from the comment "GSKit code adds 16 to the input buffer length for every update and provides a 16 byte buffer for the Final". No source in the repo proves it is the maximum OCK writes. - PR #2009 adds the OpenSSL backend for AES. Its native code (
SymmetricCipher.c) checks the real array length against the worst-case write before everyEVP_*call (checkRange) and throws if too small:- update / decryptFinal:
len + blockSize - encryptFinal:
len + 2*blockSize - 1
This change was only applied to the OpenSSL backend even though the same change is expected on both backends. The methodgetOutputSizeForOCKwas also renamed togetNativeOutputSize.
- update / decryptFinal:
Findings
- OCKC's real maximum write per mode cannot be determined from documentation or source. Do not plan on "finding" it. OpenSSL is in use so likely it has the same constraint / buffer requirements. Whatever buffer is used should be applied to both OCKC and OpenSSL backends.
- The fix must be safe and verified empirically with a test.
Proposed work
- Add the same range defensive check to the OCKC backend and remove the buffer resize code from the Java driving class
SymmetricCiphermethodgetOutputSizeForOCKorgetNativeOutputSizethat was changed in the mentioned PR. - Stress test to try to force an overwrite, run in a loop on OCK :
- All modes (ECB, CBC, CFB, CFB8, OFB, CTR; z fast path where available), padding and no padding.
updateanddoFinal, with buffered partial blocks, input lengths 0..~100 and around block boundaries, small and large caller buffers.- Many iterations and multiple threads, watching for crashes, heap corruption, or wrong output.
- Limitation: a Java array overflow does not always crash, so a clean run is evidence, not proof.
- Apply a new buffer size common for both backends and validate using developed test. We can keep range checks in for a period of time and later remove them for performance reasons given that Java already should perform caluclations of correct size buffers and they woudl become redundant. Consider keeping the C range checks in if performance is not impacted.
- Lenguaje dominante
- Java
- Estrellas
- 16
- Forks
- 26
- Merge medio
- 3 d 7 h
- PR fusionados (30 d)
- 108
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
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 IBM/OpenJCEPlus
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
IBM/OpenJCEPlus#1928 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
IBM/OpenJCEPlus#1927 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
IBM/OpenJCEPlus#1923 ·
Los mantenedores suelen responder en 2 días
-
Convert DSA Key and Signature Tests to JUnit 5 Parameterized TestsPosiblemente ocupada @johnpeck-us-ibm la tomó hace 24 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
IBM/OpenJCEPlus#1922 · 1 asignado ·
Los mantenedores suelen responder en 2 días
-
Convert AES Interop and Key Wrap Tests to JUnit 5 Parameterized TestsPosiblemente ocupada @Mohit-Rajbhar100698 la tomó hace 10 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
IBM/OpenJCEPlus#1915 · 1 asignado ·
Los mantenedores suelen responder en 2 días
Todos los issues de IBM/OpenJCEPlus
Issues similares
-
untriaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
opensearch-project/opensearch-prometheus-exporter#680 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
Los mantenedores suelen responder en 2 días
-
bug
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
-
Good First Issue
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
hiero-ledger/hiero-sdk-java#3059 ·
Los mantenedores suelen responder en 1 día
-
bug live-tv platform:desktop platform:mobile platform:tv
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
fk0u/cleanyourtv-tahoe#102 ·
Los mantenedores suelen responder en 1 día