Catalog · How the catalog works
argon2laz
Bindings Object Pascal para o Argon2 (algoritmo vencedor da Password Hashing Competition), com DLLs pré-compiladas para Windows 32/64 bits — pronto para usar em projetos Lazarus/Free Pascal sem precisar compilar a lib C.
- ★ 1 on GitHub
Anyone may press Interesting, signed in or not. It helps others find this project.
README
Argon2 para Lazarus / Free Pascal (Windows)
Bindings em Object Pascal para a biblioteca Argon2, o algoritmo vencedor da Password Hashing Competition e referência atual para hashing seguro de senhas.
O projeto Argon2 oficial (P-H-C/phc-winner-argon2) não distribui DLLs pré-compiladas nem bindings para Lazarus/Free Pascal. Este repositório resolve os dois problemas:
- DLLs compiladas para Windows (32 e 64 bits), prontas para uso — sem precisar instalar MSYS2/MinGW ou compilar a lib C você mesmo.
- Units Pascal com as declarações
externale helpers de alto nível, para chamar o Argon2 diretamente do Lazarus/FPC.
Por que este projeto existe
Ao pesquisar uma forma de usar Argon2 em uma aplicação Delphi/Lazarus, não encontrei nenhum binding pronto e mantido para Windows. A biblioteca oficial é em C, então o caminho foi:
- Compilar a
libargon2como DLL para Windows (x86 e x64), a partir do código-fonte oficial. - Escrever as declarações
cdecl; externalem Pascal para expor as funções da DLL. - Organizar tudo em units reutilizáveis, prontas para dropar em qualquer projeto Lazarus.
Conteúdo do repositório
| Arquivo | Descrição |
|---|---|
argon2_32.dll |
Build da libargon2 para Windows 32 bits |
argon2_64.dll |
Build da libargon2 para Windows 64 bits |
argon2binding.pas |
Binding mínimo — funções essenciais (argon2_hash, argon2_verify, argon2id_hash_encoded, argon2id_verify, argon2_encodedlen, argon2_error_message) |
argon2bindingex.pas |
Binding estendido — expõe toda a API pública da libargon2: variantes argon2i/argon2d/argon2id (hash encoded, hash raw e verify), funções de contexto de baixo nível (argon2*_ctx), códigos de erro completos e utilitários |
Requisitos
- Lazarus / Free Pascal Compiler (modo
objfpc) - Windows (as DLLs incluídas são para Windows; em Linux/macOS seria necessário compilar
libargon2.so/.dylib— o binding estendido já prevê essas plataformas via{$IFDEF LINUX}/{$IFDEF DARWIN}, mas as bibliotecas não estão incluídas neste repositório) - As DLLs devem estar no mesmo diretório do executável (ou em um diretório presente no
PATH)
Instalação
- Copie
argon2_32.dlleargon2_64.dllpara a pasta do seu executável. - Adicione
argon2binding.pasouargon2bindingex.pasao seu projeto (uses). - Compile — a unit já seleciona automaticamente a DLL de 32 ou 64 bits via
{$IFDEF CPU64}.
Uso básico
Exemplo usando a API de alto nível argon2id_hash_encoded / argon2id_verify (recomendada pela especificação oficial para a maioria dos casos):
program TesteArgon2;
{$mode objfpc}{$H+}
uses
argon2binding;
const
T_COST = 2; // iterações
M_COST = 65536; // memória em KB (64 MB)
PARALLELISM = 1; // threads/lanes
HASH_LEN = 32; // tamanho do hash em bytes
var
senha: AnsiString;
salt: array[0..15] of Byte;
encoded: array[0..127] of AnsiChar;
encodedLen: NativeUInt;
resultado: Integer;
begin
senha := 'MinhaSenhaSuperSecreta';
// Em produção, gere o salt com um RNG criptograficamente seguro
FillChar(salt, SizeOf(salt), $42);
encodedLen := argon2_encodedlen(T_COST, M_COST, PARALLELISM,
SizeOf(salt), HASH_LEN, Argon2_id);
resultado := argon2id_hash_encoded(
T_COST, M_COST, PARALLELISM,
PAnsiChar(senha), Length(senha),
@salt, SizeOf(salt),
HASH_LEN,
@encoded[0], encodedLen
);
if resultado = ARGON2_OK then
begin
WriteLn('Hash: ', PAnsiChar(@encoded[0]));
// Verificação
resultado := argon2id_verify(@encoded[0], PAnsiChar(senha), Length(senha));
if resultado = ARGON2_OK then
WriteLn('Senha válida!')
else
WriteLn('Senha inválida.');
end
else
WriteLn('Erro ao gerar hash: ', argon2_error_message(resultado));
end.Qual binding usar?
argon2binding.pas— se você só precisa deargon2id(hash + verify), é o suficiente e mais enxuto.argon2bindingex.pas— se precisa escolher entreargon2i,argon2deargon2id, usar a APIraw(bytes puros, sem string codificada), montar contexto customizado (TArgon2Context, callbacks de alocação de memória) ou tratar todos os códigos de erro individualmente.
Sobre os parâmetros de custo
t_cost— número de iterações. Quanto maior, mais lento e mais seguro.m_cost— memória usada, em KB. É o principal fator de resistência a ataques com GPU/ASIC.parallelism— número de lanes/threads.
Não há um valor único recomendado para todos os casos — ajuste conforme o hardware do servidor e o tempo de resposta aceitável. A documentação oficial do Argon2 traz orientações de calibração.
Compilando as DLLs você mesmo
As DLLs deste repositório foram compiladas a partir do código-fonte oficial (P-H-C/phc-winner-argon2) usando MinGW-w64. Caso prefira compilar a sua própria versão:
git clone https://github.com/P-H-C/phc-winner-argon2.git
cd phc-winner-argon2
makeAjuste o Makefile/toolchain conforme necessário para gerar .dll em vez de .so, ou utilize um ambiente MSYS2/MinGW no Windows.
Licença
O código-fonte do Argon2 é distribuído sob dupla licença CC0 / Apache 2.0 pelos autores originais. Consulte a licença do projeto oficial em P-H-C/phc-winner-argon2 para os termos que se aplicam à biblioteca C e às DLLs geradas a partir dela.
As units Pascal deste repositório (argon2binding.pas, argon2bindingex.pas) estão disponíveis livremente para uso, sob os termos que você definir ao publicar (sugestão: MIT).
Contribuindo
Sugestões, correções e melhorias são bem-vindas — especialmente builds para Linux/macOS, testes automatizados e exemplos adicionais de uso.

