gambas-source-code/main/lib/hash/hash.h
Benoît Minisini 0b7c342e8e Add Md5(), Sha1(), Sha256() and Sha512() functions.
[CONFIGURATION]
* NEW: Update 'README' and 'README.md' files.

[COMPILER]
* NEW: Add Md5(), Sha1(), Sha256() and Sha512() functions.

[INTERPRETER]
* NEW: Add Md5(), Sha1(), Sha256() and Sha512() functions.

[GB.HASH]
* NEW: This is a new component that implements the Md5(), Sha1(), Sha256() and Sha512() functions.
  The code comes from BusyBox.
2022-09-13 02:48:11 +02:00

76 lines
2.6 KiB
C

/***************************************************************************
hash.h
(c) Benoît Minisini <benoit.minisini@gambas-basic.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
***************************************************************************/
#ifndef __HASH_H
#define __HASH_H
#include <stdint.h>
#include <stddef.h>
#include <string.h>
typedef struct md5_ctx_t {
uint8_t wbuffer[64]; /* always correctly aligned for uint64_t */
void (*process_block)(struct md5_ctx_t*);
uint64_t total64; /* must be directly before hash[] */
uint32_t hash[8]; /* 4 elements for md5, 5 for sha1, 8 for sha256 */
} md5_ctx_t;
typedef struct md5_ctx_t sha1_ctx_t;
typedef struct md5_ctx_t sha256_ctx_t;
typedef struct sha512_ctx_t {
uint64_t total64[2]; /* must be directly before hash[] */
uint64_t hash[8];
uint8_t wbuffer[128]; /* always correctly aligned for uint64_t */
} sha512_ctx_t;
typedef struct sha3_ctx_t {
uint64_t state[25];
unsigned bytes_queued;
unsigned input_block_bytes;
} sha3_ctx_t;
void md5_begin(md5_ctx_t *ctx);
void md5_hash(md5_ctx_t *ctx, const void *buffer, size_t len);
unsigned md5_end(md5_ctx_t *ctx, void *resbuf);
void sha1_begin(sha1_ctx_t *ctx);
#define sha1_hash md5_hash
unsigned sha1_end(sha1_ctx_t *ctx, void *resbuf);
void sha256_begin(sha256_ctx_t *ctx);
#define sha256_hash md5_hash
#define sha256_end sha1_end
void sha512_begin(sha512_ctx_t *ctx);
void sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len);
unsigned sha512_end(sha512_ctx_t *ctx, void *resbuf);
void sha3_begin(sha3_ctx_t *ctx);
void sha3_hash(sha3_ctx_t *ctx, const void *buffer, size_t len);
unsigned sha3_end(sha3_ctx_t *ctx, void *resbuf);
/* TLS benefits from knowing that sha1 and sha256 share these. Give them "agnostic" names too */
typedef struct md5_ctx_t md5sha_ctx_t;
#define md5sha_hash md5_hash
#define sha_end sha1_end
enum {
MD5_OUTSIZE = 16,
SHA1_OUTSIZE = 20,
SHA256_OUTSIZE = 32,
SHA512_OUTSIZE = 64,
SHA3_OUTSIZE = 28,
};
#endif