Coverage Report

Created: 2022-10-31 07:00

/src/ghostpdl/base/smd5.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (C) 2001-2021 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,
13
   CA 94945, U.S.A., +1(415)492-9861, for further information.
14
*/
15
16
17
/* MD5Encode filter */
18
#include "memory_.h"
19
#include "strimpl.h"
20
#include "stream.h"
21
#include "smd5.h"
22
23
/* ------ MD5Encode ------ */
24
25
private_st_MD5E_state();
26
27
/* Initialize the state. */
28
static int
29
s_MD5E_init(stream_state * st)
30
32.1k
{
31
32.1k
    stream_MD5E_state *const ss = (stream_MD5E_state *) st;
32
33
32.1k
    gs_md5_init(&ss->md5);
34
32.1k
    return 0;
35
32.1k
}
36
37
/* Process a buffer. */
38
static int
39
s_MD5E_process(stream_state * st, stream_cursor_read * pr,
40
               stream_cursor_write * pw, bool last)
41
216k
{
42
216k
    stream_MD5E_state *const ss = (stream_MD5E_state *) st;
43
216k
    int status = 0;
44
45
216k
    if (pr->ptr < pr->limit) {
46
184k
        gs_md5_append(&ss->md5, pr->ptr + 1, pr->limit - pr->ptr);
47
184k
        pr->ptr = pr->limit;
48
184k
    }
49
216k
    if (last) {
50
32.1k
        if (pw->limit - pw->ptr >= 16) {
51
16.0k
            gs_md5_finish(&ss->md5, pw->ptr + 1);
52
16.0k
            pw->ptr += 16;
53
16.0k
            status = EOFC;
54
16.0k
        } else
55
16.0k
            status = 1;
56
32.1k
    }
57
216k
    return status;
58
216k
}
59
60
/* Stream template */
61
const stream_template s_MD5E_template = {
62
    &st_MD5E_state, s_MD5E_init, s_MD5E_process, 1, 16
63
};
64
65
stream *
66
s_MD5E_make_stream(gs_memory_t *mem, byte *digest, int digest_size)
67
16.0k
{
68
16.0k
    stream *s = s_alloc(mem, "s_MD5E_make_stream");
69
16.0k
    stream_state *ss = s_alloc_state(mem, s_MD5E_template.stype, "s_MD5E_make_stream");
70
71
16.0k
    if (ss == NULL || s == NULL)
72
0
        goto err;
73
16.0k
    ss->templat = &s_MD5E_template;
74
16.0k
    if (s_init_filter(s, ss, digest, digest_size, NULL) < 0)
75
0
goto err;
76
16.0k
    s->strm = s;
77
16.0k
    return s;
78
0
err:
79
0
    gs_free_object(mem, ss, "s_MD5E_make_stream");
80
0
    gs_free_object(mem, s, "s_MD5E_make_stream");
81
0
    return NULL;
82
16.0k
}
83
84
/* Process a buffer. */
85
static int
86
s_MD5C_process(stream_state * st, stream_cursor_read * pr,
87
               stream_cursor_write * pw, bool last)
88
6.52M
{
89
6.52M
    stream_MD5E_state *const ss = (stream_MD5E_state *) st;
90
6.52M
    int nr = pr->limit - pr->ptr;
91
6.52M
    int nw = pw->limit - pw->ptr;
92
6.52M
    int n = min(nr, nw);
93
94
6.52M
    gs_md5_append(&ss->md5, pr->ptr + 1, n);
95
6.52M
    memcpy(pw->ptr + 1, pr->ptr + 1, n);
96
6.52M
    pr->ptr += n;
97
6.52M
    pw->ptr += n;
98
6.52M
    if (pw->limit == pw->ptr)
99
5.17M
        return 1;
100
1.34M
    return 0;
101
6.52M
}
102
/* Stream template */
103
const stream_template s_MD5C_template = {
104
    &st_MD5E_state, s_MD5E_init, s_MD5C_process, 1, 1024
105
};
106
107
stream *
108
s_MD5C_make_stream(gs_memory_t *mem, stream *strm)
109
16.0k
{
110
16.0k
    stream *s = s_alloc(mem, "s_MD5E_make_stream");
111
16.0k
    stream_state *ss = s_alloc_state(mem, s_MD5E_template.stype, "s_MD5E_make_stream");
112
16.0k
    int buffer_size = 1024;
113
16.0k
    byte *buffer = gs_alloc_bytes(mem, buffer_size, "s_MD5E_make_stream(buffer)");
114
115
16.0k
    if (ss == NULL || s == NULL || buffer == NULL)
116
0
        goto err;
117
16.0k
    ss->templat = &s_MD5C_template;
118
16.0k
    if (s_init_filter(s, ss, buffer, buffer_size, NULL) < 0)
119
0
        goto err;
120
16.0k
    s->strm = strm;
121
16.0k
    s->close_strm = true;
122
16.0k
    return s;
123
0
err:
124
0
    gs_free_object(mem, ss, "s_MD5E_make_stream");
125
0
    gs_free_object(mem, s, "s_MD5E_make_stream");
126
0
    gs_free_object(mem, buffer, "s_MD5E_make_stream");
127
0
    return NULL;
128
16.0k
}
129
130
/* Get a digest. Apply 'flush' before calling. */
131
int
132
s_MD5C_get_digest(stream *s, byte *buf, int buf_length)
133
11.2k
{
134
11.2k
    stream_MD5E_state *const ss = (stream_MD5E_state *)s->state;
135
11.2k
    gs_md5_state_t md5;
136
11.2k
    byte b[16], *p;
137
11.2k
    int l = min(16, buf_length), k;
138
139
11.2k
    if (s->procs.process != s_MD5C_process)
140
3
        return 0; /* Must not happen. */
141
11.2k
    md5 = ss->md5;
142
11.2k
    gs_md5_finish(&md5, b);
143
11.2k
    memcpy(buf, b, l);
144
33.6k
    for (p = b + l; p < b + sizeof(b); p += l) {
145
134k
        for (k = 0; k < l && p + k < b + sizeof(b); k++)
146
112k
            buf[k] ^= p[k];
147
22.4k
    }
148
11.2k
    return l;
149
11.2k
}