18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * pppcrypt.c - PPP/DES linkage for MS-CHAP and EAP SRP-SHA1 38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Extracted from chap_ms.c by James Carlson. 58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (c) 1995 Eric Rosenquist. All rights reserved. 78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Redistribution and use in source and binary forms, with or without 98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * modification, are permitted provided that the following conditions 108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * are met: 118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice, this list of conditions and the following disclaimer. 148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice, this list of conditions and the following disclaimer in 178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the documentation and/or other materials provided with the 188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * distribution. 198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3. The name(s) of the authors of this software must not be used to 218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * endorse or promote products derived from this software without 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * prior written permission. 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <errno.h> 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd.h" 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppcrypt.h" 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic u_char 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectGet7Bits(input, startBit) 398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *input; 408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint startBit; 418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int word; 438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project word = (unsigned)input[startBit / 8] << 8; 458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project word |= (unsigned)input[startBit / 8 + 1]; 468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project word >>= 15 - (startBit % 8 + 7); 488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return word & 0xFE; 508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectMakeKey(key, des_key) 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *key; /* IN 56 bit DES key missing parity bits */ 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *des_key; /* OUT 64 bit DES key with parity bits added */ 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_key[0] = Get7Bits(key, 0); 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_key[1] = Get7Bits(key, 7); 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_key[2] = Get7Bits(key, 14); 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_key[3] = Get7Bits(key, 21); 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_key[4] = Get7Bits(key, 28); 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_key[5] = Get7Bits(key, 35); 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_key[6] = Get7Bits(key, 42); 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_key[7] = Get7Bits(key, 49); 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef USE_CRYPT 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_set_odd_parity((des_cblock *)des_key); 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef USE_CRYPT 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * in == 8-byte string (expanded version of the 56-bit key) 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * out == 64-byte string where each byte is either 1 or 0 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Note that the low-order "bit" is always ignored by by setkey() 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectExpand(in, out) 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *in; 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *out; 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int j, c; 838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i; 848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i = 0; i < 64; in++){ 868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = *in; 878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (j = 7; j >= 0; j--) 888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *out++ = (c >> j) & 01; 898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project i += 8; 908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* The inverse of Expand 948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectCollapse(in, out) 978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *in; 988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *out; 998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int j; 1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i; 1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project unsigned int c; 1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i = 0; i < 64; i += 8, out++) { 1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = 0; 1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (j = 7; j >= 0; j--, in++) 1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c |= *in << j; 1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *out = c & 0xff; 1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool 1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDesSetkey(key) 1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *key; 1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char des_key[8]; 1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char crypt_key[66]; 1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project MakeKey(key, des_key); 1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project Expand(des_key, crypt_key); 1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project errno = 0; 1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project setkey((const char *)crypt_key); 1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (errno != 0) 1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (0); 1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (1); 1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool 1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDesEncrypt(clear, cipher) 1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *clear; /* IN 8 octets */ 1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *cipher; /* OUT 8 octets */ 1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char des_input[66]; 1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project Expand(clear, des_input); 1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project errno = 0; 1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project encrypt((char *)des_input, 0); 1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (errno != 0) 1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (0); 1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project Collapse(des_input, cipher); 1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (1); 1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool 1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDesDecrypt(cipher, clear) 1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *cipher; /* IN 8 octets */ 1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *clear; /* OUT 8 octets */ 1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_char des_input[66]; 1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project Expand(cipher, des_input); 1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project errno = 0; 1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project encrypt((char *)des_input, 1); 1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (errno != 0) 1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (0); 1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project Collapse(des_input, clear); 1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (1); 1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else /* USE_CRYPT */ 1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic des_key_schedule key_schedule; 1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool 1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDesSetkey(key) 1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *key; 1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_cblock des_key; 1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project MakeKey(key, des_key); 1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_set_key(&des_key, key_schedule); 1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (1); 1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool 174e7f221f12403dcb4081d08e28c54d3b2a1ab05eeChung-yih WangDesEncrypt(clear, cipher) 1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *clear; /* IN 8 octets */ 1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *cipher; /* OUT 8 octets */ 1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_ecb_encrypt((des_cblock *)clear, (des_cblock *)cipher, 1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project key_schedule, 1); 1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (1); 1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool 1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDesDecrypt(cipher, clear) 1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *cipher; /* IN 8 octets */ 1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_char *clear; /* OUT 8 octets */ 1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project des_ecb_encrypt((des_cblock *)cipher, (des_cblock *)clear, 1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project key_schedule, 0); 1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (1); 1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* USE_CRYPT */ 194