1 {==============================================================================|
2 | Project : Delphree - Synapse | 001.004.001 |
3 |==============================================================================|
4 | Content: Coding and decoding support |
5 |==============================================================================|
6 | The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
7 | (the "License"); you may not use this file except in compliance with the |
8 | License. You may obtain a Copy of the License at http://www.mozilla.org/MPL/ |
10 | Software distributed under the License is distributed on an "AS IS" basis, |
11 | WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
12 | the specific language governing rights and limitations under the License. |
13 |==============================================================================|
14 | The Original Code is Synapse Delphi Library. |
15 |==============================================================================|
16 | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
17 | Portions created by Lukas Gebauer are Copyright (c)2000, 2001. |
18 | All Rights Reserved. |
19 |==============================================================================|
21 |==============================================================================|
22 | History: see HISTORY.HTM from distribution package |
23 | (Found at URL: http://www.ararat.cz/synapse/) |
24 |==============================================================================}
35 TSpecials
= set of Char;
39 SpecialChar
: TSpecials
=
40 ['=', '(', ')', '[', ']', '<', '>', ':', ';', '.', ',', '@', '/', '?', '\',
42 URLFullSpecialChar
: TSpecials
=
43 [';', '/', '?', ':', '@', '=', '&', '#'];
44 URLSpecialChar
: TSpecials
=
45 [#
$00..#
$20, '_', '<', '>', '"', '%', '{', '}', '|', '\', '^', '~', '[', ']',
48 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
50 '`!"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_';
52 '+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_';
55 function DecodeTriplet(const Value
: string; Delimiter
: Char): string;
56 function DecodeQuotedPrintable(const Value
: string): string;
57 function DecodeURL(const Value
: string): string;
58 function EncodeTriplet(const Value
: string; Delimiter
: Char;
59 Specials
: TSpecials
): string;
60 function EncodeQuotedPrintable(const Value
: string): string;
61 function EncodeURLElement(const Value
: string): string;
62 function EncodeURL(const Value
: string): string;
63 function Decode4to3(const Value
, Table
: string): string;
64 function DecodeBase64(const Value
: string): string;
65 function EncodeBase64(const Value
: string): string;
66 function DecodeUU(const Value
: string): string;
67 function DecodeXX(const Value
: string): string;
68 function UpdateCrc32(Value
: Byte; Crc32
: Integer): Integer;
69 function Crc32(const Value
: string): Integer;
70 function UpdateCrc16(Value
: Byte; Crc16
: Word): Word;
71 function Crc16(const Value
: string): Word;
72 function MD5(const Value
: string): string;
73 function HMAC_MD5(Text, Key
: string): string;
79 Crc32Tab
: array[0..255] of Integer = (
80 Integer($00000000), Integer($77073096), Integer($EE0E612C), Integer($990951BA),
81 Integer($076DC419), Integer($706AF48F), Integer($E963A535), Integer($9E6495A3),
82 Integer($0EDB8832), Integer($79DCB8A4), Integer($E0D5E91E), Integer($97D2D988),
83 Integer($09B64C2B), Integer($7EB17CBD), Integer($E7B82D07), Integer($90BF1D91),
84 Integer($1DB71064), Integer($6AB020F2), Integer($F3B97148), Integer($84BE41DE),
85 Integer($1ADAD47D), Integer($6DDDE4EB), Integer($F4D4B551), Integer($83D385C7),
86 Integer($136C9856), Integer($646BA8C0), Integer($FD62F97A), Integer($8A65C9EC),
87 Integer($14015C4F), Integer($63066CD9), Integer($FA0F3D63), Integer($8D080DF5),
88 Integer($3B6E20C8), Integer($4C69105E), Integer($D56041E4), Integer($A2677172),
89 Integer($3C03E4D1), Integer($4B04D447), Integer($D20D85FD), Integer($A50AB56B),
90 Integer($35B5A8FA), Integer($42B2986C), Integer($DBBBC9D6), Integer($ACBCF940),
91 Integer($32D86CE3), Integer($45DF5C75), Integer($DCD60DCF), Integer($ABD13D59),
92 Integer($26D930AC), Integer($51DE003A), Integer($C8D75180), Integer($BFD06116),
93 Integer($21B4F4B5), Integer($56B3C423), Integer($CFBA9599), Integer($B8BDA50F),
94 Integer($2802B89E), Integer($5F058808), Integer($C60CD9B2), Integer($B10BE924),
95 Integer($2F6F7C87), Integer($58684C11), Integer($C1611DAB), Integer($B6662D3D),
96 Integer($76DC4190), Integer($01DB7106), Integer($98D220BC), Integer($EFD5102A),
97 Integer($71B18589), Integer($06B6B51F), Integer($9FBFE4A5), Integer($E8B8D433),
98 Integer($7807C9A2), Integer($0F00F934), Integer($9609A88E), Integer($E10E9818),
99 Integer($7F6A0DBB), Integer($086D3D2D), Integer($91646C97), Integer($E6635C01),
100 Integer($6B6B51F4), Integer($1C6C6162), Integer($856530D8), Integer($F262004E),
101 Integer($6C0695ED), Integer($1B01A57B), Integer($8208F4C1), Integer($F50FC457),
102 Integer($65B0D9C6), Integer($12B7E950), Integer($8BBEB8EA), Integer($FCB9887C),
103 Integer($62DD1DDF), Integer($15DA2D49), Integer($8CD37CF3), Integer($FBD44C65),
104 Integer($4DB26158), Integer($3AB551CE), Integer($A3BC0074), Integer($D4BB30E2),
105 Integer($4ADFA541), Integer($3DD895D7), Integer($A4D1C46D), Integer($D3D6F4FB),
106 Integer($4369E96A), Integer($346ED9FC), Integer($AD678846), Integer($DA60B8D0),
107 Integer($44042D73), Integer($33031DE5), Integer($AA0A4C5F), Integer($DD0D7CC9),
108 Integer($5005713C), Integer($270241AA), Integer($BE0B1010), Integer($C90C2086),
109 Integer($5768B525), Integer($206F85B3), Integer($B966D409), Integer($CE61E49F),
110 Integer($5EDEF90E), Integer($29D9C998), Integer($B0D09822), Integer($C7D7A8B4),
111 Integer($59B33D17), Integer($2EB40D81), Integer($B7BD5C3B), Integer($C0BA6CAD),
112 Integer($EDB88320), Integer($9ABFB3B6), Integer($03B6E20C), Integer($74B1D29A),
113 Integer($EAD54739), Integer($9DD277AF), Integer($04DB2615), Integer($73DC1683),
114 Integer($E3630B12), Integer($94643B84), Integer($0D6D6A3E), Integer($7A6A5AA8),
115 Integer($E40ECF0B), Integer($9309FF9D), Integer($0A00AE27), Integer($7D079EB1),
116 Integer($F00F9344), Integer($8708A3D2), Integer($1E01F268), Integer($6906C2FE),
117 Integer($F762575D), Integer($806567CB), Integer($196C3671), Integer($6E6B06E7),
118 Integer($FED41B76), Integer($89D32BE0), Integer($10DA7A5A), Integer($67DD4ACC),
119 Integer($F9B9DF6F), Integer($8EBEEFF9), Integer($17B7BE43), Integer($60B08ED5),
120 Integer($D6D6A3E8), Integer($A1D1937E), Integer($38D8C2C4), Integer($4FDFF252),
121 Integer($D1BB67F1), Integer($A6BC5767), Integer($3FB506DD), Integer($48B2364B),
122 Integer($D80D2BDA), Integer($AF0A1B4C), Integer($36034AF6), Integer($41047A60),
123 Integer($DF60EFC3), Integer($A867DF55), Integer($316E8EEF), Integer($4669BE79),
124 Integer($CB61B38C), Integer($BC66831A), Integer($256FD2A0), Integer($5268E236),
125 Integer($CC0C7795), Integer($BB0B4703), Integer($220216B9), Integer($5505262F),
126 Integer($C5BA3BBE), Integer($B2BD0B28), Integer($2BB45A92), Integer($5CB36A04),
127 Integer($C2D7FFA7), Integer($B5D0CF31), Integer($2CD99E8B), Integer($5BDEAE1D),
128 Integer($9B64C2B0), Integer($EC63F226), Integer($756AA39C), Integer($026D930A),
129 Integer($9C0906A9), Integer($EB0E363F), Integer($72076785), Integer($05005713),
130 Integer($95BF4A82), Integer($E2B87A14), Integer($7BB12BAE), Integer($0CB61B38),
131 Integer($92D28E9B), Integer($E5D5BE0D), Integer($7CDCEFB7), Integer($0BDBDF21),
132 Integer($86D3D2D4), Integer($F1D4E242), Integer($68DDB3F8), Integer($1FDA836E),
133 Integer($81BE16CD), Integer($F6B9265B), Integer($6FB077E1), Integer($18B74777),
134 Integer($88085AE6), Integer($FF0F6A70), Integer($66063BCA), Integer($11010B5C),
135 Integer($8F659EFF), Integer($F862AE69), Integer($616BFFD3), Integer($166CCF45),
136 Integer($A00AE278), Integer($D70DD2EE), Integer($4E048354), Integer($3903B3C2),
137 Integer($A7672661), Integer($D06016F7), Integer($4969474D), Integer($3E6E77DB),
138 Integer($AED16A4A), Integer($D9D65ADC), Integer($40DF0B66), Integer($37D83BF0),
139 Integer($A9BCAE53), Integer($DEBB9EC5), Integer($47B2CF7F), Integer($30B5FFE9),
140 Integer($BDBDF21C), Integer($CABAC28A), Integer($53B39330), Integer($24B4A3A6),
141 Integer($BAD03605), Integer($CDD70693), Integer($54DE5729), Integer($23D967BF),
142 Integer($B3667A2E), Integer($C4614AB8), Integer($5D681B02), Integer($2A6F2B94),
143 Integer($B40BBE37), Integer($C30C8EA1), Integer($5A05DF1B), Integer($2D02EF8D)
146 Crc16Tab
: array[0..255] of Word = (
147 $0000, $1189, $2312, $329B, $4624, $57AD, $6536, $74BF,
148 $8C48, $9DC1, $AF5A, $BED3, $CA6C, $DBE5, $E97E, $F8F7,
149 $1081, $0108, $3393, $221A, $56A5, $472C, $75B7, $643E,
150 $9CC9, $8D40, $BFDB, $AE52, $DAED, $CB64, $F9FF, $E876,
151 $2102, $308B, $0210, $1399, $6726, $76AF, $4434, $55BD,
152 $AD4A, $BCC3, $8E58, $9FD1, $EB6E, $FAE7, $C87C, $D9F5,
153 $3183, $200A, $1291, $0318, $77A7, $662E, $54B5, $453C,
154 $BDCB, $AC42, $9ED9, $8F50, $FBEF, $EA66, $D8FD, $C974,
155 $4204, $538D, $6116, $709F, $0420, $15A9, $2732, $36BB,
156 $CE4C, $DFC5, $ED5E, $FCD7, $8868, $99E1, $AB7A, $BAF3,
157 $5285, $430C, $7197, $601E, $14A1, $0528, $37B3, $263A,
158 $DECD, $CF44, $FDDF, $EC56, $98E9, $8960, $BBFB, $AA72,
159 $6306, $728F, $4014, $519D, $2522, $34AB, $0630, $17B9,
160 $EF4E, $FEC7, $CC5C, $DDD5, $A96A, $B8E3, $8A78, $9BF1,
161 $7387, $620E, $5095, $411C, $35A3, $242A, $16B1, $0738,
162 $FFCF, $EE46, $DCDD, $CD54, $B9EB, $A862, $9AF9, $8B70,
163 $8408, $9581, $A71A, $B693, $C22C, $D3A5, $E13E, $F0B7,
164 $0840, $19C9, $2B52, $3ADB, $4E64, $5FED, $6D76, $7CFF,
165 $9489, $8500, $B79B, $A612, $D2AD, $C324, $F1BF, $E036,
166 $18C1, $0948, $3BD3, $2A5A, $5EE5, $4F6C, $7DF7, $6C7E,
167 $A50A, $B483, $8618, $9791, $E32E, $F2A7, $C03C, $D1B5,
168 $2942, $38CB, $0A50, $1BD9, $6F66, $7EEF, $4C74, $5DFD,
169 $B58B, $A402, $9699, $8710, $F3AF, $E226, $D0BD, $C134,
170 $39C3, $284A, $1AD1, $0B58, $7FE7, $6E6E, $5CF5, $4D7C,
171 $C60C, $D785, $E51E, $F497, $8028, $91A1, $A33A, $B2B3,
172 $4A44, $5BCD, $6956, $78DF, $0C60, $1DE9, $2F72, $3EFB,
173 $D68D, $C704, $F59F, $E416, $90A9, $8120, $B3BB, $A232,
174 $5AC5, $4B4C, $79D7, $685E, $1CE1, $0D68, $3FF3, $2E7A,
175 $E70E, $F687, $C41C, $D595, $A12A, $B0A3, $8238, $93B1,
176 $6B46, $7ACF, $4854, $59DD, $2D62, $3CEB, $0E70, $1FF9,
177 $F78F, $E606, $D49D, $C514, $B1AB, $A022, $92B9, $8330,
178 $7BC7, $6A4E, $58D5, $495C, $3DE3, $2C6A, $1EF1, $0F78
183 State
: array[0..3] of Integer;
184 Count
: array[0..1] of Integer;
186 0: (BufChar
: array[0..63] of Byte);
187 1: (BufLong
: array[0..15] of Integer);
190 {==============================================================================}
192 function DecodeTriplet(const Value
: string; Delimiter
: Char): string;
200 while x
<= Length(Value
) do
204 if c
<> Delimiter
then
207 if x
< Length(Value
) then
209 s
:= Copy(Value
, x
, 2);
211 if pos(#13, s
) + pos(#10, s
) = 0 then
212 Result
:= Result
+ Char(StrToIntDef('$' + s
, 32));
217 {==============================================================================}
219 function DecodeQuotedPrintable(const Value
: string): string;
221 Result
:= DecodeTriplet(Value
, '=');
224 {==============================================================================}
226 function DecodeURL(const Value
: string): string;
228 Result
:= DecodeTriplet(Value
, '%');
231 {==============================================================================}
233 function EncodeTriplet(const Value
: string; Delimiter
: Char;
234 Specials
: TSpecials
): string;
240 for n
:= 1 to Length(Value
) do
243 if s
[1] in Specials
then
244 s
:= Delimiter
+ Int2Hex(Ord(s
[1]), 2);
245 Result
:= Result
+ s
;
249 {==============================================================================}
251 function EncodeQuotedPrintable(const Value
: string): string;
253 Result
:= EncodeTriplet(Value
, '=', SpecialChar
+
254 [Char(1)..Char(31), Char(128)..Char(255)]);
257 {==============================================================================}
259 function EncodeURLElement(const Value
: string): string;
261 Result
:= EncodeTriplet(Value
, '%', URLSpecialChar
+ URLFullSpecialChar
);
264 {==============================================================================}
266 function EncodeURL(const Value
: string): string;
268 Result
:= EncodeTriplet(Value
, '%', URLSpecialChar
);
271 {==============================================================================}
273 function Decode4to3(const Value
, Table
: string): string;
276 d
: array[0..3] of Byte;
280 while x
< Length(Value
) do
284 if x
> Length(Value
) then
288 y
:= Pos(Value
[x
], Table
);
295 Result
:= Result
+ Char((D
[0] and $3F) shl 2 + (D
[1] and $30) shr 4);
298 Result
:= Result
+ Char((D
[1] and $0F) shl 4 + (D
[2] and $3C) shr 2);
300 Result
:= Result
+ Char((D
[2] and $03) shl 6 + (D
[3] and $3F));
305 {==============================================================================}
307 function DecodeBase64(const Value
: string): string;
309 Result
:= Decode4to3(Value
, TableBase64
);
312 {==============================================================================}
314 function EncodeBase64(const Value
: string): string;
319 DOut
: array[0..3] of Byte;
323 while Count
<= Length(Value
) do
325 c
:= Ord(Value
[Count
]);
327 DOut
[0] := (c
and $FC) shr 2;
328 DOut
[1] := (c
and $03) shl 4;
329 if Count
<= Length(Value
) then
331 c
:= Ord(Value
[Count
]);
333 DOut
[1] := DOut
[1] + (c
and $F0) shr 4;
334 DOut
[2] := (c
and $0F) shl 2;
335 if Count
<= Length(Value
) then
337 c
:= Ord(Value
[Count
]);
339 DOut
[2] := DOut
[2] + (c
and $C0) shr 6;
340 DOut
[3] := (c
and $3F);
353 Result
:= Result
+ TableBase64
[DOut
[n
] + 1];
357 {==============================================================================}
359 function DecodeUU(const Value
: string): string;
367 s
:= trim(UpperCase(Value
));
369 if Pos('BEGIN', s
) = 1 then
371 if Pos('END', s
) = 1 then
373 if Pos('TABLE', s
) = 1 then
374 Exit
; //ignore Table yet (set custom UUT)
376 x
:= Pos(Value
[1], uut
) - 1;
377 x
:= Round((x
/ 3) * 4);
379 s
:= Copy(Value
, 2, x
);
382 Result
:= Decode4to3(s
, uut
);
385 {==============================================================================}
387 function DecodeXX(const Value
: string): string;
393 s
:= trim(UpperCase(Value
));
396 if Pos('BEGIN', s
) = 1 then
398 if Pos('END', s
) = 1 then
401 x
:= Pos(Value
[1], TableXX
) - 1;
402 x
:= Round((x
/ 3) * 4);
404 s
:= Copy(Value
, 2, x
);
407 Result
:= Decode4to3(s
, TableXX
);
410 {==============================================================================}
412 function UpdateCrc32(Value
: Byte; Crc32
: Integer): Integer;
414 Result
:= ((Crc32
shr 8) and Integer($00FFFFFF)) xor
415 crc32tab
[Byte(Crc32
xor Integer(Value
)) and Integer($000000FF)];
418 {==============================================================================}
420 function Crc32(const Value
: string): Integer;
424 Result
:= Integer($FFFFFFFF);
425 for n
:= 1 to Length(Value
) do
426 Result
:= UpdateCrc32(Ord(Value
[n
]), Result
);
429 {==============================================================================}
431 function UpdateCrc16(Value
: Byte; Crc16
: Word): Word;
433 Result
:= ((Crc16
shr 8) and $00FF) xor
434 crc16tab
[Byte(Crc16
xor (Word(Value
)) and $00FF)];
437 {==============================================================================}
439 function Crc16(const Value
: string): Word;
444 for n
:= 1 to Length(Value
) do
445 Result
:= UpdateCrc16(Ord(Value
[n
]), Result
);
448 {==============================================================================}
450 procedure MD5Init(var MD5Context
: TMD5Ctx
);
452 FillChar(MD5Context
, SizeOf(TMD5Ctx
), #0);
455 State
[0] := Integer($67452301);
456 State
[1] := Integer($EFCDAB89);
457 State
[2] := Integer($98BADCFE);
458 State
[3] := Integer($10325476);
462 procedure MD5Transform(var Buf
: array of LongInt; const Data
: array of LongInt);
466 procedure Round1(var W
: LongInt; X
, Y
, Z
, Data
: LongInt; S
: Byte);
468 Inc(W
, (Z
xor (X
and (Y
xor Z
))) + Data
);
469 W
:= (W
shl S
) or (W
shr (32 - S
));
473 procedure Round2(var W
: LongInt; X
, Y
, Z
, Data
: LongInt; S
: Byte);
475 Inc(W
, (Y
xor (Z
and (X
xor Y
))) + Data
);
476 W
:= (W
shl S
) or (W
shr (32 - S
));
480 procedure Round3(var W
: LongInt; X
, Y
, Z
, Data
: LongInt; S
: Byte);
482 Inc(W
, (X
xor Y
xor Z
) + Data
);
483 W
:= (W
shl S
) or (W
shr (32 - S
));
487 procedure Round4(var W
: LongInt; X
, Y
, Z
, Data
: LongInt; S
: Byte);
489 Inc(W
, (Y
xor (X
or not Z
)) + Data
);
490 W
:= (W
shl S
) or (W
shr (32 - S
));
499 Round1(A
, B
, C
, D
, Data
[0] + Longint($D76AA478), 7);
500 Round1(D
, A
, B
, C
, Data
[1] + Longint($E8C7B756), 12);
501 Round1(C
, D
, A
, B
, Data
[2] + Longint($242070DB), 17);
502 Round1(B
, C
, D
, A
, Data
[3] + Longint($C1BDCEEE), 22);
503 Round1(A
, B
, C
, D
, Data
[4] + Longint($F57C0FAF), 7);
504 Round1(D
, A
, B
, C
, Data
[5] + Longint($4787C62A), 12);
505 Round1(C
, D
, A
, B
, Data
[6] + Longint($A8304613), 17);
506 Round1(B
, C
, D
, A
, Data
[7] + Longint($FD469501), 22);
507 Round1(A
, B
, C
, D
, Data
[8] + Longint($698098D8), 7);
508 Round1(D
, A
, B
, C
, Data
[9] + Longint($8B44F7AF), 12);
509 Round1(C
, D
, A
, B
, Data
[10] + Longint($FFFF5BB1), 17);
510 Round1(B
, C
, D
, A
, Data
[11] + Longint($895CD7BE), 22);
511 Round1(A
, B
, C
, D
, Data
[12] + Longint($6B901122), 7);
512 Round1(D
, A
, B
, C
, Data
[13] + Longint($FD987193), 12);
513 Round1(C
, D
, A
, B
, Data
[14] + Longint($A679438E), 17);
514 Round1(B
, C
, D
, A
, Data
[15] + Longint($49B40821), 22);
515 Round2(A
, B
, C
, D
, Data
[1] + Longint($F61E2562), 5);
516 Round2(D
, A
, B
, C
, Data
[6] + Longint($C040B340), 9);
517 Round2(C
, D
, A
, B
, Data
[11] + Longint($265E5A51), 14);
518 Round2(B
, C
, D
, A
, Data
[0] + Longint($E9B6C7AA), 20);
519 Round2(A
, B
, C
, D
, Data
[5] + Longint($D62F105D), 5);
520 Round2(D
, A
, B
, C
, Data
[10] + Longint($02441453), 9);
521 Round2(C
, D
, A
, B
, Data
[15] + Longint($D8A1E681), 14);
522 Round2(B
, C
, D
, A
, Data
[4] + Longint($E7D3FBC8), 20);
523 Round2(A
, B
, C
, D
, Data
[9] + Longint($21E1CDE6), 5);
524 Round2(D
, A
, B
, C
, Data
[14] + Longint($C33707D6), 9);
525 Round2(C
, D
, A
, B
, Data
[3] + Longint($F4D50D87), 14);
526 Round2(B
, C
, D
, A
, Data
[8] + Longint($455A14ED), 20);
527 Round2(A
, B
, C
, D
, Data
[13] + Longint($A9E3E905), 5);
528 Round2(D
, A
, B
, C
, Data
[2] + Longint($FCEFA3F8), 9);
529 Round2(C
, D
, A
, B
, Data
[7] + Longint($676F02D9), 14);
530 Round2(B
, C
, D
, A
, Data
[12] + Longint($8D2A4C8A), 20);
531 Round3(A
, B
, C
, D
, Data
[5] + Longint($FFFA3942), 4);
532 Round3(D
, A
, B
, C
, Data
[8] + Longint($8771F681), 11);
533 Round3(C
, D
, A
, B
, Data
[11] + Longint($6D9D6122), 16);
534 Round3(B
, C
, D
, A
, Data
[14] + Longint($FDE5380C), 23);
535 Round3(A
, B
, C
, D
, Data
[1] + Longint($A4BEEA44), 4);
536 Round3(D
, A
, B
, C
, Data
[4] + Longint($4BDECFA9), 11);
537 Round3(C
, D
, A
, B
, Data
[7] + Longint($F6BB4B60), 16);
538 Round3(B
, C
, D
, A
, Data
[10] + Longint($BEBFBC70), 23);
539 Round3(A
, B
, C
, D
, Data
[13] + Longint($289B7EC6), 4);
540 Round3(D
, A
, B
, C
, Data
[0] + Longint($EAA127FA), 11);
541 Round3(C
, D
, A
, B
, Data
[3] + Longint($D4EF3085), 16);
542 Round3(B
, C
, D
, A
, Data
[6] + Longint($04881D05), 23);
543 Round3(A
, B
, C
, D
, Data
[9] + Longint($D9D4D039), 4);
544 Round3(D
, A
, B
, C
, Data
[12] + Longint($E6DB99E5), 11);
545 Round3(C
, D
, A
, B
, Data
[15] + Longint($1FA27CF8), 16);
546 Round3(B
, C
, D
, A
, Data
[2] + Longint($C4AC5665), 23);
547 Round4(A
, B
, C
, D
, Data
[0] + Longint($F4292244), 6);
548 Round4(D
, A
, B
, C
, Data
[7] + Longint($432AFF97), 10);
549 Round4(C
, D
, A
, B
, Data
[14] + Longint($AB9423A7), 15);
550 Round4(B
, C
, D
, A
, Data
[5] + Longint($FC93A039), 21);
551 Round4(A
, B
, C
, D
, Data
[12] + Longint($655B59C3), 6);
552 Round4(D
, A
, B
, C
, Data
[3] + Longint($8F0CCC92), 10);
553 Round4(C
, D
, A
, B
, Data
[10] + Longint($FFEFF47D), 15);
554 Round4(B
, C
, D
, A
, Data
[1] + Longint($85845DD1), 21);
555 Round4(A
, B
, C
, D
, Data
[8] + Longint($6FA87E4F), 6);
556 Round4(D
, A
, B
, C
, Data
[15] + Longint($FE2CE6E0), 10);
557 Round4(C
, D
, A
, B
, Data
[6] + Longint($A3014314), 15);
558 Round4(B
, C
, D
, A
, Data
[13] + Longint($4E0811A1), 21);
559 Round4(A
, B
, C
, D
, Data
[4] + Longint($F7537E82), 6);
560 Round4(D
, A
, B
, C
, Data
[11] + Longint($BD3AF235), 10);
561 Round4(C
, D
, A
, B
, Data
[2] + Longint($2AD7D2BB), 15);
562 Round4(B
, C
, D
, A
, Data
[9] + Longint($EB86D391), 21);
569 procedure MD5Update(var MD5Context
: TMD5Ctx
; const Data
: string);
571 Index
, t
, len
: Integer;
577 Inc(Count
[0], Len
shl 3);
580 Inc(Count
[1], Len
shr 29);
581 T
:= (T
shr 3) and $3F;
589 Move(Data
, Bufchar
[Index
], Len
);
592 Move(Data
, Bufchar
[Index
], T
);
593 MD5Transform(State
, Buflong
);
599 Move(Data
[Index
+ 1], Bufchar
, 64);
600 MD5Transform(State
, Buflong
);
604 Move(Data
[Index
+ 1], Bufchar
, Len
);
608 function MD5Final(var MD5Context
: TMD5Ctx
): string;
612 digest
: array[0..15] of Char;
616 Byte(Digest
[I
]) := I
+ 1;
619 Cnt
:= (Count
[0] shr 3) and $3F;
626 FillChar(BufChar
[P
], Cnt
, #0);
627 MD5Transform(State
, BufLong
);
628 FillChar(BufChar
, 56, #0);
631 FillChar(BufChar
[P
], Cnt
- 8, #0);
632 BufLong
[14] := Count
[0];
633 BufLong
[15] := Count
[1];
634 MD5Transform(State
, BufLong
);
635 Move(State
, Digest
, 16);
638 Result
:= Result
+ Char(digest
[i
]);
640 FillChar(MD5Context
, SizeOf(TMD5Ctx
), #0)
643 {==============================================================================}
645 function MD5(const Value
: string): string;
650 MD5Update(MD5Context
, Value
);
651 Result
:= MD5Final(MD5Context
);
654 {==============================================================================}
656 function HMAC_MD5(Text, Key
: string): string;
658 ipad
, opad
, s
: string;
662 if Length(Key
) > 64 then
670 for n
:= 1 to Length(Key
) do
672 ipad
[n
] := Char(Byte(ipad
[n
]) xor Byte(Key
[n
]));
673 opad
[n
] := Char(Byte(opad
[n
]) xor Byte(Key
[n
]));
676 MD5Update(MD5Context
, ipad
);
677 MD5Update(MD5Context
, Text);
678 s
:= MD5Final(MD5Context
);
680 MD5Update(MD5Context
, opad
);
681 MD5Update(MD5Context
, s
);
682 Result
:= MD5Final(MD5Context
);