/* misc.c * Copyright (C) 1998-2012 Free Software Foundation, Inc. * * Author: Timo Schulz * * This file is part of OpenCDK. * * The OpenCDK library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include "gnutls_int.h" #include u32 _cdk_buftou32(const byte * buf) { u32 u; if (!buf) return 0; u = ((u32)buf[0]) << 24; u |= buf[1] << 16; u |= buf[2] << 8; u |= buf[3]; return u; } void _cdk_u32tobuf(u32 u, byte * buf) { if (!buf) return; buf[0] = u >> 24; buf[1] = u >> 16; buf[2] = u >> 8; buf[3] = u; } /** * cdk_strlist_free: * @sl: the string list * * Release the string list object. **/ void cdk_strlist_free(cdk_strlist_t sl) { cdk_strlist_t sl2; for (; sl; sl = sl2) { sl2 = sl->next; cdk_free(sl); } } /** * cdk_strlist_add: * @list: destination string list * @string: the string to add * * Add the given list to the string list. **/ cdk_strlist_t cdk_strlist_add(cdk_strlist_t * list, const char *string) { if (!string) return NULL; cdk_strlist_t sl; int string_size = strlen(string); sl = cdk_calloc(1, sizeof *sl + string_size + 2); if (!sl) return NULL; sl->d = (char *) sl + sizeof(*sl); memcpy(sl->d, string, string_size + 1); sl->next = *list; *list = sl; return sl; } const char *_cdk_memistr(const char *buf, size_t buflen, const char *sub) { const byte *t, *s; size_t n; for (t = (byte *) buf, n = buflen, s = (byte *) sub; n; t++, n--) { if (c_toupper(*t) == c_toupper(*s)) { for (buf = (char *) t++, buflen = n--, s++; n && c_toupper(*t) == c_toupper((byte) * s); t++, s++, n--); if (!*s) return buf; t = (byte *) buf; n = buflen; s = (byte *) sub; } } return NULL; } cdk_error_t _cdk_map_gnutls_error(int err) { switch (err) { case 0: return CDK_Success; case GNUTLS_E_INVALID_REQUEST: return CDK_Inv_Value; default: return CDK_General_Error; } } int _cdk_check_args(int overwrite, const char *in, const char *out) { struct stat stbuf; if (!in || !out) return CDK_Inv_Value; if (strlen(in) == strlen(out) && strcmp(in, out) == 0) return CDK_Inv_Mode; if (!overwrite && !stat(out, &stbuf)) return CDK_Inv_Mode; return 0; } #ifdef _WIN32 #include #include FILE *_cdk_tmpfile(void) { /* Because the tmpfile() version of wine is not really useful, we implement our own version to avoid problems with 'make check'. */ static const char *letters = "abcdefghijklmnopqrstuvwxyz"; unsigned char buf[512], rnd[24]; FILE *fp; int fd, i; gnutls_rnd(GNUTLS_RND_NONCE, rnd, DIM(rnd)); for (i = 0; i < DIM(rnd) - 1; i++) { char c = letters[(unsigned char) rnd[i] % 26]; rnd[i] = c; } rnd[DIM(rnd) - 1] = 0; if (!GetTempPath(464, buf)) return NULL; _gnutls_str_cat(buf, sizeof(buf), "_cdk_"); _gnutls_str_cat(buf, sizeof(buf), rnd); /* We need to make sure the file will be deleted when it is closed. */ fd = _open(buf, _O_CREAT | _O_EXCL | _O_TEMPORARY | _O_RDWR | _O_BINARY, _S_IREAD | _S_IWRITE); if (fd == -1) return NULL; fp = fdopen(fd, "w+b"); if (fp != NULL) return fp; _close(fd); return NULL; } #else FILE *_cdk_tmpfile(void) { return tmpfile(); } #endif int _gnutls_hash_algo_to_pgp(int algo) { switch (algo) { case GNUTLS_DIG_MD5: return 0x01; case GNUTLS_DIG_MD2: return 0x05; case GNUTLS_DIG_SHA1: return 0x02; case GNUTLS_DIG_RMD160: return 0x03; case GNUTLS_DIG_SHA256: return 0x08; case GNUTLS_DIG_SHA384: return 0x09; case GNUTLS_DIG_SHA512: return 0x0A; case GNUTLS_DIG_SHA224: return 0x0B; default: gnutls_assert(); return 0x00; } } int _pgp_hash_algo_to_gnutls(int algo) { switch (algo) { case 0x01: return GNUTLS_DIG_MD5; case 0x02: return GNUTLS_DIG_SHA1; case 0x03: return GNUTLS_DIG_RMD160; case 0x05: return GNUTLS_DIG_MD2; case 0x08: return GNUTLS_DIG_SHA256; case 0x09: return GNUTLS_DIG_SHA384; case 0x0A: return GNUTLS_DIG_SHA512; case 0x0B: return GNUTLS_DIG_SHA224; default: gnutls_assert(); return GNUTLS_DIG_NULL; } } int _pgp_cipher_to_gnutls(int cipher) { switch (cipher) { case 0: return GNUTLS_CIPHER_NULL; case 1: return GNUTLS_CIPHER_IDEA_PGP_CFB; case 2: return GNUTLS_CIPHER_3DES_PGP_CFB; case 3: return GNUTLS_CIPHER_CAST5_PGP_CFB; case 4: return GNUTLS_CIPHER_BLOWFISH_PGP_CFB; case 5: return GNUTLS_CIPHER_SAFER_SK128_PGP_CFB; case 7: return GNUTLS_CIPHER_AES128_PGP_CFB; case 8: return GNUTLS_CIPHER_AES192_PGP_CFB; case 9: return GNUTLS_CIPHER_AES256_PGP_CFB; case 10: return GNUTLS_CIPHER_TWOFISH_PGP_CFB; default: gnutls_assert(); _gnutls_debug_log("Unknown openpgp cipher %u\n", cipher); return GNUTLS_CIPHER_UNKNOWN; } } int _gnutls_cipher_to_pgp(int cipher) { switch (cipher) { case GNUTLS_CIPHER_NULL: return 0; case GNUTLS_CIPHER_IDEA_PGP_CFB: return 1; case GNUTLS_CIPHER_3DES_PGP_CFB: return 2; case GNUTLS_CIPHER_CAST5_PGP_CFB: return 3; case GNUTLS_CIPHER_BLOWFISH_PGP_CFB: return 4; case GNUTLS_CIPHER_SAFER_SK128_PGP_CFB: return 5; case GNUTLS_CIPHER_AES128_PGP_CFB: return 7; case GNUTLS_CIPHER_AES192_PGP_CFB: return 8; case GNUTLS_CIPHER_AES256_PGP_CFB: return 9; case GNUTLS_CIPHER_TWOFISH_PGP_CFB: return 10; default: gnutls_assert(); return 0; } }