blob: 1f3e794bc961f9967e5608f23a9a9a7e71c273f8 [file] [log] [blame]
/*
* Copyright (c) 2017, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "sha256_alt.h"
#ifdef MBEDTLS_SHA256_ALT
#include <string.h>
/**
* documented in sha256_alt.h
*/
void mbedtls_sha256_init(mbedtls_sha256_context *ctx)
{
memset((void *)ctx, 0x00, sizeof(ctx));
}
/**
* documented in sha256_alt.h
*/
void mbedtls_sha256_free(mbedtls_sha256_context *ctx)
{
memset((void *)ctx, 0x00, sizeof(ctx));
}
/**
* documented in sha256_alt.h
*/
void mbedtls_sha256_clone(mbedtls_sha256_context *dst, const mbedtls_sha256_context *src)
{
*dst = *src;
}
/**
* documented in sha256_alt.h
*/
void mbedtls_sha256_starts(mbedtls_sha256_context *ctx, int is224)
{
SHA256_initialize(ctx);
if (is224 != 0)
{
/* SHA-224 */
ctx->state[0] = 0xC1059ED8;
ctx->state[1] = 0x367CD507;
ctx->state[2] = 0x3070DD17;
ctx->state[3] = 0xF70E5939;
ctx->state[4] = 0xFFC00B31;
ctx->state[5] = 0x68581511;
ctx->state[6] = 0x64F98FA7;
ctx->state[7] = 0xBEFA4FA4;
}
}
/**
* documented in sha256_alt.h
*/
void mbedtls_sha256_update(mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen)
{
SHA256_execute(ctx, (uint8_t *)input, (uint32_t)ilen);
}
char *workaround_cc2650_rom;
/**
* documented in sha256_alt.h
*/
void mbedtls_sha256_finish(mbedtls_sha256_context *ctx, unsigned char output[32])
{
/* workaround for error in copy subroutine of SHA256 ROM implementation.
* Allocate an extra 64 bytes on the stack to make sure we have buffer
* room. This could be optomized out if you never call this function with
* a call stack shorter than 16 words, approx. 8 stack frames.
*
* The simple description is this:
* If the stack pointer is within 64bytes of the end of RAM
* the bug exposes it self.
* If the stack pointer is more then 64bytes from end of RAM
* There is no bug...
* Solution:
* Make a 64byte buffer on the stack..
* And force the compiler to think it requires this buffer.
*/
char buffer[ 64 ];
workaround_cc2650_rom = &buffer[0];
SHA256_output(ctx, (uint8_t *)output);
return;
}
/**
* documented in sha256_alt.h
*/
void mbedtls_sha256_process(mbedtls_sha256_context *ctx, const unsigned char data[64])
{
SHA256_execute(ctx, (uint8_t *)data, sizeof(unsigned char) * 64);
}
#endif /* MBEDTLS_SHA256_ALT */