- memset(key, 0, HEXPASSWDLEN);
-
- return err;
-}
-
-static int encrypt_passwd(u_int8_t *dst, const u_int8_t *src, int keyfd)
-{
- const u_int8_t *key;
- int err = 0;
-
- key = retrieve_key(keyfd);
- if (!key)
- return 0;
-
- {
- DES_key_schedule schedule;
-
- DES_set_key_unchecked((DES_cblock *) key, &schedule);
- DES_ecb_encrypt((DES_cblock *) src, (DES_cblock *) dst,
- &schedule, DES_ENCRYPT);
-
+ if (keyfd > -1) {
+ lseek(keyfd, 0, SEEK_SET);
+ read(keyfd, key, sizeof(key));
+ /* convert to binary */
+ for (i = j = 0; i < sizeof(key); i += 2, j++)
+ key[j] = (unhex(key[i]) << 4) | unhex(key[i + 1]);
+ if (j <= DES_KEY_SZ)
+ memset(key + j, 0, sizeof(key) - j);
+ key_sched((C_Block *) key, schedule);
+ memset(key, 0, sizeof(key));
+ if (newpwd) {
+ ecb_encrypt((C_Block *) newpwd, (C_Block *) newpwd, schedule,
+ DES_ENCRYPT);
+ } else {
+ /* decrypt the password */
+ ecb_encrypt((C_Block *) buf, (C_Block *) buf, schedule, DES_DECRYPT);
+ }