/* * Copyright (C) 2011, 2015 Filip Pizlo. 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. * * THIS SOFTWARE IS PROVIDED BY FILIP PIZLO ``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 FILIP PIZLO 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 "tsf_internal.h" tsf_sha1_wtr_t *tsf_sha1_writer_create(void) { tsf_sha1_wtr_t *result=malloc(sizeof(tsf_sha1_wtr_t)); if (result==NULL) { tsf_set_errno("Could not malloc tsf_sha1_wtr_t"); return NULL; } tsf_SHA1Reset(&result->ctx); return result; } void tsf_sha1_writer_destroy(tsf_sha1_wtr_t *sha1) { free(sha1); } tsf_bool_t tsf_sha1_writer_write(void *arg, const void *buf, uint32_t len) { tsf_sha1_wtr_t *sha1=(tsf_sha1_wtr_t*)arg; if (sha1->ctx.Computed) { tsf_set_error(TSF_E_BAD_STATE, "Cannot write using a SHA1 writer after " "tsf_sha1_writer_finish() has been called"); return tsf_false; } tsf_SHA1Input(&sha1->ctx, (const uint8_t*)buf, len); if (sha1->ctx.Corrupted) { tsf_set_error(TSF_E_INTERNAL, "SHA1 writer has been corrupted."); return tsf_false; } return tsf_true; } uint32_t *tsf_sha1_writer_finish(tsf_sha1_wtr_t *sha1) { int32_t result=tsf_SHA1Result(&sha1->ctx); if (!result) { tsf_set_error(TSF_E_INTERNAL, "SHA1 writer has been corrupted and the result cannot " "be computed."); return NULL; } return tsf_sha1_writer_result(sha1); } uint32_t *tsf_sha1_writer_result(tsf_sha1_wtr_t *sha1) { return sha1->ctx.Message_Digest; } char *tsf_sha1_sum_to_str(uint32_t *sum) { const char *hex="0123456789abcdef"; unsigned i; char *result; char *cur; if (sum==NULL) { /* propagate the error. */ return NULL; } result=malloc(41); if (result==NULL) { tsf_set_errno("Could not malloc result in tsf_sha1_sum_to_str()"); return NULL; } cur=result; for (i=0;i<5;++i) { uint32_t word; unsigned j; word=sum[i]; for (j=0;j<4;++j) { *cur++ = hex[(word>>28)&0xF]; *cur++ = hex[(word>>24)&0xF]; word<<=8; } } *cur=0; return result; }