source: project/release/4/ripemd/trunk/ripemd.scm @ 35320

Last change on this file since 35320 was 35320, checked in by kon, 16 months ago

use csi+csc test runner, add types

File size: 5.1 KB
Line 
1;;;; ripemd.scm
2;;;; Kon Lovett, Jan '06
3;;;; Kon Lovett, Aug '10
4
5;; Issues
6
7(module ripemd
8
9(;export
10  ripemd128-primitive
11  ripemd160-primitive)
12
13(import scheme chicken foreign)
14(use message-digest-primitive)
15
16;;;
17
18(define-type message-digest-primitive (struct message-digest-primitive))
19
20;;;
21
22#>
23typedef void (*initializef)( uint32_t * );
24typedef void (*compressf)( uint32_t *, uint32_t * );
25typedef void (*finishf)( uint32_t *, uint8_t *, uint32_t, uint32_t );
26
27typedef struct {
28  uint8_t rembuf[16 * sizeof(uint32_t)];
29  uint32_t length[2];
30  uint32_t MDbuf[0];
31} ripemdctx;
32
33static void
34ripemdX_init( initializef init, ripemdctx *ctx )
35{
36  memset( ctx->rembuf, 0, sizeof(ctx->rembuf) );
37  ctx->length[0] = ctx->length[1] = 0;
38  (*init)( ctx->MDbuf );
39}
40
41static void
42ripemdX_update( compressf compress, ripemdctx *ctx, uint8_t *data, size_t nbytes )
43{
44# define BYTES_TO_DWORD( strptr ) \
45    (((uint32_t) *((strptr)+3) << 24) | \
46     ((uint32_t) *((strptr)+2) << 16) | \
47     ((uint32_t) *((strptr)+1) <<  8) | \
48     ((uint32_t) *(strptr)))
49
50  uint32_t X[16];
51  unsigned int i, j;
52
53  /* process all complete 16-uint32_t blocks */
54  for( i = nbytes; i > 63; i -= 64 ) {
55     for( j = 0; j < 16; j++ ) {
56        X[j] = BYTES_TO_DWORD( data );
57        data += sizeof(uint32_t);
58      }
59     (*compress)( ctx->MDbuf, X );
60  }
61
62  /* update length[] */
63  if( ctx->length[0] + nbytes < ctx->length[0] )
64     ctx->length[1]++;      /* overflow to msb of length */
65  ctx->length[0] += nbytes;
66
67  /* remaining bytes? */
68  /* MUST only occur on the last call to update */
69  if( i ) {
70    memcpy( ctx->rembuf, data, i );
71  }
72
73# undef BYTES_TO_DWORD
74}
75
76static
77void ripemdX_final( finishf finish, uint8_t *str, ripemdctx *ctx, size_t mdlen )
78{
79  int i;
80
81  (*finish)( ctx->MDbuf, ctx->rembuf, ctx->length[0], ctx->length[1] );
82
83  for( i = 0; i < mdlen; i += sizeof(uint32_t) ) {
84    str[i]   =  ctx->MDbuf[i>>2];
85    str[i+1] = (ctx->MDbuf[i>>2] >>  8);
86    str[i+2] = (ctx->MDbuf[i>>2] >> 16);
87    str[i+3] = (ctx->MDbuf[i>>2] >> 24);
88  }
89}
90
91#define C_VISIBILITY static
92
93#define dword uint32_t
94#define byte uint8_t
95
96#include "rmd160.c"
97#define RMD160blksiz 64
98#define RMD160hshsiz (160/8)
99#define RMD160ctxsiz (sizeof(ripemdctx) + sizeof(uint32_t)*(160/32))
100#undef BYTES_TO_DWORD
101#undef ROL
102#undef F
103#undef G
104#undef H
105#undef I
106#undef J
107#undef FF
108#undef GG
109#undef HH
110#undef II
111#undef JJ
112#undef FFF
113#undef GGG
114#undef HHH
115#undef III
116#undef JJJ
117
118#include "rmd128.c"
119#define RMD128blksiz 64
120#define RMD128hshsiz (128/8)
121#define RMD128ctxsiz (sizeof(ripemdctx) + sizeof(uint32_t)*(128/32))
122#undef BYTES_TO_DWORD
123#undef ROL
124#undef F
125#undef G
126#undef H
127#undef I
128#undef FF
129#undef GG
130#undef HH
131#undef II
132#undef FFF
133#undef GGG
134#undef HHH
135#undef III
136
137#undef dword
138#undef byte
139
140#undef C_VISIBILITY
141<#
142
143;;;
144
145(define-foreign-variable context-size128 unsigned-int "RMD128ctxsiz")
146(define-foreign-variable digest-length128 unsigned-int "RMD128hshsiz")
147(define-foreign-variable block-length128 unsigned-int "RMD128blksiz")
148
149(define init128
150  (foreign-lambda* void ((c-pointer ctx)) "ripemdX_init( &MDinit128, ctx );"))
151
152(define update128
153  (foreign-lambda* void ((c-pointer ctx) (scheme-pointer obj) (int len))
154    "ripemdX_update( &compress128, ctx, obj, len );"))
155
156(define final128
157  (foreign-lambda* void ((c-pointer ctx) (scheme-pointer result))
158    "ripemdX_final( &MDfinish128, result, ctx, RMD128hshsiz );"))
159
160(define raw-update128
161  (foreign-lambda* void ((c-pointer ctx) (c-pointer obj) (int len))
162    "ripemdX_update( &compress128, ctx, obj, len );"))
163
164;;
165
166(: ripemd128-primitive (-> message-digest-primitive))
167;
168(define ripemd128-primitive
169  (let ((the-prim #f))
170    (lambda ()
171      (or
172        the-prim
173        (begin
174          (set!
175            the-prim
176            (make-message-digest-primitive
177              context-size128 digest-length128
178              init128 update128 final128
179              block-length128 'ripemd128-primitive
180              raw-update128))
181          the-prim ) ) ) ) )
182
183;;;
184
185(define-foreign-variable context-size160 unsigned-int "RMD160ctxsiz")
186(define-foreign-variable digest-length160 unsigned-int "RMD160hshsiz")
187(define-foreign-variable block-length160 unsigned-int "RMD160blksiz")
188
189(define init160
190  (foreign-lambda* void ((c-pointer ctx))
191    "ripemdX_init( &MDinit160, ctx );"))
192
193(define update160
194  (foreign-lambda* void ((c-pointer ctx) (scheme-pointer obj) (int len))
195    "ripemdX_update( &compress160, ctx, obj, len );"))
196
197(define final160
198  (foreign-lambda* void ((c-pointer ctx) (scheme-pointer result))
199    "ripemdX_final( &MDfinish160, result, ctx, RMD160hshsiz );"))
200
201(define raw-update160
202  (foreign-lambda* void ((c-pointer ctx) (c-pointer obj) (int len))
203    "ripemdX_update( &compress160, ctx, obj, len );"))
204
205;;
206
207(: ripemd160-primitive (-> message-digest-primitive))
208;
209(define ripemd160-primitive
210  (let ((the-prim #f))
211    (lambda ()
212      (or
213        the-prim
214        (begin
215          (set!
216            the-prim
217            (make-message-digest-primitive
218              context-size160 digest-length160
219              init160 update160 final160
220              block-length160 'ripemd160-primitive
221              raw-update160))
222          the-prim ) ) ) ) )
223
224) ;module ripemd
Note: See TracBrowser for help on using the repository browser.