[BACK]Return to radix.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Annotation of src/usr.bin/ssh/radix.c, Revision 1.16.2.4

1.1       deraadt     1: /*
1.13      deraadt     2:  * Copyright (c) 1999 Dug Song.  All rights reserved.
1.16.2.2  jason       3:  * Copyright (c) 2002 Markus Friedl.  All rights reserved.
1.8       markus      4:  *
1.13      deraadt     5:  * Redistribution and use in source and binary forms, with or without
                      6:  * modification, are permitted provided that the following conditions
                      7:  * are met:
                      8:  * 1. Redistributions of source code must retain the above copyright
                      9:  *    notice, this list of conditions and the following disclaimer.
                     10:  * 2. Redistributions in binary form must reproduce the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer in the
                     12:  *    documentation and/or other materials provided with the distribution.
                     13:  *
                     14:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     15:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     16:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     17:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     18:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     19:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     20:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     21:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     22:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     23:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1.5       deraadt    24:  */
1.4       markus     25:
1.1       deraadt    26: #include "includes.h"
1.9       markus     27: #include "uuencode.h"
1.1       deraadt    28:
1.16.2.4! miod       29: RCSID("$OpenBSD: radix.c,v 1.16.2.3 2002/04/23 14:17:47 jason Exp $");
1.12      djm        30:
1.1       deraadt    31: #ifdef AFS
                     32: #include <krb.h>
1.16      itojun     33:
                     34: #include <radix.h>
1.16.2.2  jason      35: #include "bufaux.h"
1.1       deraadt    36:
1.16.2.2  jason      37: int
                     38: creds_to_radix(CREDENTIALS *creds, u_char *buf, size_t buflen)
                     39: {
                     40:        Buffer b;
                     41:        int ret;
1.1       deraadt    42:
1.16.2.2  jason      43:        buffer_init(&b);
1.1       deraadt    44:
1.16.2.2  jason      45:        buffer_put_char(&b, 1); /* version */
1.1       deraadt    46:
1.16.2.2  jason      47:        buffer_append(&b, creds->service, strlen(creds->service));
                     48:        buffer_put_char(&b, '\0');
                     49:        buffer_append(&b, creds->instance, strlen(creds->instance));
                     50:        buffer_put_char(&b, '\0');
                     51:        buffer_append(&b, creds->realm, strlen(creds->realm));
                     52:        buffer_put_char(&b, '\0');
                     53:        buffer_append(&b, creds->pname, strlen(creds->pname));
                     54:        buffer_put_char(&b, '\0');
                     55:        buffer_append(&b, creds->pinst, strlen(creds->pinst));
                     56:        buffer_put_char(&b, '\0');
1.1       deraadt    57:
1.4       markus     58:        /* Null string to repeat the realm. */
1.16.2.2  jason      59:        buffer_put_char(&b, '\0');
1.1       deraadt    60:
1.16.2.2  jason      61:        buffer_put_int(&b, creds->issue_date);
                     62:        buffer_put_int(&b, krb_life_to_time(creds->issue_date,
                     63:            creds->lifetime));
                     64:        buffer_append(&b, creds->session, sizeof(creds->session));
                     65:        buffer_put_short(&b, creds->kvno);
                     66:
                     67:        /* 32 bit size + data */
1.16.2.3  jason      68:        buffer_put_string(&b, creds->ticket_st.dat, creds->ticket_st.length);
1.16.2.2  jason      69:
                     70:        ret = uuencode(buffer_ptr(&b), buffer_len(&b), (char *)buf, buflen);
                     71:
                     72:        buffer_free(&b);
                     73:        return ret;
                     74: }
                     75:
                     76: #define GETSTRING(b, t, tlen) \
                     77:        do { \
                     78:                int i, found = 0; \
                     79:                for (i = 0; i < tlen; i++) { \
                     80:                        if (buffer_len(b) == 0) \
                     81:                                goto done; \
                     82:                        t[i] = buffer_get_char(b); \
                     83:                        if (t[i] == '\0') { \
                     84:                                found = 1; \
                     85:                                break; \
                     86:                        } \
                     87:                } \
                     88:                if (!found) \
                     89:                        goto done; \
                     90:        } while(0)
1.1       deraadt    91:
1.8       markus     92: int
1.4       markus     93: radix_to_creds(const char *buf, CREDENTIALS *creds)
1.1       deraadt    94: {
1.16.2.2  jason      95:        Buffer b;
                     96:        char c, version, *space, *p;
                     97:        u_int endTime;
                     98:        int len, blen, ret;
1.1       deraadt    99:
1.16.2.2  jason     100:        ret = 0;
                    101:        blen = strlen(buf);
1.4       markus    102:
1.16.2.2  jason     103:        /* sanity check for size */
                    104:        if (blen > 8192)
1.4       markus    105:                return 0;
                    106:
1.16.2.2  jason     107:        buffer_init(&b);
                    108:        space = buffer_append_space(&b, blen);
1.4       markus    109:
                    110:        /* check version and length! */
1.16.2.2  jason     111:        len = uudecode(buf, space, blen);
1.4       markus    112:        if (len < 1)
1.16.2.2  jason     113:                goto done;
1.4       markus    114:
1.16.2.2  jason     115:        version = buffer_get_char(&b);
1.4       markus    116:
1.16.2.2  jason     117:        GETSTRING(&b, creds->service, sizeof creds->service);
                    118:        GETSTRING(&b, creds->instance, sizeof creds->instance);
                    119:        GETSTRING(&b, creds->realm, sizeof creds->realm);
                    120:        GETSTRING(&b, creds->pname, sizeof creds->pname);
                    121:        GETSTRING(&b, creds->pinst, sizeof creds->pinst);
1.4       markus    122:
1.16.2.2  jason     123:        if (buffer_len(&b) == 0)
                    124:                goto done;
1.4       markus    125:
1.16.2.2  jason     126:        /* Ignore possibly different realm. */
                    127:        while (buffer_len(&b) > 0 && (c = buffer_get_char(&b)) != '\0')
                    128:                ;
                    129:
                    130:        if (buffer_len(&b) == 0)
                    131:                goto done;
1.4       markus    132:
1.16.2.2  jason     133:        creds->issue_date = buffer_get_int(&b);
1.4       markus    134:
1.16.2.2  jason     135:        endTime = buffer_get_int(&b);
                    136:        creds->lifetime = krb_time_to_life(creds->issue_date, endTime);
                    137:
                    138:        len = buffer_len(&b);
                    139:        if (len < sizeof(creds->session))
                    140:                goto done;
                    141:        memcpy(&creds->session, buffer_ptr(&b), sizeof(creds->session));
                    142:        buffer_consume(&b, sizeof(creds->session));
                    143:
                    144:        creds->kvno = buffer_get_short(&b);
                    145:
                    146:        p = buffer_get_string(&b, &len);
                    147:        if (len < 0 || len > sizeof(creds->ticket_st.dat))
                    148:                goto done;
                    149:        memcpy(&creds->ticket_st.dat, p, len);
                    150:        creds->ticket_st.length = len;
1.16.2.4! miod      151:
1.16.2.2  jason     152:        ret = 1;
                    153: done:
                    154:        buffer_free(&b);
                    155:        return ret;
1.1       deraadt   156: }
                    157: #endif /* AFS */