digest.c 16.3 KB
Newer Older
R
Rich Salz 已提交
1
/*
P
Paul Yang 已提交
2
 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
R
Rich Salz 已提交
5 6 7
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8
 */
9 10

#include <stdio.h>
11
#include "internal/cryptlib.h"
12 13
#include <openssl/objects.h>
#include <openssl/evp.h>
R
Rich Salz 已提交
14
#include <openssl/engine.h>
15
#include "internal/evp_int.h"
M
Matt Caswell 已提交
16
#include "internal/provider.h"
17
#include "evp_locl.h"
18

19
/* This call frees resources associated with the context */
20
int EVP_MD_CTX_reset(EVP_MD_CTX *ctx)
21
{
22 23 24
    if (ctx == NULL)
        return 1;

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
    if (ctx->digest == NULL || ctx->digest->prov == NULL)
        goto legacy;

    if (ctx->provctx != NULL) {
        if (ctx->digest->freectx != NULL)
            ctx->digest->freectx(ctx->provctx);
        ctx->provctx = NULL;
        EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
    }

    if (ctx->pctx != NULL)
        goto legacy;

    return 1;

    /* TODO(3.0): Remove legacy code below */
 legacy:

43 44 45 46 47 48 49 50 51 52 53
    /*
     * Don't assume ctx->md_data was cleaned in EVP_Digest_Final, because
     * sometimes only copies of the context are ever finalised.
     */
    if (ctx->digest && ctx->digest->cleanup
        && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))
        ctx->digest->cleanup(ctx);
    if (ctx->digest && ctx->digest->ctx_size && ctx->md_data
        && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) {
        OPENSSL_clear_free(ctx->md_data, ctx->digest->ctx_size);
    }
P
Paul Yang 已提交
54 55
    /*
     * pctx should be freed by the user of EVP_MD_CTX
P
Paul Yang 已提交
56
     * if EVP_MD_CTX_FLAG_KEEP_PKEY_CTX is set
P
Paul Yang 已提交
57
     */
P
Paul Yang 已提交
58
    if (!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX))
P
Paul Yang 已提交
59
        EVP_PKEY_CTX_free(ctx->pctx);
60
#ifndef OPENSSL_NO_ENGINE
R
Rich Salz 已提交
61
    ENGINE_finish(ctx->engine);
62
#endif
63
    OPENSSL_cleanse(ctx, sizeof(*ctx));
64 65

    return 1;
66
}
67

68
EVP_MD_CTX *EVP_MD_CTX_new(void)
69
{
70 71
    return OPENSSL_zalloc(sizeof(EVP_MD_CTX));
}
72

73
void EVP_MD_CTX_free(EVP_MD_CTX *ctx)
74
{
75 76 77 78 79 80 81 82 83 84 85
    if (ctx == NULL)
        return;

    if (ctx->digest == NULL || ctx->digest->prov == NULL)
        goto legacy;

    EVP_MD_CTX_reset(ctx);

    EVP_MD_meth_free(ctx->fetched_digest);
    ctx->fetched_digest = NULL;
    ctx->digest = NULL;
86
    ctx->reqdigest = NULL;
87 88 89 90 91 92

    OPENSSL_free(ctx);
    return;

    /* TODO(3.0): Remove legacy code below */
 legacy:
93
    EVP_MD_CTX_reset(ctx);
94
    OPENSSL_free(ctx);
95
}
96

D
 
Dr. Stephen Henson 已提交
97
int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
98
{
99
    EVP_MD_CTX_reset(ctx);
100 101
    return EVP_DigestInit_ex(ctx, type, NULL);
}
B
Ben Laurie 已提交
102

