Add an implementation of RC4. This will be used by Rockchip booting but may be useful in other situations. Signed-off-by: Simon Glass <sjg@chromium.org>master
parent
6e780c7a7b
commit
1acab96d97
@ -0,0 +1,21 @@ |
||||
/*
|
||||
* (C) Copyright 2015 Google, Inc |
||||
* |
||||
* (C) Copyright 2008-2014 Rockchip Electronics |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef __RC4_H |
||||
#define __RC4_H |
||||
|
||||
/**
|
||||
* rc4_encode() - encode a buf with the RC4 cipher |
||||
* |
||||
* @buf: Buffer to encode (it is overwrite in the process |
||||
* @len: Length of buffer in bytes |
||||
* @key: 16-byte key to use |
||||
*/ |
||||
void rc4_encode(unsigned char *buf, unsigned int len, unsigned char key[16]); |
||||
|
||||
#endif |
@ -0,0 +1,49 @@ |
||||
/*
|
||||
* (C) Copyright 2015 Google, Inc |
||||
* |
||||
* (C) Copyright 2008-2014 Rockchip Electronics |
||||
* |
||||
* Rivest Cipher 4 (RC4) implementation |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef USE_HOSTCC |
||||
#include <common.h> |
||||
#endif |
||||
#include <rc4.h> |
||||
|
||||
void rc4_encode(unsigned char *buf, unsigned int len, unsigned char key[16]) |
||||
{ |
||||
unsigned char s[256], k[256], temp; |
||||
unsigned short i, j, t; |
||||
int ptr; |
||||
|
||||
j = 0; |
||||
for (i = 0; i < 256; i++) { |
||||
s[i] = (unsigned char)i; |
||||
j &= 0x0f; |
||||
k[i] = key[j]; |
||||
j++; |
||||
} |
||||
|
||||
j = 0; |
||||
for (i = 0; i < 256; i++) { |
||||
j = (j + s[i] + k[i]) % 256; |
||||
temp = s[i]; |
||||
s[i] = s[j]; |
||||
s[j] = temp; |
||||
} |
||||
|
||||
i = 0; |
||||
j = 0; |
||||
for (ptr = 0; ptr < len; ptr++) { |
||||
i = (i + 1) % 256; |
||||
j = (j + s[i]) % 256; |
||||
temp = s[i]; |
||||
s[i] = s[j]; |
||||
s[j] = temp; |
||||
t = (s[i] + (s[j] % 256)) % 256; |
||||
buf[ptr] = buf[ptr] ^ s[t]; |
||||
} |
||||
} |
Loading…
Reference in new issue