/src/openssl30/crypto/mdc2/mdc2dgst.c
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | /* | 
| 2 |  |  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. | 
| 3 |  |  * | 
| 4 |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
| 5 |  |  * this file except in compliance with the License.  You can obtain a copy | 
| 6 |  |  * in the file LICENSE in the source distribution or at | 
| 7 |  |  * https://www.openssl.org/source/license.html | 
| 8 |  |  */ | 
| 9 |  |  | 
| 10 |  | /* | 
| 11 |  |  * MD2 low level APIs are deprecated for public use, but still ok for | 
| 12 |  |  * internal use. | 
| 13 |  |  */ | 
| 14 |  | #include "internal/deprecated.h" | 
| 15 |  |  | 
| 16 |  | #include <stdio.h> | 
| 17 |  | #include <stdlib.h> | 
| 18 |  | #include <string.h> | 
| 19 |  | #include <openssl/crypto.h> | 
| 20 |  | #include <openssl/des.h> | 
| 21 |  | #include <openssl/mdc2.h> | 
| 22 |  |  | 
| 23 |  | #undef c2l | 
| 24 | 0 | #define c2l(c,l)        (l =((DES_LONG)(*((c)++)))    , \ | 
| 25 | 0 |                          l|=((DES_LONG)(*((c)++)))<< 8L, \ | 
| 26 | 0 |                          l|=((DES_LONG)(*((c)++)))<<16L, \ | 
| 27 | 0 |                          l|=((DES_LONG)(*((c)++)))<<24L) | 
| 28 |  |  | 
| 29 |  | #undef l2c | 
| 30 | 0 | #define l2c(l,c)        (*((c)++)=(unsigned char)(((l)     )&0xff), \ | 
| 31 | 0 |                         *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ | 
| 32 | 0 |                         *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ | 
| 33 | 0 |                         *((c)++)=(unsigned char)(((l)>>24L)&0xff)) | 
| 34 |  |  | 
| 35 |  | static void mdc2_body(MDC2_CTX *c, const unsigned char *in, size_t len); | 
| 36 |  | int MDC2_Init(MDC2_CTX *c) | 
| 37 | 0 | { | 
| 38 | 0 |     c->num = 0; | 
| 39 | 0 |     c->pad_type = 1; | 
| 40 | 0 |     memset(&(c->h[0]), 0x52, MDC2_BLOCK); | 
| 41 | 0 |     memset(&(c->hh[0]), 0x25, MDC2_BLOCK); | 
| 42 | 0 |     return 1; | 
| 43 | 0 | } | 
| 44 |  |  | 
| 45 |  | int MDC2_Update(MDC2_CTX *c, const unsigned char *in, size_t len) | 
| 46 | 0 | { | 
| 47 | 0 |     size_t i, j; | 
| 48 |  | 
 | 
| 49 | 0 |     i = c->num; | 
| 50 | 0 |     if (i != 0) { | 
| 51 | 0 |         if (len < MDC2_BLOCK - i) { | 
| 52 |  |             /* partial block */ | 
| 53 | 0 |             memcpy(&(c->data[i]), in, len); | 
| 54 | 0 |             c->num += (int)len; | 
| 55 | 0 |             return 1; | 
| 56 | 0 |         } else { | 
| 57 |  |             /* filled one */ | 
| 58 | 0 |             j = MDC2_BLOCK - i; | 
| 59 | 0 |             memcpy(&(c->data[i]), in, j); | 
| 60 | 0 |             len -= j; | 
| 61 | 0 |             in += j; | 
| 62 | 0 |             c->num = 0; | 
| 63 | 0 |             mdc2_body(c, &(c->data[0]), MDC2_BLOCK); | 
| 64 | 0 |         } | 
| 65 | 0 |     } | 
| 66 | 0 |     i = len & ~((size_t)MDC2_BLOCK - 1); | 
| 67 | 0 |     if (i > 0) | 
| 68 | 0 |         mdc2_body(c, in, i); | 
| 69 | 0 |     j = len - i; | 
| 70 | 0 |     if (j > 0) { | 
| 71 | 0 |         memcpy(&(c->data[0]), &(in[i]), j); | 
| 72 | 0 |         c->num = (int)j; | 
| 73 | 0 |     } | 
| 74 | 0 |     return 1; | 
| 75 | 0 | } | 
| 76 |  |  | 
| 77 |  | static void mdc2_body(MDC2_CTX *c, const unsigned char *in, size_t len) | 
| 78 | 0 | { | 
| 79 | 0 |     register DES_LONG tin0, tin1; | 
| 80 | 0 |     register DES_LONG ttin0, ttin1; | 
| 81 | 0 |     DES_LONG d[2], dd[2]; | 
| 82 | 0 |     DES_key_schedule k; | 
| 83 | 0 |     unsigned char *p; | 
| 84 | 0 |     size_t i; | 
| 85 |  | 
 | 
| 86 | 0 |     for (i = 0; i < len; i += 8) { | 
| 87 | 0 |         c2l(in, tin0); | 
| 88 | 0 |         d[0] = dd[0] = tin0; | 
| 89 | 0 |         c2l(in, tin1); | 
| 90 | 0 |         d[1] = dd[1] = tin1; | 
| 91 | 0 |         c->h[0] = (c->h[0] & 0x9f) | 0x40; | 
| 92 | 0 |         c->hh[0] = (c->hh[0] & 0x9f) | 0x20; | 
| 93 |  | 
 | 
| 94 | 0 |         DES_set_odd_parity(&c->h); | 
| 95 | 0 |         DES_set_key_unchecked(&c->h, &k); | 
| 96 | 0 |         DES_encrypt1(d, &k, 1); | 
| 97 |  | 
 | 
| 98 | 0 |         DES_set_odd_parity(&c->hh); | 
| 99 | 0 |         DES_set_key_unchecked(&c->hh, &k); | 
| 100 | 0 |         DES_encrypt1(dd, &k, 1); | 
| 101 |  | 
 | 
| 102 | 0 |         ttin0 = tin0 ^ dd[0]; | 
| 103 | 0 |         ttin1 = tin1 ^ dd[1]; | 
| 104 | 0 |         tin0 ^= d[0]; | 
| 105 | 0 |         tin1 ^= d[1]; | 
| 106 |  | 
 | 
| 107 | 0 |         p = c->h; | 
| 108 | 0 |         l2c(tin0, p); | 
| 109 | 0 |         l2c(ttin1, p); | 
| 110 | 0 |         p = c->hh; | 
| 111 | 0 |         l2c(ttin0, p); | 
| 112 | 0 |         l2c(tin1, p); | 
| 113 | 0 |     } | 
| 114 | 0 | } | 
| 115 |  |  | 
| 116 |  | int MDC2_Final(unsigned char *md, MDC2_CTX *c) | 
| 117 | 0 | { | 
| 118 | 0 |     unsigned int i; | 
| 119 | 0 |     int j; | 
| 120 |  | 
 | 
| 121 | 0 |     i = c->num; | 
| 122 | 0 |     j = c->pad_type; | 
| 123 | 0 |     if ((i > 0) || (j == 2)) { | 
| 124 | 0 |         if (j == 2) | 
| 125 | 0 |             c->data[i++] = 0x80; | 
| 126 | 0 |         memset(&(c->data[i]), 0, MDC2_BLOCK - i); | 
| 127 | 0 |         mdc2_body(c, c->data, MDC2_BLOCK); | 
| 128 | 0 |     } | 
| 129 | 0 |     memcpy(md, (char *)c->h, MDC2_BLOCK); | 
| 130 | 0 |     memcpy(&(md[MDC2_BLOCK]), (char *)c->hh, MDC2_BLOCK); | 
| 131 | 0 |     return 1; | 
| 132 | 0 | } |