103
int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
104
{
105 106 107
    EVP_MD *provmd;
    ENGINE *tmpimpl = NULL;

108
    EVP_MD_CTX_clear_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
109

110 111 112
    if (type != NULL)
        ctx->reqdigest = type;

113
    /* TODO(3.0): Legacy work around code below. Remove this */
114
#ifndef OPENSSL_NO_ENGINE
115 116 117 118
    /*
     * Whether it's nice or not, "Inits" can be used on "Final"'d contexts so
     * this context may already have an ENGINE! Try to avoid releasing the
     * previous handle, re-querying for an ENGINE, and having a
F
FdaSilvaYY 已提交
119
     * reinitialisation, when it may all be unnecessary.
120
     */
121 122
    if (ctx->engine && ctx->digest &&
        (type == NULL || (type->type == ctx->digest->type)))
123
        goto skip_to_init;
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

    if (type != NULL && impl == NULL)
        tmpimpl = ENGINE_get_digest_engine(type->type);
#endif

    /*
     * If there are engines involved or if we're being used as part of
     * EVP_DigestSignInit then we should use legacy handling for now.
     */
    if (ctx->engine != NULL
            || impl != NULL
            || tmpimpl != NULL
            || ctx->pctx != NULL
            || (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) != 0) {
        if (ctx->digest == ctx->fetched_digest)
            ctx->digest = NULL;
        EVP_MD_meth_free(ctx->fetched_digest);
        ctx->fetched_digest = NULL;
        goto legacy;
    }

    if (type->prov == NULL) {
        switch(type->type) {
147 148
        case NID_sha256:
            break;
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
        default:
            goto legacy;
        }
    }

    if (ctx->digest != NULL && ctx->digest->ctx_size > 0) {
        OPENSSL_clear_free(ctx->md_data, ctx->digest->ctx_size);
        ctx->md_data = NULL;
    }

    /* TODO(3.0): Start of non-legacy code below */

    if (type->prov == NULL) {
        provmd = EVP_MD_fetch(NULL, OBJ_nid2sn(type->type), "");
        if (provmd == NULL) {
            EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
            return 0;
        }
        type = provmd;
        EVP_MD_meth_free(ctx->fetched_digest);
        ctx->fetched_digest = provmd;
    }

    ctx->digest = type;
    if (ctx->provctx == NULL) {
        ctx->provctx = ctx->digest->newctx();
        if (ctx->provctx == NULL) {
            EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
            return 0;
        }
    }

    if (ctx->digest->dinit == NULL) {
        EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
        return 0;
    }

    return ctx->digest->dinit(ctx->provctx);

    /* TODO(3.0): Remove legacy code below */
 legacy:

#ifndef OPENSSL_NO_ENGINE
192 193 194 195 196 197
    if (type) {
        /*
         * Ensure an ENGINE left lying around from last time is cleared (the
         * previous check attempted to avoid this if the same ENGINE and
         * EVP_MD could be used).
         */
R
Rich Salz 已提交
198 199
        ENGINE_finish(ctx->engine);
        if (impl != NULL) {
200 201 202 203
            if (!ENGINE_init(impl)) {
                EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
                return 0;
            }
R
Rich Salz 已提交
204
        } else {
205
            /* Ask if an ENGINE is reserved for this job */
206
            impl = tmpimpl;
R
Rich Salz 已提交
207 208
        }
        if (impl != NULL) {
209 210
            /* There's an ENGINE for this job ... (apparently) */
            const EVP_MD *d = ENGINE_get_digest(impl, type->type);
R
Rich Salz 已提交
211 212

            if (d == NULL) {
213 214 215 216 217 218 219 220 221 222 223 224 225
                EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
                ENGINE_finish(impl);
                return 0;
            }
            /* We'll use the ENGINE's private digest definition */
            type = d;
            /*
             * Store the ENGINE functional reference so we know 'type' came
             * from an ENGINE and we need to release it when done.
             */
            ctx->engine = impl;
        } else
            ctx->engine = NULL;
226 227 228 229 230 231
    } else {
        if (!ctx->digest) {
            EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_NO_DIGEST_SET);
            return 0;
        }
        type = ctx->digest;
232
    }
