Sat, 22 Jun 2019 16:36:52 +0200
move some properties to new namespace
for properties encryption we need to decide which props must be encrypted and the plan is, to decide by namespace
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
4 | * Copyright 2018 Olaf Wintermann. All rights reserved. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
6bf798ad3aec
adds encrypted password store
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 |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include <stdio.h> |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include <stdlib.h> |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | #include <netinet/in.h> |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
33 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
34 | #include "pwd.h" |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
35 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
36 | #include <ucx/buffer.h> |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
37 | #include <ucx/utils.h> |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
39 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | PwdStore* pwdstore_open(const char *file) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
42 | FILE *in = fopen(file, "r"); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
43 | if(!in) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | UcxBuffer *buf = ucx_buffer_new(NULL, 2048, UCX_BUFFER_AUTOEXTEND); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | ucx_stream_copy(in, buf, (read_func)fread, (write_func)ucx_buffer_write); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | fclose(in); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | if(buf->size < PWDS_HEADER_SIZE || buf->space[0] != PWDS_MAGIC_CHAR) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | ucx_buffer_free(buf); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | PwdStore *p = malloc(sizeof(PwdStore)); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
57 | p->ids = ucx_map_new(16); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
58 | p->locations = NULL; |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
59 | p->noloc = NULL; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
60 | p->index = ucx_map_new(16); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | p->content = buf; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | p->key = NULL; |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
63 | p->encoffset = PWDS_HEADER_SIZE; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
64 | p->isdecrypted = 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
65 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
66 | if(pwdstore_getindex(p)) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
67 | pwdstore_free(p); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
68 | return NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
69 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
70 | |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | return p; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | PwdStore* pwdstore_new(void) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | PwdStore *p = calloc(1, sizeof(PwdStore)); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
76 | p->ids = ucx_map_new(16); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
77 | p->locations = NULL; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
78 | p->noloc = NULL; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
79 | p->index = ucx_map_new(16); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
80 | p->content = ucx_buffer_new(NULL, PWDS_HEADER_SIZE, UCX_BUFFER_AUTOEXTEND); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | PWDS_MAGIC(p) = PWDS_MAGIC_CHAR; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | PWDS_VERSION(p) = 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | PWDS_ENC(p) = DAV_KEY_AES256; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | PWDS_PWFUNC(p) = DAV_PWFUNC_PBKDF2_SHA256; |
488
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
474
diff
changeset
|
85 | dav_rand_bytes((unsigned char*)p->content->space+4, 16); |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
86 | p->isdecrypted = 1; |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
87 | p->encoffset = PWDS_HEADER_SIZE; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | return p; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
91 | static int readval(UcxBuffer *in, char **val, int allowzero) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
92 | *val = NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
93 | uint32_t length = 0; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
94 | if(ucx_buffer_read(&length, 1, sizeof(uint32_t), in) != sizeof(uint32_t)) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
95 | return 0; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
96 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
97 | length = ntohl(length); |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
98 | if(length == 0) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
99 | if(allowzero) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
100 | return 1; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
101 | } else { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
102 | return 0; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
103 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
104 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
105 | if(length > PWDSTORE_MAX_LEN) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
106 | return 0; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
107 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
108 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
109 | char *value = malloc(length + 1); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
110 | value[length] = 0; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
111 | if(ucx_buffer_read(value, 1, length, in) != length) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
112 | free(value); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
113 | return 0; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
114 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
115 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
116 | *val = value; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
117 | return 1; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
118 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
119 | |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
120 | static int read_indexentry(PwdStore *p, UcxBuffer *in) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
121 | int type = ucx_buffer_getc(in); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
122 | if(type == EOF || type != 0) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
123 | // only type 0 supported yet |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
124 | return 0; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
125 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
126 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
127 | char *id = NULL; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
128 | UcxList *locations = NULL; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
129 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
130 | int ret = 0; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
131 | if(readval(in, &id, FALSE)) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
132 | ret = 1; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
133 | char *location = NULL; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
134 | while((ret = readval(in, &location, TRUE)) == 1) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
135 | if(!location) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
136 | break; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
137 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
138 | locations = ucx_list_append(locations, location); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
139 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
140 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
141 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
142 | if(ret) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
143 | pwdstore_put_index(p, id, locations); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
144 | } else { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
145 | if(id) free(id); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
146 | ucx_list_free_content(locations, free); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
147 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
148 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
149 | return ret; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
150 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
151 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
152 | static int read_pwdentry(PwdStore *p, UcxBuffer *in) { |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | int type = ucx_buffer_getc(in); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
154 | if(type == EOF || type != 0) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
155 | // only type 0 supported yet |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
156 | return 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
157 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
158 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
159 | char *id = NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
160 | char *location = NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
161 | char *user = NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
162 | char *password = NULL; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
163 | |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
164 | int ret = 0; |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
165 | if(readval(in, &id, FALSE)) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
166 | if(readval(in, &user, FALSE)) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
167 | if(readval(in, &password, FALSE)) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
168 | pwdstore_put(p, id, user, password); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
169 | ret = 1; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
170 | } |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
171 | } |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
172 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
173 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
174 | if(id) free(id); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
175 | if(location) free(location); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
176 | if(user) free(user); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
177 | if(password) free(password); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
178 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
179 | return ret; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
180 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
181 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
182 | int pwdstore_getindex(PwdStore *s) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
183 | uint32_t netindexlen; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
184 | s->content->pos = PWDS_HEADER_SIZE - sizeof(uint32_t); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
185 | if(ucx_buffer_read(&netindexlen, 1, sizeof(uint32_t), s->content) != sizeof(uint32_t)) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
186 | return 1; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
187 | } |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
188 | uint32_t indexlen = ntohl(netindexlen); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
189 | if(UINT32_MAX - PWDS_HEADER_SIZE < indexlen) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
190 | return 1; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
191 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
192 | if(s->content->size < PWDS_HEADER_SIZE + indexlen) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
193 | return 1; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
194 | } |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
195 | s->encoffset += indexlen; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
196 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
197 | UcxBuffer *index = ucx_buffer_new(s->content->space+PWDS_HEADER_SIZE, indexlen, 0); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
198 | index->size = indexlen; |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
199 | while(read_indexentry(s, index)) {} |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
200 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
201 | ucx_buffer_free(index); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
202 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
203 | return 0; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
204 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
205 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
206 | int pwdstore_decrypt(PwdStore *p) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
207 | if(!p->key) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
208 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
209 | } |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
210 | if(p->isdecrypted) { |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
211 | return 0; |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
212 | } |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
213 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
214 | // decrypt contet |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
215 | size_t encsz = p->content->size - p->encoffset; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
216 | UcxBuffer *enc = ucx_buffer_new(p->content->space + p->encoffset, encsz, 0); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
217 | enc->size = encsz; |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
218 | enc->size = p->content->size - p->encoffset; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
219 | UcxBuffer *content = aes_decrypt_buffer(enc, p->key); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
220 | ucx_buffer_free(enc); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
221 | if(!content) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
222 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
223 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
224 | |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
225 | while(read_pwdentry(p, content)) {} |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
226 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
227 | ucx_buffer_free(content); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
228 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
229 | return 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
230 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
231 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
232 | int pwdstore_setpassword(PwdStore *p, const char *password) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
233 | DavKey *key = dav_pw2key( |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
234 | password, |
515
2465dd550bb5
fixes signedness of salt in dav_pw2key()
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
235 | (unsigned char*)(p->content->space + 4), |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
236 | 16, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
237 | PWDS_PWFUNC(p), |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
238 | PWDS_ENC(p)); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
239 | if(!key) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
240 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
241 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
242 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
243 | p->key = key; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
244 | return 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
245 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
246 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
247 | void pwdstore_encsettings(PwdStore *p, uint8_t enc, uint8_t pwfunc) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
248 | PWDS_ENC(p) = enc; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
249 | PWDS_PWFUNC(p) = pwfunc; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
250 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
251 | |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
252 | void pwdstore_free_entry(PwdEntry *e) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
253 | if(e->id) free(e->id); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
254 | if(e->user) free(e->user); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
255 | if(e->password) free(e->password); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
256 | free(e); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
257 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
258 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
259 | void pwdstore_free(PwdStore* p) { |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
260 | ucx_map_free_content(p->ids, (ucx_destructor)pwdstore_free_entry); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
261 | ucx_map_free(p->ids); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
262 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
263 | ucx_list_free(p->locations); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
264 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
265 | if(p->content) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
266 | ucx_buffer_free(p->content); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
267 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
268 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
269 | free(p); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
270 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
271 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
272 | int pwdstore_has_id(PwdStore *s, const char *id) { |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
273 | return ucx_map_cstr_get(s->index, id) ? 1 : 0; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
274 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
275 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
276 | PwdEntry* pwdstore_get(PwdStore *p, const char *id) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
277 | PwdEntry *e = ucx_map_cstr_get(p->ids, id); |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
278 | if(e && e->user && e->password) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
279 | return e; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
280 | } else { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
281 | return NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
282 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
283 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
284 | |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
285 | void pwdstore_put(PwdStore *p, const char *id, const char *username, const char *password) { |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
286 | PwdEntry *entry = malloc(sizeof(PwdEntry)); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
287 | entry->id = strdup(id); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
288 | entry->user = strdup(username); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
289 | entry->password = strdup(password); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
290 | ucx_map_cstr_put(p->ids, id, entry); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
291 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
292 | |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
293 | void pwdstore_put_index(PwdStore *p, char *id, UcxList *locations) { |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
294 | PwdIndexEntry *e = ucx_map_cstr_get(p->index, id); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
295 | if(e) { |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
296 | return; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
297 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
298 | PwdIndexEntry *newentry = malloc(sizeof(PwdIndexEntry)); |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
299 | newentry->id = id; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
300 | if(locations) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
301 | newentry->locations = locations; |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
302 | p->locations = ucx_list_append(p->locations, newentry); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
303 | } else { |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
304 | newentry->locations = NULL; |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
305 | p->noloc = ucx_list_append(p->noloc, newentry); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
306 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
307 | ucx_map_cstr_put(p->index, id, newentry); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
308 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
309 | |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
310 | void write_index_entry(UcxBuffer *out, PwdIndexEntry *e) { |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
311 | uint32_t idlen = strlen(e->id); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
312 | uint32_t netidlen = htonl(idlen); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
313 | |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
314 | ucx_buffer_putc(out, 0); // type |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
315 | |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
316 | ucx_buffer_write(&netidlen, 1, sizeof(uint32_t), out); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
317 | ucx_buffer_write(e->id, 1, idlen, out); |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
318 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
319 | UCX_FOREACH(elm, e->locations) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
320 | char *location = elm->data; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
321 | uint32_t locationlen = strlen(location); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
322 | uint32_t netlocationlen = htonl(locationlen); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
323 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
324 | ucx_buffer_write(&netlocationlen, 1, sizeof(uint32_t), out); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
325 | ucx_buffer_write(location, 1, locationlen, out); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
326 | } |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
327 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
328 | uint32_t terminate = 0; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
329 | ucx_buffer_write(&terminate, 1, sizeof(uint32_t), out); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
330 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
331 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
332 | int pwdstore_store(PwdStore *p, const char *file) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
333 | if(!p->key) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
334 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
335 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
336 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
337 | UcxBuffer *index = ucx_buffer_new(NULL, 2048, UCX_BUFFER_AUTOEXTEND); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
338 | UcxBuffer *content = ucx_buffer_new(NULL, 2048, UCX_BUFFER_AUTOEXTEND); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
339 | |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
340 | // create index |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
341 | UCX_FOREACH(elm, p->noloc) { |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
342 | PwdIndexEntry *e = elm->data; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
343 | write_index_entry(index, e); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
344 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
345 | UCX_FOREACH(elm, p->locations) { |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
346 | PwdIndexEntry *e = elm->data; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
347 | write_index_entry(index, e); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
348 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
349 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
350 | UcxMapIterator i = ucx_map_iterator(p->ids); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
351 | PwdEntry *value; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
352 | UCX_MAP_FOREACH(key, value, i) { |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
353 | if(!value->id || !value->user || !value->password) { |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
354 | continue; |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
355 | } |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
356 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
357 | uint32_t idlen = strlen(value->id); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
358 | uint32_t ulen = strlen(value->user); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
359 | uint32_t plen = strlen(value->password); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
360 | uint32_t netidlen = htonl(idlen); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
361 | uint32_t netulen = htonl(ulen); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
362 | uint32_t netplen = htonl(plen); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
363 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
364 | // content buffer |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
365 | ucx_buffer_putc(content, 0); // type |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
366 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
367 | ucx_buffer_write(&netidlen, 1, sizeof(uint32_t), content); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
368 | ucx_buffer_write(value->id, 1, idlen, content); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
369 | ucx_buffer_write(&netulen, 1, sizeof(uint32_t), content); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
370 | ucx_buffer_write(value->user, 1, ulen, content); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
371 | ucx_buffer_write(&netplen, 1, sizeof(uint32_t), content); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
372 | ucx_buffer_write(value->password, 1, plen, content); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
373 | } |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
374 | |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
375 | content->pos = 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
376 | UcxBuffer *enc = aes_encrypt_buffer(content, p->key); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
377 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
378 | p->content->pos = PWDS_HEADER_SIZE - sizeof(uint32_t); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
379 | p->content->size = PWDS_HEADER_SIZE; |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
380 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
381 | // add index after header |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
382 | uint32_t netindexlen = htonl((uint32_t)index->size); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
383 | ucx_buffer_write(&netindexlen, 1, sizeof(uint32_t), p->content); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
384 | ucx_buffer_write(index->space, 1, index->size, p->content); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
385 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
386 | // add encrypted buffer |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
387 | ucx_buffer_write(enc->space, 1, enc->size, p->content); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
388 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
389 | ucx_buffer_free(enc); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
390 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
391 | FILE *out = fopen(file, "w"); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
392 | if(!out) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
393 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
394 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
395 | fwrite(p->content->space, 1, p->content->size, out); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
396 | fclose(out); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
397 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
398 | return 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
399 | } |