transmission 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +0 -0
- data/LICENSE +23 -0
- data/README +50 -0
- data/Rakefile +41 -0
- data/ext/bencode.c +335 -0
- data/ext/bencode.h +64 -0
- data/ext/choking.c +335 -0
- data/ext/choking.h +30 -0
- data/ext/clients.c +90 -0
- data/ext/clients.h +25 -0
- data/ext/completion.c +266 -0
- data/ext/completion.h +67 -0
- data/ext/extconf.rb +3 -0
- data/ext/fastresume.h +375 -0
- data/ext/fdlimit.c +297 -0
- data/ext/fdlimit.h +36 -0
- data/ext/inout.c +620 -0
- data/ext/inout.h +38 -0
- data/ext/internal.h +202 -0
- data/ext/metainfo.c +339 -0
- data/ext/metainfo.h +44 -0
- data/ext/net.c +405 -0
- data/ext/net.h +54 -0
- data/ext/peer.c +584 -0
- data/ext/peer.h +55 -0
- data/ext/peermessages.h +326 -0
- data/ext/peerparse.h +564 -0
- data/ext/peerutils.h +394 -0
- data/ext/platform.c +196 -0
- data/ext/platform.h +63 -0
- data/ext/r_transmission.c +1135 -0
- data/ext/ratecontrol.c +170 -0
- data/ext/ratecontrol.h +33 -0
- data/ext/sha1.c +235 -0
- data/ext/sha1.h +68 -0
- data/ext/tracker.c +767 -0
- data/ext/tracker.h +53 -0
- data/ext/transmission.c +776 -0
- data/ext/transmission.h +317 -0
- data/ext/utils.c +142 -0
- data/ext/utils.h +164 -0
- data/lib/transmission.rb +75 -0
- metadata +98 -0
data/ext/ratecontrol.c
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
/******************************************************************************
|
2
|
+
* $Id: ratecontrol.c 261 2006-05-29 21:27:31Z titer $
|
3
|
+
*
|
4
|
+
* Copyright (c) 2006 Transmission authors and contributors
|
5
|
+
*
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a
|
7
|
+
* copy of this software and associated documentation files (the "Software"),
|
8
|
+
* to deal in the Software without restriction, including without limitation
|
9
|
+
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
10
|
+
* and/or sell copies of the Software, and to permit persons to whom the
|
11
|
+
* Software is furnished to do so, subject to the following conditions:
|
12
|
+
*
|
13
|
+
* The above copyright notice and this permission notice shall be included in
|
14
|
+
* all copies or substantial portions of the Software.
|
15
|
+
*
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
22
|
+
* DEALINGS IN THE SOFTWARE.
|
23
|
+
*****************************************************************************/
|
24
|
+
|
25
|
+
#include "transmission.h"
|
26
|
+
|
27
|
+
#define MAX_HISTORY 30
|
28
|
+
|
29
|
+
typedef struct tr_transfer_s tr_transfer_t;
|
30
|
+
struct tr_ratecontrol_s
|
31
|
+
{
|
32
|
+
tr_lock_t lock;
|
33
|
+
int limit;
|
34
|
+
tr_transfer_t * first;
|
35
|
+
tr_transfer_t * last;
|
36
|
+
};
|
37
|
+
struct tr_transfer_s
|
38
|
+
{
|
39
|
+
uint64_t date;
|
40
|
+
int size;
|
41
|
+
tr_transfer_t * next;
|
42
|
+
tr_transfer_t * prev;
|
43
|
+
};
|
44
|
+
|
45
|
+
/***********************************************************************
|
46
|
+
* rateForInterval
|
47
|
+
***********************************************************************
|
48
|
+
* Returns the transfer rate on the last 'interval' milliseconds
|
49
|
+
**********************************************************************/
|
50
|
+
static inline float rateForInterval( tr_ratecontrol_t * r, int interval )
|
51
|
+
{
|
52
|
+
tr_transfer_t * t;
|
53
|
+
uint64_t start = tr_date() - interval;
|
54
|
+
int total = 0;
|
55
|
+
|
56
|
+
for( t = r->first; t && t->date > start; t = t->next )
|
57
|
+
{
|
58
|
+
total += t->size;
|
59
|
+
}
|
60
|
+
|
61
|
+
return ( 1000.0 / 1024.0 ) * total / interval;
|
62
|
+
}
|
63
|
+
|
64
|
+
static inline void cleanOldTransfers( tr_ratecontrol_t * r )
|
65
|
+
{
|
66
|
+
tr_transfer_t * t, * prev;
|
67
|
+
uint64_t old = tr_date() - MAX_HISTORY * 1000;
|
68
|
+
|
69
|
+
for( t = r->last; t && t->date < old; )
|
70
|
+
{
|
71
|
+
prev = t->prev;
|
72
|
+
if( prev )
|
73
|
+
prev->next = NULL;
|
74
|
+
else
|
75
|
+
r->first = NULL;
|
76
|
+
free( t );
|
77
|
+
t = prev;
|
78
|
+
r->last = prev;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
tr_ratecontrol_t * tr_rcInit()
|
83
|
+
{
|
84
|
+
tr_ratecontrol_t * r;
|
85
|
+
|
86
|
+
r = calloc( sizeof( tr_ratecontrol_t ), 1 );
|
87
|
+
r->limit = -1;
|
88
|
+
tr_lockInit( &r->lock );
|
89
|
+
|
90
|
+
return r;
|
91
|
+
}
|
92
|
+
|
93
|
+
void tr_rcSetLimit( tr_ratecontrol_t * r, int limit )
|
94
|
+
{
|
95
|
+
tr_lockLock( &r->lock );
|
96
|
+
r->limit = limit;
|
97
|
+
tr_lockUnlock( &r->lock );
|
98
|
+
}
|
99
|
+
|
100
|
+
int tr_rcCanTransfer( tr_ratecontrol_t * r )
|
101
|
+
{
|
102
|
+
int ret;
|
103
|
+
|
104
|
+
tr_lockLock( &r->lock );
|
105
|
+
ret = ( r->limit < 0 ) || ( rateForInterval( r, 1000 ) < r->limit );
|
106
|
+
tr_lockUnlock( &r->lock );
|
107
|
+
|
108
|
+
return ret;
|
109
|
+
}
|
110
|
+
|
111
|
+
void tr_rcTransferred( tr_ratecontrol_t * r, int size )
|
112
|
+
{
|
113
|
+
tr_transfer_t * t;
|
114
|
+
|
115
|
+
if( size < 100 )
|
116
|
+
{
|
117
|
+
return;
|
118
|
+
}
|
119
|
+
|
120
|
+
tr_lockLock( &r->lock );
|
121
|
+
t = malloc( sizeof( tr_transfer_t ) );
|
122
|
+
|
123
|
+
if( r->first )
|
124
|
+
r->first->prev = t;
|
125
|
+
if( !r->last )
|
126
|
+
r->last = t;
|
127
|
+
t->next = r->first;
|
128
|
+
t->prev = NULL;
|
129
|
+
r->first = t;
|
130
|
+
|
131
|
+
t->date = tr_date();
|
132
|
+
t->size = size;
|
133
|
+
|
134
|
+
cleanOldTransfers( r );
|
135
|
+
tr_lockUnlock( &r->lock );
|
136
|
+
}
|
137
|
+
|
138
|
+
float tr_rcRate( tr_ratecontrol_t * r )
|
139
|
+
{
|
140
|
+
float ret;
|
141
|
+
|
142
|
+
tr_lockLock( &r->lock );
|
143
|
+
ret = rateForInterval( r, MAX_HISTORY * 1000 );
|
144
|
+
tr_lockUnlock( &r->lock );
|
145
|
+
|
146
|
+
return ret;
|
147
|
+
}
|
148
|
+
|
149
|
+
void tr_rcReset( tr_ratecontrol_t * r )
|
150
|
+
{
|
151
|
+
tr_transfer_t * t, * next;
|
152
|
+
|
153
|
+
tr_lockLock( &r->lock );
|
154
|
+
for( t = r->first; t; )
|
155
|
+
{
|
156
|
+
next = t->next;
|
157
|
+
free( t );
|
158
|
+
t = next;
|
159
|
+
}
|
160
|
+
r->first = NULL;
|
161
|
+
r->last = NULL;
|
162
|
+
tr_lockUnlock( &r->lock );
|
163
|
+
}
|
164
|
+
|
165
|
+
void tr_rcClose( tr_ratecontrol_t * r )
|
166
|
+
{
|
167
|
+
tr_rcReset( r );
|
168
|
+
tr_lockClose( &r->lock );
|
169
|
+
free( r );
|
170
|
+
}
|
data/ext/ratecontrol.h
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
/******************************************************************************
|
2
|
+
* $Id: ratecontrol.h 261 2006-05-29 21:27:31Z titer $
|
3
|
+
*
|
4
|
+
* Copyright (c) 2006 Transmission authors and contributors
|
5
|
+
*
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a
|
7
|
+
* copy of this software and associated documentation files (the "Software"),
|
8
|
+
* to deal in the Software without restriction, including without limitation
|
9
|
+
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
10
|
+
* and/or sell copies of the Software, and to permit persons to whom the
|
11
|
+
* Software is furnished to do so, subject to the following conditions:
|
12
|
+
*
|
13
|
+
* The above copyright notice and this permission notice shall be included in
|
14
|
+
* all copies or substantial portions of the Software.
|
15
|
+
*
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
22
|
+
* DEALINGS IN THE SOFTWARE.
|
23
|
+
*****************************************************************************/
|
24
|
+
|
25
|
+
typedef struct tr_ratecontrol_s tr_ratecontrol_t;
|
26
|
+
|
27
|
+
tr_ratecontrol_t * tr_rcInit();
|
28
|
+
void tr_rcSetLimit( tr_ratecontrol_t *, int );
|
29
|
+
int tr_rcCanTransfer( tr_ratecontrol_t * );
|
30
|
+
void tr_rcTransferred( tr_ratecontrol_t *, int );
|
31
|
+
float tr_rcRate( tr_ratecontrol_t * );
|
32
|
+
void tr_rcReset( tr_ratecontrol_t * );
|
33
|
+
void tr_rcClose( tr_ratecontrol_t * );
|
data/ext/sha1.c
ADDED
@@ -0,0 +1,235 @@
|
|
1
|
+
/*
|
2
|
+
sha1.c: Implementation of SHA-1 Secure Hash Algorithm-1
|
3
|
+
|
4
|
+
Based upon: NIST FIPS180-1 Secure Hash Algorithm-1
|
5
|
+
http://www.itl.nist.gov/fipspubs/fip180-1.htm
|
6
|
+
|
7
|
+
Non-official Japanese Translation by HIRATA Yasuyuki:
|
8
|
+
http://yasu.asuka.net/translations/SHA-1.html
|
9
|
+
|
10
|
+
Copyright (C) 2002 vi@nwr.jp. All rights reserved.
|
11
|
+
|
12
|
+
This software is provided 'as-is', without any express or implied
|
13
|
+
warranty. In no event will the authors be held liable for any damages
|
14
|
+
arising from the use of this software.
|
15
|
+
|
16
|
+
Permission is granted to anyone to use this software for any purpose,
|
17
|
+
including commercial applications, and to alter it and redistribute it
|
18
|
+
freely, subject to the following restrictions:
|
19
|
+
|
20
|
+
1. The origin of this software must not be misrepresented; you must not
|
21
|
+
claim that you wrote the original software. If you use this software
|
22
|
+
in a product, an acknowledgement in the product documentation would be
|
23
|
+
appreciated but is not required.
|
24
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
25
|
+
misrepresented as beging the original software.
|
26
|
+
3. This notice may not be removed or altered from any source distribution.
|
27
|
+
|
28
|
+
Note:
|
29
|
+
The copyright notice above is copied from md5.h by L. Peter Deutsch
|
30
|
+
<ghost@aladdin.com>. Thank him since I'm not a good speaker of English. :)
|
31
|
+
*/
|
32
|
+
#include <string.h>
|
33
|
+
#include "sha1.h"
|
34
|
+
|
35
|
+
#define INLINE inline
|
36
|
+
/*
|
37
|
+
* Packing bytes to a word
|
38
|
+
*
|
39
|
+
* Should not assume p is aligned to word boundary
|
40
|
+
*/
|
41
|
+
static INLINE sha1_word_t packup(sha1_byte_t *p)
|
42
|
+
{
|
43
|
+
/* Portable, but slow */
|
44
|
+
return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3] << 0;
|
45
|
+
}
|
46
|
+
|
47
|
+
/*
|
48
|
+
* Unpacking a word to bytes
|
49
|
+
*
|
50
|
+
* Should not assume p is aligned to word boundary
|
51
|
+
*/
|
52
|
+
static void unpackup(sha1_byte_t *p, sha1_word_t q)
|
53
|
+
{
|
54
|
+
p[0] = (q >> 24) & 0xff;
|
55
|
+
p[1] = (q >> 16) & 0xff;
|
56
|
+
p[2] = (q >> 8) & 0xff;
|
57
|
+
p[3] = (q >> 0) & 0xff;
|
58
|
+
}
|
59
|
+
|
60
|
+
/*
|
61
|
+
* Processing a block
|
62
|
+
*/
|
63
|
+
static inline void sha1_update_now(sha1_state_s *pms, sha1_byte_t *bp)
|
64
|
+
{
|
65
|
+
sha1_word_t tmp, a, b, c, d, e, w[16+16];
|
66
|
+
int i, s;
|
67
|
+
|
68
|
+
/* pack 64 bytes into 16 words */
|
69
|
+
for(i = 0; i < 16; i++) {
|
70
|
+
w[i] = packup(bp + i * sizeof(sha1_word_t));
|
71
|
+
}
|
72
|
+
memcpy(w + 16, w + 0, sizeof(sha1_word_t) * 16);
|
73
|
+
|
74
|
+
a = pms->sha1_h[0], b = pms->sha1_h[1], c = pms->sha1_h[2], d = pms->sha1_h[3], e = pms->sha1_h[4];
|
75
|
+
|
76
|
+
#define rot(x,n) (((x) << n) | ((x) >> (32-n)))
|
77
|
+
#define f0(b, c, d) ((b&c)|(~b&d))
|
78
|
+
#define f1(b, c, d) (b^c^d)
|
79
|
+
#define f2(b, c, d) ((b&c)|(b&d)|(c&d))
|
80
|
+
#define f3(b, c, d) (b^c^d)
|
81
|
+
#define k0 0x5a827999
|
82
|
+
#define k1 0x6ed9eba1
|
83
|
+
#define k2 0x8f1bbcdc
|
84
|
+
#define k3 0xca62c1d6
|
85
|
+
|
86
|
+
/* t=0-15 */
|
87
|
+
s = 0;
|
88
|
+
for(i = 0; i < 16; i++) {
|
89
|
+
tmp = rot(a, 5) + f0(b, c, d) + e + w[s] + k0;
|
90
|
+
e = d; d = c; c = rot(b, 30); b = a; a = tmp;
|
91
|
+
s = (s + 1) % 16;
|
92
|
+
}
|
93
|
+
|
94
|
+
/* t=16-19 */
|
95
|
+
for(i = 16; i < 20; i++) {
|
96
|
+
w[s] = rot(w[s+13] ^ w[s+8] ^ w[s+2] ^ w[s], 1);
|
97
|
+
w[s+16] = w[s];
|
98
|
+
tmp = rot(a, 5) + f0(b, c, d) + e + w[s] + k0;
|
99
|
+
e = d; d = c; c = rot(b, 30); b = a; a = tmp;
|
100
|
+
s = (s + 1) % 16;
|
101
|
+
}
|
102
|
+
|
103
|
+
/* t=20-39 */
|
104
|
+
for(i = 0; i < 20; i++) {
|
105
|
+
w[s] = rot(w[s+13] ^ w[s+8] ^ w[s+2] ^ w[s], 1);
|
106
|
+
w[s+16] = w[s];
|
107
|
+
tmp = rot(a, 5) + f1(b, c, d) + e + w[s] + k1;
|
108
|
+
e = d; d = c; c = rot(b, 30); b = a; a = tmp;
|
109
|
+
s = (s + 1) % 16;
|
110
|
+
}
|
111
|
+
|
112
|
+
/* t=40-59 */
|
113
|
+
for(i = 0; i < 20; i++) {
|
114
|
+
w[s] = rot(w[s+13] ^ w[s+8] ^ w[s+2] ^ w[s], 1);
|
115
|
+
w[s+16] = w[s];
|
116
|
+
tmp = rot(a, 5) + f2(b, c, d) + e + w[s] + k2;
|
117
|
+
e = d; d = c; c = rot(b, 30); b = a; a = tmp;
|
118
|
+
s = (s + 1) % 16;
|
119
|
+
}
|
120
|
+
|
121
|
+
/* t=60-79 */
|
122
|
+
for(i = 0; i < 20; i++) {
|
123
|
+
w[s] = rot(w[s+13] ^ w[s+8] ^ w[s+2] ^ w[s], 1);
|
124
|
+
w[s+16] = w[s];
|
125
|
+
tmp = rot(a, 5) + f3(b, c, d) + e + w[s] + k3;
|
126
|
+
e = d; d = c; c = rot(b, 30); b = a; a = tmp;
|
127
|
+
s = (s + 1) % 16;
|
128
|
+
}
|
129
|
+
|
130
|
+
pms->sha1_h[0] += a, pms->sha1_h[1] += b, pms->sha1_h[2] += c, pms->sha1_h[3] += d, pms->sha1_h[4] += e;
|
131
|
+
}
|
132
|
+
|
133
|
+
/*
|
134
|
+
* Increment sha1_size1, sha1_size2 field of sha1_state_s
|
135
|
+
*/
|
136
|
+
static INLINE void incr(sha1_state_s *pms, int v)
|
137
|
+
{
|
138
|
+
sha1_word_t q;
|
139
|
+
|
140
|
+
q = pms->sha1_size1 + v * BITS;
|
141
|
+
if(q < pms->sha1_size1) {
|
142
|
+
pms->sha1_size2++;
|
143
|
+
}
|
144
|
+
pms->sha1_size1 = q;
|
145
|
+
}
|
146
|
+
|
147
|
+
/*
|
148
|
+
* Initialize sha1_state_s as FIPS specifies
|
149
|
+
*/
|
150
|
+
void sha1_init(sha1_state_s *pms)
|
151
|
+
{
|
152
|
+
memset(pms, 0, sizeof(*pms));
|
153
|
+
pms->sha1_h[0] = 0x67452301; /* Initialize H[0]-H[4] */
|
154
|
+
pms->sha1_h[1] = 0xEFCDAB89;
|
155
|
+
pms->sha1_h[2] = 0x98BADCFE;
|
156
|
+
pms->sha1_h[3] = 0x10325476;
|
157
|
+
pms->sha1_h[4] = 0xC3D2E1F0;
|
158
|
+
}
|
159
|
+
|
160
|
+
/*
|
161
|
+
* Fill block and update output when needed
|
162
|
+
*/
|
163
|
+
void sha1_update(sha1_state_s *pms, sha1_byte_t *bufp, int length)
|
164
|
+
{
|
165
|
+
/* Is the buffer partially filled? */
|
166
|
+
if(pms->sha1_count != 0) {
|
167
|
+
if(pms->sha1_count + length >= (signed) sizeof(pms->sha1_buf)) { /* buffer is filled enough */
|
168
|
+
int fil = sizeof(pms->sha1_buf) - pms->sha1_count; /* length to copy */
|
169
|
+
|
170
|
+
memcpy(pms->sha1_buf + pms->sha1_count, bufp, fil);
|
171
|
+
sha1_update_now(pms, pms->sha1_buf);
|
172
|
+
length -= fil;
|
173
|
+
bufp += fil;
|
174
|
+
pms->sha1_count = 0;
|
175
|
+
incr(pms, fil);
|
176
|
+
} else {
|
177
|
+
memcpy(pms->sha1_buf + pms->sha1_count, bufp, length);
|
178
|
+
pms->sha1_count += length;
|
179
|
+
incr(pms, length);
|
180
|
+
return;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
/* Loop to update state */
|
185
|
+
for(;;) {
|
186
|
+
if(length < (signed) sizeof(pms->sha1_buf)) { /* Short to fill up the buffer */
|
187
|
+
if(length) {
|
188
|
+
memcpy(pms->sha1_buf, bufp, length);
|
189
|
+
}
|
190
|
+
pms->sha1_count = length;
|
191
|
+
incr(pms, length);
|
192
|
+
break;
|
193
|
+
}
|
194
|
+
sha1_update_now(pms, bufp);
|
195
|
+
length -= sizeof(pms->sha1_buf);
|
196
|
+
bufp += sizeof(pms->sha1_buf);
|
197
|
+
incr(pms, sizeof(pms->sha1_buf));
|
198
|
+
}
|
199
|
+
}
|
200
|
+
|
201
|
+
void sha1_finish(sha1_state_s *pms, sha1_byte_t output[SHA1_OUTPUT_SIZE])
|
202
|
+
{
|
203
|
+
int i;
|
204
|
+
sha1_byte_t buf[1];
|
205
|
+
|
206
|
+
/* fill a bit */
|
207
|
+
buf[0] = 0x80;
|
208
|
+
sha1_update(pms, buf, 1);
|
209
|
+
|
210
|
+
/* Decrement sha1_size1, sha1_size2 */
|
211
|
+
if((pms->sha1_size1 -= BITS) == 0) {
|
212
|
+
pms->sha1_size2--;
|
213
|
+
}
|
214
|
+
|
215
|
+
/* fill zeros */
|
216
|
+
if(pms->sha1_count > (signed) (sizeof(pms->sha1_buf) - 2 * sizeof(sha1_word_t))) {
|
217
|
+
memset(pms->sha1_buf + pms->sha1_count, 0, sizeof(pms->sha1_buf) - pms->sha1_count);
|
218
|
+
sha1_update_now(pms, pms->sha1_buf);
|
219
|
+
pms->sha1_count = 0;
|
220
|
+
}
|
221
|
+
memset(pms->sha1_buf + pms->sha1_count, 0,
|
222
|
+
sizeof(pms->sha1_buf) - pms->sha1_count - sizeof(sha1_word_t) * 2);
|
223
|
+
|
224
|
+
/* fill last length */
|
225
|
+
unpackup(pms->sha1_buf + sizeof(pms->sha1_buf) - sizeof(sha1_word_t) * 2, pms->sha1_size2);
|
226
|
+
unpackup(pms->sha1_buf + sizeof(pms->sha1_buf) - sizeof(sha1_word_t) * 1, pms->sha1_size1);
|
227
|
+
|
228
|
+
/* final update */
|
229
|
+
sha1_update_now(pms, pms->sha1_buf);
|
230
|
+
|
231
|
+
/* move hash value to output byte array */
|
232
|
+
for(i = 0; i < (signed) (sizeof(pms->sha1_h)/sizeof(sha1_word_t)); i++) {
|
233
|
+
unpackup(output + i * sizeof(sha1_word_t), pms->sha1_h[i]);
|
234
|
+
}
|
235
|
+
}
|
data/ext/sha1.h
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
/*
|
2
|
+
sha1.h: Implementation of SHA-1 Secure Hash Algorithm-1
|
3
|
+
|
4
|
+
Based upon: NIST FIPS180-1 Secure Hash Algorithm-1
|
5
|
+
http://www.itl.nist.gov/fipspubs/fip180-1.htm
|
6
|
+
|
7
|
+
Non-official Japanese Translation by HIRATA Yasuyuki:
|
8
|
+
http://yasu.asuka.net/translations/SHA-1.html
|
9
|
+
|
10
|
+
Copyright (C) 2002 vi@nwr.jp. All rights reserved.
|
11
|
+
|
12
|
+
This software is provided 'as-is', without any express or implied
|
13
|
+
warranty. In no event will the authors be held liable for any damages
|
14
|
+
arising from the use of this software.
|
15
|
+
|
16
|
+
Permission is granted to anyone to use this software for any purpose,
|
17
|
+
including commercial applications, and to alter it and redistribute it
|
18
|
+
freely, subject to the following restrictions:
|
19
|
+
|
20
|
+
1. The origin of this software must not be misrepresented; you must not
|
21
|
+
claim that you wrote the original software. If you use this software
|
22
|
+
in a product, an acknowledgement in the product documentation would be
|
23
|
+
appreciated but is not required.
|
24
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
25
|
+
misrepresented as beging the original software.
|
26
|
+
3. This notice may not be removed or altered from any source distribution.
|
27
|
+
|
28
|
+
Note:
|
29
|
+
The copyright notice above is copied from md5.h by L. Petet Deutsch
|
30
|
+
<ghost@aladdin.com>. Thank him since I'm not a good speaker of English. :)
|
31
|
+
*/
|
32
|
+
#ifndef SHA1_H
|
33
|
+
#define SHA1_H
|
34
|
+
|
35
|
+
typedef unsigned int sha1_word_t; /* 32bits unsigned integer */
|
36
|
+
typedef unsigned char sha1_byte_t; /* 8bits unsigned integer */
|
37
|
+
#define BITS 8
|
38
|
+
|
39
|
+
/* Define the state of SHA-1 algorithm */
|
40
|
+
typedef struct {
|
41
|
+
sha1_byte_t sha1_buf[64]; /* 512 bits */
|
42
|
+
int sha1_count; /* How many bytes are used */
|
43
|
+
sha1_word_t sha1_size1; /* Length counter Lower Word */
|
44
|
+
sha1_word_t sha1_size2; /* Length counter Upper Word */
|
45
|
+
sha1_word_t sha1_h[5]; /* Hash output */
|
46
|
+
} sha1_state_s;
|
47
|
+
#define SHA1_OUTPUT_SIZE 20 /* in bytes */
|
48
|
+
|
49
|
+
/* External Functions */
|
50
|
+
|
51
|
+
#ifdef __cplusplus
|
52
|
+
extern "C" {
|
53
|
+
#endif
|
54
|
+
|
55
|
+
/* Initialize SHA-1 algorithm */
|
56
|
+
void sha1_init(sha1_state_s *pms);
|
57
|
+
|
58
|
+
/* Append a string to SHA-1 algorithm */
|
59
|
+
void sha1_update(sha1_state_s *pms, sha1_byte_t *input_buffer, int length);
|
60
|
+
|
61
|
+
/* Finish the SHA-1 algorithm and return the hash */
|
62
|
+
void sha1_finish(sha1_state_s *pms, sha1_byte_t output[SHA1_OUTPUT_SIZE]);
|
63
|
+
|
64
|
+
#ifdef __cplusplus
|
65
|
+
}
|
66
|
+
#endif
|
67
|
+
|
68
|
+
#endif
|