|
Lines 152-163
Link Here
|
| 152 |
u_char * |
152 |
u_char * |
| 153 |
mac_compute(Mac *mac, u_int32_t seqno, u_char *data, int datalen) |
153 |
mac_compute(Mac *mac, u_int32_t seqno, u_char *data, int datalen) |
| 154 |
{ |
154 |
{ |
| 155 |
static u_char m[EVP_MAX_MD_SIZE]; |
155 |
static union { |
|
|
156 |
u_char m[EVP_MAX_MD_SIZE]; |
| 157 |
u_int64_t for_align; |
| 158 |
} u; |
| 156 |
u_char b[4], nonce[8]; |
159 |
u_char b[4], nonce[8]; |
| 157 |
|
160 |
|
| 158 |
if (mac->mac_len > sizeof(m)) |
161 |
if (mac->mac_len > sizeof(u)) |
| 159 |
fatal("mac_compute: mac too long %u %lu", |
162 |
fatal("mac_compute: mac too long %u %lu", |
| 160 |
mac->mac_len, (u_long)sizeof(m)); |
163 |
mac->mac_len, (u_long)sizeof(u)); |
| 161 |
|
164 |
|
| 162 |
switch (mac->type) { |
165 |
switch (mac->type) { |
| 163 |
case SSH_EVP: |
166 |
case SSH_EVP: |
|
Lines 166-187
Link Here
|
| 166 |
HMAC_Init(&mac->evp_ctx, NULL, 0, NULL); |
169 |
HMAC_Init(&mac->evp_ctx, NULL, 0, NULL); |
| 167 |
HMAC_Update(&mac->evp_ctx, b, sizeof(b)); |
170 |
HMAC_Update(&mac->evp_ctx, b, sizeof(b)); |
| 168 |
HMAC_Update(&mac->evp_ctx, data, datalen); |
171 |
HMAC_Update(&mac->evp_ctx, data, datalen); |
| 169 |
HMAC_Final(&mac->evp_ctx, m, NULL); |
172 |
HMAC_Final(&mac->evp_ctx, u.m, NULL); |
| 170 |
break; |
173 |
break; |
| 171 |
case SSH_UMAC: |
174 |
case SSH_UMAC: |
| 172 |
put_u64(nonce, seqno); |
175 |
put_u64(nonce, seqno); |
| 173 |
umac_update(mac->umac_ctx, data, datalen); |
176 |
umac_update(mac->umac_ctx, data, datalen); |
| 174 |
umac_final(mac->umac_ctx, m, nonce); |
177 |
umac_final(mac->umac_ctx, u.m, nonce); |
| 175 |
break; |
178 |
break; |
| 176 |
case SSH_UMAC128: |
179 |
case SSH_UMAC128: |
| 177 |
put_u64(nonce, seqno); |
180 |
put_u64(nonce, seqno); |
| 178 |
umac128_update(mac->umac_ctx, data, datalen); |
181 |
umac128_update(mac->umac_ctx, data, datalen); |
| 179 |
umac128_final(mac->umac_ctx, m, nonce); |
182 |
umac128_final(mac->umac_ctx, u.m, nonce); |
| 180 |
break; |
183 |
break; |
| 181 |
default: |
184 |
default: |
| 182 |
fatal("mac_compute: unknown MAC type"); |
185 |
fatal("mac_compute: unknown MAC type"); |
| 183 |
} |
186 |
} |
| 184 |
return (m); |
187 |
return (u.m); |
| 185 |
} |
188 |
} |
| 186 |
|
189 |
|
| 187 |
void |
190 |
void |