c59d91027c15b481ee6c425521d57ad7f7c893bc
[reactos.git] / reactos / drivers / filesystems / udfs / Include / key_lib.cpp
1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
6
7 static const char XPEHb[] = "zfvbgt^&*()aq,lpwdenjsxnygv!@yhuhb#$%chimuokbr";
8
9 UDF_FibonachiNum(
10 int n,
11 int* f
12 )
13 {
14 int a=0xff557788;
15 int i;
16 // do something
17 n <<= 8;
18 for(i=0; i<n; i = i++) {
19 a = ((a+i)*2) ^ ((a+n) * (XPEHb[i % (sizeof(XPEHb)-1)]) & 0xfffffffe) + 1;
20 if(i*2 >= n) {
21 n >>= 4;
22 (*f) = (*f) ^ (a+n);
23 n >>= 1;
24 a = n & a;
25 }
26 }
27 n >>= 3;
28 // if(n < 2)
29 if(!(n & ~1))
30 return 1;
31 n--;
32 if(!(n+1))
33 return 1;
34 a = UDF_FibonachiNum(n, f);
35 return UDF_FibonachiNum(n-1, f) + a;
36 }
37
38 void
39 UDF_build_long_key(
40 char* buffer,
41 int blen,
42 char* key_str,
43 int klen
44 )
45 {
46 int i, k, j;
47 int r[32];
48 int* tmp = (int*)buffer;
49 int f, fn;
50
51 memcpy(buffer, key_str, klen);
52 for(i=0; i<klen/4; i++) {
53 r[i%32] = tmp[i];
54 }
55 f = 0xf4acb89e;
56 for(k=0, fn=1, j=0; i<blen/4; i++) {
57 if(!fn) {
58 tmp[i] = tmp[k%(klen/4)];
59 fn = UDF_FibonachiNum(k, &f);
60 k++;
61 continue;
62 }
63 if(i>=blen/4)
64 break;
65 r[j%(klen/4)] = (int32)( ((int64)r[j%(klen/4)] * 0x8088405 + 1) >> 3 );
66 tmp[i] = r[j%(klen/4)] ^ f;
67 j++;
68 fn--;
69 }
70 } // end UDF_build_long_key()
71
72
73 void
74 UDF_build_hash_by_key(
75 char* longkey_buffer,
76 int longkey_len,
77 char* key_hash,
78 char* key_str
79 )
80 {
81 UDF_MD5_CTX context;
82 char key1[16];
83 int m;
84
85 UDF_build_long_key(longkey_buffer, longkey_len, key_str, 16);
86 UDF_MD5Init(&context);
87 UDF_MD5Update(&context, (PUCHAR)longkey_buffer, longkey_len);
88 UDF_MD5Pad (&context);
89 UDF_MD5Final((PUCHAR)key_hash, &context);
90 memcpy(key1, key_hash, 16);
91 for(m = 0; m<113; m++) {
92 UDF_build_long_key(longkey_buffer, longkey_len, key_hash, 16);
93 UDF_MD5Init(&context);
94 UDF_MD5Update(&context, (PUCHAR)longkey_buffer, longkey_len);
95 UDF_MD5Pad (&context);
96 UDF_MD5Final((PUCHAR)key_hash, &context);
97 }
98 for(m=0; m<16; m++) {
99 key_hash[m] = key_hash[m] ^ key1[m];
100 }
101 } // end UDF_build_hash_by_key()
102