233
#endif
234
    if (ctx->digest != type) {
235
        if (ctx->digest && ctx->digest->ctx_size) {
236
            OPENSSL_clear_free(ctx->md_data, ctx->digest->ctx_size);
237 238
            ctx->md_data = NULL;
        }
239 240 241
        ctx->digest = type;
        if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) {
            ctx->update = type->update;
R
Rich Salz 已提交
242
            ctx->md_data = OPENSSL_zalloc(type->ctx_size);
243 244 245 246 247 248
            if (ctx->md_data == NULL) {
                EVPerr(EVP_F_EVP_DIGESTINIT_EX, ERR_R_MALLOC_FAILURE);
                return 0;
            }
        }
    }
249
#ifndef OPENSSL_NO_ENGINE
250
 skip_to_init:
251
#endif
252 253 254 255 256 257 258 259 260 261 262
    if (ctx->pctx) {
        int r;
        r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG,
                              EVP_PKEY_CTRL_DIGESTINIT, 0, ctx);
        if (r <= 0 && (r != -2))
            return 0;
    }
    if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT)
        return 1;
    return ctx->digest->init(ctx);
}
263

B
Ben Laurie 已提交
264
int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count)
265
{
266 267 268
    if (count == 0)
        return 1;

269 270 271 272 273 274 275 276 277 278 279
    if (ctx->digest == NULL || ctx->digest->prov == NULL)
        goto legacy;

    if (ctx->digest->dupdate == NULL) {
        EVPerr(EVP_F_EVP_DIGESTUPDATE, EVP_R_UPDATE_ERROR);
        return 0;
    }
    return ctx->digest->dupdate(ctx->provctx, data, count);

    /* TODO(3.0): Remove legacy code below */
 legacy:
280 281
    return ctx->update(ctx, data, count);
}
282

283
/* The caller can assume that this removes any secret data from the context */
D
 
Dr. Stephen Henson 已提交
284
int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
285 286 287
{
    int ret;
    ret = EVP_DigestFinal_ex(ctx, md, size);
288
    EVP_MD_CTX_reset(ctx);
289 290
    return ret;
}
D
 
Dr. Stephen Henson 已提交
291 292

/* The caller can assume that this removes any secret data from the context */
293
int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *isize)
294 295
{
    int ret;
296 297 298 299
    size_t size = 0;

    if (ctx->digest == NULL || ctx->digest->prov == NULL)
        goto legacy;
300

301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
    if (ctx->digest->dfinal == NULL) {
        EVPerr(EVP_F_EVP_DIGESTFINAL_EX, EVP_R_FINAL_ERROR);
        return 0;
    }

    ret = ctx->digest->dfinal(ctx->provctx, md, &size);

    if (isize != NULL) {
        if (size <= UINT_MAX) {
            *isize = (int)size;
        } else {
            EVPerr(EVP_F_EVP_DIGESTFINAL_EX, EVP_R_FINAL_ERROR);
            ret = 0;
        }
    }

    EVP_MD_CTX_reset(ctx);

    return ret;

    /* TODO(3.0): Remove legacy code below */
 legacy:
323 324
    OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE);
    ret = ctx->digest->final(ctx, md);
325 326
    if (isize != NULL)
        *isize = ctx->digest->md_size;
327 328 329 330
    if (ctx->digest->cleanup) {
        ctx->digest->cleanup(ctx);
        EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
    }
331
    OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size);
332 333
    return ret;
}
334

335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, size_t size)
{
    int ret = 0;

    if (ctx->digest->flags & EVP_MD_FLAG_XOF
        && size <= INT_MAX
        && ctx->digest->md_ctrl(ctx, EVP_MD_CTRL_XOF_LEN, (int)size, NULL)) {
        ret = ctx->digest->final(ctx, md);

        if (ctx->digest->cleanup != NULL) {
            ctx->digest->cleanup(ctx);
            EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
        }
        OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size);
    } else {
        EVPerr(EVP_F_EVP_DIGESTFINALXOF, EVP_R_NOT_XOF_OR_INVALID_LENGTH);
    }

    return ret;
}

