254 |
{ |
{ |
255 |
u_char *encr_text; |
u_char *encr_text; |
256 |
size_t encr_size; |
size_t encr_size; |
257 |
unsigned short salt; |
char *plaintext; |
258 |
|
size_t length = strlen(password); |
259 |
salt = htons( (((long)pair ^ *(long *)vector) & 0xffff) | 0x8000 ); |
unsigned short salt = htons( (((long)pair ^ *(long *)vector) & 0xffff) |
260 |
|
| 0x8000 ); |
261 |
|
|
262 |
|
plaintext = emalloc(length+2); |
263 |
|
plaintext[0] = length; |
264 |
|
memcpy(&plaintext[1], password, length + 1); |
265 |
encrypt_text(&encr_text, &encr_size, |
encrypt_text(&encr_text, &encr_size, |
266 |
password, vector, secret, |
plaintext, vector, secret, |
267 |
&salt, 2); |
(u_char*) &salt, 2); |
268 |
|
efree(plaintext); |
269 |
pair->avp_strlength = 4 + encr_size; |
|
270 |
|
pair->avp_strlength = 3 + encr_size; |
271 |
pair->avp_strvalue = emalloc(pair->avp_strlength); |
pair->avp_strvalue = emalloc(pair->avp_strlength); |
272 |
pair->avp_strvalue[0] = tag; |
pair->avp_strvalue[0] = tag; |
273 |
pair->avp_strvalue[1] = strlen(password); |
memcpy(&pair->avp_strvalue[1], &salt, 2); |
274 |
memcpy(&pair->avp_strvalue[2], &salt, 2); |
memcpy(&pair->avp_strvalue[3], encr_text, encr_size); |
|
memcpy(&pair->avp_strvalue[4], encr_text, encr_size); |
|
275 |
efree(encr_text); |
efree(encr_text); |
276 |
} |
} |
277 |
|
|
283 |
char *vector, /* Request authenticator */ |
char *vector, /* Request authenticator */ |
284 |
char *secret) /* Shared secret */ |
char *secret) /* Shared secret */ |
285 |
{ |
{ |
286 |
|
size_t length; |
287 |
decrypt_text(password, |
decrypt_text(password, |
288 |
pair->avp_strvalue + 4, |
pair->avp_strvalue + 3, |
289 |
pair->avp_strlength - 4, |
pair->avp_strlength - 3, |
290 |
vector, |
vector, |
291 |
secret, |
secret, |
292 |
&pair->avp_strvalue[2], |
&pair->avp_strvalue[1], |
293 |
2); |
2); |
294 |
password[pair->avp_strvalue[1]] = 0; |
length = *(u_char*) password; |
295 |
|
memmove(password, password + 1, length); |
296 |
|
password[length] = 0; |
297 |
*tag = pair->avp_strvalue[0]; |
*tag = pair->avp_strvalue[0]; |
298 |
} |
} |