Deleted Added
full compact
pk.c (102250) pk.c (189092)
1/*-
2 * Copyright (c) 1991, 1993
3 * Dave Safford. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 16 unchanged lines hidden (view full) ---

25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30
31#include <sys/cdefs.h>
32
1/*-
2 * Copyright (c) 1991, 1993
3 * Dave Safford. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 16 unchanged lines hidden (view full) ---

25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30
31#include <sys/cdefs.h>
32
33__FBSDID("$FreeBSD: head/contrib/telnet/libtelnet/pk.c 102250 2002-08-22 06:19:07Z nsayer $");
33__FBSDID("$FreeBSD: head/contrib/telnet/libtelnet/pk.c 189092 2009-02-26 21:43:15Z ed $");
34
35/* public key routines */
36/* functions:
37 genkeys(char *public, char *secret)
38 common_key(char *secret, char *public, desData *deskey)
39 pk_encode(char *in, *out, DesData *deskey);
40 pk_decode(char *in, *out, DesData *deskey);
41 where

--- 21 unchanged lines hidden (view full) ---

63{
64 MINT *a;
65 MINT *z;
66 short r;
67 int i;
68 short base = (1 << 8);
69 char *k;
70
34
35/* public key routines */
36/* functions:
37 genkeys(char *public, char *secret)
38 common_key(char *secret, char *public, desData *deskey)
39 pk_encode(char *in, *out, DesData *deskey);
40 pk_decode(char *in, *out, DesData *deskey);
41 where

--- 21 unchanged lines hidden (view full) ---

63{
64 MINT *a;
65 MINT *z;
66 short r;
67 int i;
68 short base = (1 << 8);
69 char *k;
70
71 z = itom(0);
72 a = itom(0);
73 madd(ck, z, a);
71 z = mp_itom(0);
72 a = mp_itom(0);
73 mp_madd(ck, z, a);
74 for (i = 0; i < ((KEYSIZE - 128) / 8); i++) {
74 for (i = 0; i < ((KEYSIZE - 128) / 8); i++) {
75 sdiv(a, base, a, &r);
75 mp_sdiv(a, base, a, &r);
76 }
77 k = (char *)ideakey;
78 for (i = 0; i < 16; i++) {
76 }
77 k = (char *)ideakey;
78 for (i = 0; i < 16; i++) {
79 sdiv(a, base, a, &r);
79 mp_sdiv(a, base, a, &r);
80 *k++ = r;
81 }
80 *k++ = r;
81 }
82 mfree(z);
83 mfree(a);
82 mp_mfree(z);
83 mp_mfree(a);
84}
85
86/*
87 * Choose middle 64 bits of the common key to use as our des key, possibly
88 * overwriting the lower order bits by setting parity.
89 */
90static void
91extractdeskey(MINT *ck, DesData *deskey)
92{
93 MINT *a;
94 MINT *z;
95 short r;
96 int i;
97 short base = (1 << 8);
98 char *k;
99
84}
85
86/*
87 * Choose middle 64 bits of the common key to use as our des key, possibly
88 * overwriting the lower order bits by setting parity.
89 */
90static void
91extractdeskey(MINT *ck, DesData *deskey)
92{
93 MINT *a;
94 MINT *z;
95 short r;
96 int i;
97 short base = (1 << 8);
98 char *k;
99
100 z = itom(0);
101 a = itom(0);
102 madd(ck, z, a);
100 z = mp_itom(0);
101 a = mp_itom(0);
102 mp_madd(ck, z, a);
103 for (i = 0; i < ((KEYSIZE - 64) / 2) / 8; i++) {
103 for (i = 0; i < ((KEYSIZE - 64) / 2) / 8; i++) {
104 sdiv(a, base, a, &r);
104 mp_sdiv(a, base, a, &r);
105 }
106 k = (char *)deskey;
107 for (i = 0; i < 8; i++) {
105 }
106 k = (char *)deskey;
107 for (i = 0; i < 8; i++) {
108 sdiv(a, base, a, &r);
108 mp_sdiv(a, base, a, &r);
109 *k++ = r;
110 }
109 *k++ = r;
110 }
111 mfree(z);
112 mfree(a);
111 mp_mfree(z);
112 mp_mfree(a);
113}
114
115/*
116 * get common key from my secret key and his public key
117 */
118void
119common_key(char *xsecret, char *xpublic, IdeaData *ideakey, DesData *deskey)
120{
121 MINT *public;
122 MINT *secret;
123 MINT *common;
113}
114
115/*
116 * get common key from my secret key and his public key
117 */
118void
119common_key(char *xsecret, char *xpublic, IdeaData *ideakey, DesData *deskey)
120{
121 MINT *public;
122 MINT *secret;
123 MINT *common;
124 MINT *modulus = xtom(HEXMODULUS);
124 MINT *modulus = mp_xtom(HEXMODULUS);
125
125
126 public = xtom(xpublic);
127 secret = xtom(xsecret);
128 common = itom(0);
129 pow(public, secret, modulus, common);
126 public = mp_xtom(xpublic);
127 secret = mp_xtom(xsecret);
128 common = mp_itom(0);
129 mp_pow(public, secret, modulus, common);
130 extractdeskey(common, deskey);
131 extractideakey(common, ideakey);
132 des_set_odd_parity(deskey);
130 extractdeskey(common, deskey);
131 extractideakey(common, ideakey);
132 des_set_odd_parity(deskey);
133 mfree(common);
134 mfree(secret);
135 mfree(public);
136 mfree(modulus);
133 mp_mfree(common);
134 mp_mfree(secret);
135 mp_mfree(public);
136 mp_mfree(modulus);
137}
138
139/*
140 * Generate a seed
141 */
142static void
143getseed(char *seed, int seedsize)
144{

--- 11 unchanged lines hidden (view full) ---

156void
157genkeys(char *public, char *secret)
158{
159 size_t i;
160
161# define BASEBITS (8*sizeof(short) - 1)
162# define BASE (1 << BASEBITS)
163
137}
138
139/*
140 * Generate a seed
141 */
142static void
143getseed(char *seed, int seedsize)
144{

--- 11 unchanged lines hidden (view full) ---

156void
157genkeys(char *public, char *secret)
158{
159 size_t i;
160
161# define BASEBITS (8*sizeof(short) - 1)
162# define BASE (1 << BASEBITS)
163
164 MINT *pk = itom(0);
165 MINT *sk = itom(0);
164 MINT *pk = mp_itom(0);
165 MINT *sk = mp_itom(0);
166 MINT *tmp;
166 MINT *tmp;
167 MINT *base = itom(BASE);
168 MINT *root = itom(PROOT);
169 MINT *modulus = xtom(HEXMODULUS);
167 MINT *base = mp_itom(BASE);
168 MINT *root = mp_itom(PROOT);
169 MINT *modulus = mp_xtom(HEXMODULUS);
170 short r;
171 unsigned short seed[KEYSIZE/BASEBITS + 1];
172 char *xkey;
173
174 getseed((char *)seed, sizeof(seed));
175 for (i = 0; i < KEYSIZE/BASEBITS + 1; i++) {
176 r = seed[i] % BASE;
170 short r;
171 unsigned short seed[KEYSIZE/BASEBITS + 1];
172 char *xkey;
173
174 getseed((char *)seed, sizeof(seed));
175 for (i = 0; i < KEYSIZE/BASEBITS + 1; i++) {
176 r = seed[i] % BASE;
177 tmp = itom(r);
178 mult(sk, base, sk);
179 madd(sk, tmp, sk);
180 mfree(tmp);
177 tmp = mp_itom(r);
178 mp_mult(sk, base, sk);
179 mp_madd(sk, tmp, sk);
180 mp_mfree(tmp);
181 }
181 }
182 tmp = itom(0);
183 mdiv(sk, modulus, tmp, sk);
184 mfree(tmp);
185 pow(root, sk, modulus, pk);
186 xkey = mtox(sk);
182 tmp = mp_itom(0);
183 mp_mdiv(sk, modulus, tmp, sk);
184 mp_mfree(tmp);
185 mp_pow(root, sk, modulus, pk);
186 xkey = mp_mtox(sk);
187 adjust(secret, xkey);
187 adjust(secret, xkey);
188 xkey = mtox(pk);
188 xkey = mp_mtox(pk);
189 adjust(public, xkey);
189 adjust(public, xkey);
190 mfree(sk);
191 mfree(base);
192 mfree(pk);
193 mfree(root);
194 mfree(modulus);
190 mp_mfree(sk);
191 mp_mfree(base);
192 mp_mfree(pk);
193 mp_mfree(root);
194 mp_mfree(modulus);
195}
196
197/*
198 * Adjust the input key so that it is 0-filled on the left
199 */
200static void
201adjust(char keyout[HEXKEYBYTES+1], char *keyin)
202{

--- 63 unchanged lines hidden ---
195}
196
197/*
198 * Adjust the input key so that it is 0-filled on the left
199 */
200static void
201adjust(char keyout[HEXKEYBYTES+1], char *keyin)
202{

--- 63 unchanged lines hidden ---