| /** @file | |
| ARC4 Wrapper Implementation over OpenSSL. | |
| Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include "InternalCryptLib.h" | |
| #include <openssl/rc4.h> | |
| /** | |
| Retrieves the size, in bytes, of the context buffer required for ARC4 operations. | |
| @return The size, in bytes, of the context buffer required for ARC4 operations. | |
| **/ | |
| UINTN | |
| EFIAPI | |
| Arc4GetContextSize ( | |
| VOID | |
| ) | |
| { | |
| // | |
| // Memory for 2 copies of RC4_KEY is allocated, one for working copy, and the other | |
| // for backup copy. When Arc4Reset() is called, we can use the backup copy to restore | |
| // the working copy to the initial state. | |
| // | |
| return (UINTN) (2 * sizeof (RC4_KEY)); | |
| } | |
| /** | |
| Initializes user-supplied memory as ARC4 context for subsequent use. | |
| This function initializes user-supplied memory pointed by Arc4Context as ARC4 context. | |
| In addition, it sets up all ARC4 key materials for subsequent encryption and decryption | |
| operations. | |
| If Arc4Context is NULL, then return FALSE. | |
| If Key is NULL, then return FALSE. | |
| If KeySize does not in the range of [5, 256] bytes, then return FALSE. | |
| @param[out] Arc4Context Pointer to ARC4 context being initialized. | |
| @param[in] Key Pointer to the user-supplied ARC4 key. | |
| @param[in] KeySize Size of ARC4 key in bytes. | |
| @retval TRUE ARC4 context initialization succeeded. | |
| @retval FALSE ARC4 context initialization failed. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| Arc4Init ( | |
| OUT VOID *Arc4Context, | |
| IN CONST UINT8 *Key, | |
| IN UINTN KeySize | |
| ) | |
| { | |
| RC4_KEY *Rc4Key; | |
| // | |
| // Check input parameters. | |
| // | |
| if (Arc4Context == NULL || Key == NULL || (KeySize < 5 || KeySize > 256)) { | |
| return FALSE; | |
| } | |
| Rc4Key = (RC4_KEY *) Arc4Context; | |
| RC4_set_key (Rc4Key, (UINT32) KeySize, Key); | |
| CopyMem (Rc4Key + 1, Rc4Key, sizeof (RC4_KEY)); | |
| return TRUE; | |
| } | |
| /** | |
| Performs ARC4 encryption on a data buffer of the specified size. | |
| This function performs ARC4 encryption on data buffer pointed by Input, of specified | |
| size of InputSize. | |
| Arc4Context should be already correctly initialized by Arc4Init(). Behavior with | |
| invalid ARC4 context is undefined. | |
| If Arc4Context is NULL, then return FALSE. | |
| If Input is NULL, then return FALSE. | |
| If Output is NULL, then return FALSE. | |
| @param[in, out] Arc4Context Pointer to the ARC4 context. | |
| @param[in] Input Pointer to the buffer containing the data to be encrypted. | |
| @param[in] InputSize Size of the Input buffer in bytes. | |
| @param[out] Output Pointer to a buffer that receives the ARC4 encryption output. | |
| @retval TRUE ARC4 encryption succeeded. | |
| @retval FALSE ARC4 encryption failed. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| Arc4Encrypt ( | |
| IN OUT VOID *Arc4Context, | |
| IN CONST UINT8 *Input, | |
| IN UINTN InputSize, | |
| OUT UINT8 *Output | |
| ) | |
| { | |
| RC4_KEY *Rc4Key; | |
| // | |
| // Check input parameters. | |
| // | |
| if (Arc4Context == NULL || Input == NULL || Output == NULL || InputSize > INT_MAX) { | |
| return FALSE; | |
| } | |
| Rc4Key = (RC4_KEY *) Arc4Context; | |
| RC4 (Rc4Key, (UINT32) InputSize, Input, Output); | |
| return TRUE; | |
| } | |
| /** | |
| Performs ARC4 decryption on a data buffer of the specified size. | |
| This function performs ARC4 decryption on data buffer pointed by Input, of specified | |
| size of InputSize. | |
| Arc4Context should be already correctly initialized by Arc4Init(). Behavior with | |
| invalid ARC4 context is undefined. | |
| If Arc4Context is NULL, then return FALSE. | |
| If Input is NULL, then return FALSE. | |
| If Output is NULL, then return FALSE. | |
| @param[in, out] Arc4Context Pointer to the ARC4 context. | |
| @param[in] Input Pointer to the buffer containing the data to be decrypted. | |
| @param[in] InputSize Size of the Input buffer in bytes. | |
| @param[out] Output Pointer to a buffer that receives the ARC4 decryption output. | |
| @retval TRUE ARC4 decryption succeeded. | |
| @retval FALSE ARC4 decryption failed. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| Arc4Decrypt ( | |
| IN OUT VOID *Arc4Context, | |
| IN UINT8 *Input, | |
| IN UINTN InputSize, | |
| OUT UINT8 *Output | |
| ) | |
| { | |
| RC4_KEY *Rc4Key; | |
| // | |
| // Check input parameters. | |
| // | |
| if (Arc4Context == NULL || Input == NULL || Output == NULL || InputSize > INT_MAX) { | |
| return FALSE; | |
| } | |
| Rc4Key = (RC4_KEY *) Arc4Context; | |
| RC4 (Rc4Key, (UINT32) InputSize, Input, Output); | |
| return TRUE; | |
| } | |
| /** | |
| Resets the ARC4 context to the initial state. | |
| The function resets the ARC4 context to the state it had immediately after the | |
| ARC4Init() function call. | |
| Contrary to ARC4Init(), Arc4Reset() requires no secret key as input, but ARC4 context | |
| should be already correctly initialized by ARC4Init(). | |
| If Arc4Context is NULL, then return FALSE. | |
| @param[in, out] Arc4Context Pointer to the ARC4 context. | |
| @retval TRUE ARC4 reset succeeded. | |
| @retval FALSE ARC4 reset failed. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| Arc4Reset ( | |
| IN OUT VOID *Arc4Context | |
| ) | |
| { | |
| RC4_KEY *Rc4Key; | |
| // | |
| // Check input parameters. | |
| // | |
| if (Arc4Context == NULL) { | |
| return FALSE; | |
| } | |
| Rc4Key = (RC4_KEY *) Arc4Context; | |
| CopyMem (Rc4Key, Rc4Key + 1, sizeof (RC4_KEY)); | |
| return TRUE; | |
| } |