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