Line data Source code
1 : /* 2 : * SPDX-License-Identifier: MPL-2.0 3 : * 4 : * This Source Code Form is subject to the terms of the Mozilla Public 5 : * License, v. 2.0. If a copy of the MPL was not distributed with this 6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. 7 : * 8 : * Copyright 2024 MonetDB Foundation; 9 : * Copyright August 2008 - 2023 MonetDB B.V.; 10 : * Copyright 1997 - July 2008 CWI. 11 : */ 12 : 13 : #include "monetdb_config.h" 14 : #include "rmd160.h" 15 : #include "ripemd160.h" 16 : 17 : void 18 39411 : RIPEMD160Reset(RIPEMD160Context *ctxt) 19 : { 20 39411 : MDinit(ctxt->digest); 21 39411 : ctxt->noverflow = 0; 22 39411 : ctxt->length = 0; 23 39411 : } 24 : 25 : void 26 78821 : RIPEMD160Input(RIPEMD160Context *ctxt, const uint8_t *bytes, unsigned bytecount) 27 : { 28 78821 : dword X[16]; 29 : 30 78821 : ctxt->length += bytecount; 31 78821 : if (ctxt->noverflow > 0) { 32 0 : assert(ctxt->noverflow < 64); 33 0 : if (ctxt->noverflow + bytecount < 64) { 34 0 : memcpy(ctxt->overflow + ctxt->noverflow, bytes, bytecount); 35 0 : ctxt->noverflow += bytecount; 36 0 : return; 37 : } 38 0 : unsigned l = 64 - ctxt->noverflow; 39 0 : memcpy(ctxt->overflow + ctxt->noverflow, bytes, l); 40 0 : const uint8_t *x = ctxt->overflow; 41 0 : for (int i = 0; i < 16; i++) { 42 0 : X[i] = BYTES_TO_DWORD(x); 43 0 : x += 4; 44 : } 45 0 : bytecount -= l; 46 0 : bytes += l; 47 0 : ctxt->noverflow = 0; 48 0 : MDcompress(ctxt->digest, X); 49 : } 50 157638 : while (bytecount >= 64) { 51 1339923 : for (int i = 0; i < 16; i++) { 52 1261104 : X[i] = BYTES_TO_DWORD(bytes); 53 1261104 : bytes += 4; 54 : } 55 78819 : bytecount -= 64; 56 78819 : MDcompress(ctxt->digest, X); 57 : } 58 78819 : if (bytecount > 0) 59 39411 : memcpy(ctxt->overflow, bytes, bytecount); 60 78819 : ctxt->noverflow = bytecount; 61 : } 62 : 63 : void 64 39411 : RIPEMD160Result(RIPEMD160Context *ctxt, uint8_t digest[RIPEMD160_DIGEST_LENGTH]) 65 : { 66 39411 : MDfinish(ctxt->digest, ctxt->overflow, (dword) ctxt->length, 0); 67 236436 : for (int i = 0; i < RIPEMD160_DIGEST_LENGTH; i += 4) { 68 197025 : digest[i] = (uint8_t) ctxt->digest[i >> 2]; 69 197025 : digest[i + 1] = (uint8_t) (ctxt->digest[i >> 2] >> 8); 70 197025 : digest[i + 2] = (uint8_t) (ctxt->digest[i >> 2] >> 16); 71 197025 : digest[i + 3] = (uint8_t) (ctxt->digest[i >> 2] >> 24); 72 : } 73 39407 : }