Blame crypto/des/fcrypt.c

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