1 // some functions borrowed from:
2 // Sven Peter <svenpeter@gmail.com>
3 // Segher Boessenkool <segher@kernel.crashing.org>
4 // Licensed under the terms of the GNU GPL, version 2
5 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
18 #include "mingw_mmap.h"
33 void *mmap_file(const char *path
)
39 fd
= open(path
, O_RDONLY
);
41 fail("open %s", path
);
42 if(fstat(fd
, &st
) != 0)
43 fail("fstat %s", path
);
45 ptr
= mmap(0, st
.st_size
, PROT_READ
| PROT_WRITE
, MAP_PRIVATE
, fd
, 0);
54 void fail(const char *a
, ...)
60 vsnprintf(msg
, sizeof msg
, a
, va
);
61 fprintf(stderr
, "%s\n", msg
);
69 void print_hash(u8
*ptr
, u32 len
)
72 printf(" %02x", *ptr
++);
75 void aes256cbc(u8
*key
, u8
*iv_in
, u8
*in
, u64 len
, u8
*out
)
82 memcpy(iv
, iv_in
, 16);
83 memset(&k
, 0, sizeof k
);
84 AES_set_decrypt_key(key
, 256, &k
);
88 AES_decrypt(in
, out
, &k
);
90 for (i
= 0; i
< 16; i
++)
103 void aes256cbc_enc(u8
*key
, u8
*iv
, u8
*in
, u64 len
, u8
*out
)
110 memset(&k
, 0, sizeof k
);
111 AES_set_encrypt_key(key
, 256, &k
);
114 for (i
= 0; i
< 16; i
++)
117 AES_encrypt(tmp
, out
, &k
);
118 memcpy(tmp
, out
, 16);
126 void aes128cbc(u8
*key
, u8
*iv_in
, u8
*in
, u64 len
, u8
*out
)
133 memcpy(iv
, iv_in
, 16);
134 memset(&k
, 0, sizeof k
);
135 AES_set_decrypt_key(key
, 128, &k
);
139 AES_decrypt(in
, out
, &k
);
141 for (i
= 0; i
< 16; i
++)
153 void aes128cbc_enc(u8
*key
, u8
*iv
, u8
*in
, u64 len
, u8
*out
)
160 memset(&k
, 0, sizeof k
);
161 AES_set_encrypt_key(key
, 128, &k
);
164 for (i
= 0; i
< 16; i
++)
167 AES_encrypt(tmp
, out
, &k
);
168 memcpy(tmp
, out
, 16);
175 void rol1(u8
* worthless
) {
177 u8
xor = (worthless
[0]&0x80)?0x87:0;
180 worthless
[i
] |= worthless
[i
+1]>>7;
182 worthless
[0xF] <<= 1;
183 worthless
[0xF] ^= xor;
186 void aesOmacMode1(u8
* output
, u8
* input
, int len
, u8
* aes_key_data
, int aes_key_bits
)
191 AES_set_encrypt_key(aes_key_data
, aes_key_bits
, &aes_key
);
193 u8 running
[0x10]; memset(running
, 0, 0x10);
198 AES_encrypt(running
, worthless
, &aes_key
);
202 for(i
=0;i
<(len
-0x10);i
+=0x10) {
203 for(j
=0;j
<0x10;j
++) hash
[j
] = running
[j
] ^ input
[i
+j
];
204 AES_encrypt(hash
, running
, &aes_key
);
207 int overrun
= len
&0xF;
208 if( (len
%0x10) == 0 ) overrun
= 0x10;
210 memset(hash
, 0, 0x10);
211 memcpy(hash
, &input
[i
], overrun
);
213 if(overrun
!= 0x10) {
214 hash
[overrun
] = 0x80;
218 for(j
=0;j
<0x10;j
++) hash
[j
] ^= running
[j
] ^ worthless
[j
];
219 AES_encrypt(hash
, output
, &aes_key
);
223 static void sha1_fixup(struct SHA1Context
*ctx
, u8
*digest
)
227 for(i
= 0; i
< 5; i
++) {
228 *digest
++ = ctx
->Message_Digest
[i
] >> 24 & 0xff;
229 *digest
++ = ctx
->Message_Digest
[i
] >> 16 & 0xff;
230 *digest
++ = ctx
->Message_Digest
[i
] >> 8 & 0xff;
231 *digest
++ = ctx
->Message_Digest
[i
] & 0xff;
235 void sha1(u8
*data
, u32 len
, u8
*digest
)
237 struct SHA1Context ctx
;
240 SHA1Input(&ctx
, data
, len
);
243 sha1_fixup(&ctx
, digest
);
247 void get_rand(u8
*bfr
, u32 size
)
251 if (!CryptAcquireContext(&hProv
, NULL
, NULL
, PROV_RSA_FULL
, CRYPT_VERIFYCONTEXT
))
252 fail("unable to open random");
254 if (!CryptGenRandom(hProv
, size
, bfr
))
255 fail("unable to read random numbers");
257 CryptReleaseContext(hProv
, 0);
260 void get_rand(u8
*bfr
, u32 size
)
264 fp
= fopen("/dev/urandom", "r");
266 fail("unable to open random");
268 if (fread(bfr
, size
, 1, fp
) != 1)
269 printf("unable to read /dev/urandom");