diff options
Diffstat (limited to 'rpmio/digest.c')
-rw-r--r-- | rpmio/digest.c | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/rpmio/digest.c b/rpmio/digest.c index 4c51914ee..af4f8c02d 100644 --- a/rpmio/digest.c +++ b/rpmio/digest.c @@ -23,8 +23,9 @@ */ struct DIGEST_CTX_s { rpmDigestFlags flags; /*!< Bit(s) to control digest operation. */ - uint32 digestlen; /*!< No. bytes of digest. */ uint32 datalen; /*!< No. bytes in block of plaintext data. */ + uint32 paramlen; /*!< No. bytes of digest parameters. */ + uint32 digestlen; /*!< No. bytes of digest. */ void * param; /*!< Digest parameters. */ int (*Reset) (void * param) /*@modifies param @*/; /*!< Digest initialize. */ @@ -37,60 +38,70 @@ struct DIGEST_CTX_s { DIGEST_CTX rpmDigestDup(DIGEST_CTX octx) { - DIGEST_CTX nctx = xcalloc(1, sizeof(*nctx)); - memcpy(nctx, octx, sizeof(*nctx)); + DIGEST_CTX nctx = memcpy(xcalloc(1, sizeof(*nctx)), octx, sizeof(*nctx)); + nctx->param = memcpy(xcalloc(1, nctx->paramlen), octx->param, nctx->paramlen); return nctx; } DIGEST_CTX -rpmDigestInit(rpmDigestFlags flags) +rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags) { DIGEST_CTX ctx = xcalloc(1, sizeof(*ctx)); + int xx; ctx->flags = flags; - if (flags & RPMDIGEST_MD5) { + switch (hashalgo) { + case PGPHASHALGO_MD5: ctx->digestlen = 16; ctx->datalen = 64; /*@-sizeoftype@*/ /* FIX: union, not void pointer */ - ctx->param = xcalloc(1, sizeof(md5Param)); + ctx->paramlen = sizeof(md5Param); /*@=sizeoftype@*/ + ctx->param = xcalloc(1, ctx->paramlen); /*@-type@*/ /* FIX: cast? */ ctx->Reset = (void *) md5Reset; ctx->Update = (void *) md5Update; ctx->Digest = (void *) md5Digest; /*@=type@*/ - } - - if (flags & RPMDIGEST_SHA1) { + break; + case PGPHASHALGO_SHA1: ctx->digestlen = 20; ctx->datalen = 64; /*@-sizeoftype@*/ /* FIX: union, not void pointer */ - ctx->param = xcalloc(1, sizeof(sha1Param)); + ctx->paramlen = sizeof(sha1Param); /*@=sizeoftype@*/ + ctx->param = xcalloc(1, ctx->paramlen); /*@-type@*/ /* FIX: cast? */ ctx->Reset = (void *) sha1Reset; ctx->Update = (void *) sha1Update; ctx->Digest = (void *) sha1Digest; /*@=type@*/ + break; + case PGPHASHALGO_RIPEMD160: + case PGPHASHALGO_MD2: + case PGPHASHALGO_TIGER192: + case PGPHASHALGO_HAVAL_5_160: + default: + free(ctx); + return NULL; + /*@notreached@*/ break; } - /*@-noeffectuncon@*/ /* FIX: check rc */ - (void) (*ctx->Reset) (ctx->param); - /*@=noeffectuncon@*/ /* FIX: check rc */ + xx = (*ctx->Reset) (ctx->param); DPRINTF((stderr, "*** Init(%x) ctx %p param %p\n", flags, ctx, ctx->param)); return ctx; } -void +/*@-mustmod@*/ /* LCL: ctx->param may be modified, but ctx is abstract @*/ +int rpmDigestUpdate(DIGEST_CTX ctx, const void * data, size_t len) { DPRINTF((stderr, "*** Update(%p,%p,%d) param %p \"%s\"\n", ctx, data, len, ctx->param, ((char *)data))); - /*@-noeffectuncon@*/ /* FIX: check rc */ - (void) (*ctx->Update) (ctx->param, data, len); - /*@=noeffectuncon@*/ + return (*ctx->Update) (ctx->param, data, len); } +/*@=mustmod@*/ /*@unchecked@*/ static int _ie = 0x44332211; @@ -104,7 +115,7 @@ static union _dendian { #define IS_BIG_ENDIAN() (_endian->b[0] == '\x44') #define IS_LITTLE_ENDIAN() (_endian->b[0] == '\x11') -void +int rpmDigestFinal(/*@only@*/ DIGEST_CTX ctx, /*@out@*/ void ** datap, /*@out@*/ size_t *lenp, int asAscii) { @@ -150,7 +161,9 @@ DPRINTF((stderr, "*** Final(%p,%p,%p,%d) param %p digest %p\n", ctx, datap, lenp memset(digest, 0, ctx->digestlen); /* In case it's sensitive */ free(digest); } + memset(ctx->param, 0, ctx->paramlen); /* In case it's sensitive */ free(ctx->param); memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ free(ctx); + return 0; } |