1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
From 8546e9be8757a9406a8c05fae9efc55eaab3e984 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
Date: Mon, 13 Jan 2014 13:05:14 +0200
Subject: [PATCH] add legacy functions setkey() and encrypt()
---
src/crypt/crypt_des.c | 12 +++++-----
src/crypt/encrypt.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+), 6 deletions(-)
create mode 100644 src/crypt/encrypt.c
diff --git a/src/crypt/crypt_des.c b/src/crypt/crypt_des.c
index dc95dca..d5766a7 100644
--- a/src/crypt/crypt_des.c
+++ b/src/crypt/crypt_des.c
@@ -692,7 +692,7 @@ static uint32_t setup_salt(uint32_t salt)
return saltbits;
}
-static void des_setkey(const unsigned char *key, struct expanded_key *ekey)
+void __des_setkey(const unsigned char *key, struct expanded_key *ekey)
{
uint32_t k0, k1, rawkey0, rawkey1;
unsigned int shifts, round, i, ibit;
@@ -753,7 +753,7 @@ static void des_setkey(const unsigned char *key, struct expanded_key *ekey)
/*
* l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
*/
-static void do_des(uint32_t l_in, uint32_t r_in,
+void __do_des(uint32_t l_in, uint32_t r_in,
uint32_t *l_out, uint32_t *r_out,
uint32_t count, uint32_t saltbits, const struct expanded_key *ekey)
{
@@ -862,7 +862,7 @@ static void des_cipher(const unsigned char *in, unsigned char *out,
((uint32_t)in[5] << 16) |
((uint32_t)in[4] << 24);
- do_des(rawl, rawr, &l_out, &r_out, count, saltbits, ekey);
+ __do_des(rawl, rawr, &l_out, &r_out, count, saltbits, ekey);
out[0] = l_out >> 24;
out[1] = l_out >> 16;
@@ -894,7 +894,7 @@ static char *_crypt_extended_r_uut(const char *_key, const char *_setting, char
if (*key)
key++;
}
- des_setkey(keybuf, &ekey);
+ __des_setkey(keybuf, &ekey);
if (*setting == _PASSWORD_EFMT1) {
/*
@@ -929,7 +929,7 @@ static char *_crypt_extended_r_uut(const char *_key, const char *_setting, char
q = keybuf;
while (q <= &keybuf[sizeof(keybuf) - 1] && *key)
*q++ ^= *key++ << 1;
- des_setkey(keybuf, &ekey);
+ __des_setkey(keybuf, &ekey);
}
memcpy(output, setting, 9);
@@ -957,7 +957,7 @@ static char *_crypt_extended_r_uut(const char *_key, const char *_setting, char
/*
* Do it.
*/
- do_des(0, 0, &r0, &r1, count, setup_salt(salt), &ekey);
+ __do_des(0, 0, &r0, &r1, count, setup_salt(salt), &ekey);
/*
* Now encode the result...
diff --git a/src/crypt/encrypt.c b/src/crypt/encrypt.c
new file mode 100644
index 0000000..3b414f1
--- /dev/null
+++ b/src/crypt/encrypt.c
@@ -0,0 +1,63 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+struct expanded_key {
+ uint32_t l[16], r[16];
+};
+
+void __des_setkey(const unsigned char *key, struct expanded_key *ekey);
+void __do_des(uint32_t l_in, uint32_t r_in,
+ uint32_t *l_out, uint32_t *r_out,
+ uint32_t count, uint32_t saltbits, const struct expanded_key *ekey);
+
+
+static struct expanded_key __encrypt_key;
+
+void setkey(const char *key)
+{
+ unsigned char bkey[8];
+ int i, j;
+
+ for (i = 0; i < 8; i++) {
+ bkey[i] = 0;
+ for (j = 7; j >= 0; j--, key++) {
+ if (*key & 1)
+ bkey[i] |= 1 << j;
+ }
+ }
+
+ __des_setkey(bkey, &__encrypt_key);
+}
+
+void encrypt(char *block, int edflag)
+{
+ struct expanded_key decrypt_key, *key;
+ uint32_t b[2];
+ int i, j;
+ char *p;
+
+ p = block;
+ for (i = 0; i < 2; i++) {
+ b[i] = 0;
+ for (j = 31; j >= 0; j--, p++)
+ if (*p & 1)
+ b[i] |= 1 << j;
+ }
+
+ key = &__encrypt_key;
+ if (edflag) {
+ key = &decrypt_key;
+ for (i = 0; i < 16; i++) {
+ decrypt_key.l[i] = __encrypt_key.l[15-i];
+ decrypt_key.r[i] = __encrypt_key.r[15-i];
+ }
+ }
+
+ __do_des(b[0], b[1], b, b + 1, 1, 0, key);
+
+ p = block;
+ for (i = 0; i < 2; i++)
+ for (j = 31; j >= 0; j--)
+ *p++ = (b[i] & (1 << j)) ? 1 : 0;
+}
--
1.8.5.2
|