Blame crypto/des/fcrypt.c

Packit Service 084de1
/*
Packit Service 084de1
 * Copyright 1998-2016 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
 *
Packit Service 084de1
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
 * this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
 * in the file LICENSE in the source distribution or at
Packit Service 084de1
 * https://www.openssl.org/source/license.html
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
/* NOCW */
Packit Service 084de1
#include <stdio.h>
Packit Service 084de1
#ifdef _OSD_POSIX
Packit Service 084de1
# ifndef CHARSET_EBCDIC
Packit Service 084de1
#  define CHARSET_EBCDIC 1
Packit Service 084de1
# endif
Packit Service 084de1
#endif
Packit Service 084de1
#ifdef CHARSET_EBCDIC
Packit Service 084de1
# include <openssl/ebcdic.h>
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
#include <openssl/crypto.h>
Packit Service 084de1
#include "des_local.h"
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Added more values to handle illegal salt values the way normal crypt()
Packit Service 084de1
 * implementations do.
Packit Service 084de1
 */
Packit Service 084de1
static unsigned const char con_salt[128] = {
Packit Service 084de1
    0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
Packit Service 084de1
    0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1,
Packit Service 084de1
    0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
Packit Service 084de1
    0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1,
Packit Service 084de1
    0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9,
Packit Service 084de1
    0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x01,
Packit Service 084de1
    0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
Packit Service 084de1
    0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
Packit Service 084de1
    0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12,
Packit Service 084de1
    0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A,
Packit Service 084de1
    0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22,
Packit Service 084de1
    0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
Packit Service 084de1
    0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C,
Packit Service 084de1
    0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
Packit Service 084de1
    0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
Packit Service 084de1
    0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44,
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
static unsigned const char cov_2char[64] = {
Packit Service 084de1
    0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
Packit Service 084de1
    0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
Packit Service 084de1
    0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C,
Packit Service 084de1
    0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54,
Packit Service 084de1
    0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62,
Packit Service 084de1
    0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
Packit Service 084de1
    0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72,
Packit Service 084de1
    0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
char *DES_crypt(const char *buf, const char *salt)
Packit Service 084de1
{
Packit Service 084de1
    static char buff[14];
Packit Service 084de1
Packit Service 084de1
#ifndef CHARSET_EBCDIC
Packit Service 084de1
    return DES_fcrypt(buf, salt, buff);
Packit Service 084de1
#else
Packit Service 084de1
    char e_salt[2 + 1];
Packit Service 084de1
    char e_buf[32 + 1];         /* replace 32 by 8 ? */
Packit Service 084de1
    char *ret;
Packit Service 084de1
Packit Service 084de1
    if (salt[0] == '\0' || salt[1] == '\0')
Packit Service 084de1
        return NULL;
Packit Service 084de1
Packit Service 084de1
    /* Copy salt, convert to ASCII. */
Packit Service 084de1
    e_salt[0] = salt[0];
Packit Service 084de1
    e_salt[1] = salt[1];
Packit Service 084de1
    e_salt[2] = '\0';
Packit Service 084de1
    ebcdic2ascii(e_salt, e_salt, sizeof(e_salt));
Packit Service 084de1
Packit Service 084de1
    /* Convert password to ASCII. */
Packit Service 084de1
    OPENSSL_strlcpy(e_buf, buf, sizeof(e_buf));
Packit Service 084de1
    ebcdic2ascii(e_buf, e_buf, sizeof(e_buf));
Packit Service 084de1
Packit Service 084de1
    /* Encrypt it (from/to ASCII); if it worked, convert back. */
Packit Service 084de1
    ret = DES_fcrypt(e_buf, e_salt, buff);
Packit Service 084de1
    if (ret != NULL)
Packit Service 084de1
        ascii2ebcdic(ret, ret, strlen(ret));
Packit Service 084de1
Packit Service 084de1
    return ret;
Packit Service 084de1
#endif
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
char *DES_fcrypt(const char *buf, const char *salt, char *ret)
Packit Service 084de1
{
Packit Service 084de1
    unsigned int i, j, x, y;
Packit Service 084de1
    DES_LONG Eswap0, Eswap1;
Packit Service 084de1
    DES_LONG out[2], ll;
Packit Service 084de1
    DES_cblock key;
Packit Service 084de1
    DES_key_schedule ks;
Packit Service 084de1
    unsigned char bb[9];
Packit Service 084de1
    unsigned char *b = bb;
Packit Service 084de1
    unsigned char c, u;
Packit Service 084de1
Packit Service 084de1
    x = ret[0] = salt[0];
Packit Service 084de1
    if (x == 0 || x >= sizeof(con_salt))
Packit Service 084de1
        return NULL;
Packit Service 084de1
    Eswap0 = con_salt[x] << 2;
Packit Service 084de1
    x = ret[1] = salt[1];
Packit Service 084de1
    if (x == 0 || x >= sizeof(con_salt))
Packit Service 084de1
        return NULL;
Packit Service 084de1
    Eswap1 = con_salt[x] << 6;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * EAY r=strlen(buf); r=(r+7)/8;
Packit Service 084de1
     */
Packit Service 084de1
    for (i = 0; i < 8; i++) {
Packit Service 084de1
        c = *(buf++);
Packit Service 084de1
        if (!c)
Packit Service 084de1
            break;
Packit Service 084de1
        key[i] = (c << 1);
Packit Service 084de1
    }
Packit Service 084de1
    for (; i < 8; i++)
Packit Service 084de1
        key[i] = 0;
Packit Service 084de1
Packit Service 084de1
    DES_set_key_unchecked(&key, &ks);
Packit Service 084de1
    fcrypt_body(&(out[0]), &ks, Eswap0, Eswap1);
Packit Service 084de1
Packit Service 084de1
    ll = out[0];
Packit Service 084de1
    l2c(ll, b);
Packit Service 084de1
    ll = out[1];
Packit Service 084de1
    l2c(ll, b);
Packit Service 084de1
    y = 0;
Packit Service 084de1
    u = 0x80;
Packit Service 084de1
    bb[8] = 0;
Packit Service 084de1
    for (i = 2; i < 13; i++) {
Packit Service 084de1
        c = 0;
Packit Service 084de1
        for (j = 0; j < 6; j++) {
Packit Service 084de1
            c <<= 1;
Packit Service 084de1
            if (bb[y] & u)
Packit Service 084de1
                c |= 1;
Packit Service 084de1
            u >>= 1;
Packit Service 084de1
            if (!u) {
Packit Service 084de1
                y++;
Packit Service 084de1
                u = 0x80;
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
        ret[i] = cov_2char[c];
Packit Service 084de1
    }
Packit Service 084de1
    ret[13] = '\0';
Packit Service 084de1
    return ret;
Packit Service 084de1
}