annotate src/plugins/var-expand-crypt/var-expand-crypt-plugin.c @ 22656:1789bf2a1e01

director: Make sure HOST-RESET-USERS isn't used with max_moving_users=0 The reset command would just hang in that case. doveadm would never have sent this, so this is just an extra sanity check.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sun, 05 Nov 2017 23:51:56 +0200
parents a5de42736743
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1 /* Copyright (c) 2003-2016 Dovecot authors, see the included COPYING file */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
2
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
3 #include "lib.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
4 #include "array.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
5 #include "hex-binary.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
6 #include "base64.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
7 #include "str.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
8 #include "strescape.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
9 #include "var-expand.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
10 #include "var-expand-private.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
11 #include "dcrypt.h"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
12
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
13 #define VAR_EXPAND_CRYPT_DEFAULT_ALGO "AES-256-CBC"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
14
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
15 struct module;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
16
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
17 enum crypt_field_format {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
18 FORMAT_HEX,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
19 FORMAT_BASE64
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
20 };
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
21
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
22 struct var_expand_crypt_context {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
23 struct var_expand_context *ctx;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
24 const char *algo;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
25 string_t *iv;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
26 string_t *enckey;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
27 enum crypt_field_format format;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
28 bool enc_result_only:1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
29 };
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
30
21866
f23b6f713a50 var-expand-crypt: Add error handling for initialization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21865
diff changeset
31 static bool var_expand_crypt_initialize(const char **error_r);
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
32
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
33 void var_expand_crypt_init(struct module *module);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
34 void var_expand_crypt_deinit(void);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
35 void auth_var_expand_crypt_init(struct module *module);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
36 void auth_var_expand_crypt_deinit(void);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
37
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
38 static bool has_been_init;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
39
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
40 static int
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
41 var_expand_crypt_settings(struct var_expand_crypt_context *ctx,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
42 const char *const *args, const char **error_r)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
43 {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
44 while(args != NULL && *args != NULL) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
45 const char *k = t_strcut(*args, '=');
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
46 const char *value = strchr(*args, '=');
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
47 if (value == NULL) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
48 args++;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
49 continue;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
50 } else {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
51 value++;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
52 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
53
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
54 if (strcmp(k, "iv") == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
55 str_truncate(ctx->iv, 0);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
56 var_expand_with_funcs(ctx->iv, value, ctx->ctx->table,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
57 ctx->ctx->func_table,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
58 ctx->ctx->context);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
59 const char *hexiv = t_strdup(str_c(ctx->iv));
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
60 /* try to decode IV */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
61 str_truncate(ctx->iv, 0);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
62 hex_to_binary(hexiv, ctx->iv);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
63 if (str_len(ctx->iv) == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
64 *error_r = "iv is not valid hex encoded value";
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
65 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
66 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
67 } if (strcmp(k, "noiv") == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
68 ctx->enc_result_only = strcasecmp(value, "yes")==0;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
69 } if (strcmp(k, "algo") == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
70 ctx->algo = value;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
71 } else if (strcmp(k, "key") == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
72 str_truncate(ctx->enckey, 0);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
73 var_expand_with_funcs(ctx->enckey, value,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
74 ctx->ctx->table,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
75 ctx->ctx->func_table,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
76 ctx->ctx->context);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
77 const char *hexkey = t_strdup(str_c(ctx->enckey));
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
78 str_truncate(ctx->enckey, 0);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
79 hex_to_binary(hexkey, ctx->enckey);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
80 if (str_len(ctx->enckey) == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
81 *error_r = "key is not valid hex encoded value";
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
82 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
83 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
84 } else if (strcmp(k, "format") == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
85 if (strcmp(value, "hex") == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
86 ctx->format = FORMAT_HEX;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
87 } else if (strcmp(value, "base64") == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
88 ctx->format = FORMAT_BASE64;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
89 } else {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
90 *error_r = t_strdup_printf(
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
91 "Cannot parse hash arguments:"
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
92 "'%s' is not supported format",
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
93 value);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
94 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
95 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
96 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
97 args++;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
98 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
99
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
100 if (ctx->algo == NULL) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
101 ctx->algo = "AES-256-CBC";
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
102 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
103
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
104 return 0;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
105 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
106
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
107 static int
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
108 var_expand_crypt(struct dcrypt_context_symmetric *dctx, buffer_t *key, buffer_t *iv,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
109 const buffer_t *input, buffer_t *output, const char **error_r)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
110 {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
111 /* make sure IV is correct */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
112 if (iv->used == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
113 dcrypt_ctx_sym_set_key_iv_random(dctx);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
114 /* acquire IV */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
115 dcrypt_ctx_sym_get_iv(dctx, iv);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
116 } else if (dcrypt_ctx_sym_get_iv_length(dctx) != iv->used) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
117 *error_r = t_strdup_printf("crypt: IV length invalid (%"PRIuSIZE_T" != %u)",
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
118 iv->used,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
119 dcrypt_ctx_sym_get_iv_length(dctx));
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
120 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
121 } else {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
122 dcrypt_ctx_sym_set_iv(dctx, iv->data, iv->used);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
123 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
124
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
125 if (dcrypt_ctx_sym_get_key_length(dctx) != key->used) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
126 *error_r = t_strdup_printf("crypt: Key length invalid (%"PRIuSIZE_T" != %u)",
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
127 key->used,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
128 dcrypt_ctx_sym_get_key_length(dctx));
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
129 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
130 } else {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
131 dcrypt_ctx_sym_set_key(dctx, key->data, key->used);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
132 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
133
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
134 if (!dcrypt_ctx_sym_init(dctx, error_r) ||
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
135 !dcrypt_ctx_sym_update(dctx, input->data,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
136 input->used, output, error_r) ||
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
137 !dcrypt_ctx_sym_final(dctx, output, error_r))
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
138 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
139 return 0;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
140 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
141
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
142 static int
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
143 var_expand_encrypt(struct var_expand_context *_ctx,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
144 const char *key, const char *field,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
145 const char **result_r, const char **error_r)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
146 {
21866
f23b6f713a50 var-expand-crypt: Add error handling for initialization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21865
diff changeset
147 if (!has_been_init && !var_expand_crypt_initialize(error_r))
f23b6f713a50 var-expand-crypt: Add error handling for initialization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21865
diff changeset
148 return -1;
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
149
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
150 const char *p = strchr(key, ';');
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
151 const char *const *args = NULL;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
152 const char *value;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
153 struct var_expand_crypt_context ctx;
21862
026af538e3dd var-expand-crypt: Fix base64 encoding
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21861
diff changeset
154 string_t *dest;
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
155 int ret = 0;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
156
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
157 memset(&ctx, 0, sizeof(ctx));
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
158 ctx.ctx = _ctx;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
159 ctx.format = FORMAT_HEX;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
160
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
161 if (p != NULL) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
162 args = t_strsplit(p+1, ",");
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
163 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
164
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
165 string_t *field_value = t_str_new(64);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
166 ctx.iv = t_str_new(64);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
167 ctx.enckey = t_str_new(64);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
168 string_t *tmp = t_str_new(128);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
169
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
170 if ((ret = var_expand_long(_ctx, field, strlen(field),
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
171 &value, error_r)) < 1) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
172 return ret;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
173 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
174
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
175 if (*value == '\0') {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
176 *result_r = value;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
177 return ret;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
178 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
179
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
180 if (var_expand_crypt_settings(&ctx, args, error_r) < 0)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
181 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
182
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
183 str_append(field_value, value);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
184
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
185 struct dcrypt_context_symmetric *dctx;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
186 if (!dcrypt_ctx_sym_create(ctx.algo, DCRYPT_MODE_ENCRYPT, &dctx, error_r))
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
187 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
188
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
189 ret = var_expand_crypt(dctx, ctx.enckey, ctx.iv, field_value, tmp, error_r);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
190 dcrypt_ctx_sym_destroy(&dctx);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
191
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
192 if (ret == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
193 /* makes compiler happy */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
194 const char *enciv = "";
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
195 const char *res = "";
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
196
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
197 switch(ctx.format) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
198 case FORMAT_HEX:
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
199 enciv = binary_to_hex(ctx.iv->data, ctx.iv->used);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
200 res = binary_to_hex(tmp->data, tmp->used);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
201 break;
21862
026af538e3dd var-expand-crypt: Fix base64 encoding
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21861
diff changeset
202 case FORMAT_BASE64:
026af538e3dd var-expand-crypt: Fix base64 encoding
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21861
diff changeset
203 dest = t_str_new(32);
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
204 base64_encode(ctx.iv->data, ctx.iv->used, dest);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
205 enciv = str_c(dest);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
206 dest = t_str_new(32);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
207 base64_encode(tmp->data, tmp->used, dest);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
208 res = str_c(dest);
21862
026af538e3dd var-expand-crypt: Fix base64 encoding
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21861
diff changeset
209 break;
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
210 default:
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
211 i_unreached();
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
212 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
213 if (ctx.enc_result_only)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
214 *result_r = t_strdup(res);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
215 else
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
216 *result_r = t_strdup_printf("%s$%s$", enciv, res);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
217 ret = 1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
218 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
219
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
220 return ret;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
221 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
222
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
223 static int
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
224 var_expand_decrypt(struct var_expand_context *_ctx,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
225 const char *key, const char *field,
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
226 const char **result_r, const char **error_r)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
227 {
21866
f23b6f713a50 var-expand-crypt: Add error handling for initialization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21865
diff changeset
228 if (!has_been_init && !var_expand_crypt_initialize(error_r))
f23b6f713a50 var-expand-crypt: Add error handling for initialization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21865
diff changeset
229 return -1;
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
230
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
231 const char *p = strchr(key, ';');
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
232 const char *const *args = NULL;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
233 const char *value;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
234 struct var_expand_crypt_context ctx;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
235 int ret = 0;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
236
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
237 memset(&ctx, 0, sizeof(ctx));
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
238 ctx.ctx = _ctx;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
239 ctx.format = FORMAT_HEX;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
240
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
241 if (p != NULL) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
242 args = t_strsplit(p+1, ",");
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
243 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
244
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
245 string_t *field_value = t_str_new(64);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
246 ctx.iv = t_str_new(64);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
247 ctx.enckey = t_str_new(64);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
248 string_t *tmp = t_str_new(128);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
249
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
250 if ((ret = var_expand_long(_ctx, field, strlen(field),
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
251 &value, error_r)) < 1) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
252 return ret;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
253 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
254
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
255 if (*value == '\0') {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
256 *result_r = value;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
257 return ret;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
258 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
259
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
260 if (var_expand_crypt_settings(&ctx, args, error_r) < 0)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
261 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
262
21867
a5de42736743 var-expand-crypt: Fix data decryption
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21866
diff changeset
263 const char *encdata = value;
a5de42736743 var-expand-crypt: Fix data decryption
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21866
diff changeset
264 const char *enciv = "";
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
265
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
266 /* make sure IV is correct */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
267 if (ctx.iv->used == 0 && (p = strchr(encdata, '$')) != NULL) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
268 /* see if IV can be taken from data */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
269 enciv = t_strcut(encdata, '$');
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
270 encdata = t_strcut(p+1,'$');
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
271 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
272
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
273 str_truncate(field_value, 0);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
274
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
275 /* try to decode iv and encdata */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
276 switch(ctx.format) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
277 case FORMAT_HEX:
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
278 if (ctx.iv->used == 0)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
279 hex_to_binary(enciv, ctx.iv);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
280 hex_to_binary(encdata, field_value);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
281 break;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
282 case FORMAT_BASE64:
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
283 if (ctx.iv->used == 0)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
284 str_append_str(ctx.iv, t_base64_decode_str(enciv));
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
285 str_append_str(field_value, t_base64_decode_str(encdata));
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
286 break;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
287 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
288
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
289 if (ctx.iv->used == 0) {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
290 *error_r = t_strdup_printf("decrypt: IV missing");
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
291 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
292 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
293
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
294 struct dcrypt_context_symmetric *dctx;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
295 if (!dcrypt_ctx_sym_create(ctx.algo, DCRYPT_MODE_DECRYPT, &dctx, error_r))
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
296 return -1;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
297 ret = var_expand_crypt(dctx, ctx.enckey, ctx.iv, field_value, tmp, error_r);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
298 dcrypt_ctx_sym_destroy(&dctx);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
299
21867
a5de42736743 var-expand-crypt: Fix data decryption
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21866
diff changeset
300 if (ret == 0) {
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
301 *result_r = str_c(tmp);
21867
a5de42736743 var-expand-crypt: Fix data decryption
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21866
diff changeset
302 ret = 1;
a5de42736743 var-expand-crypt: Fix data decryption
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21866
diff changeset
303 }
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
304
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
305 return ret;
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
306 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
307
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
308 static const struct var_expand_extension_func_table funcs[] = {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
309 { "encrypt", var_expand_encrypt },
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
310 { "decrypt", var_expand_decrypt },
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
311 { NULL, NULL, }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
312 };
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
313
21866
f23b6f713a50 var-expand-crypt: Add error handling for initialization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21865
diff changeset
314 static bool var_expand_crypt_initialize(const char **error_r)
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
315 {
21866
f23b6f713a50 var-expand-crypt: Add error handling for initialization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21865
diff changeset
316 return dcrypt_initialize(NULL, NULL, error_r);
21861
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
317 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
318
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
319 void var_expand_crypt_init(struct module *module ATTR_UNUSED)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
320 {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
321 var_expand_register_func_array(funcs);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
322 /* do not initialize dcrypt here - saves alot of memory
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
323 to not load openssl every time. Only load it if
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
324 needed */
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
325 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
326
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
327 void var_expand_crypt_deinit(void)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
328 {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
329 var_expand_unregister_func_array(funcs);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
330 if (has_been_init)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
331 dcrypt_deinitialize();
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
332 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
333
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
334 void auth_var_expand_crypt_init(struct module *module)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
335 {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
336 var_expand_crypt_init(module);
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
337 }
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
338
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
339 void auth_var_expand_crypt_deinit(void)
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
340 {
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
341 var_expand_crypt_deinit();
e57b7745e081 var-expand-crypt: Encryption/decryption support for var-expand
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
342 }