1 /* Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
3 /** \file crypt_common.c Crypto functions independent of openssl/libgcrypt. */
11 #include "crypt_backend.h"
12 #include "portable_io.h"
14 /** If the key begins with this text, we treat it as an ssh key. */
15 #define KEY_TYPE_TXT "ssh-rsa"
18 * Check if given buffer starts with a ssh rsa key signature.
20 * \param data The buffer.
21 * \param size Number of data bytes.
23 * \return Number of header bytes to be skipped on success, zero if
24 * ssh rsa signature was not found.
26 size_t is_ssh_rsa_key(char *data, size_t size)
30 if (size < strlen(KEY_TYPE_TXT) + 2)
32 cp = memchr(data, ' ', size);
35 if (strncmp(KEY_TYPE_TXT, data, strlen(KEY_TYPE_TXT)))
38 if (cp >= data + size)
46 * Sanity checks for the header of an ssh key.
48 * \param blob The buffer.
49 * \param blen The number of bytes of \a blob.
51 * This performs some checks to make sure we really have an ssh key. It also
52 * computes the offset in bytes of the start of the key values (modulus,
55 * \return The number of bytes to skip until the start of the first encoded
56 * number (usually 11).
58 int check_ssh_key_header(const unsigned char *blob, int blen)
60 const unsigned char *p = blob, *end = blob + blen;
64 return -E_SSH_KEY_HEADER;
65 rlen = read_u32_be(p);
68 return -E_SSH_KEY_HEADER;
70 return -E_SSH_KEY_HEADER;
71 if (rlen < strlen(KEY_TYPE_TXT))
72 return -E_SSH_KEY_HEADER;
73 PARA_DEBUG_LOG("type: %s, rlen: %u\n", p, rlen);
74 if (strncmp((char *)p, KEY_TYPE_TXT, strlen(KEY_TYPE_TXT)))
75 return -E_SSH_KEY_HEADER;
80 * Check existence and permissions of a private key file.
82 * \param file The path of the key file.
84 * This checks whether the file exists and its permissions are restrictive
85 * enough. It is considered an error if we own the file and it is readable for
90 int check_private_key_file(const char *file)
94 if (stat(file, &st) != 0)
95 return -ERRNO_TO_PARA_ERROR(errno);
96 if ((st.st_uid == getuid()) && (st.st_mode & 077) != 0)
101 void hash_to_asc(unsigned char *hash, char *asc)
104 const char hexchar[] = "0123456789abcdef";
106 for (i = 0; i < HASH_SIZE; i++) {
107 asc[2 * i] = hexchar[hash[i] >> 4];
108 asc[2 * i + 1] = hexchar[hash[i] & 0xf];
110 asc[2 * HASH_SIZE] = '\0';
113 int hash_compare(unsigned char *h1, unsigned char *h2)
117 for (i = 0; i < HASH_SIZE; i++) {