2 * $Id: crypt.c,v 1.3 2003-06-11 07:49:52 srittau Exp $
4 * Copyright (c) 1990,1993 Regents of The University of Michigan.
5 * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
6 * Copyright (C) 2003 Sebastian Rittau (srittau@debian.org)
7 * All Rights Reserved. See COPYRIGHT.
18 #include <sys/types.h>
23 #else /* HAVE_GCRYPT */
25 #endif /* HAVE_GCRYPT */
27 #include <atalk/afp.h>
31 /* Cannot perform in-place operation. dstlen must be at least srclen*2. */
32 void atalk_hexify(u_int8_t *dst, size_t dstlen, const u_int8_t *src, size_t srclen)
34 static const unsigned char hextable[] = "0123456789ABCDEF";
36 assert(dstlen >= srclen * 2);
38 for (; srclen > 0; dst += 2, src++, dstlen -= 2, srclen--) {
39 dst[0] = hextable[(*src & 0xF0) >> 4];
40 dst[1] = hextable[(*src & 0x0F)];
43 memset(dst, 0, dstlen);
46 /* Can perform in-place operation. dstlen must be at least srclen/2. */
47 #define unhex(x) (isdigit(x) ? (x) - '0' : toupper(x) + 10 - 'A')
48 void atalk_unhexify(u_int8_t *dst, size_t dstlen, const u_int8_t *src, size_t srclen)
50 assert(srclen % 2 == 0);
51 assert(dstlen >= srclen / 2);
53 for (; srclen > 0; dst++, src += 2, dstlen--, srclen -= 2)
54 *dst = (unhex(src[0]) << 4) | unhex(src[1]);
56 memset(dst, 0, dstlen);
59 int atalk_encrypt_start(CryptHandle *handle, u_int8_t *key)
64 hd = gcry_cipher_open(GCRY_CIPHER_DES, GCRY_CIPHER_MODE_ECB, 0);
67 gcry_cipher_setkey(hd, key, DES_KEY_SZ);
72 #else /* HAVE_GCRYPT */
73 DES_key_schedule *sched = malloc(sizeof(DES_key_schedule));
74 DES_set_key_unchecked((DES_cblock *) key, sched);
79 #endif /* HAVE_GCRYPT */
82 int atalk_encrypt_do(CryptHandle handle, u_int8_t *dst, u_int8_t *src)
87 ret = gcry_cipher_encrypt(*(GcryCipherHd *) handle,
88 dst, DES_KEY_SZ, src, DES_KEY_SZ);
90 return ret == 0 ? AFP_OK : AFPERR_PARAM;
91 #else /* HAVE_GCRYPT */
92 DES_ecb_encrypt((DES_cblock *) src, (DES_cblock *) dst,
93 (DES_key_schedule *) handle, DES_ENCRYPT);
96 #endif /* HAVE_GCRYPT */
99 void atalk_encrypt_end(CryptHandle handle)
102 gcry_cipher_close(*(GcryCipherHd *) handle);
103 #else /* HAVE_GCRYPT */
104 memset(handle, 0, sizeof(DES_key_schedule));
106 #endif /* HAVE_GCRYPT */
109 int atalk_encrypt(u_int8_t *key, u_int8_t *dst, u_int8_t *src)
115 hd = gcry_cipher_open(GCRY_CIPHER_DES, GCRY_CIPHER_MODE_ECB, 0);
118 gcry_cipher_setkey(hd, key, DES_KEY_SZ);
120 ret = gcry_cipher_encrypt(hd, dst, DES_KEY_SZ, src, DES_KEY_SZ);
122 gcry_cipher_close(hd);
124 return ret == 0 ? AFP_OK : AFPERR_PARAM;
125 #else /* HAVE_GCRYPT */
126 DES_key_schedule sched;
128 DES_set_key_unchecked((DES_cblock *) key, &sched);
129 DES_ecb_encrypt((DES_cblock *) src, (DES_cblock *) dst,
130 &sched, DES_ENCRYPT);
132 memset(&sched, 0, sizeof(sched));
135 #endif /* HAVE_GCRYPT */
138 int atalk_decrypt(u_int8_t *key, u_int8_t *dst, u_int8_t *src)
144 hd = gcry_cipher_open(GCRY_CIPHER_DES, GCRY_CIPHER_MODE_ECB, 0);
147 gcry_cipher_setkey(hd, key, DES_KEY_SZ);
149 ret = gcry_cipher_encrypt(hd, dst, DES_KEY_SZ, src, DES_KEY_SZ);
151 gcry_cipher_close(hd);
153 return ret == 0 ? AFP_OK : AFPERR_PARAM;
154 #else /* HAVE_GCRYPT */
155 DES_key_schedule sched;
157 DES_set_key_unchecked((DES_cblock *) key, &sched);
158 DES_ecb_encrypt((DES_cblock *) src, (DES_cblock *) dst,
159 &sched, DES_ENCRYPT);
161 memset(&sched, 0, sizeof(sched));
164 #endif /* HAVE_GCRYPT */