1/* public key routines */ |
2/* $FreeBSD: head/contrib/telnet/libtelnet/pk.c 81965 2001-08-20 12:28:40Z markm $ */ |
3/* functions: 4 genkeys(char *public, char *secret) 5 common_key(char *secret, char *public, desData *deskey) 6 pk_encode(char *in, *out, DesData *deskey); 7 pk_decode(char *in, *out, DesData *deskey); 8 where 9 char public[HEXKEYBYTES + 1]; 10 char secret[HEXKEYBYTES + 1]; 11 */ 12 |
13#include <sys/time.h> |
14#include <openssl/des.h> |
15#include <fcntl.h> 16#include <stdio.h> 17#include <string.h> |
18#include "mp.h" 19#include "pk.h" |
20#if defined(SOLARIS2) || defined(LINUX) || defined(__FreeBSD__) |
21#include <stdlib.h> 22#endif 23 |
24static void adjust(char keyout[HEXKEYBYTES+1], char *keyin); 25 |
26/* 27 * Choose top 128 bits of the common key to use as our idea key. 28 */ |
29static void 30extractideakey(MINT *ck, IdeaData *ideakey) |
31{ 32 MINT *a; 33 MINT *z; 34 short r; 35 int i; 36 short base = (1 << 8); 37 char *k; 38 --- 11 unchanged lines hidden (view full) --- 50 mfree(z); 51 mfree(a); 52} 53 54/* 55 * Choose middle 64 bits of the common key to use as our des key, possibly 56 * overwriting the lower order bits by setting parity. 57 */ |
58static void 59extractdeskey(MINT *ck, DesData *deskey) |
60{ 61 MINT *a; 62 MINT *z; 63 short r; 64 int i; 65 short base = (1 << 8); 66 char *k; 67 --- 10 unchanged lines hidden (view full) --- 78 } 79 mfree(z); 80 mfree(a); 81} 82 83/* 84 * get common key from my secret key and his public key 85 */ |
86void 87common_key(char *xsecret, char *xpublic, IdeaData *ideakey, DesData *deskey) |
88{ 89 MINT *public; 90 MINT *secret; 91 MINT *common; 92 MINT *modulus = xtom(HEXMODULUS); 93 94 public = xtom(xpublic); 95 secret = xtom(xsecret); --- 7 unchanged lines hidden (view full) --- 103 des_set_odd_parity(deskey); 104#endif 105 mfree(common); 106 mfree(secret); 107 mfree(public); 108 mfree(modulus); 109} 110 |
111/* 112 * Generate a seed 113 */ |
114void 115getseed(char *seed, int seedsize) |
116{ |
117 int i; 118 119 srandomdev(); 120 for (i = 0; i < seedsize; i++) { 121 seed[i] = random() & 0xff; 122 } |
123} 124 |
125/* 126 * Generate a random public/secret key pair 127 */ |
128void 129genkeys(char *public, char *secret) |
130{ 131 int i; 132 133# define BASEBITS (8*sizeof(short) - 1) 134# define BASE (1 << BASEBITS) 135 136 MINT *pk = itom(0); 137 MINT *sk = itom(0); --- 26 unchanged lines hidden (view full) --- 164 mfree(pk); 165 mfree(root); 166 mfree(modulus); 167} 168 169/* 170 * Adjust the input key so that it is 0-filled on the left 171 */ |
172static void 173adjust(char keyout[HEXKEYBYTES+1], char *keyin) |
174{ 175 char *p; 176 char *s; 177 178 for (p = keyin; *p; p++) 179 ; 180 for (s = keyout + HEXKEYBYTES; p >= keyin; p--, s--) { 181 *s = *p; 182 } 183 while (s >= keyout) { 184 *s-- = '0'; 185 } 186} 187 188static char hextab[17] = "0123456789ABCDEF"; 189 190/* given a DES key, cbc encrypt and translate input to terminated hex */ |
191void 192pk_encode(char *in, char *out, DesData *key) |
193{ 194 char buf[256]; 195 DesData i; 196 des_key_schedule k; 197 int l,op,deslen; 198 199 memset(&i,0,sizeof(i)); 200 memset(buf,0,sizeof(buf)); 201 deslen = ((strlen(in) + 7)/8)*8; 202 des_key_sched(key, k); 203 des_cbc_encrypt(in,buf,deslen, k,&i,DES_ENCRYPT); 204 for (l=0,op=0;l<deslen;l++) { 205 out[op++] = hextab[(buf[l] & 0xf0) >> 4]; 206 out[op++] = hextab[(buf[l] & 0x0f)]; 207 } 208 out[op] = '\0'; 209} 210 211/* given a DES key, translate input from hex and decrypt */ |
212void 213pk_decode(char *in, char *out, DesData *key) |
214{ 215 char buf[256]; 216 DesData i; 217 des_key_schedule k; 218 int l,n1,n2,op; 219 220 memset(&i,0,sizeof(i)); 221 memset(buf,0,sizeof(buf)); --- 19 unchanged lines hidden --- |