Unify native output buffer sizing for OCK and OpenSSL in SymmetricCipher
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 20/100
- Tipo di issue
- Refactoring
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Ambito
- cryptography
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- Java
- Stelle
- 16
- Fork
- 26
- Merge medio
- 3g 7h
- PR unite (30g)
- 108
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di IBM/OpenJCEPlus
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
IBM/OpenJCEPlus#1928 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
IBM/OpenJCEPlus#1927 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
IBM/OpenJCEPlus#1923 ·
I maintainer di solito rispondono entro 2 giorni
-
Convert DSA Key and Signature Tests to JUnit 5 Parameterized TestsForse già presa @johnpeck-us-ibm l’ha presa 24 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
IBM/OpenJCEPlus#1922 · 1 assegnatario ·
I maintainer di solito rispondono entro 2 giorni
-
Convert AES Interop and Key Wrap Tests to JUnit 5 Parameterized TestsForse già presa @Mohit-Rajbhar100698 l’ha presa 10 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
IBM/OpenJCEPlus#1915 · 1 assegnatario ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di IBM/OpenJCEPlus
Issue simili
-
untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
opensearch-project/opensearch-prometheus-exporter#680 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
I maintainer di solito rispondono entro 2 giorni
-
bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
-
Good First Issue
Difficoltà 1/5 1-3 ore Idoneità per principianti 88/100
hiero-ledger/hiero-sdk-java#3059 ·
I maintainer di solito rispondono entro 1 giorno
-
bug live-tv platform:desktop platform:mobile platform:tv
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
fk0u/cleanyourtv-tahoe#102 ·
I maintainer di solito rispondono entro 1 giorno