Commit e849c8f2 authored by kollo's avatar kollo

added SHA1 algorithm for HASH$()

release notes mit md5/sha1
parent f711d1e7
Release notes for Version 1.25 (Sept 2016 -- )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- HASH()/SHA1 and MD5 now work also without libgcrypt
......@@ -63,8 +63,8 @@ For details, see: http://www.netlib.org/lapack/
X11-Basic uses the lodepng code for the PNG bitmap graphics support.
Copyright (c) 2005-2013 Lode Vandevenne
X11-Basic uses a md5 algorithm
Copyright (c) 2001 by Alexander Peslyak (public domain).
X11-Basic uses a md5 algorithm Copyright (c) 2001 by Alexander Peslyak (public domain).
X11-Basic uses a sha1 algorithm Copyright (C) 2001-2003 Christophe Devine (GPLv2+)
So I would like to thank every people involved in the following projects:
......
......@@ -28,8 +28,9 @@ DESCRIPTION:
HASH$() returns a string which contains the hash value in binary form.
COMMENT:
The default HASH$(), which is MD5, is always available. The other
hash algorithms are only available if libgcrypt was compiled in.
The default HASH$(), which is MD5, and HASH typ%=2, which is SHA1, are
always available. The other hash algorithms are only available if
libgcrypt was compiled in.
EXAMPLE:
h$=HASH$("Calculate a MD5 sum from this text.",1)
......
......@@ -63,8 +63,8 @@ For details, see: http://www.netlib.org/lapack/
X11-Basic uses the lodepng code for the PNG bitmap graphics support.
Copyright (c) 2005-2013 Lode Vandevenne
X11-Basic uses a md5 algorithm
Copyright (c) 2001 by Alexander Peslyak (public domain).
X11-Basic uses a md5 algorithm Copyright (c) 2001 by Alexander Peslyak (public domain).
X11-Basic uses a sha1 algorithm Copyright (C) 2001-2003 Christophe Devine (GPLv2+)
So I would like to thank every people involved in the following projects:
......
......@@ -73,7 +73,7 @@ LIBOBJS=xbasic.o tools.o loadprg.o file.o io.o io_basic.o parser.o variablen.o s
runtime.o wort_sep.o ltext.o functions.o sfunctions.o afunctions.o \
kommandos.o gkommandos.o bitmap.o do_gets.o errortxt.o window.o\
sysVstuff.o aes.o graphics.o sound.o number.o decode.o \
virtual-machine.o type.o lodepng.o md5.o
virtual-machine.o type.o lodepng.o md5.o sha1.o
# these are objects which are compiled to binary
......@@ -106,7 +106,7 @@ HSRC= aes.h afunctions.h android.h array.h bitmap.h bytecode.h \
mathematics.h number.h options.h parameter.h parser.h raw_mouse.h \
sfunctions.h sound.h svariablen.h sysVstuff.h \
terminal.h type.h variablen.h virtual-machine.h \
window.h wort_sep.h x11basic.h xb2csol.h xbasic.h lodepng.h md5.h
window.h wort_sep.h x11basic.h xb2csol.h xbasic.h lodepng.h md5.h sha1.h
EXAMPLES_TESTS= \
../examples/tests/*.bas \
......
......@@ -1095,6 +1095,7 @@ static STRING f_bwtds(STRING n) { /* inverse Burrows-Wheeler transform */
static int gcrypt_init=0;
#else
#include "md5.h"
#include "sha1.h"
#endif
static STRING f_hashs(PARAMETER *plist,int e) {
STRING ergebnis;
......@@ -1117,7 +1118,7 @@ static STRING f_hashs(PARAMETER *plist,int e) {
ergebnis.pointer=malloc(ergebnis.len+1);
gcry_md_hash_buffer(typ,ergebnis.pointer, plist[0].pointer, plist[0].integer);
#else
if(typ==1) {
if(typ==1) { /* MD5 */
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx, plist->pointer, plist->integer);
......@@ -1125,6 +1126,14 @@ static STRING f_hashs(PARAMETER *plist,int e) {
ergebnis.pointer=malloc(ergebnis.len+1);
ergebnis.pointer[MD5_DIGEST_LENGTH]=0;
MD5_Final((unsigned char *)ergebnis.pointer, &ctx);
} else if(typ==2) { /* SHA1 */
sha1_context ctx;
sha1_starts(&ctx);
sha1_update(&ctx, plist->pointer, plist->integer);
ergebnis.len=SHA1_DIGEST_LENGTH;
ergebnis.pointer=malloc(ergebnis.len+1);
ergebnis.pointer[SHA1_DIGEST_LENGTH]=0;
sha1_finish(&ctx, (unsigned char *)ergebnis.pointer);
} else {
printf("The %s function is not implemented \n"
" in this version of X11-Basic because the GCRYPT library \n"
......
/*
* FIPS-180-1 compliant SHA-1 implementation
*
* Copyright (C) 2001-2003 Christophe Devine
*
* 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 of the License,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.,59 Temple Place,Suite 330,Boston,MA 02111-1307 USA
*/
#include <string.h>
#include "sha1.h"
#define GET_UINT32(n,b,i) \
{ \
(n) = ((uint32) (b)[(i) ] << 24 ) \
| ((uint32) (b)[(i) + 1] << 16 ) \
| ((uint32) (b)[(i) + 2] << 8 ) \
| ((uint32) (b)[(i) + 3] ); \
}
#define PUT_UINT32(n,b,i) \
{ \
(b)[(i) ] = (uint8) ((n) >> 24); \
(b)[(i) + 1] = (uint8) ((n) >> 16); \
(b)[(i) + 2] = (uint8) ((n) >> 8); \
(b)[(i) + 3] = (uint8) ((n) ); \
}
void sha1_starts(sha1_context *ctx) {
ctx->total[0]=0;
ctx->total[1]=0;
ctx->state[0]=0x67452301;
ctx->state[1]=0xEFCDAB89;
ctx->state[2]=0x98BADCFE;
ctx->state[3]=0x10325476;
ctx->state[4]=0xC3D2E1F0;
}
void sha1_process(sha1_context *ctx,uint8 data[64]) {
uint32 temp,W[16],A,B,C,D,E;
GET_UINT32(W[0],data,0);
GET_UINT32(W[1],data,4);
GET_UINT32(W[2],data,8);
GET_UINT32(W[3],data,12);
GET_UINT32(W[4],data,16);
GET_UINT32(W[5],data,20);
GET_UINT32(W[6],data,24);
GET_UINT32(W[7],data,28);
GET_UINT32(W[8],data,32);
GET_UINT32(W[9],data,36);
GET_UINT32(W[10],data,40);
GET_UINT32(W[11],data,44);
GET_UINT32(W[12],data,48);
GET_UINT32(W[13],data,52);
GET_UINT32(W[14],data,56);
GET_UINT32(W[15],data,60);
#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
#define R(t) \
( \
temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \
W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \
(W[t & 0x0F] = S(temp,1) ) \
)
#define P(a,b,c,d,e,x) \
{ \
e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \
}
A = ctx->state[0];
B = ctx->state[1];
C = ctx->state[2];
D = ctx->state[3];
E = ctx->state[4];
#define F(x,y,z) (z ^ (x & (y ^ z)))
#define K 0x5A827999
P(A,B,C,D,E,W[0] );
P(E,A,B,C,D,W[1] );
P(D,E,A,B,C,W[2] );
P(C,D,E,A,B,W[3] );
P(B,C,D,E,A,W[4] );
P(A,B,C,D,E,W[5] );
P(E,A,B,C,D,W[6] );
P(D,E,A,B,C,W[7] );
P(C,D,E,A,B,W[8] );
P(B,C,D,E,A,W[9] );
P(A,B,C,D,E,W[10]);
P(E,A,B,C,D,W[11]);
P(D,E,A,B,C,W[12]);
P(C,D,E,A,B,W[13]);
P(B,C,D,E,A,W[14]);
P(A,B,C,D,E,W[15]);
P(E,A,B,C,D,R(16));
P(D,E,A,B,C,R(17));
P(C,D,E,A,B,R(18));
P(B,C,D,E,A,R(19));
#undef K
#undef F
#define F(x,y,z) (x ^ y ^ z)
#define K 0x6ED9EBA1
P(A,B,C,D,E,R(20));
P(E,A,B,C,D,R(21));
P(D,E,A,B,C,R(22));
P(C,D,E,A,B,R(23));
P(B,C,D,E,A,R(24));
P(A,B,C,D,E,R(25));
P(E,A,B,C,D,R(26));
P(D,E,A,B,C,R(27));
P(C,D,E,A,B,R(28));
P(B,C,D,E,A,R(29));
P(A,B,C,D,E,R(30));
P(E,A,B,C,D,R(31));
P(D,E,A,B,C,R(32));
P(C,D,E,A,B,R(33));
P(B,C,D,E,A,R(34));
P(A,B,C,D,E,R(35));
P(E,A,B,C,D,R(36));
P(D,E,A,B,C,R(37));
P(C,D,E,A,B,R(38));
P(B,C,D,E,A,R(39));
#undef K
#undef F
#define F(x,y,z) ((x & y) | (z & (x | y)))
#define K 0x8F1BBCDC
P(A,B,C,D,E,R(40));
P(E,A,B,C,D,R(41));
P(D,E,A,B,C,R(42));
P(C,D,E,A,B,R(43));
P(B,C,D,E,A,R(44));
P(A,B,C,D,E,R(45));
P(E,A,B,C,D,R(46));
P(D,E,A,B,C,R(47));
P(C,D,E,A,B,R(48));
P(B,C,D,E,A,R(49));
P(A,B,C,D,E,R(50));
P(E,A,B,C,D,R(51));
P(D,E,A,B,C,R(52));
P(C,D,E,A,B,R(53));
P(B,C,D,E,A,R(54));
P(A,B,C,D,E,R(55));
P(E,A,B,C,D,R(56));
P(D,E,A,B,C,R(57));
P(C,D,E,A,B,R(58));
P(B,C,D,E,A,R(59));
#undef K
#undef F
#define F(x,y,z) (x ^ y ^ z)
#define K 0xCA62C1D6
P(A,B,C,D,E,R(60));
P(E,A,B,C,D,R(61));
P(D,E,A,B,C,R(62));
P(C,D,E,A,B,R(63));
P(B,C,D,E,A,R(64));
P(A,B,C,D,E,R(65));
P(E,A,B,C,D,R(66));
P(D,E,A,B,C,R(67));
P(C,D,E,A,B,R(68));
P(B,C,D,E,A,R(69));
P(A,B,C,D,E,R(70));
P(E,A,B,C,D,R(71));
P(D,E,A,B,C,R(72));
P(C,D,E,A,B,R(73));
P(B,C,D,E,A,R(74));
P(A,B,C,D,E,R(75));
P(E,A,B,C,D,R(76));
P(D,E,A,B,C,R(77));
P(C,D,E,A,B,R(78));
P(B,C,D,E,A,R(79));
#undef K
#undef F
ctx->state[0]+=A;
ctx->state[1]+=B;
ctx->state[2]+=C;
ctx->state[3]+=D;
ctx->state[4]+=E;
}
void sha1_update(sha1_context *ctx,uint8 *input,uint32 length) {
uint32 left,fill;
if(!length) return;
left=ctx->total[0]&0x3F;
fill=64-left;
ctx->total[0]+=length;
ctx->total[0]&=0xFFFFFFFF;
if(ctx->total[0]<length) ctx->total[1]++;
if(left && length>=fill) {
memcpy((void *) (ctx->buffer + left),
(void *) input,fill);
sha1_process(ctx,ctx->buffer);
length -= fill;
input += fill;
left = 0;
}
while(length>=64) {
sha1_process(ctx,input);
length-=64;
input +=64;
}
if(length) memcpy((void *) (ctx->buffer + left),(void *) input,length);
}
static uint8 sha1_padding[64]= {
0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
void sha1_finish(sha1_context *ctx,uint8 digest[20]) {
uint32 last,padn;
uint32 high,low;
uint8 msglen[8];
high = (ctx->total[0] >> 29 )
| (ctx->total[1] << 3);
low = (ctx->total[0] << 3);
PUT_UINT32(high,msglen,0);
PUT_UINT32(low,msglen,4);
last = ctx->total[0] & 0x3F;
padn = (last < 56 ) ? (56 - last ) : (120 - last);
sha1_update(ctx,sha1_padding,padn);
sha1_update(ctx,msglen,8);
PUT_UINT32(ctx->state[0],digest,0);
PUT_UINT32(ctx->state[1],digest,4);
PUT_UINT32(ctx->state[2],digest,8);
PUT_UINT32(ctx->state[3],digest,12);
PUT_UINT32(ctx->state[4],digest,16);
}
/*
* FIPS-180-1 compliant SHA-1 implementation
*
* Copyright (C) 2001-2003 Christophe Devine
*
* 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* There's ABSOLUTELY NO WARRANTY, express or implied.
*
* See sha1.c for more information.
*/
#ifndef _SHA1_H
#define _SHA1_H
#ifndef uint8
#define uint8 unsigned char
#endif
#ifndef uint32
#define uint32 unsigned long int
#endif
#define SHA1_DIGEST_LENGTH 20
typedef struct {
uint32 total[2];
uint32 state[5];
uint8 buffer[64];
}
sha1_context;
void sha1_starts( sha1_context *ctx );
void sha1_update( sha1_context *ctx, uint8 *input, uint32 length );
void sha1_finish( sha1_context *ctx, uint8 digest[20] );
#endif /* sha1.h */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment