Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Access violation if GCM mode is set after cipher is initialized

Abierto
#74 3 comentarios 0 reacciones 1 asignado Ver en GitHub

@MHumm ya está trabajando en esto.

Desde el 8/5/2024.

Evaluación

Este issue todavía no se ha evaluado.

Descripción

bug

To Reproduce

  1. Open demo project Cipher_Console
  2. Change Cipher.Mode to cmGCM
  3. Run the code. You receive EAccessViolation

Usually, if you change the cipher mode after the cipher has been initialized, then TDECCipher.SetMode should call Done on the cipher and re-initialize it.

GCM Encode requires that TGCM.Init is called and has set FEncryptionMethod := EncryptionMethod. However, if Ciper.Mode is set after the cipher has been initialized, then TGCM is created but TGCM.Init has not been called.

procedure TDECCipherModes.InitMode;
begin
  if FMode = TCipherMode.cmGCM then
  begin
    if Context.BlockSize = 16 then
      FGCM := TGCM.Create
    else
      // GCM requires a cipher with 128 bit block size
      raise EDECCipherException.CreateResFmt(@sInvalidBlockSize,
                                             [128, GetEnumName(TypeInfo(TCipherMode),
                                             Integer(FMode))]);
  end
  else
    if Assigned(FGCM) then
      FreeAndNil(FGCM);
end;

The program flow if Mode has been set before init:

  1. TDECCipher.Init()
  2. TDECCipher.Init()
  3. TDECCipherModes.OnAfterInitVectorInitialized ( calls FGCM.Init(self.DoEncode, OriginalInitVector) )
  4. TGCM.Init

The program flow if Mode has been set after init:

  1. TDECCipher.SetMode
  2. TDECCipherModes.InitMode
  3. TGCM.Create, but not TGCM.Init ( I am not sure where I get OriginalInitVector from )

So... what do we do? We probably need to preserve the InitVector, so we can call TGCM.Init with the correct parameters.

The other solution is to forbid to change the mode after the cipher has been initialized. But this is a code breaking change.

Lenguaje dominante
HTML
Estrellas
286
Forks
78
Merge medio
1 d 23 min
PR fusionados (30 d)
5

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de MHumm/DelphiEncryptionCompendium

Todos los issues de MHumm/DelphiEncryptionCompendium

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.