ReactOS  0.4.14-dev-317-g96040ec
rc2.c File Reference
#include "tomcrypt.h"
Include dependency graph for rc2.c:

Go to the source code of this file.

Functions

int rc2_setup (const unsigned char *key, int keylen, int bits, int rounds, rc2_key *rc2)
 
void rc2_ecb_encrypt (const unsigned char *plain, unsigned char *cipher, rc2_key *rc2)
 
void rc2_ecb_decrypt (const unsigned char *cipher, unsigned char *plain, rc2_key *rc2)
 

Variables

static const unsigned char permute [256]
 

Function Documentation

◆ rc2_ecb_decrypt()

void rc2_ecb_decrypt ( const unsigned char cipher,
unsigned char plain,
rc2_key rc2 
)

Definition at line 159 of file rc2.c.

162 {
163  unsigned x76, x54, x32, x10;
164  unsigned *xkey;
165  int i;
166 
167  xkey = rc2->xkey;
168 
169  x76 = ((unsigned)cipher[7] << 8) + (unsigned)cipher[6];
170  x54 = ((unsigned)cipher[5] << 8) + (unsigned)cipher[4];
171  x32 = ((unsigned)cipher[3] << 8) + (unsigned)cipher[2];
172  x10 = ((unsigned)cipher[1] << 8) + (unsigned)cipher[0];
173 
174  for (i = 15; i >= 0; i--) {
175  if (i == 4 || i == 10) {
176  x76 = (x76 - xkey[x54 & 63]) & 0xFFFF;
177  x54 = (x54 - xkey[x32 & 63]) & 0xFFFF;
178  x32 = (x32 - xkey[x10 & 63]) & 0xFFFF;
179  x10 = (x10 - xkey[x76 & 63]) & 0xFFFF;
180  }
181 
182  x76 = ((x76 << 11) | (x76 >> 5));
183  x76 = (x76 - ((x10 & ~x54) + (x32 & x54) + xkey[4*i+3])) & 0xFFFF;
184 
185  x54 = ((x54 << 13) | (x54 >> 3));
186  x54 = (x54 - ((x76 & ~x32) + (x10 & x32) + xkey[4*i+2])) & 0xFFFF;
187 
188  x32 = ((x32 << 14) | (x32 >> 2));
189  x32 = (x32 - ((x54 & ~x10) + (x76 & x10) + xkey[4*i+1])) & 0xFFFF;
190 
191  x10 = ((x10 << 15) | (x10 >> 1));
192  x10 = (x10 - ((x32 & ~x76) + (x54 & x76) + xkey[4*i+0])) & 0xFFFF;
193  }
194 
195  plain[0] = (unsigned char)x10;
196  plain[1] = (unsigned char)(x10 >> 8);
197  plain[2] = (unsigned char)x32;
198  plain[3] = (unsigned char)(x32 >> 8);
199  plain[4] = (unsigned char)x54;
200  plain[5] = (unsigned char)(x54 >> 8);
201  plain[6] = (unsigned char)x76;
202  plain[7] = (unsigned char)(x76 >> 8);
203 }
static DATA_BLOB cipher
Definition: protectdata.c:38
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned char
Definition: typeof.h:29
static const WCHAR rc2[]
Definition: oid.c:1216

Referenced by encrypt_block_impl().

◆ rc2_ecb_encrypt()

void rc2_ecb_encrypt ( const unsigned char plain,
unsigned char cipher,
rc2_key rc2 
)

Definition at line 111 of file rc2.c.

114 {
115  unsigned *xkey;
116  unsigned x76, x54, x32, x10, i;
117 
118  xkey = rc2->xkey;
119 
120  x76 = ((unsigned)plain[7] << 8) + (unsigned)plain[6];
121  x54 = ((unsigned)plain[5] << 8) + (unsigned)plain[4];
122  x32 = ((unsigned)plain[3] << 8) + (unsigned)plain[2];
123  x10 = ((unsigned)plain[1] << 8) + (unsigned)plain[0];
124 
125  for (i = 0; i < 16; i++) {
126  x10 = (x10 + (x32 & ~x76) + (x54 & x76) + xkey[4*i+0]) & 0xFFFF;
127  x10 = ((x10 << 1) | (x10 >> 15));
128 
129  x32 = (x32 + (x54 & ~x10) + (x76 & x10) + xkey[4*i+1]) & 0xFFFF;
130  x32 = ((x32 << 2) | (x32 >> 14));
131 
132  x54 = (x54 + (x76 & ~x32) + (x10 & x32) + xkey[4*i+2]) & 0xFFFF;
133  x54 = ((x54 << 3) | (x54 >> 13));
134 
135  x76 = (x76 + (x10 & ~x54) + (x32 & x54) + xkey[4*i+3]) & 0xFFFF;
136  x76 = ((x76 << 5) | (x76 >> 11));
137 
138  if (i == 4 || i == 10) {
139  x10 = (x10 + xkey[x76 & 63]) & 0xFFFF;
140  x32 = (x32 + xkey[x10 & 63]) & 0xFFFF;
141  x54 = (x54 + xkey[x32 & 63]) & 0xFFFF;
142  x76 = (x76 + xkey[x54 & 63]) & 0xFFFF;
143  }
144  }
145 
146  cipher[0] = (unsigned char)x10;
147  cipher[1] = (unsigned char)(x10 >> 8);
148  cipher[2] = (unsigned char)x32;
149  cipher[3] = (unsigned char)(x32 >> 8);
150  cipher[4] = (unsigned char)x54;
151  cipher[5] = (unsigned char)(x54 >> 8);
152  cipher[6] = (unsigned char)x76;
153  cipher[7] = (unsigned char)(x76 >> 8);
154 }
static DATA_BLOB cipher
Definition: protectdata.c:38
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned char
Definition: typeof.h:29
static const WCHAR rc2[]
Definition: oid.c:1216

