size=n-m+64;
}
else if (m==56){
zeros = 0;
ones = 0;
size=n+8;
}
else{
zeros = 63-m+56;
size=n+64-m+64;
}
arraylist bs = new arraylist(input);
if(ones==1){
bs.add( (byte)0x80 ); // 0x80 = $10000000
}
for(int i=0;i<zeros;i++){
bs.add( (byte)0 );
}
uint64 n = (uint64) n * 8;
byte h1=(byte)(n&0xff);
byte h2=(byte)((n>>8)&0xff);
byte h3=(byte)((n>>16)&0xff);
byte h4=(byte)((n>>24)&0xff);
byte h5=(byte)((n>>32)&0xff);
byte h6=(byte)((n>>40)&0xff);
byte h7=(byte)((n>>48)&0xff);
byte h8=(byte)(n>>56);
bs.add(h1);
bs.add(h2);
bs.add(h3);
bs.add(h4);
bs.add(h5);
bs.add(h6);
bs.add(h7);
bs.add(h8);
byte[] ts=(byte[])bs.toarray(typeof(byte));
/* decodes input (byte[]) into output (uint32[]). assumes len is
* a multiple of 4.
*/
uint32[] output = new uint32[size/4];
for(int64 i=0,j=0;i<size;j++,i+=4){
output[j]=(uint32)(ts[i] | ts[i+1]<<8 | ts[i+2]<<16 | ts[i+3]<<24);
}
return output;
}
private static uint32[] md5_trasform(uint32[] x){
uint32 a,b,c,d;
for(int k=0;k<x.length;k+=16){
a=a;
b=b;
c=c;
d=d;
/* round 1 */
ff (ref a, b, c, d, x[k+ 0], s11, 0xd76aa478); /* 1 */
ff (ref d, a, b, c, x[k+ 1], s12, 0xe8c7b756); /* 2 */
ff (ref c, d, a, b, x[k+ 2], s13, 0x242070db); /* 3 */
ff (ref b, c, d, a, x[k+ 3], s14, 0xc1bdceee); /* 4 */
ff (ref a, b, c, d, x[k+ 4], s11, 0xf57c0faf); /* 5 */
ff (ref d, a, b, c, x[k+ 5], s12, 0x4787c62a); /* 6 */
ff (ref c, d, a, b, x[k+ 6], s13, 0xa8304613); /* 7 */
ff (ref b, c, d, a, x[k+ 7], s14, 0xfd469501); /* 8 */
ff (ref a, b, c, d, x[k+ 8], s11, 0x698098d8); /* 9 */
ff (ref d, a, b, c, x[k+ 9], s12, 0x8b44f7af); /* 10 */
ff (ref c, d, a, b, x[k+10], s13, 0xffff5bb1); /* 11 */
ff (ref b, c, d, a, x[k+11], s14, 0x895cd7be); /* 12 */
ff (ref a, b, c, d, x[k+12], s11, 0x6b901122); /* 13 */
ff (ref d, a, b, c, x[k+13], s12, 0xfd987193); /* 14 */
ff (ref c, d, a, b, x[k+14], s13, 0xa679438e); /* 15 */
ff (ref b, c, d, a, x[k+15], s14, 0x49b40821); /* 16 */
/* round 2 */
gg (ref a, b, c, d, x[k+ 1], s21, 0xf61e2562); /* 17 */
gg (ref d, a, b, c, x[k+ 6], s22, 0xc040b340); /* 18 */
gg (ref c, d, a, b, x[k+11], s23, 0x265e5a51); /* 19 */
gg (ref b, c, d, a, x[k+ 0], s24, 0xe9b6c7aa); /* 20 */
gg (ref a, b, c, d, x[k+ 5], s21, 0xd62f105d); /* 21 */
gg (ref d, a, b, c, x[k+10], s22, 0x2441453); /* 22 */
gg (ref c, d, a, b, x[k+15], s23, 0xd8a1e681); /* 23 */
gg (ref b, c, d, a, x[k+ 4], s24, 0xe7d3fbc8); /* 24 */
gg (ref a, b, c, d, x[k+ 9], s21, 0x21e1cde6); /* 25 */
gg (ref d, a, b, c, x[k+14], s22, 0xc33707d6); /* 26 */
gg (ref c, d, a, b, x[k+ 3], s23, 0xf4d50d87); /* 27 */