Sun, 17 Dec 2023 14:25:34 +0100
[Makefile] fix missing rules preventing dry-runs
We have to support dry-runs, because many IDEs are using
dry-runs to collect build information.
Some rules have dependencies that expect certain files or
directories to be just present. We added respective build
rules which invoke the test program. This way, the behavior
when running make normally is exactly the same, but dry-runs
are also not failing now.
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
404
5c08b8e14df8
updates copyright notice
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
4 | * Copyright 2018 Olaf Wintermann. All rights reserved. |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include <stdio.h> |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include <stdlib.h> |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | #include <string.h> |
789
378b5ab86f77
add new build system for windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
32 | #include <fcntl.h> |
378b5ab86f77
add new build system for windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
33 | |
378b5ab86f77
add new build system for windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
34 | #ifndef _WIN32 |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
35 | #include <unistd.h> |
789
378b5ab86f77
add new build system for windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
36 | #endif |
378b5ab86f77
add new build system for windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
37 | |
506
ceed7714846a
fixes crash in dav-sync archive command when trying to remove resources from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
505
diff
changeset
|
38 | #include "utils.h" |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
39 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | #include "crypto.h" |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
42 | /* -------------------- OpenSSL Crypto Functions -------------------- */ |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
43 | #ifdef DAV_USE_OPENSSL |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
44 | |
625
e1a85fbf68f9
add more dav-sync pull tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
624
diff
changeset
|
45 | #if OPENSSL_VERSION_NUMBER < 0x10000000L |
261
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
46 | |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
47 | static EVP_CIPHER_CTX* create_evp_cipher_ctx() { |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
48 | EVP_CIPHER_CTX *ctx = malloc(sizeof(EVP_CIPHER_CTX)); |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
49 | EVP_CIPHER_CTX_init(ctx); |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
50 | return ctx; |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
51 | } |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
52 | |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
53 | static void free_evp_cipher_ctx(EVP_CIPHER_CTX *ctx) { |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
54 | EVP_CIPHER_CTX_cleanup(ctx); |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
55 | free(ctx); |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
56 | } |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
57 | |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
58 | #define EVP_CIPHER_CTX_new() create_evp_cipher_ctx() |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
59 | #define EVP_CIPHER_CTX_free(ctx) free_evp_cipher_ctx(ctx) |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
60 | |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
61 | #endif |
f60d742a62a0
fixes build with ancient openssl
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
260
diff
changeset
|
62 | |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
63 | int dav_rand_bytes(unsigned char *buf, size_t len) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
64 | return !RAND_bytes(buf, len); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
65 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
66 | |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
67 | AESDecrypter* aes_decrypter_new(DavKey *key, void *stream, dav_write_func write_func) { |
207
de23f8881e9f
fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
185
diff
changeset
|
68 | AESDecrypter *dec = calloc(1, sizeof(AESDecrypter)); |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
69 | SHA256_Init(&dec->sha256); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
70 | dec->stream = stream; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | dec->write = write_func; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | dec->key = key; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | dec->init = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | dec->ivpos = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
76 | return dec; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
77 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
78 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | void aes_decrypter_init(AESDecrypter *dec) { |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
80 | //EVP_CIPHER_CTX_init(&dec->ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
81 | dec->ctx = EVP_CIPHER_CTX_new(); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | dec->init = 1; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | if(dec->key->type == DAV_KEY_AES128) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | EVP_DecryptInit_ex( |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
85 | dec->ctx, |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | EVP_aes_128_cbc(), |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
87 | NULL, |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | dec->key->data, |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | dec->ivtmp); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | } else if(dec->key->type == DAV_KEY_AES256) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
91 | EVP_DecryptInit_ex( |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
92 | dec->ctx, |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
93 | EVP_aes_256_cbc(), |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
94 | NULL, |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | dec->key->data, |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
96 | dec->ivtmp); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | } else { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
98 | fprintf(stderr, "unknown key type\n"); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | exit(-1); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
100 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
101 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
103 | size_t aes_write(const void *buf, size_t s, size_t n, AESDecrypter *dec) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
104 | int len = s*n; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
105 | if(!dec->init) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
106 | size_t n = 16 - dec->ivpos; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | size_t cp = n > len ? len : n; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | memcpy(dec->ivtmp + dec->ivpos, buf, cp); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
109 | dec->ivpos += cp; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
110 | if(dec->ivpos >= 16) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | aes_decrypter_init(dec); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
112 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
113 | if(len == cp) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
114 | return len; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
115 | } else { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
116 | buf = (char*)buf + cp; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
117 | len -= cp; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
118 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
119 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
120 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
121 | int outlen = len + 16; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
122 | unsigned char *out = malloc(outlen); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
123 | EVP_DecryptUpdate(dec->ctx, out, &outlen, buf, len); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
124 | ssize_t wlen = dec->write(out, 1, outlen, dec->stream); |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
125 | SHA256_Update(&dec->sha256, out, wlen); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
126 | free(out); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
127 | return (s*n) / s; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
128 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | |
207
de23f8881e9f
fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
185
diff
changeset
|
130 | void aes_decrypter_shutdown(AESDecrypter *dec) { |
237
fd9135bc7580
fixed crash when encrypted streams are empty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
131 | if(dec->init) { |
fd9135bc7580
fixed crash when encrypted streams are empty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
132 | void *out = malloc(128); |
fd9135bc7580
fixed crash when encrypted streams are empty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
133 | int len = 0; |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
134 | EVP_DecryptFinal_ex(dec->ctx, out, &len); |
237
fd9135bc7580
fixed crash when encrypted streams are empty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
135 | dec->write(out, 1, len, dec->stream); |
fd9135bc7580
fixed crash when encrypted streams are empty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
136 | SHA256_Update(&dec->sha256, out, len); |
fd9135bc7580
fixed crash when encrypted streams are empty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
137 | free(out); |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
138 | //EVP_CIPHER_CTX_cleanup(&dec->ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
139 | EVP_CIPHER_CTX_free(dec->ctx); |
237
fd9135bc7580
fixed crash when encrypted streams are empty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
207
diff
changeset
|
140 | } |
207
de23f8881e9f
fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
185
diff
changeset
|
141 | } |
de23f8881e9f
fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
185
diff
changeset
|
142 | |
de23f8881e9f
fixed hash verification and head requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
185
diff
changeset
|
143 | void aes_decrypter_close(AESDecrypter *dec) { |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
144 | free(dec); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
145 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
146 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
147 | |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
148 | AESEncrypter* aes_encrypter_new(DavKey *key, void *stream, dav_read_func read_func, dav_seek_func seek_func) { |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
149 | unsigned char *iv = malloc(16); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
150 | if(!RAND_bytes(iv, 16)) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
151 | free(iv); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
152 | return NULL; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
154 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
155 | AESEncrypter *enc = malloc(sizeof(AESEncrypter)); |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
156 | SHA256_Init(&enc->sha256); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
157 | enc->stream = stream; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
158 | enc->read = read_func; |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
159 | enc->seek = seek_func; |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
160 | enc->tmp = NULL; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
161 | enc->tmplen = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
162 | enc->tmpoff = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
163 | enc->end = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
164 | enc->iv = iv; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
165 | enc->ivlen = 16; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
166 | |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
167 | //EVP_CIPHER_CTX_init(&enc->ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
168 | enc->ctx = EVP_CIPHER_CTX_new(); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
169 | if(key->type == DAV_KEY_AES128) { |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
170 | EVP_EncryptInit_ex(enc->ctx, EVP_aes_128_cbc(), NULL, key->data, enc->iv); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
171 | } else if(key->type == DAV_KEY_AES256) { |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
172 | EVP_EncryptInit_ex(enc->ctx, EVP_aes_256_cbc(), NULL, key->data, enc->iv); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
173 | } else { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
174 | fprintf(stderr, "unknown key type\n"); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
175 | exit(-1); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
176 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
177 | return enc; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
178 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
179 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
180 | size_t aes_read(void *buf, size_t s, size_t n, AESEncrypter *enc) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
181 | size_t len = s*n; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
182 | if(enc->tmp) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
183 | size_t tmp_diff = enc->tmplen - enc->tmpoff; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
184 | size_t cp_len = tmp_diff > len ? len : tmp_diff; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
185 | memcpy(buf, enc->tmp + enc->tmpoff, cp_len); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
186 | enc->tmpoff += cp_len; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
187 | if(enc->tmpoff >= enc->tmplen) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
188 | free(enc->tmp); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
189 | enc->tmp = NULL; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
190 | enc->tmplen = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
191 | enc->tmpoff = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
192 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
193 | return cp_len / s; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
194 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
195 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
196 | if(enc->end) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
197 | return 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
198 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
199 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
200 | void *in = malloc(len); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
201 | size_t in_len = enc->read(in, 1, len, enc->stream); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
202 | |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
203 | SHA256_Update(&enc->sha256, in, in_len); |
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
204 | |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
205 | unsigned char *out = NULL; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
206 | int outlen = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
207 | size_t ivl = enc->ivlen; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
208 | if(in_len != 0) { |
459
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
209 | outlen = len + 32; |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
210 | out = malloc(outlen + ivl); |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
211 | if(ivl > 0) { |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
212 | memcpy(out, enc->iv, ivl); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
213 | } |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
214 | EVP_EncryptUpdate(enc->ctx, out + ivl, &outlen, in, in_len); |
728 | 215 | // I think we don't need this |
216 | /* | |
459
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
217 | if(in_len != len) { |
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
218 | int newoutlen = 16; |
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
219 | EVP_EncryptFinal_ex(enc->ctx, out + ivl + outlen, &newoutlen); |
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
220 | outlen += newoutlen; |
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
221 | enc->end = 1; |
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
222 | } |
728 | 223 | */ |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
224 | } else { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
225 | out = malloc(16); |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
226 | EVP_EncryptFinal_ex(enc->ctx, out, &outlen); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
227 | enc->end = 1; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
228 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
229 | enc->tmp = (char*)out; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
230 | enc->tmplen = outlen + ivl; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
231 | enc->tmpoff = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
232 | |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
233 | if(enc->ivlen > 0) { |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
234 | enc->ivlen = 0; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
235 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
236 | |
459
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
237 | free(in); |
2c112cbaa08e
aes encrypter: fixes case where EVP_EncryptFinal_ex was not called at the stream end
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
238 | |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
239 | return aes_read(buf, s, n, enc); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
240 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
241 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
242 | void aes_encrypter_close(AESEncrypter *enc) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
243 | if(enc->tmp) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
244 | free(enc->tmp); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
245 | } |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
246 | if(enc->iv) { |
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
247 | free(enc->iv); |
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
248 | } |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
249 | //EVP_CIPHER_CTX_cleanup(&enc->ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
250 | EVP_CIPHER_CTX_free(enc->ctx); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
251 | free(enc); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
252 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
253 | |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
254 | int aes_encrypter_reset(AESEncrypter *enc, curl_off_t offset, int origin) { |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
255 | if(origin != SEEK_SET || offset != 0 || !enc->seek) { |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
256 | return CURL_SEEKFUNC_CANTSEEK; |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
257 | } |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
258 | |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
259 | enc->ivlen = 16; |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
260 | if(enc->seek(enc->stream, 0, SEEK_SET) != 0) { |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
261 | return CURL_SEEKFUNC_FAIL; |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
262 | } |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
263 | return CURL_SEEKFUNC_OK; |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
264 | } |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
265 | |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
266 | |
505 | 267 | char* aes_encrypt(const char *in, size_t len, DavKey *key) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
268 | unsigned char iv[16]; |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
269 | if(!RAND_bytes(iv, 16)) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
270 | return NULL; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
271 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
272 | |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
273 | //EVP_CIPHER_CTX ctx; |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
274 | //EVP_CIPHER_CTX_init(&ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
275 | EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
276 | if(key->type == DAV_KEY_AES128) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
277 | EVP_EncryptInit_ex( |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
278 | ctx, |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
279 | EVP_aes_128_cbc(), |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
280 | NULL, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
281 | (unsigned char*)key->data, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
282 | iv); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
283 | } else if(key->type == DAV_KEY_AES256) { |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
284 | EVP_EncryptInit_ex( |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
285 | ctx, |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
286 | EVP_aes_256_cbc(), |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
287 | NULL, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
288 | (unsigned char*)key->data, |
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
289 | iv); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
290 | } else { |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
291 | //EVP_CIPHER_CTX_cleanup(&ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
292 | EVP_CIPHER_CTX_free(ctx); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
293 | return NULL; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
294 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
295 | |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
296 | //int len = strlen(in); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
297 | int buflen = len + 64; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
298 | unsigned char *buf = calloc(1, buflen); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
299 | memcpy(buf, iv, 16); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
300 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
301 | int l = buflen - 16; |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
302 | EVP_EncryptUpdate(ctx, buf + 16, &l, (unsigned char*)in, len); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
303 | |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
304 | int f = 0; |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
305 | EVP_EncryptFinal_ex(ctx, buf + 16 + l, &f); |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
306 | char *out = util_base64encode((char*)buf, 16 + l + f); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
307 | free(buf); |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
308 | EVP_CIPHER_CTX_free(ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
309 | //EVP_CIPHER_CTX_cleanup(&ctx); |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
310 | |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
311 | return out; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
312 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
313 | |
505 | 314 | char* aes_decrypt(const char *in, size_t *length, DavKey *key) { |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
315 | int len; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
316 | unsigned char *buf = (unsigned char*)util_base64decode_len(in, &len); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
317 | |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
318 | //EVP_CIPHER_CTX ctx; |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
319 | //EVP_CIPHER_CTX_init(&ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
320 | EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
321 | if(key->type == DAV_KEY_AES128) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
322 | EVP_DecryptInit_ex( |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
323 | ctx, |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
324 | EVP_aes_128_cbc(), |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
325 | NULL, |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
326 | key->data, |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
327 | buf); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
328 | } else if(key->type == DAV_KEY_AES256) { |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
329 | EVP_DecryptInit_ex( |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
330 | ctx, |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
331 | EVP_aes_256_cbc(), |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
332 | NULL, |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
333 | key->data, |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
334 | buf); |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
335 | } else { |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
336 | //EVP_CIPHER_CTX_cleanup(&ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
337 | EVP_CIPHER_CTX_free(ctx); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
338 | return NULL; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
339 | } |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
340 | |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
341 | unsigned char *out = malloc(len + 1); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
342 | int outlen = len; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
343 | unsigned char *in_buf = buf + 16; |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
344 | int inlen = len - 16; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
345 | int f = 0; |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
346 | |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
347 | EVP_DecryptUpdate(ctx, out, &outlen, in_buf, inlen); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
348 | EVP_DecryptFinal_ex(ctx, out + outlen, &f); |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
349 | out[outlen + f] = '\0'; |
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
350 | free(buf); |
260
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
351 | //EVP_CIPHER_CTX_cleanup(&ctx); |
26f5f817429e
fixes build with openssl 1.1
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
352 | EVP_CIPHER_CTX_free(ctx); |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
353 | |
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
354 | *length = outlen + f; |
43
03076907b58a
added file name encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
40
diff
changeset
|
355 | return (char*)out; |
40
a95ee94b9204
supports whitespace in paths
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
356 | } |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
357 | |
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
358 | |
354
067ea2315a8a
moves auth prompt functionality to libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
349
diff
changeset
|
359 | void dav_get_hash(DAV_SHA_CTX *sha256, unsigned char *buf){ |
155
b85248a8aee2
fixed some cases of incompatible types in crypto functions
Mike Becker <universe@uap-core.de>
parents:
150
diff
changeset
|
360 | SHA256_Final((unsigned char*)buf, sha256); |
150
37fb12574acd
added checksums for encrypted resources
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
75
diff
changeset
|
361 | } |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
362 | |
367
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
363 | char* dav_create_hash(const char *data, size_t len) { |
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
364 | unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; |
624
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
365 | DAV_SHA_CTX ctx; |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
366 | SHA256_Init(&ctx); |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
367 | SHA256_Update(&ctx, data, len); |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
368 | SHA256_Final(hash, &ctx); |
367
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
369 | return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
370 | } |
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
371 | |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
372 | DAV_SHA_CTX* dav_hash_init(void) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
373 | DAV_SHA_CTX *ctx = malloc(sizeof(DAV_SHA_CTX)); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
374 | SHA256_Init(ctx); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
375 | return ctx; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
376 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
377 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
378 | void dav_hash_update(DAV_SHA_CTX *ctx, const char *data, size_t len) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
379 | SHA256_Update(ctx, data, len); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
380 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
381 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
382 | void dav_hash_final(DAV_SHA_CTX *ctx, unsigned char *buf) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
383 | SHA256_Final(buf, ctx); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
384 | free(ctx); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
385 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
386 | |
624
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
387 | #if OPENSSL_VERSION_NUMBER < 0x10100000L |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
388 | static int crypto_pw2key_error = 0; |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
389 | DavKey* dav_pw2key(const char *password, const unsigned char *salt, int saltlen, int pwfunc, int enc) { |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
390 | if(!crypto_pw2key_error) { |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
391 | fprintf(stderr, "Error: password key derivation not supported on this platform: openssl to old\n"); |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
392 | crypto_pw2key_error = 1; |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
393 | } |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
394 | return 0; |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
395 | } |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
396 | |
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
397 | #else |
515
2465dd550bb5
fixes signedness of salt in dav_pw2key()
Mike Becker <universe@uap-core.de>
parents:
506
diff
changeset
|
398 | DavKey* dav_pw2key(const char *password, const unsigned char *salt, int saltlen, int pwfunc, int enc) { |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
399 | if(!password) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
400 | return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
401 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
402 | size_t len = strlen(password); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
403 | if(len == 0) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
404 | return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
405 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
406 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
407 | // setup key data and length |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
408 | unsigned char keydata[32]; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
409 | int keylen = 32; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
410 | switch(enc) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
411 | case DAV_KEY_AES128: keylen = 16; break; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
412 | case DAV_KEY_AES256: keylen = 32; break; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
413 | default: return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
414 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
415 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
416 | // generate key |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
417 | switch(pwfunc) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
418 | case DAV_PWFUNC_PBKDF2_SHA256: { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
419 | PKCS5_PBKDF2_HMAC( |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
420 | password, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
421 | len, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
422 | salt, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
423 | saltlen, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
424 | DAV_CRYPTO_ITERATION_COUNT, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
425 | EVP_sha256(), |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
426 | keylen, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
427 | keydata); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
428 | break; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
429 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
430 | case DAV_PWFUNC_PBKDF2_SHA512: { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
431 | PKCS5_PBKDF2_HMAC( |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
432 | password, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
433 | len, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
434 | salt, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
435 | saltlen, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
436 | DAV_CRYPTO_ITERATION_COUNT, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
437 | EVP_sha512(), |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
438 | keylen, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
439 | keydata); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
440 | break; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
441 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
442 | default: return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
443 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
444 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
445 | // create DavKey with generated data |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
446 | DavKey *key = malloc(sizeof(DavKey)); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
447 | key->data = malloc(keylen); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
448 | key->length = keylen; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
449 | key->name = NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
450 | key->type = enc; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
451 | memcpy(key->data, keydata, keylen); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
452 | return key; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
453 | } |
624
27985062cd2c
fix build on Solaris 10
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
520
diff
changeset
|
454 | #endif |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
455 | |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
456 | #endif |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
457 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
458 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
459 | /* -------------------- Apple Crypto Functions -------------------- */ |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
460 | #ifdef DAV_CRYPTO_COMMON_CRYPTO |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
461 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
462 | #define RANDOM_BUFFER_LENGTH 256 |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
463 | static char randbuf[RANDOM_BUFFER_LENGTH]; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
464 | static int rbufpos = RANDOM_BUFFER_LENGTH; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
465 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
466 | int dav_rand_bytes(unsigned char *buf, size_t len) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
467 | if(len + rbufpos > RANDOM_BUFFER_LENGTH) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
468 | int devr = open("/dev/urandom", O_RDONLY); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
469 | if(devr == -1) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
470 | return 1; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
471 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
472 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
473 | if(read(devr, randbuf, RANDOM_BUFFER_LENGTH) < RANDOM_BUFFER_LENGTH) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
474 | close(devr); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
475 | return 1; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
476 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
477 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
478 | rbufpos = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
479 | if(len > RANDOM_BUFFER_LENGTH) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
480 | int err = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
481 | if(read(devr, buf, len) < len) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
482 | err = 1; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
483 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
484 | close(devr); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
485 | return err; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
486 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
487 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
488 | close(devr); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
489 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
490 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
491 | char *r = randbuf; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
492 | memcpy(buf, r + rbufpos, len); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
493 | rbufpos += len; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
494 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
495 | return 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
496 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
497 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
498 | AESDecrypter* aes_decrypter_new(DavKey *key, void *stream, dav_write_func write_func) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
499 | AESDecrypter *dec = calloc(1, sizeof(AESDecrypter)); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
500 | CC_SHA256_Init(&dec->sha256); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
501 | dec->stream = stream; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
502 | dec->write = write_func; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
503 | dec->key = key; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
504 | dec->init = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
505 | dec->ivpos = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
506 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
507 | return dec; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
508 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
509 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
510 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
511 | void aes_decrypter_init(AESDecrypter *dec) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
512 | //EVP_CIPHER_CTX_init(&dec->ctx); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
513 | dec->init = 1; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
514 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
515 | CCCryptorRef cryptor; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
516 | CCCryptorStatus status; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
517 | if(dec->key->type == DAV_KEY_AES128) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
518 | status = CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, dec->key->data, dec->key->length, dec->ivtmp, &cryptor); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
519 | } else if(dec->key->type == DAV_KEY_AES256) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
520 | status = CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding, dec->key->data, dec->key->length, dec->ivtmp, &cryptor); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
521 | } else { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
522 | fprintf(stderr, "unknown key type\n"); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
523 | exit(-1); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
524 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
525 | dec->ctx = cryptor; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
526 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
527 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
528 | size_t aes_write(const void *buf, size_t s, size_t n, AESDecrypter *dec) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
529 | int len = s*n; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
530 | if(!dec->init) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
531 | size_t n = 16 - dec->ivpos; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
532 | size_t cp = n > len ? len : n; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
533 | memcpy(dec->ivtmp + dec->ivpos, buf, cp); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
534 | dec->ivpos += cp; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
535 | if(dec->ivpos >= 16) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
536 | aes_decrypter_init(dec); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
537 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
538 | if(len == cp) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
539 | return len; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
540 | } else { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
541 | buf = (char*)buf + cp; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
542 | len -= cp; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
543 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
544 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
545 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
546 | int outlen = len + 16; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
547 | unsigned char *out = malloc(outlen); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
548 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
549 | CCCryptorStatus status; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
550 | size_t avail = outlen; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
551 | size_t moved = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
552 | status = CCCryptorUpdate(dec->ctx, buf, len, out, avail, &moved); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
553 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
554 | ssize_t wlen = dec->write(out, 1, moved, dec->stream); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
555 | CC_SHA256_Update(&dec->sha256, out, wlen); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
556 | free(out); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
557 | return (s*n) / s; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
558 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
559 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
560 | void aes_decrypter_shutdown(AESDecrypter *dec) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
561 | if(dec->init) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
562 | void *out = malloc(128); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
563 | size_t len = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
564 | //EVP_DecryptFinal_ex(dec->ctx, out, &len); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
565 | CCCryptorFinal(dec->ctx, out, 128, &len); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
566 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
567 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
568 | dec->write(out, 1, len, dec->stream); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
569 | CC_SHA256_Update(&dec->sha256, out, len); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
570 | free(out); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
571 | //EVP_CIPHER_CTX_cleanup(&dec->ctx); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
572 | //EVP_CIPHER_CTX_free(dec->ctx); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
573 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
574 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
575 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
576 | void aes_decrypter_close(AESDecrypter *dec) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
577 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
578 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
579 | |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
580 | AESEncrypter* aes_encrypter_new(DavKey *key, void *stream, dav_read_func read_func, dav_seek_func seek_func) { |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
581 | unsigned char *iv = malloc(16); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
582 | if(dav_rand_bytes(iv, 16)) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
583 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
584 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
585 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
586 | CCCryptorRef cryptor; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
587 | CCCryptorStatus status; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
588 | if(key->type == DAV_KEY_AES128) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
589 | status = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, key->data, key->length, iv, &cryptor); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
590 | } else if(key->type == DAV_KEY_AES256) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
591 | status = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding, key->data, key->length, iv, &cryptor); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
592 | } else { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
593 | free(iv); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
594 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
595 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
596 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
597 | AESEncrypter *enc = malloc(sizeof(AESEncrypter)); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
598 | enc->ctx = cryptor; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
599 | CC_SHA256_Init(&enc->sha256); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
600 | enc->stream = stream; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
601 | enc->read = read_func; |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
602 | enc->seek = seek_func; |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
603 | enc->tmp = NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
604 | enc->tmplen = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
605 | enc->tmpoff = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
606 | enc->end = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
607 | enc->iv = iv; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
608 | enc->ivlen = 16; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
609 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
610 | return enc; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
611 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
612 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
613 | size_t aes_read(void *buf, size_t s, size_t n, AESEncrypter *enc) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
614 | size_t len = s*n; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
615 | if(enc->tmp) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
616 | size_t tmp_diff = enc->tmplen - enc->tmpoff; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
617 | size_t cp_len = tmp_diff > len ? len : tmp_diff; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
618 | memcpy(buf, enc->tmp + enc->tmpoff, cp_len); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
619 | enc->tmpoff += cp_len; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
620 | if(enc->tmpoff >= enc->tmplen) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
621 | free(enc->tmp); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
622 | enc->tmp = NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
623 | enc->tmplen = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
624 | enc->tmpoff = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
625 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
626 | return cp_len / s; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
627 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
628 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
629 | if(enc->end) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
630 | return 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
631 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
632 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
633 | void *in = malloc(len); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
634 | size_t in_len = enc->read(in, 1, len, enc->stream); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
635 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
636 | CC_SHA256_Update(&enc->sha256, in, in_len); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
637 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
638 | unsigned char *out = NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
639 | size_t outlen = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
640 | size_t ivl = enc->ivlen; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
641 | if(in_len != 0) { |
462
efda9aa1bbad
applies aes stream fix to macos implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
459
diff
changeset
|
642 | outlen = len + 32; |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
643 | out = malloc(outlen + ivl); |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
644 | if(ivl > 0) { |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
645 | memcpy(out, enc->iv, ivl); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
646 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
647 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
648 | CCCryptorStatus status; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
649 | size_t avail = outlen; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
650 | status = CCCryptorUpdate(enc->ctx, in, in_len, out + ivl, avail, &outlen); |
728 | 651 | // TODO: check if this still works |
652 | /* | |
462
efda9aa1bbad
applies aes stream fix to macos implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
459
diff
changeset
|
653 | if(in_len != len) { |
488
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
654 | size_t newoutlen = 16; |
462
efda9aa1bbad
applies aes stream fix to macos implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
459
diff
changeset
|
655 | status = CCCryptorFinal(enc->ctx, out + ivl + outlen, 16, &newoutlen); |
efda9aa1bbad
applies aes stream fix to macos implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
459
diff
changeset
|
656 | outlen += newoutlen; |
efda9aa1bbad
applies aes stream fix to macos implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
459
diff
changeset
|
657 | enc->end = 1; |
efda9aa1bbad
applies aes stream fix to macos implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
459
diff
changeset
|
658 | } |
728 | 659 | */ |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
660 | } else { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
661 | out = malloc(32); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
662 | CCCryptorStatus status; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
663 | size_t avail = outlen; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
664 | status = CCCryptorFinal(enc->ctx, out, 32, &outlen); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
665 | enc->end = 1; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
666 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
667 | enc->tmp = (char*)out; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
668 | enc->tmplen = outlen + ivl; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
669 | enc->tmpoff = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
670 | |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
671 | if(enc->ivlen > 0) { |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
672 | enc->ivlen = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
673 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
674 | |
462
efda9aa1bbad
applies aes stream fix to macos implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
459
diff
changeset
|
675 | free(in); |
efda9aa1bbad
applies aes stream fix to macos implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
459
diff
changeset
|
676 | |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
677 | return aes_read(buf, s, n, enc); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
678 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
679 | |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
680 | int aes_encrypter_reset(AESEncrypter *enc, curl_off_t offset, int origin) { |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
681 | if(origin != SEEK_SET || offset != 0 || !enc->seek) { |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
682 | return CURL_SEEKFUNC_CANTSEEK; |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
683 | } |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
684 | |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
685 | enc->ivlen = 16; |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
686 | if(enc->seek(enc->stream, 0, SEEK_SET) != 0) { |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
687 | return CURL_SEEKFUNC_FAIL; |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
688 | } |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
689 | return CURL_SEEKFUNC_OK; |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
690 | } |
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
691 | |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
692 | void aes_encrypter_close(AESEncrypter *enc) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
693 | if(enc->tmp) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
694 | free(enc->tmp); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
695 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
696 | if(enc->iv) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
697 | free(enc->iv); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
698 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
699 | // TODO: cleanup cryptor |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
700 | free(enc); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
701 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
702 | |
505 | 703 | char* aes_encrypt(const char *in, size_t len, DavKey *key) { |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
704 | unsigned char iv[16]; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
705 | if(dav_rand_bytes(iv, 16)) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
706 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
707 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
708 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
709 | CCCryptorRef cryptor; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
710 | CCCryptorStatus status; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
711 | if(key->type == DAV_KEY_AES128) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
712 | status = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, key->data, key->length, iv, &cryptor); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
713 | } else if(key->type == DAV_KEY_AES256) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
714 | status = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding, key->data, key->length, iv, &cryptor); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
715 | } else { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
716 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
717 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
718 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
719 | if(status != kCCSuccess) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
720 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
721 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
722 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
723 | int buflen = len + 64; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
724 | char *buf = calloc(1, buflen); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
725 | memcpy(buf, iv, 16); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
726 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
727 | int pos = 16; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
728 | size_t avail = buflen - 16; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
729 | size_t moved; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
730 | char *out = buf + 16; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
731 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
732 | status = CCCryptorUpdate(cryptor, in, |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
733 | len, out, avail, |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
734 | &moved); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
735 | if(status != kCCSuccess) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
736 | free(buf); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
737 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
738 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
739 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
740 | pos += moved; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
741 | avail -= moved; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
742 | out += moved; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
743 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
744 | status = CCCryptorFinal(cryptor, out, avail, &moved); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
745 | if(status != kCCSuccess) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
746 | free(buf); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
747 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
748 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
749 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
750 | pos += moved; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
751 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
752 | char *b64enc = util_base64encode(buf, pos); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
753 | free(buf); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
754 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
755 | return b64enc; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
756 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
757 | |
505 | 758 | char* aes_decrypt(const char *in, size_t *len, DavKey *key) { |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
759 | int inlen; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
760 | unsigned char *buf = (unsigned char*)util_base64decode_len(in, &inlen); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
761 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
762 | CCCryptorRef cryptor; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
763 | CCCryptorStatus status; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
764 | if(key->type == DAV_KEY_AES128) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
765 | status = CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, key->data, key->length, buf, &cryptor); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
766 | } else if(key->type == DAV_KEY_AES256) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
767 | status = CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding, key->data, key->length, buf, &cryptor); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
768 | } else { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
769 | free(buf); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
770 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
771 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
772 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
773 | if(status != kCCSuccess) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
774 | free(buf); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
775 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
776 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
777 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
778 | char *out = malloc(inlen + 1); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
779 | size_t outavail = inlen; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
780 | size_t outlen = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
781 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
782 | unsigned char *inbuf = buf + 16; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
783 | inlen -= 16; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
784 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
785 | size_t moved = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
786 | status = CCCryptorUpdate(cryptor, inbuf, inlen, out, outavail, &moved); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
787 | if(status != kCCSuccess) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
788 | free(buf); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
789 | free(out); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
790 | // TODO cryptor |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
791 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
792 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
793 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
794 | outlen += moved; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
795 | outavail -= moved; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
796 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
797 | status = CCCryptorFinal(cryptor, out + outlen, outavail, &moved); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
798 | if(status != kCCSuccess) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
799 | free(buf); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
800 | free(out); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
801 | // TODO cryptor |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
802 | return NULL; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
803 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
804 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
805 | outlen += moved; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
806 | out[outlen] = 0; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
807 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
808 | *len = outlen; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
809 | return out; |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
810 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
811 | |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
812 | void dav_get_hash(DAV_SHA_CTX *sha256, unsigned char *buf) { |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
813 | CC_SHA256_Final(buf, sha256); |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
814 | } |
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
815 | |
367
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
816 | char* dav_create_hash(const char *data, size_t len) { |
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
817 | unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; |
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
818 | CC_SHA256((const unsigned char*)data, len, hash); |
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
819 | return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
820 | } |
4a6a59f89f9f
adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
354
diff
changeset
|
821 | |
520
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
822 | DAV_SHA_CTX* dav_hash_init(void) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
823 | DAV_SHA_CTX *ctx = malloc(sizeof(DAV_SHA_CTX)); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
824 | CC_SHA256_Init(ctx); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
825 | return ctx; |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
826 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
827 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
828 | void dav_hash_update(DAV_SHA_CTX *ctx, const char *data, size_t len) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
829 | CC_SHA256_Update(ctx, data, len); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
830 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
831 | |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
832 | void dav_hash_final(DAV_SHA_CTX *ctx, unsigned char *buf) { |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
833 | CC_SHA256_Final(buf, ctx); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
834 | free(ctx); |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
835 | } |
da2b0cc44e4f
adds xml attribute support and xattr property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
836 | |
515
2465dd550bb5
fixes signedness of salt in dav_pw2key()
Mike Becker <universe@uap-core.de>
parents:
506
diff
changeset
|
837 | DavKey* dav_pw2key(const char *password, const unsigned char *salt, int saltlen, int pwfunc, int enc) { |
488
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
838 | if(!password) { |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
839 | return NULL; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
840 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
841 | size_t len = strlen(password); |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
842 | if(len == 0) { |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
843 | return NULL; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
844 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
845 | |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
846 | // setup key data and length |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
847 | unsigned char keydata[32]; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
848 | int keylen = 32; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
849 | switch(enc) { |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
850 | case DAV_KEY_AES128: keylen = 16; break; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
851 | case DAV_KEY_AES256: keylen = 32; break; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
852 | default: return NULL; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
853 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
854 | |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
855 | // generate key |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
856 | switch(pwfunc) { |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
857 | case DAV_PWFUNC_PBKDF2_SHA256: { |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
858 | int result = CCKeyDerivationPBKDF( |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
859 | kCCPBKDF2, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
860 | password, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
861 | len, |
515
2465dd550bb5
fixes signedness of salt in dav_pw2key()
Mike Becker <universe@uap-core.de>
parents:
506
diff
changeset
|
862 | salt, |
488
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
863 | saltlen, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
864 | kCCPRFHmacAlgSHA256, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
865 | DAV_CRYPTO_ITERATION_COUNT, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
866 | keydata, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
867 | keylen); |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
868 | if(result) { |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
869 | return NULL; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
870 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
871 | break; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
872 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
873 | case DAV_PWFUNC_PBKDF2_SHA512: { |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
874 | int result = CCKeyDerivationPBKDF( |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
875 | kCCPBKDF2, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
876 | password, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
877 | len, |
515
2465dd550bb5
fixes signedness of salt in dav_pw2key()
Mike Becker <universe@uap-core.de>
parents:
506
diff
changeset
|
878 | salt, |
488
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
879 | saltlen, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
880 | kCCPRFHmacAlgSHA512, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
881 | DAV_CRYPTO_ITERATION_COUNT, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
882 | keydata, |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
883 | keylen); |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
884 | if(result) { |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
885 | return NULL; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
886 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
887 | break; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
888 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
889 | default: return NULL; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
890 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
891 | |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
892 | // create DavKey with generated data |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
893 | DavKey *key = malloc(sizeof(DavKey)); |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
894 | key->data = malloc(keylen); |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
895 | key->length = keylen; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
896 | key->name = NULL; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
897 | key->type = enc; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
898 | memcpy(key->data, keydata, keylen); |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
899 | return key; |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
900 | } |
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
478
diff
changeset
|
901 | |
349
0b4ecadaf3f9
ports openssl code to commoncrypto (macos)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
267
diff
changeset
|
902 | #endif |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
903 | |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
904 | /* -------------------- Windows Crypto Functions -------------------- */ |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
905 | #ifdef DAV_CRYPTO_CNG |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
906 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
907 | static void cng_cleanup(BCRYPT_ALG_HANDLE hAesAlg, BCRYPT_KEY_HANDLE hKey, BCRYPT_HASH_HANDLE hHash, void *pbObject) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
908 | if(hAesAlg) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
909 | BCryptCloseAlgorithmProvider(hAesAlg,0); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
910 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
911 | if(hKey) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
912 | BCryptDestroyKey(hKey); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
913 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
914 | if(hHash) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
915 | BCryptDestroyHash(hHash); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
916 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
917 | if(pbObject) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
918 | free(pbObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
919 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
920 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
921 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
922 | static int cng_init_key(BCRYPT_ALG_HANDLE *alg, BCRYPT_KEY_HANDLE *key, void **keyobj, DavKey *aesKey) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
923 | BCRYPT_ALG_HANDLE hAesAlg = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
924 | BCRYPT_KEY_HANDLE hKey = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
925 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
926 | void *pbKeyObject = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
927 | ULONG keyObjectLength = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
928 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
929 | ULONG result = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
930 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
931 | // check DavKey and get AES key length |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
932 | if(!aesKey) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
933 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
934 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
935 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
936 | ULONG aesKeyLength = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
937 | if(aesKey->type == DAV_KEY_AES128) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
938 | aesKeyLength = 16; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
939 | } else if(aesKey->type == DAV_KEY_AES256) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
940 | aesKeyLength = 32; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
941 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
942 | if(aesKeyLength > aesKey->length || !aesKey->data) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
943 | // invalid DavKey |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
944 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
945 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
946 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
947 | // initialize BCrypt stuff |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
948 | if(BCryptOpenAlgorithmProvider(&hAesAlg, BCRYPT_AES_ALGORITHM, NULL, 0)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
949 | fprintf(stderr, "Error: BCryptOpenAlgorithmProvider failed\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
950 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
951 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
952 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
953 | if(BCryptGetProperty(hAesAlg, BCRYPT_OBJECT_LENGTH, (PUCHAR)&keyObjectLength, sizeof(DWORD), &result, 0)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
954 | fprintf(stderr, "Error: BCrypt: Cannot get BCRYPT_OBJECT_LENGTH\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
955 | cng_cleanup(hAesAlg, hKey, NULL, pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
956 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
957 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
958 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
959 | if(BCryptSetProperty(hAesAlg, BCRYPT_CHAINING_MODE, (PBYTE)BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC), 0)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
960 | fprintf(stderr, "Error: BCrypt: Cannot set CBC mode\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
961 | cng_cleanup(hAesAlg, hKey, NULL, pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
962 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
963 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
964 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
965 | pbKeyObject = calloc(1, keyObjectLength); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
966 | if(!pbKeyObject) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
967 | cng_cleanup(hAesAlg, hKey, NULL, pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
968 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
969 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
970 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
971 | // init key |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
972 | if(BCryptGenerateSymmetricKey(hAesAlg, &hKey, pbKeyObject, keyObjectLength, aesKey->data, aesKeyLength, 0)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
973 | fprintf(stderr, "Error: BCrypt: Cannot set key\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
974 | cng_cleanup(hAesAlg, hKey, NULL, pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
975 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
976 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
977 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
978 | *alg = hAesAlg; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
979 | *key = hKey; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
980 | *keyobj = pbKeyObject; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
981 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
982 | return 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
983 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
984 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
985 | static int cng_hash_init(WinBCryptSHACTX *ctx) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
986 | if(BCryptOpenAlgorithmProvider(&ctx->hAlg, BCRYPT_SHA256_ALGORITHM, NULL, 0)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
987 | fprintf(stderr, "Error: BCryptOpenAlgorithmProvider failed\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
988 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
989 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
990 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
991 | ULONG hashObjectLen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
992 | ULONG result; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
993 | if(BCryptGetProperty(ctx->hAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&hashObjectLen, sizeof(DWORD), &result, 0)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
994 | cng_cleanup(ctx->hAlg, NULL, NULL, NULL); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
995 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
996 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
997 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
998 | ctx->pbHashObject = calloc(1, hashObjectLen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
999 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1000 | if(BCryptCreateHash(ctx->hAlg, &ctx->hHash, ctx->pbHashObject, hashObjectLen, NULL, 0, 0)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1001 | cng_cleanup(ctx->hAlg, NULL, ctx->hHash, ctx->pbHashObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1002 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1003 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1004 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1005 | return 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1006 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1007 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1008 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1009 | int dav_rand_bytes(unsigned char *buf, size_t len) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1010 | if(BCryptGenRandom(NULL, (unsigned char*)buf, (ULONG)len, BCRYPT_USE_SYSTEM_PREFERRED_RNG)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1011 | return 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1012 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1013 | return 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1014 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1015 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1016 | AESDecrypter* aes_decrypter_new(DavKey *key, void *stream, dav_write_func write_func) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1017 | AESDecrypter *dec = calloc(1, sizeof(AESDecrypter)); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1018 | if(!dec) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1019 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1020 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1021 | if(cng_hash_init(&dec->sha256)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1022 | free(dec); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1023 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1024 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1025 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1026 | dec->stream = stream; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1027 | dec->write = write_func; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1028 | dec->key = key; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1029 | dec->init = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1030 | dec->ivpos = 0; |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1031 | |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1032 | return dec; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1033 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1034 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1035 | static void aes_decrypter_init(AESDecrypter *dec) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1036 | if(cng_init_key(&dec->ctx.hAlg, &dec->ctx.hKey, &dec->ctx.pbKeyObject, dec->key)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1037 | fprintf(stderr, "Error: cng_init_key failed\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1038 | exit(-1); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1039 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1040 | // copy iv |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1041 | memcpy(dec->ctx.pbIV, dec->ivtmp, 16); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1042 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1043 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1044 | size_t aes_write(const void *buf, size_t s, size_t n, AESDecrypter *dec) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1045 | int len = s*n; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1046 | if(!dec->init) { |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1047 | dec->init = 1; |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1048 | |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1049 | size_t n = 16 - dec->ivpos; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1050 | size_t cp = n > len ? len : n; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1051 | memcpy(dec->ivtmp + dec->ivpos, buf, cp); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1052 | dec->ivpos += cp; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1053 | if(dec->ivpos >= 16) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1054 | aes_decrypter_init(dec); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1055 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1056 | if(len == cp) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1057 | return len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1058 | } else { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1059 | buf = (char*)buf + cp; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1060 | len -= cp; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1061 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1062 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1063 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1064 | // the cipher text must be a multiply of 16 |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1065 | // remaining bytes are stored in ctx.buf and must be added to cibuf |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1066 | // the next time |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1067 | size_t cbufalloc = len + 64; |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1068 | ULONG clen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1069 | char *cbuf = malloc(cbufalloc); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1070 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1071 | // add previous remaining bytes |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1072 | if(dec->ctx.buflen > 0) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1073 | memcpy(cbuf, dec->ctx.buf, dec->ctx.buflen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1074 | clen = dec->ctx.buflen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1075 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1076 | // add current bytes |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1077 | memcpy(cbuf + clen, buf, len); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1078 | clen += len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1079 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1080 | // check if the message fits the blocksize |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1081 | int remaining = clen % 16; |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1082 | if(remaining == 0) { |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1083 | // decrypt last block next time, or in aes_decrypter_shutdown |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1084 | // this makes sure, that shutdown always decrypts the last block |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1085 | // with BCRYPT_BLOCK_PADDING flag |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1086 | remaining = 16; |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1087 | } |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1088 | |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1089 | // add remaining bytes to ctx.buf for the next aes_write run |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1090 | clen -= remaining; |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1091 | memcpy(dec->ctx.buf, cbuf + clen, remaining); |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1092 | dec->ctx.buflen = remaining; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1093 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1094 | // ready to decrypt the message |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1095 | ULONG outlen = clen + 32; |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1096 | |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1097 | // decrypt |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1098 | if(clen > 0) { |
791
38796c7e32b6
fix aes_write on windows could write non-decrypted bytes to output buffer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
789
diff
changeset
|
1099 | unsigned char* out = malloc(outlen); |
38796c7e32b6
fix aes_write on windows could write non-decrypted bytes to output buffer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
789
diff
changeset
|
1100 | |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1101 | ULONG enc_len = 0; |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1102 | ULONG status = BCryptDecrypt(dec->ctx.hKey, cbuf, clen, NULL, dec->ctx.pbIV, 16, out, outlen, &enc_len, 0); |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1103 | if(status > 0) { |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1104 | fprintf(stderr, "Error: BCryptDecrypt failed: 0x%X\n", status); |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1105 | free(out); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1106 | free(cbuf); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1107 | return 0; |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1108 | } |
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1109 | outlen = enc_len; |
791
38796c7e32b6
fix aes_write on windows could write non-decrypted bytes to output buffer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
789
diff
changeset
|
1110 | |
38796c7e32b6
fix aes_write on windows could write non-decrypted bytes to output buffer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
789
diff
changeset
|
1111 | // write decrypted data to the output stream and update the hash |
38796c7e32b6
fix aes_write on windows could write non-decrypted bytes to output buffer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
789
diff
changeset
|
1112 | dec->write(out, 1, outlen, dec->stream); |
38796c7e32b6
fix aes_write on windows could write non-decrypted bytes to output buffer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
789
diff
changeset
|
1113 | BCryptHashData(dec->sha256.hHash, out, outlen, 0); |
38796c7e32b6
fix aes_write on windows could write non-decrypted bytes to output buffer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
789
diff
changeset
|
1114 | |
38796c7e32b6
fix aes_write on windows could write non-decrypted bytes to output buffer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
789
diff
changeset
|
1115 | free(out); |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1116 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1117 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1118 | free(cbuf); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1119 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1120 | return (s*n) / s; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1121 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1122 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1123 | void aes_decrypter_shutdown(AESDecrypter *dec) { |
689
b1f7d83f6e69
fix aes decrypter stream
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
688
diff
changeset
|
1124 | if(dec->init && dec->ctx.buflen > 0) { |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1125 | ULONG outlen = 64; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1126 | char out[64]; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1127 | if(BCryptDecrypt(dec->ctx.hKey, dec->ctx.buf, dec->ctx.buflen, NULL, dec->ctx.pbIV, 16, out, outlen, &outlen, BCRYPT_BLOCK_PADDING)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1128 | fprintf(stderr, "Error: BCryptDecrypt failed\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1129 | return; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1130 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1131 | dec->write(out, 1, outlen, dec->stream); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1132 | BCryptHashData(dec->sha256.hHash, out, outlen, 0); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1133 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1134 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1135 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1136 | void aes_decrypter_close(AESDecrypter *dec) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1137 | cng_cleanup(dec->ctx.hAlg, dec->ctx.hKey, NULL, dec->ctx.pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1138 | cng_cleanup(dec->sha256.hAlg, NULL, dec->sha256.hHash, dec->sha256.pbHashObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1139 | free(dec); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1140 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1141 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1142 | AESEncrypter* aes_encrypter_new(DavKey *key, void *stream, dav_read_func read_func, dav_seek_func seek_func) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1143 | unsigned char *iv = malloc(16); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1144 | if(dav_rand_bytes(iv, 16)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1145 | free(iv); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1146 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1147 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1148 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1149 | AESEncrypter *enc = calloc(1, sizeof(AESEncrypter)); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1150 | if(cng_hash_init(&enc->sha256)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1151 | free(iv); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1152 | free(enc); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1153 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1154 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1155 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1156 | enc->stream = stream; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1157 | enc->read = read_func; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1158 | enc->seek = seek_func; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1159 | enc->tmp = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1160 | enc->tmplen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1161 | enc->tmpoff = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1162 | enc->end = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1163 | enc->iv = iv; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1164 | enc->ivlen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1165 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1166 | if(cng_init_key(&enc->ctx.hAlg, &enc->ctx.hKey, &enc->ctx.pbKeyObject, key)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1167 | fprintf(stderr, "Error: cng_init_key failed\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1168 | exit(-1); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1169 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1170 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1171 | enc->ctx.buflen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1172 | memcpy(enc->ctx.pbIV, iv, 16); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1173 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1174 | return enc; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1175 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1176 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1177 | size_t aes_read(void *buf, size_t s, size_t n, AESEncrypter *enc) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1178 | size_t len = s*n; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1179 | size_t nread = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1180 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1181 | if(enc->tmp) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1182 | // the temp buffer contains bytes that are already encrypted, but |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1183 | // the last aes_read had not enough read buffer space |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1184 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1185 | // in case we have a tmp buf, we just return this |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1186 | size_t tmp_diff = enc->tmplen - enc->tmpoff; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1187 | size_t cp_len = tmp_diff > len ? len : tmp_diff; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1188 | memcpy(buf, enc->tmp + enc->tmpoff, cp_len); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1189 | enc->tmpoff += cp_len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1190 | if(enc->tmpoff >= enc->tmplen) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1191 | free(enc->tmp); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1192 | enc->tmp = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1193 | enc->tmplen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1194 | enc->tmpoff = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1195 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1196 | return cp_len / s; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1197 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1198 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1199 | if(enc->ivlen < 16) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1200 | size_t copy_iv_len = 16 - enc->ivlen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1201 | copy_iv_len = len > copy_iv_len ? copy_iv_len : len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1202 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1203 | memcpy(buf, enc->iv, copy_iv_len); |
789
378b5ab86f77
add new build system for windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
1204 | (char*)buf += copy_iv_len; |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1205 | len -= copy_iv_len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1206 | nread = copy_iv_len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1207 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1208 | enc->ivlen += copy_iv_len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1209 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1210 | if(len == 0) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1211 | return copy_iv_len / s; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1212 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1213 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1214 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1215 | if(enc->end) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1216 | return 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1217 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1218 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1219 | size_t remaining = len % 16; |
690
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1220 | len -= remaining; |
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1221 | |
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1222 | if(len > 256) { |
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1223 | len -= 16; // optimization for avoiding tmp buffer usage |
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1224 | } |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1225 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1226 | size_t inalloc = len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1227 | ULONG inlen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1228 | unsigned char *in = malloc(inalloc); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1229 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1230 | // fill the input buffer |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1231 | while(inlen < inalloc) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1232 | size_t r = enc->read(in + inlen, 1, inalloc - inlen, enc->stream); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1233 | if(r == 0) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1234 | enc->end = 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1235 | break; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1236 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1237 | inlen += r; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1238 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1239 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1240 | if(inlen == 0) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1241 | return nread / s; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1242 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1243 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1244 | // hash read data |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1245 | BCryptHashData(enc->sha256.hHash, in, inlen, 0); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1246 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1247 | // create output buffer |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1248 | ULONG outalloc = inlen + 16; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1249 | ULONG outlen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1250 | char *out = malloc(outalloc); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1251 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1252 | // encrypt |
690
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1253 | int flags = 0; |
692
56b66fe2b4f5
fix dav-sync deltav versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
691
diff
changeset
|
1254 | if(inlen % 16 != 0) { |
691
48ec0ab17011
fix encryption of files with specific length
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
690
diff
changeset
|
1255 | enc->end = 1; |
48ec0ab17011
fix encryption of files with specific length
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
690
diff
changeset
|
1256 | } |
48ec0ab17011
fix encryption of files with specific length
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
690
diff
changeset
|
1257 | if(enc->end) { |
690
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1258 | flags = BCRYPT_BLOCK_PADDING; |
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1259 | } |
ce253cfb9127
fix aes encrypter stream (cng)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
689
diff
changeset
|
1260 | if(BCryptEncrypt(enc->ctx.hKey, in, inlen, NULL, enc->ctx.pbIV, 16, out, outalloc, &outlen, flags)) { |
688
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1261 | fprintf(stderr, "Error: BCryptEncrypt failed\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1262 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1263 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1264 | // check if the output fits in buf, if not, save the remaining bytes in tmp |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1265 | if(outlen > len) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1266 | size_t tmplen = outlen - len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1267 | char *tmp = malloc(tmplen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1268 | memcpy(tmp, out+len, tmplen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1269 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1270 | enc->tmp = tmp; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1271 | enc->tmplen = tmplen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1272 | enc->tmpoff = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1273 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1274 | outlen = len; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1275 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1276 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1277 | // fill read buffer and return |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1278 | memcpy(buf, out, outlen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1279 | nread += outlen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1280 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1281 | free(in); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1282 | free(out); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1283 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1284 | return nread / s; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1285 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1286 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1287 | void aes_encrypter_close(AESEncrypter *enc) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1288 | enc->end = 1; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1289 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1290 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1291 | int aes_encrypter_reset(AESEncrypter *enc, curl_off_t offset, int origin) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1292 | if(origin != SEEK_SET || offset != 0 || !enc->seek) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1293 | return CURL_SEEKFUNC_CANTSEEK; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1294 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1295 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1296 | enc->ivlen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1297 | memcpy(enc->ctx.pbIV, enc->iv, 16); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1298 | if(enc->seek(enc->stream, 0, SEEK_SET) != 0) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1299 | return CURL_SEEKFUNC_FAIL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1300 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1301 | return CURL_SEEKFUNC_OK; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1302 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1303 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1304 | char* aes_encrypt(const char *in, size_t len, DavKey *key) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1305 | // create random IV |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1306 | char iv[16]; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1307 | if(dav_rand_bytes(iv, 16)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1308 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1309 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1310 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1311 | // initialize bcrypt stuff |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1312 | BCRYPT_ALG_HANDLE hAlg = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1313 | BCRYPT_KEY_HANDLE hKey = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1314 | void *pbKeyObject = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1315 | if(cng_init_key(&hAlg, &hKey, &pbKeyObject, key)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1316 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1317 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1318 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1319 | // create output buffer |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1320 | ULONG outlen = len + 128; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1321 | char *out = malloc(outlen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1322 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1323 | // the output must start with the IV |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1324 | memcpy(out, iv, 16); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1325 | char *encbuf = out + 16; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1326 | ULONG enclen = outlen - 16; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1327 | ULONG encoutlen = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1328 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1329 | // encrypt |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1330 | if(BCryptEncrypt(hKey, (PUCHAR)in, len, NULL, (PUCHAR)iv, 16, encbuf, enclen, &encoutlen, BCRYPT_BLOCK_PADDING)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1331 | fprintf(stderr, "Error: BCryptEncrypt failed\n"); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1332 | cng_cleanup(hAlg, hKey, NULL, pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1333 | free(out); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1334 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1335 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1336 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1337 | outlen = encoutlen + 16; // length of encrypted data + 16 bytes IV |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1338 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1339 | // base64 encode |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1340 | char *outstr = util_base64encode(out, outlen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1341 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1342 | cng_cleanup(hAlg, hKey, NULL, pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1343 | free(out); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1344 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1345 | return outstr; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1346 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1347 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1348 | char* aes_decrypt(const char *in, size_t *len, DavKey *key) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1349 | BCRYPT_ALG_HANDLE hAlg = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1350 | BCRYPT_KEY_HANDLE hKey = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1351 | void *pbKeyObject = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1352 | if(cng_init_key(&hAlg, &hKey, &pbKeyObject, key)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1353 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1354 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1355 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1356 | int inlen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1357 | unsigned char *buf = (unsigned char*)util_base64decode_len(in, &inlen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1358 | if(inlen < 16 || !buf) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1359 | cng_cleanup(hAlg, hKey, NULL, pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1360 | if(buf) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1361 | free(buf); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1362 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1363 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1364 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1365 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1366 | // encrypted data starts with IV |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1367 | char iv[16]; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1368 | memcpy(iv, buf, 16); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1369 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1370 | // decrypt data |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1371 | char *data = buf + 16; // encrypted data starts after IV |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1372 | size_t datalen = inlen - 16; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1373 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1374 | // create output buffer |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1375 | ULONG outlen = inlen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1376 | char *out = malloc(outlen + 1); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1377 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1378 | // decrypt |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1379 | if(BCryptDecrypt(hKey, data, datalen, NULL, iv, 16, out, outlen, &outlen, BCRYPT_BLOCK_PADDING)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1380 | cng_cleanup(hAlg, hKey, NULL, pbKeyObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1381 | free(out); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1382 | free(buf); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1383 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1384 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1385 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1386 | // decrypt finished, return |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1387 | out[outlen] = 0; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1388 | *len = (size_t)outlen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1389 | return out; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1390 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1391 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1392 | void dav_get_hash(DAV_SHA_CTX *sha256, unsigned char *buf) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1393 | BCryptFinishHash(sha256->hHash, buf, DAV_SHA256_DIGEST_LENGTH, 0); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1394 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1395 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1396 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1397 | char* dav_create_hash(const char *data, size_t len) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1398 | unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1399 | DAV_SHA_CTX *ctx = dav_hash_init(); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1400 | if(ctx) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1401 | dav_hash_update(ctx, data, len); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1402 | dav_hash_final(ctx, hash); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1403 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1404 | return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1405 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1406 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1407 | DAV_SHA_CTX* dav_hash_init(void) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1408 | DAV_SHA_CTX *ctx = malloc(sizeof(DAV_SHA_CTX)); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1409 | if(!ctx) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1410 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1411 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1412 | if(cng_hash_init(ctx)) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1413 | free(ctx); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1414 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1415 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1416 | return ctx; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1417 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1418 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1419 | void dav_hash_update(DAV_SHA_CTX *ctx, const char *data, size_t len) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1420 | BCryptHashData(ctx->hHash, (PUCHAR)data, len, 0); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1421 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1422 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1423 | void dav_hash_final(DAV_SHA_CTX *ctx, unsigned char *buf) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1424 | BCryptFinishHash(ctx->hHash, (PUCHAR)buf, DAV_SHA256_DIGEST_LENGTH, 0); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1425 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1426 | // cleanup |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1427 | cng_cleanup(ctx->hAlg, NULL, ctx->hHash, ctx->pbHashObject); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1428 | free(ctx); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1429 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1430 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1431 | DavKey* dav_pw2key(const char *password, const unsigned char *salt, int saltlen, int pwfunc, int enc) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1432 | if(!password) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1433 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1434 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1435 | size_t len = strlen(password); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1436 | if(len == 0) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1437 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1438 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1439 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1440 | // setup key data and length |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1441 | unsigned char keydata[128]; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1442 | int keylen = 32; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1443 | switch(enc) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1444 | case DAV_KEY_AES128: keylen = 16; break; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1445 | case DAV_KEY_AES256: keylen = 32; break; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1446 | default: return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1447 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1448 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1449 | LPCWSTR algid; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1450 | switch(pwfunc) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1451 | case DAV_PWFUNC_PBKDF2_SHA256: algid = BCRYPT_SHA256_ALGORITHM; break; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1452 | case DAV_PWFUNC_PBKDF2_SHA512: algid = BCRYPT_SHA512_ALGORITHM; break; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1453 | default: return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1454 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1455 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1456 | // open algorithm provider |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1457 | BCRYPT_ALG_HANDLE hAlg; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1458 | ULONG status = BCryptOpenAlgorithmProvider(&hAlg, algid, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1459 | if(status > 0) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1460 | fprintf(stderr, "Error: dav_pw2key: BCryptOpenAlgorithmProvider failed: 0x%X\n", (unsigned int)status); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1461 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1462 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1463 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1464 | // derive key |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1465 | status = BCryptDeriveKeyPBKDF2( |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1466 | hAlg, |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1467 | (PUCHAR)password, |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1468 | len, |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1469 | (PUCHAR)salt, |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1470 | saltlen, |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1471 | DAV_CRYPTO_ITERATION_COUNT, |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1472 | keydata, |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1473 | 128, |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1474 | 0); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1475 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1476 | BCryptCloseAlgorithmProvider(hAlg,0); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1477 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1478 | if(status) { |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1479 | fprintf(stderr, "Error: dav_pw2key: BCryptDeriveKeyPBKDF2 failed: 0x%X\n", (unsigned int)status); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1480 | return NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1481 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1482 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1483 | // create DavKey with generated data |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1484 | DavKey *key = malloc(sizeof(DavKey)); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1485 | key->data = malloc(keylen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1486 | key->length = keylen; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1487 | key->name = NULL; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1488 | key->type = enc; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1489 | memcpy(key->data, keydata, keylen); |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1490 | return key; |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1491 | } |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1492 | #endif |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1493 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1494 | |
d405d2ac78e6
replace openssl on windows with cng/bcrypt
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
625
diff
changeset
|
1495 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1496 | CxBuffer* aes_encrypt_buffer(CxBuffer *in, DavKey *key) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1497 | CxBuffer *encbuf = cxBufferCreate(NULL, in->size, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1498 | if(!encbuf) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1499 | return NULL; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1500 | } |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1501 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1502 | AESEncrypter *enc = aes_encrypter_new( |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1503 | key, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1504 | in, |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1505 | (dav_read_func)cxBufferRead, |
478
baa63fef5c5c
fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
1506 | NULL); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1507 | if(!enc) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1508 | cxBufferFree(encbuf); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1509 | return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1510 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1511 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1512 | char buf[1024]; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1513 | size_t r; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1514 | while((r = aes_read(buf, 1, 1024, enc)) > 0) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1515 | cxBufferWrite(buf, 1, r, encbuf); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1516 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1517 | aes_encrypter_close(enc); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1518 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1519 | encbuf->pos = 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1520 | return encbuf; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1521 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1522 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1523 | CxBuffer* aes_decrypt_buffer(CxBuffer *in, DavKey *key) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1524 | CxBuffer *decbuf = cxBufferCreate(NULL, in->size, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1525 | if(!decbuf) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1526 | return NULL; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1527 | } |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1528 | AESDecrypter *dec = aes_decrypter_new( |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1529 | key, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1530 | decbuf, |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1531 | (dav_write_func)cxBufferWrite); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1532 | if(!dec) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1533 | cxBufferFree(decbuf); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1534 | return NULL; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
728
diff
changeset
|
1535 | } |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1536 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1537 | aes_write(in->space, 1, in->size, dec); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1538 | aes_decrypter_shutdown(dec); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1539 | aes_decrypter_close(dec); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1540 | decbuf->pos = 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1541 | return decbuf; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
462
diff
changeset
|
1542 | } |