356
int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)
357
{
358
    EVP_MD_CTX_reset(out);
359 360
    return EVP_MD_CTX_copy_ex(out, in);
}
D
 
Dr. Stephen Henson 已提交
361 362

int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
363 364
{
    unsigned char *tmp_buf;
365 366

    if (in == NULL || in->digest == NULL) {
367 368 369
        EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_INPUT_NOT_INITIALIZED);
        return 0;
    }
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410

    if (in->digest->prov == NULL)
        goto legacy;

    if (in->digest->dupctx == NULL) {
        EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_NOT_ABLE_TO_COPY_CTX);
        return 0;
    }

    EVP_MD_CTX_reset(out);
    if (out->fetched_digest != NULL)
        EVP_MD_meth_free(out->fetched_digest);
    *out = *in;
    /* NULL out pointers in case of error */
    out->pctx = NULL;
    out->provctx = NULL;

    if (in->fetched_digest != NULL)
        EVP_MD_upref(in->fetched_digest);

    out->provctx = in->digest->dupctx(in->provctx);
    if (out->provctx == NULL) {
        EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_NOT_ABLE_TO_COPY_CTX);
        return 0;
    }

    /* copied EVP_MD_CTX should free the copied EVP_PKEY_CTX */
    EVP_MD_CTX_clear_flags(out, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
    if (in->pctx != NULL) {
        out->pctx = EVP_PKEY_CTX_dup(in->pctx);
        if (out->pctx == NULL) {
            EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_NOT_ABLE_TO_COPY_CTX);
            EVP_MD_CTX_reset(out);
            return 0;
        }
    }

    return 1;

    /* TODO(3.0): Remove legacy code below */
 legacy:
411
#ifndef OPENSSL_NO_ENGINE
412 413 414 415 416
    /* Make sure it's safe to copy a digest context using an ENGINE */
    if (in->engine && !ENGINE_init(in->engine)) {
        EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, ERR_R_ENGINE_LIB);
        return 0;
    }
417
#endif
418

419 420 421 422 423
    if (out->digest == in->digest) {
        tmp_buf = out->md_data;
        EVP_MD_CTX_set_flags(out, EVP_MD_CTX_FLAG_REUSE);
    } else
        tmp_buf = NULL;
424
    EVP_MD_CTX_reset(out);
R
Rich Salz 已提交
425
    memcpy(out, in, sizeof(*out));
426

P
Paul Yang 已提交
427 428 429
    /* copied EVP_MD_CTX should free the copied EVP_PKEY_CTX */
    EVP_MD_CTX_clear_flags(out, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);

R
Richard Levitte 已提交
430 431 432 433 434 435 436
    /* Null these variables, since they are getting fixed up
     * properly below.  Anything else may cause a memleak and/or
     * double free if any of the memory allocations below fail
     */
    out->md_data = NULL;
    out->pctx = NULL;

437 438 439 440 441
    if (in->md_data && out->digest->ctx_size) {
        if (tmp_buf)
            out->md_data = tmp_buf;
        else {
            out->md_data = OPENSSL_malloc(out->digest->ctx_size);
442
            if (out->md_data == NULL) {
443 444 445 446 447 448
                EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, ERR_R_MALLOC_FAILURE);
                return 0;
            }
        }
        memcpy(out->md_data, in->md_data, out->digest->ctx_size);
    }
449

450
    out->update = in->update;
451

452 453 454
    if (in->pctx) {
        out->pctx = EVP_PKEY_CTX_dup(in->pctx);
        if (!out->pctx) {
455
            EVP_MD_CTX_reset(out);
456 457 458
            return 0;
        }
    }
459

460 461
    if (out->digest->copy)
        return out->digest->copy(out, in);
462

463 464
    return 1;
}
465

466
int EVP_Digest(const void *data, size_t count,
467 468 469
               unsigned char *md, unsigned int *size, const EVP_MD *type,
               ENGINE *impl)
{
470
    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
471
    int ret;
472

473 474 475 476 477 478
    if (ctx == NULL)
        return 0;
    EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT);
    ret = EVP_DigestInit_ex(ctx, type, impl)
        && EVP_DigestUpdate(ctx, data, count)
        && EVP_DigestFinal_ex(ctx, md, size);
