static int ah_none_mature(struct secasvar *);
static int ah_none_init(struct ah_algorithm_state *, struct secasvar *);
static void ah_none_loop(struct ah_algorithm_state *, caddr_t, size_t);
-static void ah_none_result(struct ah_algorithm_state *, caddr_t);
+static void ah_none_result(struct ah_algorithm_state *, caddr_t, size_t);
static int ah_keyed_md5_mature(struct secasvar *);
static int ah_keyed_md5_init(struct ah_algorithm_state *, struct secasvar *);
static void ah_keyed_md5_loop(struct ah_algorithm_state *, caddr_t, size_t);
-static void ah_keyed_md5_result(struct ah_algorithm_state *, caddr_t);
+static void ah_keyed_md5_result(struct ah_algorithm_state *, caddr_t, size_t);
static int ah_keyed_sha1_mature(struct secasvar *);
static int ah_keyed_sha1_init(struct ah_algorithm_state *, struct secasvar *);
static void ah_keyed_sha1_loop(struct ah_algorithm_state *, caddr_t, size_t);
-static void ah_keyed_sha1_result(struct ah_algorithm_state *, caddr_t);
+static void ah_keyed_sha1_result(struct ah_algorithm_state *, caddr_t, size_t);
static int ah_hmac_md5_mature(struct secasvar *);
static int ah_hmac_md5_init(struct ah_algorithm_state *, struct secasvar *);
static void ah_hmac_md5_loop(struct ah_algorithm_state *, caddr_t, size_t);
-static void ah_hmac_md5_result(struct ah_algorithm_state *, caddr_t);
+static void ah_hmac_md5_result(struct ah_algorithm_state *, caddr_t, size_t);
static int ah_hmac_sha1_mature(struct secasvar *);
static int ah_hmac_sha1_init(struct ah_algorithm_state *, struct secasvar *);
static void ah_hmac_sha1_loop(struct ah_algorithm_state *, caddr_t, size_t);
-static void ah_hmac_sha1_result(struct ah_algorithm_state *, caddr_t);
+static void ah_hmac_sha1_result(struct ah_algorithm_state *, caddr_t, size_t);
#if ALLCRYPTO
static int ah_sumsiz_sha2_256(struct secasvar *);
static int ah_hmac_sha2_256_mature(struct secasvar *);
static int ah_hmac_sha2_256_init(struct ah_algorithm_state *,
struct secasvar *);
static void ah_hmac_sha2_256_loop(struct ah_algorithm_state *, caddr_t, size_t);
-static void ah_hmac_sha2_256_result(struct ah_algorithm_state *, caddr_t);
+static void ah_hmac_sha2_256_result(struct ah_algorithm_state *, caddr_t, size_t);
static int ah_sumsiz_sha2_384(struct secasvar *);
static int ah_hmac_sha2_384_mature(struct secasvar *);
static int ah_hmac_sha2_384_init(struct ah_algorithm_state *,
struct secasvar *);
static void ah_hmac_sha2_384_loop(struct ah_algorithm_state *, caddr_t, size_t);
-static void ah_hmac_sha2_384_result(struct ah_algorithm_state *, caddr_t);
+static void ah_hmac_sha2_384_result(struct ah_algorithm_state *, caddr_t, size_t);
static int ah_sumsiz_sha2_512(struct secasvar *);
static int ah_hmac_sha2_512_mature(struct secasvar *);
static int ah_hmac_sha2_512_init(struct ah_algorithm_state *,
struct secasvar *);
static void ah_hmac_sha2_512_loop(struct ah_algorithm_state *, caddr_t, size_t);
-static void ah_hmac_sha2_512_result(struct ah_algorithm_state *, caddr_t);
+static void ah_hmac_sha2_512_result(struct ah_algorithm_state *, caddr_t, size_t);
#endif /* ALLCRYPTO */
static void ah_update_mbuf(struct mbuf *, int, int,
static void
ah_none_result(
__unused struct ah_algorithm_state *state,
- __unused caddr_t addr)
+ __unused caddr_t addr,
+ __unused size_t l)
{
}
}
static void
-ah_keyed_md5_result(state, addr)
+ah_keyed_md5_result(state, addr, l)
struct ah_algorithm_state *state;
caddr_t addr;
+ size_t l;
{
u_char digest[16];
}
MD5Final(&digest[0], (MD5_CTX *)state->foo);
FREE(state->foo, M_TEMP);
- bcopy(&digest[0], (void *)addr, sizeof(digest));
+ bcopy(&digest[0], (void *)addr, sizeof(digest) > l ? l : sizeof(digest));
}
static int
}
static void
-ah_keyed_sha1_result(state, addr)
+ah_keyed_sha1_result(state, addr, l)
struct ah_algorithm_state *state;
caddr_t addr;
+ size_t l;
{
u_char digest[SHA1_RESULTLEN]; /* SHA-1 generates 160 bits */
SHA1_CTX *ctxt;
(u_int)_KEYLEN(state->sav->key_auth));
}
SHA1Final((caddr_t)&digest[0], ctxt);
- bcopy(&digest[0], (void *)addr, HMACSIZE);
+ bcopy(&digest[0], (void *)addr, sizeof(digest) > l ? l : sizeof(digest));
FREE(state->foo, M_TEMP);
}
}
static void
-ah_hmac_md5_result(state, addr)
+ah_hmac_md5_result(state, addr, l)
struct ah_algorithm_state *state;
caddr_t addr;
+ size_t l;
{
u_char digest[16];
u_char *ipad;
MD5Update(ctxt, &digest[0], sizeof(digest));
MD5Final(&digest[0], ctxt);
- bcopy(&digest[0], (void *)addr, HMACSIZE);
+ bcopy(&digest[0], (void *)addr, sizeof(digest) > l ? l : sizeof(digest));
FREE(state->foo, M_TEMP);
}
}
static void
-ah_hmac_sha1_result(state, addr)
+ah_hmac_sha1_result(state, addr, l)
struct ah_algorithm_state *state;
caddr_t addr;
+ size_t l;
{
u_char digest[SHA1_RESULTLEN]; /* SHA-1 generates 160 bits */
u_char *ipad;
SHA1Update(ctxt, (caddr_t)&digest[0], sizeof(digest));
SHA1Final((caddr_t)&digest[0], ctxt);
- bcopy(&digest[0], (void *)addr, HMACSIZE);
+ bcopy(&digest[0], (void *)addr, sizeof(digest) > l ? l : sizeof(digest));
FREE(state->foo, M_TEMP);
}
}
static void
-ah_hmac_sha2_256_result(state, addr)
+ah_hmac_sha2_256_result(state, addr, l)
struct ah_algorithm_state *state;
caddr_t addr;
+ size_t l;
{
+ u_char digest[SHA256_DIGEST_LENGTH];
u_char *ipad;
u_char *opad;
SHA256_CTX *ctxt;
opad = (u_char *)(ipad + 64);
ctxt = (SHA256_CTX *)(opad + 64);
- SHA256_Final((u_int8_t *)addr, ctxt);
+ SHA256_Final((u_int8_t *)digest, ctxt);
- bzero(ctxt, sizeof(*ctxt));
SHA256_Init(ctxt);
SHA256_Update(ctxt, opad, 64);
- SHA256_Update(ctxt, (const u_int8_t *)addr, SHA256_DIGEST_LENGTH);
- SHA256_Final((u_int8_t *)addr, ctxt);
+ SHA256_Update(ctxt, (const u_int8_t *)digest, sizeof(digest));
+ SHA256_Final((u_int8_t *)digest, ctxt);
+
+ bcopy(&digest[0], (void *)addr, sizeof(digest) > l ? l : sizeof(digest));
FREE(state->foo, M_TEMP);
}
}
static void
-ah_hmac_sha2_384_result(state, addr)
+ah_hmac_sha2_384_result(state, addr, l)
struct ah_algorithm_state *state;
caddr_t addr;
+ size_t l;
{
+ u_char digest[SHA384_DIGEST_LENGTH];
u_char *ipad;
u_char *opad;
SHA384_CTX *ctxt;
opad = (u_char *)(ipad + 128);
ctxt = (SHA384_CTX *)(opad + 128);
- SHA384_Final((u_int8_t *)addr, ctxt);
+ SHA384_Final((u_int8_t *)digest, ctxt);
- bzero(ctxt, sizeof(*ctxt));
SHA384_Init(ctxt);
SHA384_Update(ctxt, opad, 128);
- SHA384_Update(ctxt, (const u_int8_t *)addr, SHA384_DIGEST_LENGTH);
- SHA384_Final((u_int8_t *)addr, ctxt);
+ SHA384_Update(ctxt, (const u_int8_t *)digest, sizeof(digest));
+ SHA384_Final((u_int8_t *)digest, ctxt);
+
+ bcopy(&digest[0], (void *)addr, sizeof(digest) > l ? l : sizeof(digest));
FREE(state->foo, M_TEMP);
}
}
static void
-ah_hmac_sha2_512_result(state, addr)
+ah_hmac_sha2_512_result(state, addr, l)
struct ah_algorithm_state *state;
caddr_t addr;
+ size_t l;
{
+ u_char digest[SHA512_DIGEST_LENGTH];
u_char *ipad;
u_char *opad;
SHA512_CTX *ctxt;
opad = (u_char *)(ipad + 128);
ctxt = (SHA512_CTX *)(opad + 128);
- SHA512_Final((u_int8_t *)addr, ctxt);
+ SHA512_Final((u_int8_t *)digest, ctxt);
- bzero(ctxt, sizeof(*ctxt));
SHA512_Init(ctxt);
SHA512_Update(ctxt, opad, 128);
- SHA512_Update(ctxt, (const u_int8_t *)addr, SHA512_DIGEST_LENGTH);
- SHA512_Final((u_int8_t *)addr, ctxt);
+ SHA512_Update(ctxt, (const u_int8_t *)digest, sizeof(digest));
+ SHA512_Final((u_int8_t *)digest, ctxt);
+
+ bcopy(&digest[0], (void *)addr, sizeof(digest) > l ? l : sizeof(digest));
FREE(state->foo, M_TEMP);
}
goto fail;
}
- (algo->result)(&algos, (caddr_t) &sumbuf[0]);
+ (algo->result)(&algos, (caddr_t) &sumbuf[0], sizeof(sumbuf));
bcopy(&sumbuf[0], ahdat, (*algo->sumsiz)(sav));
if (n)
goto fail;
}
- (algo->result)(&algos, (caddr_t) &sumbuf[0]);
+ (algo->result)(&algos, (caddr_t) &sumbuf[0], sizeof(sumbuf));
bcopy(&sumbuf[0], ahdat, (*algo->sumsiz)(sav));
/* just in case */