Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

DecodeBytes decodes in place and overwrites the caller's ciphertext (non-GCM modes)

Aberta Para iniciantes
#110 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
68/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Domínio
cryptography, testing

Direção de pesquisa

Comece por TDECFormattedCipher.DecodeBytes, onde Result := Source faz com que ambos os arrays compartilhem memória. Somente o ramo cmGCM chama SetLength, então copie a entrada para Result antes de Decode em todos os modos. A correção paralela está em TestTFormat_UU.TestIsValidTypeless, onde @SrcBuf deve virar @SrcBuf[0]. Está concluído quando o array de entrada do chamador permanece inalterado após a decodificação em todos os modos e os testes passam no Win64.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

TDECFormattedCipher.DecodeBytes overwrites the caller's input array for every mode except GCM.

Cause

DecodeBytes starts with Result := Source. For dynamic arrays this only copies the reference, so Result and Source point to the same memory. Only for cmGCM is SetLength(Result, Length(Source)) called, which creates a separate copy. For all other modes Decode(Source[0], Result[0], ...) writes the plaintext straight into the caller's array.

Effect

After Plain := Cipher.DecodeBytes(CipherText), CipherText contains the plaintext too. Code that decodes the same buffer twice, or keeps the ciphertext for later use (logging, retry, comparing), silently works on wrong data.

Repro

Cipher := TCipher_Twofish.Create;
Cipher.Mode := cmCBCx;
Cipher.Init(Key, IV, $FF);
Original := Copy(Source);
Plain := Cipher.DecodeBytes(Source);
// Source is now equal to Plain instead of Original

I came across this in the ChaCha20 speed tests on development_chacha20poly1305, which decode the same buffer once per CPU mode. Every decode after the first one failed.

Side note

TestTFormat_UU.TestIsValidTypeless fails now and then on Win64. It uses p := @SrcBuf, which points at the array variable instead of the data, so IsValid checks the bytes of a heap pointer. It should be @SrcBuf[0]. I fix that in the same PR.

Linguagem predominante
HTML
Estrelas
286
Forks
78
Merge médio
1d 4h
PRs com merge (30d)
4

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de MHumm/DelphiEncryptionCompendium

Todas as issues de MHumm/DelphiEncryptionCompendium

Issues semelhantes

Mais issues de Cryptography

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.