| /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| * |
| * Private header file for mount-encrypted helper tool. |
| */ |
| #ifndef CRYPTOHOME_MOUNT_ENCRYPTED_H_ |
| #define CRYPTOHOME_MOUNT_ENCRYPTED_H_ |
| |
| /* #define DEBUG_ENABLED 1 */ |
| #define DEBUG_TIME_DELTA 1 |
| |
| #include <openssl/err.h> |
| #include <openssl/sha.h> |
| |
| #define DIGEST_LENGTH SHA256_DIGEST_LENGTH |
| |
| #define _ERROR(f, a...) \ |
| do { \ |
| fprintf(stderr, "ERROR[pid:%d] %s (%s, %d): ", getpid(), __func__, \ |
| __FILE__, __LINE__); \ |
| fprintf(stderr, f, ##a); \ |
| } while (0) |
| #define ERROR(f, a...) \ |
| do { \ |
| _ERROR(f, ##a); \ |
| fprintf(stderr, "\n"); \ |
| fflush(stderr); \ |
| } while (0) |
| #define PERROR(f, a...) \ |
| do { \ |
| _ERROR(f, ##a); \ |
| fprintf(stderr, ": %s\n", strerror(errno)); \ |
| fflush(stderr); \ |
| } while (0) |
| |
| #define SSL_ERROR(f, a...) \ |
| do { \ |
| ERR_load_crypto_strings(); \ |
| _ERROR(f, ##a); \ |
| fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL)); \ |
| fflush(stderr); \ |
| } while (0) |
| |
| #if DEBUG_ENABLED |
| extern struct timeval tick; |
| extern struct timeval tick_start; |
| #define TICK_INIT() \ |
| do { \ |
| gettimeofday(&tick, NULL); \ |
| tick_start = tick; \ |
| } while (0) |
| #ifdef DEBUG_TIME_DELTA |
| /* This timeval helper copied from glibc manual. */ |
| static inline int timeval_subtract(struct timeval* result, |
| struct timeval* x, |
| struct timeval* y) { |
| /* Perform the carry for the later subtraction by updating y. */ |
| if (x->tv_usec < y->tv_usec) { |
| int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1; |
| y->tv_usec -= 1000000 * nsec; |
| y->tv_sec += nsec; |
| } |
| if (x->tv_usec - y->tv_usec > 1000000) { |
| int nsec = (x->tv_usec - y->tv_usec) / 1000000; |
| y->tv_usec += 1000000 * nsec; |
| y->tv_sec -= nsec; |
| } |
| |
| /* Compute the time remaining to wait. |
| * tv_usec is certainly positive. |
| */ |
| result->tv_sec = x->tv_sec - y->tv_sec; |
| result->tv_usec = x->tv_usec - y->tv_usec; |
| |
| /* Return 1 if result is negative. */ |
| return x->tv_sec < y->tv_sec; |
| } |
| #define TICK_REPORT() \ |
| do { \ |
| struct timeval now, diff; \ |
| gettimeofday(&now, NULL); \ |
| timeval_subtract(&diff, &now, &tick); \ |
| printf("\tTook: [pid:%d, %2d.%06ds]\n", getpid(), \ |
| static_cast<int>(diff.tv_sec), static_cast<int>(diff.tv_usec)); \ |
| tick = now; \ |
| } while (0) |
| #else |
| #define TICK_REPORT() \ |
| do { \ |
| gettimeofday(&tick, NULL); \ |
| printf("[%2d.%06d] ", static_cast<int>(tick.tv_sec), \ |
| static_cast<int>(tick.tv_usec)); \ |
| } while (0) |
| #endif |
| #define TICK_DONE() \ |
| do { \ |
| struct timeval tick_done; \ |
| TICK_REPORT(); \ |
| timeval_subtract(&tick_done, &tick, &tick_start); \ |
| printf("Process Lifetime: [pid:%d, %2d.%06ds]\n", getpid(), \ |
| static_cast<int>(tick_done.tv_sec), \ |
| static_cast<int>(tick_done.tv_usec)); \ |
| } while (0) |
| #else |
| #define TICK_INIT() \ |
| do { \ |
| } while (0) |
| #define TICK_REPORT() \ |
| do { \ |
| } while (0) |
| #define TICK_DONE() \ |
| do { \ |
| } while (0) |
| #endif |
| |
| #define _INFO(f, a...) \ |
| do { \ |
| printf("[pid:%d] ", getpid()); \ |
| printf(f, ##a); \ |
| printf("\n"); \ |
| fflush(stdout); \ |
| } while (0) |
| #define INFO(f, a...) \ |
| do { \ |
| TICK_REPORT(); \ |
| _INFO(f, ##a); \ |
| } while (0) |
| #define INFO_INIT(f, a...) \ |
| do { \ |
| TICK_INIT(); \ |
| INFO(f, ##a); \ |
| } while (0) |
| #define INFO_DONE(f, a...) \ |
| do { \ |
| TICK_DONE(); \ |
| INFO(f, ##a); \ |
| } while (0) |
| #if DEBUG_ENABLED |
| #define DEBUG(f, a...) \ |
| do { \ |
| TICK_REPORT(); \ |
| _INFO(f, ##a); \ |
| } while (0) |
| #else |
| #define DEBUG(f, a...) \ |
| do { \ |
| } while (0) |
| #endif |
| |
| #if DEBUG_ENABLED |
| static inline void debug_dump_hex(const char* name, |
| uint8_t* data, |
| uint32_t size) { |
| int i; |
| printf("%s: ", name); |
| for (i = 0; i < size; i++) { |
| printf("%02x ", data[i]); |
| } |
| printf("\n"); |
| } |
| #else |
| #define debug_dump_hex(n, d, s) \ |
| do { \ |
| } while (0) |
| #endif |
| |
| #endif // CRYPTOHOME_MOUNT_ENCRYPTED_H_ |