Referenced by encrypt_block_impl().

◆ rc2_setup()

int rc2_setup ( const unsigned char key,
int  keylen,
int  bits,
int  rounds,
rc2_key rc2 
)

Definition at line 53 of file rc2.c.

54 {
55  unsigned *xkey = rc2->xkey;
56  unsigned char tmp[128];
57  unsigned T8, TM;
58  int i;
59 
60  if (keylen < 5 || keylen > 128) {
61  return CRYPT_INVALID_KEYSIZE;
62  }
63 
64  if (rounds != 0 && rounds != 16) {
65  return CRYPT_INVALID_ROUNDS;
66  }
67 
68  /* Following comment is from Eric Young's rc2 code: */
69  /* It has come to my attention that there are 2 versions of the RC2
70  * key schedule. One which is normal, and anther which has a hook to
71  * use a reduced key length.
72  * BSAFE uses the 'retarded' version. What I previously shipped is
73  * the same as specifying 1024 for the 'bits' parameter. BSAFE uses
74  * a version where the bits parameter is the same as len*8 */
75  /* Seems like MS uses the 'retarded' version, too.
76  * Adjust effective keylen bits */
77  if (bits <= 0) bits = keylen << 3;
78  if (bits > 1024) bits = 1024;
79 
80  for (i = 0; i < keylen; i++) {
81  tmp[i] = key[i] & 255;
82  }
83 
84  /* Phase 1: Expand input key to 128 bytes */
85  if (keylen < 128) {
86  for (i = keylen; i < 128; i++) {
87  tmp[i] = permute[(tmp[i - 1] + tmp[i - keylen]) & 255];
88  }
89  }
90 
91  /* Phase 2 - reduce effective key size to "bits" */
92  /*bits = keylen<<3; */
93  T8 = (unsigned)(bits+7)>>3;
94  TM = (255 >> (unsigned)(7 & -bits));
95  tmp[128 - T8] = permute[tmp[128 - T8] & TM];
96  for (i = 127 - T8; i >= 0; i--) {
97  tmp[i] = permute[tmp[i + 1] ^ tmp[i + T8]];
98  }
99 
100  /* Phase 3 - copy to xkey in little-endian order */
101  for (i = 0; i < 64; i++) {
102  xkey[i] = (unsigned)tmp[2*i] + ((unsigned)tmp[2*i+1] << 8);
103  }
104 
105  return CRYPT_OK;
106 }
static const unsigned char permute[256]
Definition: rc2.c:34
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static const WCHAR rc2[]
Definition: oid.c:1216
Definition: path.c:42

Referenced by setup_key_impl().

Variable Documentation

◆ permute

const unsigned char permute[256]
static
Initial value:
= {
217,120,249,196, 25,221,181,237, 40,233,253,121, 74,160,216,157,
198,126, 55,131, 43,118, 83,142, 98, 76,100,136, 68,139,251,162,
23,154, 89,245,135,179, 79, 19, 97, 69,109,141, 9,129,125, 50,
189,143, 64,235,134,183,123, 11,240,149, 33, 34, 92,107, 78,130,
84,214,101,147,206, 96,178, 28,115, 86,192, 20,167,140,241,220,
18,117,202, 31, 59,190,228,209, 66, 61,212, 48,163, 60,182, 38,
111,191, 14,218, 70,105, 7, 87, 39,242, 29,155,188,148, 67, 3,
248, 17,199,246,144,239, 62,231, 6,195,213, 47,200,102, 30,215,
8,232,234,222,128, 82,238,247,132,170,114,172, 53, 77,106, 42,
150, 26,210,113, 90, 21, 73,116, 75,159,208, 94, 4, 24,164,236,
194,224, 65,110, 15, 81,203,204, 36,145,175, 80,161,244,112, 57,
153,124, 58,133, 35,184,180,122,252, 2, 54, 91, 37, 85,151, 49,
45, 93,250,152,227,138,146,174, 5,223, 41, 16,103,108,186,201,
211, 0,230,207,225,158,168, 44, 99, 22, 1, 63, 88,226,137,169,
13, 56, 52, 27,171, 51,255,176,187, 72, 12, 95,185,177,205, 46,
197,243,219, 71,229,165,156,119, 10,166, 32,104,254,127,193,173
}

Definition at line 34 of file rc2.c.

Referenced by rc2_setup().