479
    EVP_MD_CTX_free(ctx);
480

481 482
    return ret;
}
483

D
Dr. Stephen Henson 已提交
484 485 486 487 488 489 490 491 492 493
int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2)
{
    if (ctx->digest && ctx->digest->md_ctrl) {
        int ret = ctx->digest->md_ctrl(ctx, cmd, p1, p2);
        if (ret <= 0)
            return 0;
        return 1;
    }
    return 0;
}
M
Matt Caswell 已提交
494 495 496 497 498

static void *evp_md_from_dispatch(int mdtype, const OSSL_DISPATCH *fns,
                                    OSSL_PROVIDER *prov)
{
    EVP_MD *md = NULL;
499
    int fncnt = 0;
M
Matt Caswell 已提交
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541

    if ((md = EVP_MD_meth_new(mdtype, NID_undef)) == NULL)
        return NULL;

    for (; fns->function_id != 0; fns++) {
        switch (fns->function_id) {
        case OSSL_FUNC_DIGEST_NEWCTX:
            if (md->newctx != NULL)
                break;
            md->newctx = OSSL_get_OP_digest_newctx(fns);
            fncnt++;
            break;
        case OSSL_FUNC_DIGEST_INIT:
            if (md->dinit != NULL)
                break;
            md->dinit = OSSL_get_OP_digest_init(fns);
            fncnt++;
            break;
        case OSSL_FUNC_DIGEST_UPDDATE:
            if (md->dupdate != NULL)
                break;
            md->dupdate = OSSL_get_OP_digest_update(fns);
            fncnt++;
            break;
        case OSSL_FUNC_DIGEST_FINAL:
            if (md->dfinal != NULL)
                break;
            md->dfinal = OSSL_get_OP_digest_final(fns);
            fncnt++;
            break;
        case OSSL_FUNC_DIGEST_DIGEST:
            if (md->digest != NULL)
                break;
            md->digest = OSSL_get_OP_digest_digest(fns);
            /* We don't increment fnct for this as it is stand alone */
            break;
        case OSSL_FUNC_DIGEST_FREECTX:
            if (md->freectx != NULL)
                break;
            md->freectx = OSSL_get_OP_digest_freectx(fns);
            fncnt++;
            break;
542 543 544 545 546 547 548 549 550 551
        case OSSL_FUNC_DIGEST_DUPCTX:
            if (md->dupctx != NULL)
                break;
            md->dupctx = OSSL_get_OP_digest_dupctx(fns);
            break;
        case OSSL_FUNC_DIGEST_SIZE:
            if (md->size != NULL)
                break;
            md->size = OSSL_get_OP_digest_size(fns);
            break;
M
Matt Caswell 已提交
552
        }
553 554 555 556 557 558 559 560 561 562 563 564
    }
    if ((fncnt != 0 && fncnt != 5)
        || (fncnt == 0 && md->digest == NULL)
        || md->size == NULL) {
        /*
         * In order to be a consistent set of functions we either need the
         * whole set of init/update/final etc functions or none of them.
         * The "digest" function can standalone. We at least need one way to
         * generate digests.
         */
        EVP_MD_meth_free(md);
        return NULL;
M
Matt Caswell 已提交
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589
    }
    md->prov = prov;
    if (prov != NULL)
        ossl_provider_upref(prov);

    return md;
}

static int evp_md_upref(void *md)
{
    return EVP_MD_upref(md);
}

static void evp_md_free(void *md)
{
    EVP_MD_meth_free(md);
}

EVP_MD *EVP_MD_fetch(OPENSSL_CTX *ctx, const char *algorithm,
                     const char *properties)
{
    return evp_generic_fetch(ctx, OSSL_OP_DIGEST, algorithm, properties,
                             evp_md_from_dispatch, evp_md_upref,
                             evp_md_free);
}