dav/pwd.c

Sat, 22 Jun 2019 16:36:52 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 22 Jun 2019 16:36:52 +0200
changeset 607
5dc7fe41e8f8
parent 515
2465dd550bb5
child 608
3e4c0285a868
permissions
-rw-r--r--

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 }

mercurial