xref: /third_party/openssl/crypto/rc4/rc4_enc.c (revision e1051a39)
1e1051a39Sopenharmony_ci/*
2e1051a39Sopenharmony_ci * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci *
4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci * this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci */
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci/*
11e1051a39Sopenharmony_ci * RC4 low level APIs are deprecated for public use, but still ok for internal
12e1051a39Sopenharmony_ci * use.
13e1051a39Sopenharmony_ci */
14e1051a39Sopenharmony_ci#include "internal/deprecated.h"
15e1051a39Sopenharmony_ci
16e1051a39Sopenharmony_ci#include <openssl/rc4.h>
17e1051a39Sopenharmony_ci#include "rc4_local.h"
18e1051a39Sopenharmony_ci
19e1051a39Sopenharmony_ci/*-
20e1051a39Sopenharmony_ci * RC4 as implemented from a posting from
21e1051a39Sopenharmony_ci * Newsgroups: sci.crypt
22e1051a39Sopenharmony_ci * Subject: RC4 Algorithm revealed.
23e1051a39Sopenharmony_ci * Message-ID: <sternCvKL4B.Hyy@netcom.com>
24e1051a39Sopenharmony_ci * Date: Wed, 14 Sep 1994 06:35:31 GMT
25e1051a39Sopenharmony_ci */
26e1051a39Sopenharmony_ci
27e1051a39Sopenharmony_civoid RC4(RC4_KEY *key, size_t len, const unsigned char *indata,
28e1051a39Sopenharmony_ci         unsigned char *outdata)
29e1051a39Sopenharmony_ci{
30e1051a39Sopenharmony_ci    register RC4_INT *d;
31e1051a39Sopenharmony_ci    register RC4_INT x, y, tx, ty;
32e1051a39Sopenharmony_ci    size_t i;
33e1051a39Sopenharmony_ci
34e1051a39Sopenharmony_ci    x = key->x;
35e1051a39Sopenharmony_ci    y = key->y;
36e1051a39Sopenharmony_ci    d = key->data;
37e1051a39Sopenharmony_ci
38e1051a39Sopenharmony_ci#define LOOP(in,out) \
39e1051a39Sopenharmony_ci                x=((x+1)&0xff); \
40e1051a39Sopenharmony_ci                tx=d[x]; \
41e1051a39Sopenharmony_ci                y=(tx+y)&0xff; \
42e1051a39Sopenharmony_ci                d[x]=ty=d[y]; \
43e1051a39Sopenharmony_ci                d[y]=tx; \
44e1051a39Sopenharmony_ci                (out) = d[(tx+ty)&0xff]^ (in);
45e1051a39Sopenharmony_ci
46e1051a39Sopenharmony_ci    i = len >> 3;
47e1051a39Sopenharmony_ci    if (i) {
48e1051a39Sopenharmony_ci        for (;;) {
49e1051a39Sopenharmony_ci            LOOP(indata[0], outdata[0]);
50e1051a39Sopenharmony_ci            LOOP(indata[1], outdata[1]);
51e1051a39Sopenharmony_ci            LOOP(indata[2], outdata[2]);
52e1051a39Sopenharmony_ci            LOOP(indata[3], outdata[3]);
53e1051a39Sopenharmony_ci            LOOP(indata[4], outdata[4]);
54e1051a39Sopenharmony_ci            LOOP(indata[5], outdata[5]);
55e1051a39Sopenharmony_ci            LOOP(indata[6], outdata[6]);
56e1051a39Sopenharmony_ci            LOOP(indata[7], outdata[7]);
57e1051a39Sopenharmony_ci            indata += 8;
58e1051a39Sopenharmony_ci            outdata += 8;
59e1051a39Sopenharmony_ci            if (--i == 0)
60e1051a39Sopenharmony_ci                break;
61e1051a39Sopenharmony_ci        }
62e1051a39Sopenharmony_ci    }
63e1051a39Sopenharmony_ci    i = len & 0x07;
64e1051a39Sopenharmony_ci    if (i) {
65e1051a39Sopenharmony_ci        for (;;) {
66e1051a39Sopenharmony_ci            LOOP(indata[0], outdata[0]);
67e1051a39Sopenharmony_ci            if (--i == 0)
68e1051a39Sopenharmony_ci                break;
69e1051a39Sopenharmony_ci            LOOP(indata[1], outdata[1]);
70e1051a39Sopenharmony_ci            if (--i == 0)
71e1051a39Sopenharmony_ci                break;
72e1051a39Sopenharmony_ci            LOOP(indata[2], outdata[2]);
73e1051a39Sopenharmony_ci            if (--i == 0)
74e1051a39Sopenharmony_ci                break;
75e1051a39Sopenharmony_ci            LOOP(indata[3], outdata[3]);
76e1051a39Sopenharmony_ci            if (--i == 0)
77e1051a39Sopenharmony_ci                break;
78e1051a39Sopenharmony_ci            LOOP(indata[4], outdata[4]);
79e1051a39Sopenharmony_ci            if (--i == 0)
80e1051a39Sopenharmony_ci                break;
81e1051a39Sopenharmony_ci            LOOP(indata[5], outdata[5]);
82e1051a39Sopenharmony_ci            if (--i == 0)
83e1051a39Sopenharmony_ci                break;
84e1051a39Sopenharmony_ci            LOOP(indata[6], outdata[6]);
85e1051a39Sopenharmony_ci            if (--i == 0)
86e1051a39Sopenharmony_ci                break;
87e1051a39Sopenharmony_ci        }
88e1051a39Sopenharmony_ci    }
89e1051a39Sopenharmony_ci    key->x = x;
90e1051a39Sopenharmony_ci    key->y = y;
91e1051a39Sopenharmony_ci}
92