[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.17.2.1

1.1       deraadt     1: /*
1.13      deraadt     2:  * Copyright (c) 1999 Dug Song.  All rights reserved.
1.17.2.1! 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.17.2.1! jason      29: RCSID("$OpenBSD: radix.c,v 1.20 2002/04/23 12:58:26 markus Exp $");
1.12      djm        30:
1.1       deraadt    31: #ifdef AFS
                     32: #include <krb.h>
1.16      itojun     33:
                     34: #include <radix.h>
1.17.2.1! jason      35: #include "bufaux.h"
1.1       deraadt    36:
1.17.2.1! 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.17.2.1! jason      43:        buffer_init(&b);
1.1       deraadt    44:
1.17.2.1! jason      45:        buffer_put_char(&b, 1); /* version */
1.1       deraadt    46:
1.17.2.1! 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.17.2.1! jason      59:        buffer_put_char(&b, '\0');
1.1       deraadt    60:
1.17.2.1! 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 */
        !            68:        buffer_put_string(&b, creds->ticket_st.dat, creds->ticket_st.length);
        !            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.17.2.1! jason      95:        Buffer b;
        !            96:        char c, version, *space, *p;
        !            97:        u_int endTime;
        !            98:        int len, blen, ret;
1.1       deraadt    99:
1.17.2.1! jason     100:        ret = 0;
        !           101:        blen = strlen(buf);
1.4       markus    102:
1.17.2.1! jason     103:        /* sanity check for size */
        !           104:        if (blen > 8192)
1.4       markus    105:                return 0;
                    106:
1.17.2.1! jason     107:        buffer_init(&b);
        !           108:        space = buffer_append_space(&b, blen);
1.4       markus    109:
                    110:        /* check version and length! */
1.17.2.1! jason     111:        len = uudecode(buf, space, blen);
1.4       markus    112:        if (len < 1)
1.17.2.1! jason     113:                goto done;
1.4       markus    114:
1.17.2.1! jason     115:        version = buffer_get_char(&b);
1.4       markus    116:
1.17.2.1! 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.17.2.1! jason     123:        if (buffer_len(&b) == 0)
        !           124:                goto done;
1.4       markus    125:
1.17.2.1! 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.17.2.1! jason     133:        creds->issue_date = buffer_get_int(&b);
1.4       markus    134:
1.17.2.1! 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;
        !           151:
        !           152:        ret = 1;
        !           153: done:
        !           154:        buffer_free(&b);
        !           155:        return ret;
1.1       deraadt   156: }
                    157: #endif /* AFS */