X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=crypt_common.c;h=4e9622e4ee773d65c708bbf3f0b624592ed0e27b;hp=3bd603c0ec698ab6be9c3e48d99e7a76e52c53f0;hb=6a7ba04cacab72c9787c4b0427e36cedd5adefcf;hpb=5957ec3c6deb0a5585f979ff470e9a346154ca62 diff --git a/crypt_common.c b/crypt_common.c index 3bd603c0..4e9622e4 100644 --- a/crypt_common.c +++ b/crypt_common.c @@ -1,13 +1,12 @@ /* - * Copyright (C) 2005-2011 Andre Noll + * Copyright (C) 2005-2012 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ -/** \file crypt_common.c Crypto functions independent of the implementation. */ +/** \file crypt_common.c Crypto functions independent of openssl/libgcrypt. */ #include -#include #include "para.h" #include "error.h" @@ -15,6 +14,7 @@ #include "crypt_backend.h" #include "crypt.h" +/** If the key begins with this text, we treat it as an ssh key. */ #define KEY_TYPE_TXT "ssh-rsa" /** @@ -54,11 +54,19 @@ size_t is_ssh_rsa_key(char *data, size_t size) static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; -/* + +/** + * base64-decode a buffer. + * + * \param src The buffer to decode. + * \param target Result is stored here. + * \param targsize Number of bytes of \a target. + * * Skips all whitespace anywhere. Converts characters, four at a time, starting * at (or after) src from base - 64 numbers into three 8 bit bytes in the - * target area. it returns the number of data bytes stored at the target, or -E_BASE64 - * on error. + * target area. + * + * \return The number of data bytes stored at the target, -E_BASE64 on errors. */ int base64_decode(char const *src, unsigned char *target, size_t targsize) { @@ -77,7 +85,7 @@ int base64_decode(char const *src, unsigned char *target, size_t targsize) break; pos = strchr(Base64, ch); - if (pos == 0) /* A non-base64 character. */ + if (pos == NULL) /* A non-base64 character. */ return -E_BASE64; switch (state) { @@ -177,6 +185,17 @@ int base64_decode(char const *src, unsigned char *target, size_t targsize) return tarindex; } +/** + * uudecode a buffer. + * + * \param src The buffer to decode. + * \param target Result buffer. + * \param targsize The length of \a target in bytes. + * + * This is just a simple wrapper for base64_decode() which strips whitespace. + * + * \return The return value of the underlying call to base64_decode(). + */ int uudecode(const char *src, unsigned char *target, size_t targsize) { int len; @@ -196,9 +215,15 @@ int uudecode(const char *src, unsigned char *target, size_t targsize) return len; } -/* - * Can not use the inline functions of portable_io.h here because the byte - * order is different. +/** + * Read a 4-byte number from a buffer in big-endian format. + * + * \param vp The buffer. + * + * The byte-order of the buffer is expected to be big-endian, unlike read_u32() + * of portable_io.h which expects little endian. + * + * \return The 32 bit number given by \a vp. */ uint32_t read_ssh_u32(const void *vp) { @@ -213,6 +238,19 @@ uint32_t read_ssh_u32(const void *vp) return v; } +/** + * Sanity checks for the header of an ssh key. + * + * \param blob The buffer. + * \param blen The number of bytes of \a blob. + * + * This performs some checks to make sure we really have an ssh key. It also + * computes the offset in bytes of the start of the key values (modulus, + * exponent..). + * + * \return The number of bytes to skip until the start of the first encoded + * number (usually 11). + */ int check_ssh_key_header(const unsigned char *blob, int blen) { const unsigned char *p = blob, *end = blob + blen; @@ -234,6 +272,18 @@ int check_ssh_key_header(const unsigned char *blob, int blen) return 4 + rlen; } +/** + * Check existence and permissions of a key file. + * + * \param file The path of the key file. + * \param private_key Whether this is a private key. + * + * This checks whether the file exists. If it is a private key, we additionally + * check that the permissions are restrictive enough. It is considered an error + * if we own the file and it is readable for others. + * + * \return Standard. + */ int check_key_file(const char *file, bool private_key) { struct stat st; @@ -247,16 +297,6 @@ int check_key_file(const char *file, bool private_key) return 1; } -/** - * Convert a hash value to ascii format. - * - * \param hash the hash value. - * \param asc Result pointer. - * - * \a asc must point to an area of at least 2 * \p HASH_SIZE + 1 bytes which - * will be filled by the function with the ascii representation of the hash - * value given by \a hash, and a terminating \p NULL byte. - */ void hash_to_asc(unsigned char *hash, char *asc) { int i; @@ -269,15 +309,6 @@ void hash_to_asc(unsigned char *hash, char *asc) asc[2 * HASH_SIZE] = '\0'; } -/** - * Compare two hashes. - * - * \param h1 Pointer to the first hash value. - * \param h2 Pointer to the second hash value. - * - * \return 1, -1, or zero, depending on whether \a h1 is greater than, - * less than or equal to h2, respectively. - */ int hash_compare(unsigned char *h1, unsigned char *h2) { int i; @@ -291,19 +322,6 @@ int hash_compare(unsigned char *h1, unsigned char *h2) return 0; } -/** - * Receive a buffer, decrypt it and write terminating NULL byte. - * - * \param scc The context. - * \param buf The buffer to write the decrypted data to. - * \param size The size of \a buf. - * - * Read at most \a size - 1 bytes from file descriptor given by \a scc, decrypt - * the received data and write a NULL byte at the end of the decrypted data. - * - * \return The return value of the underlying call to \ref - * sc_recv_bin_buffer(). - */ int sc_recv_buffer(struct stream_cipher_context *scc, char *buf, size_t size) { int n; @@ -317,27 +335,16 @@ int sc_recv_buffer(struct stream_cipher_context *scc, char *buf, size_t size) return n; } -/** - * Encrypt and send a \p NULL-terminated buffer. - * - * \param scc The context. - * \param buf The buffer to send. - * - * \return The return value of the underyling call to sc_send_bin_buffer(). - */ -int sc_send_buffer(struct stream_cipher_context *scc, const char *buf) +int sc_send_buffer(struct stream_cipher_context *scc, char *buf) { - return sc_send_bin_buffer(scc, buf, strlen(buf)); + size_t len = strlen(buf); + int ret = sc_send_bin_buffer(scc, buf, len); + + if (ret < 0 || ret == len) + return ret; + return -E_SHORT_WRITE; } -/** - * Format, encrypt and send a buffer. - * - * \param scc The context. - * \param fmt A format string. - * - * \return The return value of the underyling call to sc_send_buffer(). - */ __printf_2_3 int sc_send_va_buffer(struct stream_cipher_context *scc, const char *fmt, ...) {