version 1.3, 1999/10/01 18:18:40 |
version 1.4, 1999/11/23 22:25:54 |
|
|
|
|
Dug Song <dugsong@UMICH.EDU> |
Dug Song <dugsong@UMICH.EDU> |
*/ |
*/ |
|
|
#include "includes.h" |
#include "includes.h" |
|
|
#ifdef AFS |
#ifdef AFS |
#include <krb.h> |
#include <krb.h> |
|
|
char six2pr[64] = { |
char six2pr[64] = { |
'A','B','C','D','E','F','G','H','I','J','K','L','M', |
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', |
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', |
'n','o','p','q','r','s','t','u','v','w','x','y','z', |
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', |
'0','1','2','3','4','5','6','7','8','9','+','/' |
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' |
}; |
}; |
|
|
unsigned char pr2six[256]; |
unsigned char pr2six[256]; |
|
|
int uuencode(unsigned char *bufin, unsigned int nbytes, char *bufcoded) |
int |
|
uuencode(unsigned char *bufin, unsigned int nbytes, char *bufcoded) |
{ |
{ |
/* ENC is the basic 1 character encoding function to make a char printing */ |
/* ENC is the basic 1 character encoding function to make a char printing */ |
#define ENC(c) six2pr[c] |
#define ENC(c) six2pr[c] |
|
|
register char *outptr = bufcoded; |
register char *outptr = bufcoded; |
unsigned int i; |
unsigned int i; |
|
|
for (i=0; i<nbytes; i += 3) { |
for (i = 0; i < nbytes; i += 3) { |
*(outptr++) = ENC(*bufin >> 2); /* c1 */ |
*(outptr++) = ENC(*bufin >> 2); /* c1 */ |
*(outptr++) = ENC(((*bufin << 4) & 060) | ((bufin[1] >> 4) & 017)); /*c2*/ |
*(outptr++) = ENC(((*bufin << 4) & 060) | ((bufin[1] >> 4) & 017)); /* c2 */ |
*(outptr++) = ENC(((bufin[1] << 2) & 074) | ((bufin[2] >> 6) & 03));/*c3*/ |
*(outptr++) = ENC(((bufin[1] << 2) & 074) | ((bufin[2] >> 6) & 03)); /* c3 */ |
*(outptr++) = ENC(bufin[2] & 077); /* c4 */ |
*(outptr++) = ENC(bufin[2] & 077); /* c4 */ |
bufin += 3; |
bufin += 3; |
} |
} |
if (i == nbytes+1) { |
if (i == nbytes + 1) { |
outptr[-1] = '='; |
outptr[-1] = '='; |
} else if (i == nbytes+2) { |
} else if (i == nbytes + 2) { |
outptr[-1] = '='; |
outptr[-1] = '='; |
outptr[-2] = '='; |
outptr[-2] = '='; |
} |
} |
*outptr = '\0'; |
*outptr = '\0'; |
return(outptr - bufcoded); |
return (outptr - bufcoded); |
} |
} |
|
|
int uudecode(const char *bufcoded, unsigned char *bufplain, int outbufsize) |
int |
|
uudecode(const char *bufcoded, unsigned char *bufplain, int outbufsize) |
{ |
{ |
/* single character decode */ |
/* single character decode */ |
#define DEC(c) pr2six[(unsigned char)c] |
#define DEC(c) pr2six[(unsigned char)c] |
#define MAXVAL 63 |
#define MAXVAL 63 |
|
|
static int first = 1; |
static int first = 1; |
int nbytesdecoded, j; |
int nbytesdecoded, j; |
const char *bufin = bufcoded; |
const char *bufin = bufcoded; |
register unsigned char *bufout = bufplain; |
register unsigned char *bufout = bufplain; |
register int nprbytes; |
register int nprbytes; |
|
|
/* If this is the first call, initialize the mapping table. */ |
/* If this is the first call, initialize the mapping table. */ |
if (first) { |
if (first) { |
first = 0; |
first = 0; |
for(j=0; j<256; j++) pr2six[j] = MAXVAL+1; |
for (j = 0; j < 256; j++) |
for(j=0; j<64; j++) pr2six[(unsigned char)six2pr[j]] = (unsigned char)j; |
pr2six[j] = MAXVAL + 1; |
} |
for (j = 0; j < 64; j++) |
|
pr2six[(unsigned char) six2pr[j]] = (unsigned char) j; |
/* Strip leading whitespace. */ |
} |
while (*bufcoded==' ' || *bufcoded == '\t') bufcoded++; |
/* Strip leading whitespace. */ |
|
while (*bufcoded == ' ' || *bufcoded == '\t') |
/* Figure out how many characters are in the input buffer. |
bufcoded++; |
If this would decode into more bytes than would fit into |
|
the output buffer, adjust the number of input bytes downwards. */ |
/* Figure out how many characters are in the input buffer. If this |
bufin = bufcoded; |
would decode into more bytes than would fit into the output |
while (DEC(*(bufin++)) <= MAXVAL); |
buffer, adjust the number of input bytes downwards. */ |
nprbytes = bufin - bufcoded - 1; |
bufin = bufcoded; |
nbytesdecoded = ((nprbytes+3)/4) * 3; |
while (DEC(*(bufin++)) <= MAXVAL); |
if (nbytesdecoded > outbufsize) |
nprbytes = bufin - bufcoded - 1; |
nprbytes = (outbufsize*4)/3; |
nbytesdecoded = ((nprbytes + 3) / 4) * 3; |
|
if (nbytesdecoded > outbufsize) |
bufin = bufcoded; |
nprbytes = (outbufsize * 4) / 3; |
|
|
while (nprbytes > 0) { |
bufin = bufcoded; |
*(bufout++) = (unsigned char) (DEC(*bufin) << 2 | DEC(bufin[1]) >> 4); |
|
*(bufout++) = (unsigned char) (DEC(bufin[1]) << 4 | DEC(bufin[2]) >> 2); |
while (nprbytes > 0) { |
*(bufout++) = (unsigned char) (DEC(bufin[2]) << 6 | DEC(bufin[3])); |
*(bufout++) = (unsigned char) (DEC(*bufin) << 2 | DEC(bufin[1]) >> 4); |
bufin += 4; |
*(bufout++) = (unsigned char) (DEC(bufin[1]) << 4 | DEC(bufin[2]) >> 2); |
nprbytes -= 4; |
*(bufout++) = (unsigned char) (DEC(bufin[2]) << 6 | DEC(bufin[3])); |
} |
bufin += 4; |
if (nprbytes & 03) { |
nprbytes -= 4; |
if (DEC(bufin[-2]) > MAXVAL) |
} |
nbytesdecoded -= 2; |
if (nprbytes & 03) { |
else |
if (DEC(bufin[-2]) > MAXVAL) |
nbytesdecoded -= 1; |
nbytesdecoded -= 2; |
} |
else |
return(nbytesdecoded); |
nbytesdecoded -= 1; |
|
} |
|
return (nbytesdecoded); |
} |
} |
|
|
typedef unsigned char my_u_char; |
typedef unsigned char my_u_char; |
|
|
} |
} |
|
|
|
|
int creds_to_radix(CREDENTIALS *creds, unsigned char *buf) |
int |
|
creds_to_radix(CREDENTIALS *creds, unsigned char *buf) |
{ |
{ |
char *p, *s; |
char *p, *s; |
int len; |
int len; |
char temp[2048]; |
char temp[2048]; |
|
|
p = temp; |
|
*p++ = 1; /* version */ |
|
s = creds->service; while (*s) *p++ = *s++; *p++ = *s; |
|
s = creds->instance; while (*s) *p++ = *s++; *p++ = *s; |
|
s = creds->realm; while (*s) *p++ = *s++; *p++ = *s; |
|
|
|
s = creds->pname; while (*s) *p++ = *s++; *p++ = *s; |
p = temp; |
s = creds->pinst; while (*s) *p++ = *s++; *p++ = *s; |
*p++ = 1; /* version */ |
/* Null string to repeat the realm. */ |
s = creds->service; |
*p++ = '\0'; |
while (*s) |
|
*p++ = *s++; |
|
*p++ = *s; |
|
s = creds->instance; |
|
while (*s) |
|
*p++ = *s++; |
|
*p++ = *s; |
|
s = creds->realm; |
|
while (*s) |
|
*p++ = *s++; |
|
*p++ = *s; |
|
|
PUTLONG(creds->issue_date,p); |
s = creds->pname; |
{ |
while (*s) |
unsigned int endTime ; |
*p++ = *s++; |
endTime = (unsigned int)krb_life_to_time(creds->issue_date, |
*p++ = *s; |
creds->lifetime); |
s = creds->pinst; |
PUTLONG(endTime,p); |
while (*s) |
} |
*p++ = *s++; |
|
*p++ = *s; |
|
/* Null string to repeat the realm. */ |
|
*p++ = '\0'; |
|
|
memcpy(p,&creds->session, sizeof(creds->session)); |
PUTLONG(creds->issue_date, p); |
p += sizeof(creds->session); |
{ |
|
unsigned int endTime; |
PUTSHORT(creds->kvno,p); |
endTime = (unsigned int) krb_life_to_time(creds->issue_date, |
PUTLONG(creds->ticket_st.length,p); |
creds->lifetime); |
|
PUTLONG(endTime, p); |
memcpy(p,creds->ticket_st.dat, creds->ticket_st.length); |
} |
p += creds->ticket_st.length; |
|
len = p - temp; |
|
|
|
return(uuencode(temp, len, buf)); |
memcpy(p, &creds->session, sizeof(creds->session)); |
|
p += sizeof(creds->session); |
|
|
|
PUTSHORT(creds->kvno, p); |
|
PUTLONG(creds->ticket_st.length, p); |
|
|
|
memcpy(p, creds->ticket_st.dat, creds->ticket_st.length); |
|
p += creds->ticket_st.length; |
|
len = p - temp; |
|
|
|
return (uuencode(temp, len, buf)); |
} |
} |
|
|
int radix_to_creds(const char *buf, CREDENTIALS *creds) |
int |
|
radix_to_creds(const char *buf, CREDENTIALS *creds) |
{ |
{ |
|
|
char *p; |
char *p; |
int len, tl; |
int len, tl; |
char version; |
char version; |
char temp[2048]; |
char temp[2048]; |
|
|
if (!(len = uudecode(buf, temp, sizeof(temp)))) |
|
return 0; |
|
|
|
p = temp; |
|
|
|
/* check version and length! */ |
if (!(len = uudecode(buf, temp, sizeof(temp)))) |
if (len < 1) return 0; |
return 0; |
version = *p; p++; len--; |
|
|
|
GETSTRING(creds->service, p, len); |
p = temp; |
GETSTRING(creds->instance, p, len); |
|
GETSTRING(creds->realm, p, len); |
|
|
|
GETSTRING(creds->pname, p, len); |
|
GETSTRING(creds->pinst, p, len); |
|
/* Ignore possibly different realm. */ |
|
while (*p && len) p++, len--; |
|
if (len == 0) return 0; |
|
p++, len--; |
|
|
|
/* Enough space for remaining fixed-length parts? */ |
|
if (len < (4 + 4 + sizeof(creds->session) + 2 + 4)) |
|
return 0; |
|
|
|
GETLONG(creds->issue_date,p); |
|
len -= 4; |
|
{ |
|
unsigned int endTime; |
|
GETLONG(endTime,p); |
|
len -= 4; |
|
creds->lifetime = krb_time_to_life(creds->issue_date, endTime); |
|
} |
|
|
|
memcpy(&creds->session, p, sizeof(creds->session)); |
/* check version and length! */ |
p += sizeof(creds->session); |
if (len < 1) |
len -= sizeof(creds->session); |
return 0; |
|
version = *p; |
GETSHORT(creds->kvno,p); |
p++; |
len -= 2; |
len--; |
GETLONG(creds->ticket_st.length,p); |
|
len -= 4; |
|
|
|
tl = creds->ticket_st.length; |
GETSTRING(creds->service, p, len); |
if (tl < 0 || tl > len || tl > sizeof(creds->ticket_st.dat)) |
GETSTRING(creds->instance, p, len); |
return 0; |
GETSTRING(creds->realm, p, len); |
|
|
memcpy(creds->ticket_st.dat, p, tl); |
|
p += tl; |
|
len -= tl; |
|
|
|
return 1; |
|
} |
|
|
|
|
GETSTRING(creds->pname, p, len); |
|
GETSTRING(creds->pinst, p, len); |
|
/* Ignore possibly different realm. */ |
|
while (*p && len) |
|
p++, len--; |
|
if (len == 0) |
|
return 0; |
|
p++, len--; |
|
|
|
/* Enough space for remaining fixed-length parts? */ |
|
if (len < (4 + 4 + sizeof(creds->session) + 2 + 4)) |
|
return 0; |
|
|
|
GETLONG(creds->issue_date, p); |
|
len -= 4; |
|
{ |
|
unsigned int endTime; |
|
GETLONG(endTime, p); |
|
len -= 4; |
|
creds->lifetime = krb_time_to_life(creds->issue_date, endTime); |
|
} |
|
|
|
memcpy(&creds->session, p, sizeof(creds->session)); |
|
p += sizeof(creds->session); |
|
len -= sizeof(creds->session); |
|
|
|
GETSHORT(creds->kvno, p); |
|
len -= 2; |
|
GETLONG(creds->ticket_st.length, p); |
|
len -= 4; |
|
|
|
tl = creds->ticket_st.length; |
|
if (tl < 0 || tl > len || tl > sizeof(creds->ticket_st.dat)) |
|
return 0; |
|
|
|
memcpy(creds->ticket_st.dat, p, tl); |
|
p += tl; |
|
len -= tl; |
|
|
|
return 1; |
|
} |
#endif /* AFS */ |
#endif /* AFS */ |