Skip to content

Commit fb113c6

Browse files
committed
FEAT: added support for SHA384 and SHA512 checksums
Replaced Brad Conte's SHA256 only implementation with Aaron D. Gifford's version which supports the new methods too.
1 parent 5149e47 commit fb113c6

File tree

12 files changed

+1413
-227
lines changed

12 files changed

+1413
-227
lines changed

NOTICE

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ SHA1:
2121
Copyright 1995-1998 Eric Young (eay@cryptsoft.com)
2222
All rights reserved.
2323

24-
SHA256:
25-
Copyright 2006-2012 (?) Brad Conte
24+
SHA256/384/512:
25+
Copyright (c) 2000-2001, Aaron D. Gifford - http://www.aarongifford.com/
2626

2727
RC4, AES, DH:
2828
Copyright (c) 2007, Cameron Rich

src/boot/natives.r

+1-1
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ checksum: native [
381381
/hash {Returns a hash value}
382382
size [integer!] {Size of the hash table}
383383
/method {Method to use}
384-
word [word!] {Methods: SHA1 SHA256 MD5 CRC32}
384+
word [word!] {Methods: SHA1 SHA256 SHA384 SHA512 MD5 CRC32}
385385
/key {Returns keyed HMAC value}
386386
key-value [any-string! binary!] {Key to use}
387387
]

src/core/n-strings.c

+18-4
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,25 @@ int SHA1_CtxSize(void);
4747
#endif
4848
#endif
4949

50-
#ifndef SHA256_DEFINED
51-
#ifdef HAS_SHA256
50+
#ifndef SHA2_DEFINED
51+
#ifdef HAS_SHA2
5252
REBYTE *SHA256(REBYTE *, REBCNT, REBYTE *);
5353
void SHA256_Init(void *c);
5454
void SHA256_Update(void *c, REBYTE *data, REBCNT len);
5555
void SHA256_Final(REBYTE *md, void *c);
5656
int SHA256_CtxSize(void);
57+
58+
REBYTE *SHA384(REBYTE *, REBCNT, REBYTE *);
59+
void SHA384_Init(void *c);
60+
void SHA384_Update(void *c, REBYTE *data, REBCNT len);
61+
void SHA384_Final(REBYTE *md, void *c);
62+
int SHA384_CtxSize(void);
63+
64+
REBYTE *SHA512(REBYTE *, REBCNT, REBYTE *);
65+
void SHA512_Init(void *c);
66+
void SHA512_Update(void *c, REBYTE *data, REBCNT len);
67+
void SHA512_Final(REBYTE *md, void *c);
68+
int SHA512_CtxSize(void);
5769
#endif
5870
#endif
5971

@@ -91,8 +103,10 @@ static struct digest {
91103
{SHA1, SHA1_Init, SHA1_Update, SHA1_Final, SHA1_CtxSize, SYM_SHA1, 20, 64},
92104
#endif
93105

94-
#ifdef HAS_SHA256
95-
{SHA256, SHA256_Init, SHA256_Update, SHA256_Final, SHA256_CtxSize, SYM_SHA256, 32, 64},
106+
#ifdef HAS_SHA2
107+
{ SHA256, SHA256_Init, SHA256_Update, SHA256_Final, SHA256_CtxSize, SYM_SHA256, 32, 64 },
108+
{ SHA384, SHA384_Init, SHA384_Update, SHA384_Final, SHA384_CtxSize, SYM_SHA384, 48, 128 },
109+
{ SHA512, SHA512_Init, SHA512_Update, SHA512_Final, SHA512_CtxSize, SYM_SHA512, 64, 128 },
96110
#endif
97111

98112
#ifdef HAS_MD4

src/core/p-checksum.c

+30-3
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@
2727
**
2828
***********************************************************************/
2929

30-
#include "sys-core.h"
30+
//#include "sys-core.h"
31+
#include "sys-sha2.h"
3132
#include "reb-net.h"
3233
#include "sys-md5.h"
3334
#include "sys-sha1.h"
34-
#include "sys-sha256.h"
35+
3536

3637

3738
/***********************************************************************
@@ -51,7 +52,15 @@
5152
break;
5253
case SYM_SHA256:
5354
*ctx = sizeof(SHA256_CTX);
54-
*blk = SHA256_BLOCK_SIZE;
55+
*blk = SHA256_DIGEST_LENGTH;
56+
return;
57+
case SYM_SHA384:
58+
*ctx = sizeof(SHA384_CTX);
59+
*blk = SHA384_DIGEST_LENGTH;
60+
return;
61+
case SYM_SHA512:
62+
*ctx = sizeof(SHA512_CTX);
63+
*blk = SHA512_DIGEST_LENGTH;
5564
return;
5665
default:
5766
*ctx = *blk = 0;
@@ -85,6 +94,12 @@
8594
case SYM_SHA256:
8695
SHA256_Init((SHA256_CTX*)VAL_BIN(ctx));
8796
return TRUE;
97+
case SYM_SHA384:
98+
SHA384_Init((SHA384_CTX*)VAL_BIN(ctx));
99+
return TRUE;
100+
case SYM_SHA512:
101+
SHA512_Init((SHA512_CTX*)VAL_BIN(ctx));
102+
return TRUE;
88103
}
89104
return FALSE;
90105
}
@@ -162,6 +177,12 @@
162177
case SYM_SHA256:
163178
SHA256_Update((SHA256_CTX*)VAL_BIN(ctx), VAL_BIN_SKIP(arg, pos), part);
164179
break;
180+
case SYM_SHA384:
181+
SHA384_Update((SHA384_CTX*)VAL_BIN(ctx), VAL_BIN_SKIP(arg, pos), part);
182+
break;
183+
case SYM_SHA512:
184+
SHA512_Update((SHA512_CTX*)VAL_BIN(ctx), VAL_BIN_SKIP(arg, pos), part);
185+
break;
165186
}
166187
break;
167188
case A_READ:
@@ -194,6 +215,12 @@
194215
case SYM_SHA256:
195216
SHA256_Final(VAL_BIN_DATA(data), (SHA256_CTX*)DS_TOP);
196217
break;
218+
case SYM_SHA384:
219+
SHA384_Final(VAL_BIN_DATA(data), (SHA384_CTX*)DS_TOP);
220+
break;
221+
case SYM_SHA512:
222+
SHA512_Final(VAL_BIN_DATA(data), (SHA512_CTX*)DS_TOP);
223+
break;
197224
}
198225
if(action == A_READ) *D_RET = *data;
199226
return R_RET;

0 commit comments

Comments
 (0)