OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Licensed Materials - Property of IBM | 3 * Licensed Materials - Property of IBM |
4 * | 4 * |
5 * trousers - An open source TCG Software Stack | 5 * trousers - An open source TCG Software Stack |
6 * | 6 * |
7 * (C) Copyright International Business Machines Corp. 2004-2006 | 7 * (C) Copyright International Business Machines Corp. 2004-2006 |
8 * | 8 * |
9 */ | 9 */ |
10 | 10 |
11 | 11 |
12 #include <stdio.h> | 12 #include <stdio.h> |
13 #include <stdlib.h> | 13 #include <stdlib.h> |
14 #include <string.h> | 14 #include <string.h> |
15 #include <unistd.h> | 15 #include <unistd.h> |
16 #include <errno.h> | 16 #include <errno.h> |
17 #include <pwd.h> | 17 #include <pwd.h> |
18 #include <sys/types.h> | 18 #include <sys/types.h> |
19 #include <sys/file.h> | 19 #include <sys/file.h> |
20 #include <sys/stat.h> | 20 #include <sys/stat.h> |
21 #include <assert.h> | 21 #include <assert.h> |
| 22 #include <fcntl.h> |
| 23 #include <limits.h> |
| 24 #include <netdb.h> |
| 25 #if defined (HAVE_BYTEORDER_H) |
| 26 #include <sys/byteorder.h> |
| 27 #elif defined(HAVE_ENDIAN_H) |
| 28 #include <endian.h> |
| 29 #define LE_16 htole16 |
| 30 #define LE_32 htole32 |
| 31 #define LE_64 htole64 |
| 32 #else |
| 33 #define LE_16(x) (x) |
| 34 #define LE_32(x) (x) |
| 35 #define LE_64(x) (x) |
| 36 #endif |
22 | 37 |
23 #include "trousers/tss.h" | 38 #include "trousers/tss.h" |
24 #include "trousers/trousers.h" | 39 #include "trousers/trousers.h" |
25 #include "trousers_types.h" | 40 #include "trousers_types.h" |
26 #include "tcs_tsp.h" | 41 #include "tcs_tsp.h" |
27 #include "spi_utils.h" | 42 #include "spi_utils.h" |
28 #include "tspps.h" | 43 #include "tspps.h" |
29 #include "tsplog.h" | 44 #include "tsplog.h" |
30 | 45 |
31 static int user_ps_fd = -1; | 46 static int user_ps_fd = -1; |
32 static MUTEX_DECLARE_INIT(user_ps_lock); | 47 static MUTEX_DECLARE_INIT(user_ps_lock); |
33 #if (defined (__FreeBSD__) || defined (__OpenBSD__)) | 48 #if (defined (__FreeBSD__) || defined (__OpenBSD__)) |
34 static MUTEX_DECLARE_INIT(user_ps_path); | 49 static MUTEX_DECLARE_INIT(user_ps_path); |
35 #endif | 50 #endif |
| 51 #if defined (SOLARIS) |
| 52 static struct flock fl = { |
| 53 0, |
| 54 0, |
| 55 0, |
| 56 0, |
| 57 0, |
| 58 0, |
| 59 {0, 0, 0, 0} |
| 60 }; |
| 61 #endif |
36 | 62 |
37 | 63 |
38 /* | 64 /* |
39 * Determine the default path to the persistent storage file and create it if it
doesn't exist. | 65 * Determine the default path to the persistent storage file and create it if it
doesn't exist. |
40 */ | 66 */ |
41 TSS_RESULT | 67 TSS_RESULT |
42 get_user_ps_path(char **file) | 68 get_user_ps_path(char **file) |
43 { | 69 { |
44 TSS_RESULT result; | 70 TSS_RESULT result; |
45 char *file_name = NULL, *home_dir = NULL; | 71 char *file_name = NULL, *home_dir = NULL; |
46 struct passwd *pwp; | 72 struct passwd *pwp; |
47 #if (defined (__linux) || defined (linux)) | 73 #if (defined (__linux) || defined (linux) || defined(__GLIBC__)) |
48 struct passwd pw; | 74 struct passwd pw; |
49 #endif | 75 #endif |
50 struct stat stat_buf; | 76 struct stat stat_buf; |
51 char buf[PASSWD_BUFSIZE]; | 77 char buf[PASSWD_BUFSIZE]; |
52 uid_t euid; | 78 uid_t euid; |
53 int rc; | 79 int rc; |
54 | 80 |
55 if ((file_name = getenv("TSS_USER_PS_FILE"))) { | 81 if ((file_name = getenv("TSS_USER_PS_FILE"))) { |
56 *file = strdup(file_name); | 82 *file = strdup(file_name); |
57 return (*file) ? TSS_SUCCESS : TSPERR(TSS_E_OUTOFMEMORY); | 83 return (*file) ? TSS_SUCCESS : TSPERR(TSS_E_OUTOFMEMORY); |
58 } | 84 } |
59 #if (defined (__FreeBSD__) || defined (__OpenBSD__)) | 85 #if (defined (__FreeBSD__) || defined (__OpenBSD__)) |
60 MUTEX_LOCK(user_ps_path); | 86 MUTEX_LOCK(user_ps_path); |
61 #endif | 87 #endif |
62 | 88 |
63 euid = geteuid(); | 89 euid = geteuid(); |
64 | 90 |
| 91 #if defined (SOLARIS) |
| 92 /* |
| 93 * Solaris keeps user PS in a local directory instead of |
| 94 * in the user's home directory, which may be shared |
| 95 * by multiple systems. |
| 96 * |
| 97 * The directory path on Solaris is /var/tpm/userps/[EUID]/ |
| 98 */ |
| 99 rc = snprintf(buf, sizeof (buf), "%s/%d", TSS_USER_PS_DIR, euid); |
| 100 #else |
65 setpwent(); | 101 setpwent(); |
66 while (1) { | 102 while (1) { |
67 #if (defined (__linux) || defined (linux)) | 103 #if (defined (__linux) || defined (linux) || defined(__GLIBC__)) |
68 rc = getpwent_r(&pw, buf, PASSWD_BUFSIZE, &pwp); | 104 rc = getpwent_r(&pw, buf, PASSWD_BUFSIZE, &pwp); |
69 if (rc) { | 105 if (rc) { |
70 LogDebugFn("USER PS: Error getting path to home director
y: getpwent_r: %s", | 106 LogDebugFn("USER PS: Error getting path to home director
y: getpwent_r: %s", |
71 strerror(rc)); | 107 strerror(rc)); |
72 endpwent(); | 108 endpwent(); |
73 return TSPERR(TSS_E_INTERNAL_ERROR); | 109 return TSPERR(TSS_E_INTERNAL_ERROR); |
74 } | 110 } |
75 | 111 |
76 #elif (defined (__FreeBSD__) || defined (__OpenBSD__)) | 112 #elif (defined (__FreeBSD__) || defined (__OpenBSD__)) |
77 if ((pwp = getpwent()) == NULL) { | 113 if ((pwp = getpwent()) == NULL) { |
78 LogDebugFn("USER PS: Error getting path to home director
y: getpwent: %s", | 114 LogDebugFn("USER PS: Error getting path to home director
y: getpwent: %s", |
79 strerror(rc)); | 115 strerror(rc)); |
80 endpwent(); | 116 endpwent(); |
81 MUTEX_UNLOCK(user_ps_path); | 117 MUTEX_UNLOCK(user_ps_path); |
82 return TSPERR(TSS_E_INTERNAL_ERROR); | 118 return TSPERR(TSS_E_INTERNAL_ERROR); |
83 } | 119 } |
84 #endif | 120 #endif |
85 if (euid == pwp->pw_uid) { | 121 if (euid == pwp->pw_uid) { |
86 home_dir = strdup(pwp->pw_dir); | 122 home_dir = strdup(pwp->pw_dir); |
87 break; | 123 break; |
88 } | 124 } |
89 } | 125 } |
90 endpwent(); | 126 endpwent(); |
91 | 127 |
92 if (!home_dir) | 128 if (!home_dir) |
93 return TSPERR(TSS_E_OUTOFMEMORY); | 129 return TSPERR(TSS_E_OUTOFMEMORY); |
94 | 130 |
95 /* Tack on TSS_USER_PS_DIR and see if it exists */ | 131 /* Tack on TSS_USER_PS_DIR and see if it exists */ |
96 » rc = snprintf(buf, PASSWD_BUFSIZE, "%s/%s", home_dir, TSS_USER_PS_DIR); | 132 » rc = snprintf(buf, sizeof (buf), "%s/%s", home_dir, TSS_USER_PS_DIR); |
97 » if (rc == PASSWD_BUFSIZE) { | 133 #endif /* SOLARIS */ |
| 134 » if (rc == sizeof (buf)) { |
98 LogDebugFn("USER PS: Path to file too long! (> %d bytes)", PASSW
D_BUFSIZE); | 135 LogDebugFn("USER PS: Path to file too long! (> %d bytes)", PASSW
D_BUFSIZE); |
99 result = TSPERR(TSS_E_INTERNAL_ERROR); | 136 result = TSPERR(TSS_E_INTERNAL_ERROR); |
100 goto done; | 137 goto done; |
101 } | 138 } |
102 | 139 |
103 errno = 0; | 140 errno = 0; |
104 if ((rc = stat(buf, &stat_buf)) == -1) { | 141 if ((rc = stat(buf, &stat_buf)) == -1) { |
105 if (errno == ENOENT) { | 142 if (errno == ENOENT) { |
106 errno = 0; | 143 errno = 0; |
107 » » » /* Create the base directory, $HOME/.trousers */ | 144 » » » /* Create the user's ps directory if it is not there. */ |
108 if ((rc = mkdir(buf, 0700)) == -1) { | 145 if ((rc = mkdir(buf, 0700)) == -1) { |
109 LogDebugFn("USER PS: Error creating dir: %s: %s"
, buf, | 146 LogDebugFn("USER PS: Error creating dir: %s: %s"
, buf, |
110 strerror(errno)); | 147 strerror(errno)); |
111 result = TSPERR(TSS_E_INTERNAL_ERROR); | 148 result = TSPERR(TSS_E_INTERNAL_ERROR); |
112 goto done; | 149 goto done; |
113 } | 150 } |
114 } else { | 151 } else { |
115 LogDebugFn("USER PS: Error stating dir: %s: %s", buf, st
rerror(errno)); | 152 LogDebugFn("USER PS: Error stating dir: %s: %s", buf, st
rerror(errno)); |
116 result = TSPERR(TSS_E_INTERNAL_ERROR); | 153 result = TSPERR(TSS_E_INTERNAL_ERROR); |
117 goto done; | 154 goto done; |
118 } | 155 } |
119 } | 156 } |
120 | 157 |
121 /* Directory exists or has been created, return the path to the file */ | 158 /* Directory exists or has been created, return the path to the file */ |
122 » rc = snprintf(buf, PASSWD_BUFSIZE, "%s/%s/%s", home_dir, TSS_USER_PS_DIR
, | 159 #if defined (SOLARIS) |
| 160 » rc = snprintf(buf, sizeof (buf), "%s/%d/%s", TSS_USER_PS_DIR, euid, |
123 TSS_USER_PS_FILE); | 161 TSS_USER_PS_FILE); |
124 » if (rc == PASSWD_BUFSIZE) { | 162 #else |
125 » » LogDebugFn("USER PS: Path to file too long! (> %d bytes)", PASSW
D_BUFSIZE); | 163 » rc = snprintf(buf, sizeof (buf), "%s/%s/%s", home_dir, TSS_USER_PS_DIR, |
| 164 » » TSS_USER_PS_FILE); |
| 165 #endif |
| 166 » if (rc == sizeof (buf)) { |
| 167 » » LogDebugFn("USER PS: Path to file too long! (> %d bytes)", sizeo
f (buf)); |
126 } else | 168 } else |
127 *file = strdup(buf); | 169 *file = strdup(buf); |
128 | 170 |
129 result = (*file) ? TSS_SUCCESS : TSPERR(TSS_E_OUTOFMEMORY); | 171 result = (*file) ? TSS_SUCCESS : TSPERR(TSS_E_OUTOFMEMORY); |
130 done: | 172 done: |
131 free(home_dir); | 173 free(home_dir); |
132 return result; | 174 return result; |
133 } | 175 } |
134 | 176 |
135 TSS_RESULT | 177 TSS_RESULT |
136 get_file(int *fd) | 178 get_file(int *fd) |
137 { | 179 { |
138 TSS_RESULT result; | 180 TSS_RESULT result; |
139 int rc = 0; | 181 int rc = 0; |
140 char *file_name = NULL; | 182 char *file_name = NULL; |
141 | 183 |
142 MUTEX_LOCK(user_ps_lock); | 184 MUTEX_LOCK(user_ps_lock); |
143 | 185 |
144 /* check the global file handle first. If it exists, lock it and return
*/ | 186 /* check the global file handle first. If it exists, lock it and return
*/ |
145 if (user_ps_fd != -1) { | 187 if (user_ps_fd != -1) { |
| 188 #if defined (SOLARIS) |
| 189 fl.l_type = F_WRLCK; |
| 190 if ((rc = fcntl(user_ps_fd, F_SETLKW, &fl))) { |
| 191 #else |
146 if ((rc = flock(user_ps_fd, LOCK_EX))) { | 192 if ((rc = flock(user_ps_fd, LOCK_EX))) { |
| 193 #endif /* SOLARIS */ |
147 LogDebug("USER PS: failed to lock file: %s", strerror(er
rno)); | 194 LogDebug("USER PS: failed to lock file: %s", strerror(er
rno)); |
148 MUTEX_UNLOCK(user_ps_lock); | 195 MUTEX_UNLOCK(user_ps_lock); |
149 return TSPERR(TSS_E_INTERNAL_ERROR); | 196 return TSPERR(TSS_E_INTERNAL_ERROR); |
150 } | 197 } |
151 | |
152 *fd = user_ps_fd; | 198 *fd = user_ps_fd; |
153 return TSS_SUCCESS; | 199 return TSS_SUCCESS; |
154 } | 200 } |
155 | 201 |
156 /* open and lock the file */ | 202 /* open and lock the file */ |
157 if ((result = get_user_ps_path(&file_name))) { | 203 if ((result = get_user_ps_path(&file_name))) { |
158 LogDebugFn("USER PS: error getting file path"); | 204 LogDebugFn("USER PS: error getting file path"); |
159 MUTEX_UNLOCK(user_ps_lock); | 205 MUTEX_UNLOCK(user_ps_lock); |
160 return result; | 206 return result; |
161 } | 207 } |
162 | 208 |
163 user_ps_fd = open(file_name, O_CREAT|O_RDWR, 0600); | 209 user_ps_fd = open(file_name, O_CREAT|O_RDWR, 0600); |
164 if (user_ps_fd < 0) { | 210 if (user_ps_fd < 0) { |
165 LogDebug("USER PS: open of %s failed: %s", file_name, strerror(e
rrno)); | 211 LogDebug("USER PS: open of %s failed: %s", file_name, strerror(e
rrno)); |
166 free(file_name); | 212 free(file_name); |
167 MUTEX_UNLOCK(user_ps_lock); | 213 MUTEX_UNLOCK(user_ps_lock); |
168 return TSPERR(TSS_E_INTERNAL_ERROR); | 214 return TSPERR(TSS_E_INTERNAL_ERROR); |
169 } | 215 } |
170 | 216 #if defined (SOLARIS) |
| 217 » fl.l_type = F_WRLCK; |
| 218 » if ((rc = fcntl(user_ps_fd, F_SETLKW, &fl))) { |
| 219 #else |
171 if ((rc = flock(user_ps_fd, LOCK_EX))) { | 220 if ((rc = flock(user_ps_fd, LOCK_EX))) { |
| 221 #endif /* SOLARIS */ |
172 LogDebug("USER PS: failed to get lock of %s: %s", file_name, str
error(errno)); | 222 LogDebug("USER PS: failed to get lock of %s: %s", file_name, str
error(errno)); |
173 free(file_name); | 223 free(file_name); |
174 close(user_ps_fd); | 224 close(user_ps_fd); |
175 user_ps_fd = -1; | 225 user_ps_fd = -1; |
176 MUTEX_UNLOCK(user_ps_lock); | 226 MUTEX_UNLOCK(user_ps_lock); |
177 return TSPERR(TSS_E_INTERNAL_ERROR); | 227 return TSPERR(TSS_E_INTERNAL_ERROR); |
178 } | 228 } |
179 | 229 |
180 *fd = user_ps_fd; | 230 *fd = user_ps_fd; |
181 free(file_name); | 231 free(file_name); |
182 return TSS_SUCCESS; | 232 return TSS_SUCCESS; |
183 } | 233 } |
184 | 234 |
185 int | 235 int |
186 put_file(int fd) | 236 put_file(int fd) |
187 { | 237 { |
188 int rc = 0; | 238 int rc = 0; |
189 | 239 |
190 fsync(fd); | 240 fsync(fd); |
191 | 241 |
192 /* release the file lock */ | 242 /* release the file lock */ |
| 243 #if defined (SOLARIS) |
| 244 fl.l_type = F_UNLCK; |
| 245 if ((rc = fcntl(fd, F_SETLKW, &fl))) { |
| 246 #else |
193 if ((rc = flock(fd, LOCK_UN))) { | 247 if ((rc = flock(fd, LOCK_UN))) { |
| 248 #endif /* SOLARIS */ |
194 LogDebug("USER PS: failed to unlock file: %s", strerror(errno)); | 249 LogDebug("USER PS: failed to unlock file: %s", strerror(errno)); |
195 rc = -1; | 250 rc = -1; |
196 } | 251 } |
197 | 252 |
198 MUTEX_UNLOCK(user_ps_lock); | 253 MUTEX_UNLOCK(user_ps_lock); |
199 return rc; | 254 return rc; |
200 } | 255 } |
201 | 256 |
202 void | 257 void |
203 psfile_close(int fd) | 258 psfile_close(int fd) |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 if (rc == ((off_t)-1)) { | 413 if (rc == ((off_t)-1)) { |
359 LogDebug("lseek: %s", strerror(errno)); | 414 LogDebug("lseek: %s", strerror(errno)); |
360 return TSPERR(TSS_E_INTERNAL_ERROR); | 415 return TSPERR(TSS_E_INTERNAL_ERROR); |
361 } | 416 } |
362 | 417 |
363 rc = read(fd, &num_keys, sizeof(UINT32)); | 418 rc = read(fd, &num_keys, sizeof(UINT32)); |
364 if (rc != sizeof(UINT32)) { | 419 if (rc != sizeof(UINT32)) { |
365 LogDebug("read of %zd bytes: %s", sizeof(UINT32), strerror(errno
)); | 420 LogDebug("read of %zd bytes: %s", sizeof(UINT32), strerror(errno
)); |
366 return TSPERR(TSS_E_INTERNAL_ERROR); | 421 return TSPERR(TSS_E_INTERNAL_ERROR); |
367 } | 422 } |
| 423 num_keys = LE_32(num_keys); |
368 | 424 |
369 if (increment) | 425 if (increment) |
370 num_keys++; | 426 num_keys++; |
371 else | 427 else |
372 num_keys--; | 428 num_keys--; |
373 | 429 |
374 rc = lseek(fd, TSSPS_NUM_KEYS_OFFSET, SEEK_SET); | 430 rc = lseek(fd, TSSPS_NUM_KEYS_OFFSET, SEEK_SET); |
375 if (rc == ((off_t)-1)) { | 431 if (rc == ((off_t)-1)) { |
376 LogDebug("lseek: %s", strerror(errno)); | 432 LogDebug("lseek: %s", strerror(errno)); |
377 return TSPERR(TSS_E_INTERNAL_ERROR); | 433 return TSPERR(TSS_E_INTERNAL_ERROR); |
378 } | 434 } |
379 | 435 |
| 436 num_keys = LE_32(num_keys); |
380 if ((result = write_data(fd, (void *)&num_keys, sizeof(UINT32)))) { | 437 if ((result = write_data(fd, (void *)&num_keys, sizeof(UINT32)))) { |
381 LogDebug("%s", __FUNCTION__); | 438 LogDebug("%s", __FUNCTION__); |
382 return result; | 439 return result; |
383 } | 440 } |
384 | 441 |
385 return TSS_SUCCESS; | 442 return TSS_SUCCESS; |
386 } | 443 } |
387 | 444 |
388 /* Write the initial header (number of keys and PS version) to initialize a new
file */ | 445 /* Write the initial header (number of keys and PS version) to initialize a new
file */ |
389 TSS_RESULT | 446 TSS_RESULT |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 goto done; | 548 goto done; |
492 } | 549 } |
493 | 550 |
494 /* [TSS_UUID uuid_parent0 ] yes */ | 551 /* [TSS_UUID uuid_parent0 ] yes */ |
495 if ((result = write_data(fd, (void *)parent_uuid, sizeof(TSS_UUID)))) { | 552 if ((result = write_data(fd, (void *)parent_uuid, sizeof(TSS_UUID)))) { |
496 LogDebug("%s", __FUNCTION__); | 553 LogDebug("%s", __FUNCTION__); |
497 goto done; | 554 goto done; |
498 } | 555 } |
499 | 556 |
500 /* [UINT16 pub_data_size0 ] yes */ | 557 /* [UINT16 pub_data_size0 ] yes */ |
| 558 pub_key_size = LE_16(pub_key_size); |
501 if ((result = write_data(fd, &pub_key_size, sizeof(UINT16)))) { | 559 if ((result = write_data(fd, &pub_key_size, sizeof(UINT16)))) { |
502 LogDebug("%s", __FUNCTION__); | 560 LogDebug("%s", __FUNCTION__); |
503 goto done; | 561 goto done; |
504 } | 562 } |
| 563 pub_key_size = LE_16(pub_key_size); |
505 | 564 |
506 /* [UINT16 blob_size0 ] yes */ | 565 /* [UINT16 blob_size0 ] yes */ |
| 566 key_blob_size = LE_16(key_blob_size); |
507 if ((result = write_data(fd, &key_blob_size, sizeof(UINT16)))) { | 567 if ((result = write_data(fd, &key_blob_size, sizeof(UINT16)))) { |
508 LogDebug("%s", __FUNCTION__); | 568 LogDebug("%s", __FUNCTION__); |
509 goto done; | 569 goto done; |
510 } | 570 } |
| 571 key_blob_size = LE_16(key_blob_size); |
511 | 572 |
512 /* [UINT32 vendor_data_size0 ] yes */ | 573 /* [UINT32 vendor_data_size0 ] yes */ |
513 if ((result = write_data(fd, &zero, sizeof(UINT32)))) { | 574 if ((result = write_data(fd, &zero, sizeof(UINT32)))) { |
514 LogDebug("%s", __FUNCTION__); | 575 LogDebug("%s", __FUNCTION__); |
515 goto done; | 576 goto done; |
516 } | 577 } |
517 | 578 |
518 /* [UINT16 cache_flags0 ] yes */ | 579 /* [UINT16 cache_flags0 ] yes */ |
| 580 cache_flags = LE_16(cache_flags); |
519 if ((result = write_data(fd, &cache_flags, sizeof(UINT16)))) { | 581 if ((result = write_data(fd, &cache_flags, sizeof(UINT16)))) { |
520 LogDebug("%s", __FUNCTION__); | 582 LogDebug("%s", __FUNCTION__); |
521 goto done; | 583 goto done; |
522 } | 584 } |
| 585 cache_flags = LE_16(cache_flags); |
523 | 586 |
524 /* [BYTE[] pub_data0 ] no */ | 587 /* [BYTE[] pub_data0 ] no */ |
525 if ((result = write_data(fd, (void *)key.pubKey.key, pub_key_size))) { | 588 if ((result = write_data(fd, (void *)key.pubKey.key, pub_key_size))) { |
526 LogDebug("%s", __FUNCTION__); | 589 LogDebug("%s", __FUNCTION__); |
527 goto done; | 590 goto done; |
528 } | 591 } |
529 | 592 |
530 /* [BYTE[] blob0 ] no */ | 593 /* [BYTE[] blob0 ] no */ |
531 if ((result = write_data(fd, (void *)key_blob, key_blob_size))) { | 594 if ((result = write_data(fd, (void *)key_blob, key_blob_size))) { |
532 LogDebug("%s", __FUNCTION__); | 595 LogDebug("%s", __FUNCTION__); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 if ((result = read_data(fd, &tmp[i].parent_uuid, sizeof(TSS_UUID
)))) { | 741 if ((result = read_data(fd, &tmp[i].parent_uuid, sizeof(TSS_UUID
)))) { |
679 LogDebug("%s", __FUNCTION__); | 742 LogDebug("%s", __FUNCTION__); |
680 goto err_exit; | 743 goto err_exit; |
681 } | 744 } |
682 | 745 |
683 /* pub data size */ | 746 /* pub data size */ |
684 if ((result = read_data(fd, &tmp[i].pub_data_size, sizeof(UINT16
)))) { | 747 if ((result = read_data(fd, &tmp[i].pub_data_size, sizeof(UINT16
)))) { |
685 LogDebug("%s", __FUNCTION__); | 748 LogDebug("%s", __FUNCTION__); |
686 goto err_exit; | 749 goto err_exit; |
687 } | 750 } |
| 751 tmp[i].pub_data_size = LE_16(tmp[i].pub_data_size); |
688 | 752 |
689 DBG_ASSERT(tmp[i].pub_data_size <= 2048); | 753 DBG_ASSERT(tmp[i].pub_data_size <= 2048); |
690 | 754 |
691 /* blob size */ | 755 /* blob size */ |
692 if ((result = read_data(fd, &tmp[i].blob_size, sizeof(UINT16))))
{ | 756 if ((result = read_data(fd, &tmp[i].blob_size, sizeof(UINT16))))
{ |
693 LogDebug("%s", __FUNCTION__); | 757 LogDebug("%s", __FUNCTION__); |
694 goto err_exit; | 758 goto err_exit; |
695 } | 759 } |
| 760 tmp[i].blob_size = LE_16(tmp[i].blob_size); |
696 | 761 |
697 DBG_ASSERT(tmp[i].blob_size <= 4096); | 762 DBG_ASSERT(tmp[i].blob_size <= 4096); |
698 | 763 |
699 /* vendor data size */ | 764 /* vendor data size */ |
700 if ((result = read_data(fd, &tmp[i].vendor_data_size, sizeof(UIN
T32)))) { | 765 if ((result = read_data(fd, &tmp[i].vendor_data_size, sizeof(UIN
T32)))) { |
701 LogDebug("%s", __FUNCTION__); | 766 LogDebug("%s", __FUNCTION__); |
702 goto err_exit; | 767 goto err_exit; |
703 } | 768 } |
| 769 tmp[i].vendor_data_size = LE_32(tmp[i].vendor_data_size); |
704 | 770 |
705 /* cache flags */ | 771 /* cache flags */ |
706 if ((result = read_data(fd, &tmp[i].flags, sizeof(UINT16)))) { | 772 if ((result = read_data(fd, &tmp[i].flags, sizeof(UINT16)))) { |
707 LogDebug("%s", __FUNCTION__); | 773 LogDebug("%s", __FUNCTION__); |
708 goto err_exit; | 774 goto err_exit; |
709 } | 775 } |
| 776 tmp[i].flags = LE_16(tmp[i].flags); |
710 | 777 |
711 /* fast forward over the pub key */ | 778 /* fast forward over the pub key */ |
712 offset = lseek(fd, tmp[i].pub_data_size, SEEK_CUR); | 779 offset = lseek(fd, tmp[i].pub_data_size, SEEK_CUR); |
713 if (offset == ((off_t)-1)) { | 780 if (offset == ((off_t)-1)) { |
714 LogDebug("lseek: %s", strerror(errno)); | 781 LogDebug("lseek: %s", strerror(errno)); |
715 result = TSPERR(TSS_E_INTERNAL_ERROR); | 782 result = TSPERR(TSS_E_INTERNAL_ERROR); |
716 goto err_exit; | 783 goto err_exit; |
717 } | 784 } |
718 | 785 |
719 /* fast forward over the blob */ | 786 /* fast forward over the blob */ |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 } | 1091 } |
1025 | 1092 |
1026 rc = read(fd, &num_keys, sizeof(UINT32)); | 1093 rc = read(fd, &num_keys, sizeof(UINT32)); |
1027 if (rc < 0) { | 1094 if (rc < 0) { |
1028 LogDebug("read of %zd bytes: %s", sizeof(UINT32), strerror(errno
)); | 1095 LogDebug("read of %zd bytes: %s", sizeof(UINT32), strerror(errno
)); |
1029 return 0; | 1096 return 0; |
1030 } else if ((unsigned)rc < sizeof(UINT32)) { | 1097 } else if ((unsigned)rc < sizeof(UINT32)) { |
1031 num_keys = 0; | 1098 num_keys = 0; |
1032 } | 1099 } |
1033 | 1100 |
| 1101 /* The system PS file is written in little-endian */ |
| 1102 num_keys = LE_32(num_keys); |
1034 return num_keys; | 1103 return num_keys; |
1035 } | 1104 } |
1036 | 1105 |
1037 /* | 1106 /* |
1038 * disk store format: | 1107 * disk store format: |
1039 * | 1108 * |
1040 * TrouSerS 0.2.1+ | 1109 * TrouSerS 0.2.1+ |
1041 * Version 1: cached? | 1110 * Version 1: cached? |
1042 * [BYTE PS version = '\1'] | 1111 * [BYTE PS version = '\1'] |
1043 * [UINT32 num_keys_on_disk ] | 1112 * [UINT32 num_keys_on_disk ] |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 LogDebug("lseek: %s", strerror(errno)); | 1171 LogDebug("lseek: %s", strerror(errno)); |
1103 return TSPERR(TSS_E_INTERNAL_ERROR); | 1172 return TSPERR(TSS_E_INTERNAL_ERROR); |
1104 } | 1173 } |
1105 } | 1174 } |
1106 | 1175 |
1107 /* pub data size */ | 1176 /* pub data size */ |
1108 if ((result = read_data(fd, &c->pub_data_size, sizeof(UINT16))))
{ | 1177 if ((result = read_data(fd, &c->pub_data_size, sizeof(UINT16))))
{ |
1109 LogDebug("%s", __FUNCTION__); | 1178 LogDebug("%s", __FUNCTION__); |
1110 return result; | 1179 return result; |
1111 } | 1180 } |
1112 | 1181 » » c->pub_data_size = LE_16(c->pub_data_size); |
1113 DBG_ASSERT(c->pub_data_size <= 2048 && c->pub_data_size > 0); | 1182 DBG_ASSERT(c->pub_data_size <= 2048 && c->pub_data_size > 0); |
1114 | 1183 |
1115 /* blob size */ | 1184 /* blob size */ |
1116 if ((result = read_data(fd, &c->blob_size, sizeof(UINT16)))) { | 1185 if ((result = read_data(fd, &c->blob_size, sizeof(UINT16)))) { |
1117 LogDebug("%s", __FUNCTION__); | 1186 LogDebug("%s", __FUNCTION__); |
1118 return result; | 1187 return result; |
1119 } | 1188 } |
1120 | 1189 » » c->blob_size = LE_16(c->blob_size); |
1121 DBG_ASSERT(c->blob_size <= 4096 && c->blob_size > 0); | 1190 DBG_ASSERT(c->blob_size <= 4096 && c->blob_size > 0); |
1122 | 1191 |
1123 /* vendor data size */ | 1192 /* vendor data size */ |
1124 if ((result = read_data(fd, &c->vendor_data_size, sizeof(UINT32)
))) { | 1193 if ((result = read_data(fd, &c->vendor_data_size, sizeof(UINT32)
))) { |
1125 LogDebug("%s", __FUNCTION__); | 1194 LogDebug("%s", __FUNCTION__); |
1126 return result; | 1195 return result; |
1127 } | 1196 } |
| 1197 c->vendor_data_size = LE_32(c->vendor_data_size); |
1128 | 1198 |
1129 /* cache flags */ | 1199 /* cache flags */ |
1130 if ((result = read_data(fd, &c->flags, sizeof(UINT16)))) { | 1200 if ((result = read_data(fd, &c->flags, sizeof(UINT16)))) { |
1131 LogDebug("%s", __FUNCTION__); | 1201 LogDebug("%s", __FUNCTION__); |
1132 return result; | 1202 return result; |
1133 } | 1203 } |
| 1204 c->flags = LE_16(c->flags); |
1134 | 1205 |
1135 /* fast forward over the pub key */ | 1206 /* fast forward over the pub key */ |
1136 offset = lseek(fd, c->pub_data_size, SEEK_CUR); | 1207 offset = lseek(fd, c->pub_data_size, SEEK_CUR); |
1137 if (offset == ((off_t)-1)) { | 1208 if (offset == ((off_t)-1)) { |
1138 LogDebug("lseek: %s", strerror(errno)); | 1209 LogDebug("lseek: %s", strerror(errno)); |
1139 return TSPERR(TSS_E_INTERNAL_ERROR); | 1210 return TSPERR(TSS_E_INTERNAL_ERROR); |
1140 } | 1211 } |
1141 | 1212 |
1142 /* fast forward over the blob */ | 1213 /* fast forward over the blob */ |
1143 offset = lseek(fd, c->blob_size, SEEK_CUR); | 1214 offset = lseek(fd, c->blob_size, SEEK_CUR); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1191 LogDebug("%s", __FUNCTION__); | 1262 LogDebug("%s", __FUNCTION__); |
1192 return result; | 1263 return result; |
1193 } | 1264 } |
1194 | 1265 |
1195 /* pub data size */ | 1266 /* pub data size */ |
1196 if ((result = read_data(fd, &c->pub_data_size, sizeof(UINT16))))
{ | 1267 if ((result = read_data(fd, &c->pub_data_size, sizeof(UINT16))))
{ |
1197 LogDebug("%s", __FUNCTION__); | 1268 LogDebug("%s", __FUNCTION__); |
1198 return result; | 1269 return result; |
1199 } | 1270 } |
1200 | 1271 |
| 1272 c->pub_data_size = LE_16(c->pub_data_size); |
1201 DBG_ASSERT(c->pub_data_size <= 2048 && c->pub_data_size > 0); | 1273 DBG_ASSERT(c->pub_data_size <= 2048 && c->pub_data_size > 0); |
1202 | 1274 |
1203 /* blob size */ | 1275 /* blob size */ |
1204 if ((result = read_data(fd, &c->blob_size, sizeof(UINT16)))) { | 1276 if ((result = read_data(fd, &c->blob_size, sizeof(UINT16)))) { |
1205 LogDebug("%s", __FUNCTION__); | 1277 LogDebug("%s", __FUNCTION__); |
1206 return result; | 1278 return result; |
1207 } | 1279 } |
1208 | 1280 |
| 1281 c->blob_size = LE_16(c->blob_size); |
1209 DBG_ASSERT(c->blob_size <= 4096 && c->blob_size > 0); | 1282 DBG_ASSERT(c->blob_size <= 4096 && c->blob_size > 0); |
1210 | 1283 |
1211 /* vendor data size */ | 1284 /* vendor data size */ |
1212 if ((result = read_data(fd, &c->vendor_data_size, sizeof(UINT32)
))) { | 1285 if ((result = read_data(fd, &c->vendor_data_size, sizeof(UINT32)
))) { |
1213 LogDebug("%s", __FUNCTION__); | 1286 LogDebug("%s", __FUNCTION__); |
1214 return result; | 1287 return result; |
1215 } | 1288 } |
| 1289 c->vendor_data_size = LE_32(c->vendor_data_size); |
1216 | 1290 |
1217 /* cache flags */ | 1291 /* cache flags */ |
1218 if ((result = read_data(fd, &c->flags, sizeof(UINT16)))) { | 1292 if ((result = read_data(fd, &c->flags, sizeof(UINT16)))) { |
1219 LogDebug("%s", __FUNCTION__); | 1293 LogDebug("%s", __FUNCTION__); |
1220 return result; | 1294 return result; |
1221 } | 1295 } |
| 1296 c->flags = LE_16(c->flags); |
1222 | 1297 |
1223 if (c->pub_data_size == pub_size) { | 1298 if (c->pub_data_size == pub_size) { |
1224 /* read in the pub key */ | 1299 /* read in the pub key */ |
1225 if ((result = read_data(fd, blob, c->pub_data_size))) { | 1300 if ((result = read_data(fd, blob, c->pub_data_size))) { |
1226 LogDebug("%s", __FUNCTION__); | 1301 LogDebug("%s", __FUNCTION__); |
1227 return result; | 1302 return result; |
1228 } | 1303 } |
1229 | 1304 |
1230 if (!memcmp(blob, pub, pub_size)) | 1305 if (!memcmp(blob, pub, pub_size)) |
1231 break; | 1306 break; |
1232 } | 1307 } |
1233 | 1308 |
1234 /* fast forward over the blob */ | 1309 /* fast forward over the blob */ |
1235 offset = lseek(fd, c->blob_size, SEEK_CUR); | 1310 offset = lseek(fd, c->blob_size, SEEK_CUR); |
1236 if (offset == ((off_t)-1)) { | 1311 if (offset == ((off_t)-1)) { |
1237 LogDebug("lseek: %s", strerror(errno)); | 1312 LogDebug("lseek: %s", strerror(errno)); |
1238 return TSPERR(TSS_E_INTERNAL_ERROR); | 1313 return TSPERR(TSS_E_INTERNAL_ERROR); |
1239 } | 1314 } |
1240 | 1315 |
1241 /* ignore vendor data */ | 1316 /* ignore vendor data */ |
1242 } | 1317 } |
1243 | 1318 |
1244 return TSS_SUCCESS; | 1319 return TSS_SUCCESS; |
1245 } | 1320 } |
OLD | NEW |