LCOV - code coverage report
Current view: top level - contrib/pgcrypto - px-hmac.c (source / functions) Coverage Total Hit
Test: Code coverage Lines: 0.0 % 84 0
Test Date: 2026-01-26 10:56:24 Functions: 0.0 % 8 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*
       2              :  * px-hmac.c
       3              :  *              HMAC implementation.
       4              :  *
       5              :  * Copyright (c) 2001 Marko Kreen
       6              :  * All rights reserved.
       7              :  *
       8              :  * Redistribution and use in source and binary forms, with or without
       9              :  * modification, are permitted provided that the following conditions
      10              :  * are met:
      11              :  * 1. Redistributions of source code must retain the above copyright
      12              :  *        notice, this list of conditions and the following disclaimer.
      13              :  * 2. Redistributions in binary form must reproduce the above copyright
      14              :  *        notice, this list of conditions and the following disclaimer in the
      15              :  *        documentation and/or other materials provided with the distribution.
      16              :  *
      17              :  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
      18              :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      19              :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      20              :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      21              :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      22              :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      23              :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      24              :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      25              :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      26              :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      27              :  * SUCH DAMAGE.
      28              :  *
      29              :  * contrib/pgcrypto/px-hmac.c
      30              :  */
      31              : 
      32              : #include "postgres.h"
      33              : 
      34              : #include "px.h"
      35              : 
      36              : #define HMAC_IPAD 0x36
      37              : #define HMAC_OPAD 0x5C
      38              : 
      39              : static unsigned
      40            0 : hmac_result_size(PX_HMAC *h)
      41              : {
      42            0 :         return px_md_result_size(h->md);
      43              : }
      44              : 
      45              : static unsigned
      46            0 : hmac_block_size(PX_HMAC *h)
      47              : {
      48            0 :         return px_md_block_size(h->md);
      49              : }
      50              : 
      51              : static void
      52            0 : hmac_init(PX_HMAC *h, const uint8 *key, unsigned klen)
      53              : {
      54            0 :         unsigned        bs,
      55              :                                 i;
      56            0 :         uint8      *keybuf;
      57            0 :         PX_MD      *md = h->md;
      58              : 
      59            0 :         bs = px_md_block_size(md);
      60            0 :         keybuf = palloc0(bs);
      61              : 
      62            0 :         if (klen > bs)
      63              :         {
      64            0 :                 px_md_update(md, key, klen);
      65            0 :                 px_md_finish(md, keybuf);
      66            0 :                 px_md_reset(md);
      67            0 :         }
      68              :         else
      69            0 :                 memcpy(keybuf, key, klen);
      70              : 
      71            0 :         for (i = 0; i < bs; i++)
      72              :         {
      73            0 :                 h->p.ipad[i] = keybuf[i] ^ HMAC_IPAD;
      74            0 :                 h->p.opad[i] = keybuf[i] ^ HMAC_OPAD;
      75            0 :         }
      76              : 
      77            0 :         px_memset(keybuf, 0, bs);
      78            0 :         pfree(keybuf);
      79              : 
      80            0 :         px_md_update(md, h->p.ipad, bs);
      81            0 : }
      82              : 
      83              : static void
      84            0 : hmac_reset(PX_HMAC *h)
      85              : {
      86            0 :         PX_MD      *md = h->md;
      87            0 :         unsigned        bs = px_md_block_size(md);
      88              : 
      89            0 :         px_md_reset(md);
      90            0 :         px_md_update(md, h->p.ipad, bs);
      91            0 : }
      92              : 
      93              : static void
      94            0 : hmac_update(PX_HMAC *h, const uint8 *data, unsigned dlen)
      95              : {
      96            0 :         px_md_update(h->md, data, dlen);
      97            0 : }
      98              : 
      99              : static void
     100            0 : hmac_finish(PX_HMAC *h, uint8 *dst)
     101              : {
     102            0 :         PX_MD      *md = h->md;
     103            0 :         unsigned        bs,
     104              :                                 hlen;
     105            0 :         uint8      *buf;
     106              : 
     107            0 :         bs = px_md_block_size(md);
     108            0 :         hlen = px_md_result_size(md);
     109              : 
     110            0 :         buf = palloc(hlen);
     111              : 
     112            0 :         px_md_finish(md, buf);
     113              : 
     114            0 :         px_md_reset(md);
     115            0 :         px_md_update(md, h->p.opad, bs);
     116            0 :         px_md_update(md, buf, hlen);
     117            0 :         px_md_finish(md, dst);
     118              : 
     119            0 :         px_memset(buf, 0, hlen);
     120            0 :         pfree(buf);
     121            0 : }
     122              : 
     123              : static void
     124            0 : hmac_free(PX_HMAC *h)
     125              : {
     126            0 :         unsigned        bs;
     127              : 
     128            0 :         bs = px_md_block_size(h->md);
     129            0 :         px_md_free(h->md);
     130              : 
     131            0 :         px_memset(h->p.ipad, 0, bs);
     132            0 :         px_memset(h->p.opad, 0, bs);
     133            0 :         pfree(h->p.ipad);
     134            0 :         pfree(h->p.opad);
     135            0 :         pfree(h);
     136            0 : }
     137              : 
     138              : 
     139              : /* PUBLIC FUNCTIONS */
     140              : 
     141              : int
     142            0 : px_find_hmac(const char *name, PX_HMAC **res)
     143              : {
     144            0 :         int                     err;
     145            0 :         PX_MD      *md;
     146            0 :         PX_HMAC    *h;
     147            0 :         unsigned        bs;
     148              : 
     149            0 :         err = px_find_digest(name, &md);
     150            0 :         if (err)
     151            0 :                 return err;
     152              : 
     153            0 :         bs = px_md_block_size(md);
     154            0 :         if (bs < 2)
     155              :         {
     156            0 :                 px_md_free(md);
     157            0 :                 return PXE_HASH_UNUSABLE_FOR_HMAC;
     158              :         }
     159              : 
     160            0 :         h = palloc_object(PX_HMAC);
     161            0 :         h->p.ipad = palloc(bs);
     162            0 :         h->p.opad = palloc(bs);
     163            0 :         h->md = md;
     164              : 
     165            0 :         h->result_size = hmac_result_size;
     166            0 :         h->block_size = hmac_block_size;
     167            0 :         h->reset = hmac_reset;
     168            0 :         h->update = hmac_update;
     169            0 :         h->finish = hmac_finish;
     170            0 :         h->free = hmac_free;
     171            0 :         h->init = hmac_init;
     172              : 
     173            0 :         *res = h;
     174              : 
     175            0 :         return 0;
     176            0 : }
        

Generated by: LCOV version 2.3.2-1