OpenCoverage

hmac.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/hmac.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: hmac.c,v 1.12 2015/03/24 20:03:44 markus Exp $ */-
2/*-
3 * Copyright (c) 2014 Markus Friedl. All rights reserved.-
4 *-
5 * Permission to use, copy, modify, and distribute this software for any-
6 * purpose with or without fee is hereby granted, provided that the above-
7 * copyright notice and this permission notice appear in all copies.-
8 *-
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES-
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF-
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR-
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES-
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN-
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF-
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.-
16 */-
17-
18#include "includes.h"-
19-
20#include <sys/types.h>-
21#include <string.h>-
22-
23#include "sshbuf.h"-
24#include "digest.h"-
25#include "hmac.h"-
26-
27struct ssh_hmac_ctx {-
28 int alg;-
29 struct ssh_digest_ctx *ictx;-
30 struct ssh_digest_ctx *octx;-
31 struct ssh_digest_ctx *digest;-
32 u_char *buf;-
33 size_t buf_len;-
34};-
35-
36size_t-
37ssh_hmac_bytes(int alg)-
38{-
39 return ssh_digest_bytes(alg);
executed 416 times by 1 test: return ssh_digest_bytes(alg);
Executed by:
  • test_hostkeys
416
40}-
41-
42struct ssh_hmac_ctx *-
43ssh_hmac_start(int alg)-
44{-
45 struct ssh_hmac_ctx *ret;-
46-
47 if ((ret = calloc(1, sizeof(*ret))) == NULL)
(ret = calloc(...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
48 return NULL;
never executed: return ((void *)0) ;
0
49 ret->alg = alg;-
50 if ((ret->ictx = ssh_digest_start(alg)) == NULL ||
(ret->ictx = s...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
51 (ret->octx = ssh_digest_start(alg)) == NULL ||
(ret->octx = s...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
52 (ret->digest = ssh_digest_start(alg)) == NULL)
(ret->digest =...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
53 goto fail;
never executed: goto fail;
0
54 ret->buf_len = ssh_digest_blocksize(ret->ictx);-
55 if ((ret->buf = calloc(1, ret->buf_len)) == NULL)
(ret->buf = ca...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
56 goto fail;
never executed: goto fail;
0
57 return ret;
executed 416 times by 1 test: return ret;
Executed by:
  • test_hostkeys
416
58fail:-
59 ssh_hmac_free(ret);-
60 return NULL;
never executed: return ((void *)0) ;
0
61}-
62-
63int-
64ssh_hmac_init(struct ssh_hmac_ctx *ctx, const void *key, size_t klen)-
65{-
66 size_t i;-
67-
68 /* reset ictx and octx if no is key given */-
69 if (key != NULL) {
key != ((void *)0)Description
TRUEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
FALSEnever evaluated
0-416
70 /* truncate long keys */-
71 if (klen <= ctx->buf_len)
klen <= ctx->buf_lenDescription
TRUEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
FALSEnever evaluated
0-416
72 memcpy(ctx->buf, key, klen);
executed 416 times by 1 test: memcpy(ctx->buf, key, klen);
Executed by:
  • test_hostkeys
416
73 else if (ssh_digest_memory(ctx->alg, key, klen, ctx->buf,
ssh_digest_mem...->buf_len) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
74 ctx->buf_len) < 0)
ssh_digest_mem...->buf_len) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
75 return -1;
never executed: return -1;
0
76 for (i = 0; i < ctx->buf_len; i++)
i < ctx->buf_lenDescription
TRUEevaluated 26624 times by 1 test
Evaluated by:
  • test_hostkeys
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
416-26624
77 ctx->buf[i] ^= 0x36;
executed 26624 times by 1 test: ctx->buf[i] ^= 0x36;
Executed by:
  • test_hostkeys
26624
78 if (ssh_digest_update(ctx->ictx, ctx->buf, ctx->buf_len) < 0)
ssh_digest_upd...->buf_len) < 0Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
79 return -1;
never executed: return -1;
0
80 for (i = 0; i < ctx->buf_len; i++)
i < ctx->buf_lenDescription
TRUEevaluated 26624 times by 1 test
Evaluated by:
  • test_hostkeys
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
416-26624
81 ctx->buf[i] ^= 0x36 ^ 0x5c;
executed 26624 times by 1 test: ctx->buf[i] ^= 0x36 ^ 0x5c;
Executed by:
  • test_hostkeys
26624
82 if (ssh_digest_update(ctx->octx, ctx->buf, ctx->buf_len) < 0)
ssh_digest_upd...->buf_len) < 0Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
83 return -1;
never executed: return -1;
0
84 explicit_bzero(ctx->buf, ctx->buf_len);-
85 }
executed 416 times by 1 test: end of block
Executed by:
  • test_hostkeys
416
86 /* start with ictx */-
87 if (ssh_digest_copy_state(ctx->ictx, ctx->digest) < 0)
ssh_digest_cop...x->digest) < 0Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
88 return -1;
never executed: return -1;
0
89 return 0;
executed 416 times by 1 test: return 0;
Executed by:
  • test_hostkeys
416
90}-
91-
92int-
93ssh_hmac_update(struct ssh_hmac_ctx *ctx, const void *m, size_t mlen)-
94{-
95 return ssh_digest_update(ctx->digest, m, mlen);
executed 416 times by 1 test: return ssh_digest_update(ctx->digest, m, mlen);
Executed by:
  • test_hostkeys
416
96}-
97-
98int-
99ssh_hmac_update_buffer(struct ssh_hmac_ctx *ctx, const struct sshbuf *b)-
100{-
101 return ssh_digest_update_buffer(ctx->digest, b);
never executed: return ssh_digest_update_buffer(ctx->digest, b);
0
102}-
103-
104int-
105ssh_hmac_final(struct ssh_hmac_ctx *ctx, u_char *d, size_t dlen)-
106{-
107 size_t len;-
108-
109 len = ssh_digest_bytes(ctx->alg);-
110 if (dlen < len ||
dlen < lenDescription
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
111 ssh_digest_final(ctx->digest, ctx->buf, len))
ssh_digest_fin...ctx->buf, len)Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
112 return -1;
never executed: return -1;
0
113 /* switch to octx */-
114 if (ssh_digest_copy_state(ctx->octx, ctx->digest) < 0 ||
ssh_digest_cop...x->digest) < 0Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
115 ssh_digest_update(ctx->digest, ctx->buf, len) < 0 ||
ssh_digest_upd...>buf, len) < 0Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
116 ssh_digest_final(ctx->digest, d, dlen) < 0)
ssh_digest_fin..., d, dlen) < 0Description
TRUEnever evaluated
FALSEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
0-416
117 return -1;
never executed: return -1;
0
118 return 0;
executed 416 times by 1 test: return 0;
Executed by:
  • test_hostkeys
416
119}-
120-
121void-
122ssh_hmac_free(struct ssh_hmac_ctx *ctx)-
123{-
124 if (ctx != NULL) {
ctx != ((void *)0)Description
TRUEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
FALSEnever evaluated
0-416
125 ssh_digest_free(ctx->ictx);-
126 ssh_digest_free(ctx->octx);-
127 ssh_digest_free(ctx->digest);-
128 if (ctx->buf) {
ctx->bufDescription
TRUEevaluated 416 times by 1 test
Evaluated by:
  • test_hostkeys
FALSEnever evaluated
0-416
129 explicit_bzero(ctx->buf, ctx->buf_len);-
130 free(ctx->buf);-
131 }
executed 416 times by 1 test: end of block
Executed by:
  • test_hostkeys
416
132 explicit_bzero(ctx, sizeof(*ctx));-
133 free(ctx);-
134 }
executed 416 times by 1 test: end of block
Executed by:
  • test_hostkeys
416
135}
executed 416 times by 1 test: end of block
Executed by:
  • test_hostkeys
416
136-
137#ifdef TEST-
138-
139/* cc -DTEST hmac.c digest.c buffer.c cleanup.c fatal.c log.c xmalloc.c -lcrypto */-
140static void-
141hmac_test(void *key, size_t klen, void *m, size_t mlen, u_char *e, size_t elen)-
142{-
143 struct ssh_hmac_ctx *ctx;-
144 size_t i;-
145 u_char digest[16];-
146-
147 if ((ctx = ssh_hmac_start(SSH_DIGEST_MD5)) == NULL)-
148 printf("ssh_hmac_start failed");-
149 if (ssh_hmac_init(ctx, key, klen) < 0 ||-
150 ssh_hmac_update(ctx, m, mlen) < 0 ||-
151 ssh_hmac_final(ctx, digest, sizeof(digest)) < 0)-
152 printf("ssh_hmac_xxx failed");-
153 ssh_hmac_free(ctx);-
154-
155 if (memcmp(e, digest, elen)) {-
156 for (i = 0; i < elen; i++)-
157 printf("[%zu] %2.2x %2.2x\n", i, e[i], digest[i]);-
158 printf("mismatch\n");-
159 } else-
160 printf("ok\n");-
161}-
162-
163int-
164main(int argc, char **argv)-
165{-
166 /* try test vectors from RFC 2104 */-
167-
168 u_char key1[16] = {-
169 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb,-
170 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb };-
171 u_char *data1 = "Hi There";-
172 u_char dig1[16] = {-
173 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,-
174 0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d };-
175-
176 u_char *key2 = "Jefe";-
177 u_char *data2 = "what do ya want for nothing?";-
178 u_char dig2[16] = {-
179 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,-
180 0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 };-
181-
182 u_char key3[16];-
183 u_char data3[50];-
184 u_char dig3[16] = {-
185 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,-
186 0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 };-
187 memset(key3, 0xaa, sizeof(key3));-
188 memset(data3, 0xdd, sizeof(data3));-
189-
190 hmac_test(key1, sizeof(key1), data1, strlen(data1), dig1, sizeof(dig1));-
191 hmac_test(key2, strlen(key2), data2, strlen(data2), dig2, sizeof(dig2));-
192 hmac_test(key3, sizeof(key3), data3, sizeof(data3), dig3, sizeof(dig3));-
193-
194 return 0;-
195}-
196-
197#endif-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2