diff options
author | Martin Schanzenbach <schanzen@gnunet.org> | 2022-12-01 16:09:54 +0900 |
---|---|---|
committer | Martin Schanzenbach <schanzen@gnunet.org> | 2022-12-01 16:09:54 +0900 |
commit | dd33576598fe43f8f224e896a63e6c354ee514ea (patch) | |
tree | 09075c1df63ee5837a0702ca6ba3e1414563886b /src/transport/gnunet-service-tng.c | |
parent | cd32211abb9c525beeeb994c3c1472bc2d365f5b (diff) | |
download | gnunet-dd33576598fe43f8f224e896a63e6c354ee514ea.tar.gz gnunet-dd33576598fe43f8f224e896a63e6c354ee514ea.zip |
-do not crash on protocol violations
Diffstat (limited to 'src/transport/gnunet-service-tng.c')
-rw-r--r-- | src/transport/gnunet-service-tng.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/transport/gnunet-service-tng.c b/src/transport/gnunet-service-tng.c index 5976bd5b1..32c8b816d 100644 --- a/src/transport/gnunet-service-tng.c +++ b/src/transport/gnunet-service-tng.c | |||
@@ -4764,15 +4764,18 @@ dv_encrypt (struct DVKeyState *key, const void *in, void *dst, size_t in_size) | |||
4764 | * @param ciph cipher text to decrypt | 4764 | * @param ciph cipher text to decrypt |
4765 | * @param[out] out output data to generate (plaintext) | 4765 | * @param[out] out output data to generate (plaintext) |
4766 | * @param out_size number of bytes of input in @a ciph and available in @a out | 4766 | * @param out_size number of bytes of input in @a ciph and available in @a out |
4767 | * @return GNUNET_OK on success | ||
4767 | */ | 4768 | */ |
4768 | static void | 4769 | static enum GNUNET_GenericReturnValue |
4769 | dv_decrypt (struct DVKeyState *key, | 4770 | dv_decrypt (struct DVKeyState *key, |
4770 | void *out, | 4771 | void *out, |
4771 | const void *ciph, | 4772 | const void *ciph, |
4772 | size_t out_size) | 4773 | size_t out_size) |
4773 | { | 4774 | { |
4774 | GNUNET_assert ( | 4775 | return (0 == |
4775 | 0 == gcry_cipher_decrypt (key->cipher, out, out_size, ciph, out_size)); | 4776 | gcry_cipher_decrypt (key->cipher, |
4777 | out, out_size, | ||
4778 | ciph, out_size)) ? GNUNET_OK : GNUNET_SYSERR; | ||
4776 | } | 4779 | } |
4777 | 4780 | ||
4778 | 4781 | ||
@@ -8254,8 +8257,22 @@ handle_dv_box (void *cls, const struct TransportDVBoxMessage *dvb) | |||
8254 | 8257 | ||
8255 | GNUNET_assert (hdr_len >= | 8258 | GNUNET_assert (hdr_len >= |
8256 | sizeof(ppay) + sizeof(struct GNUNET_MessageHeader)); | 8259 | sizeof(ppay) + sizeof(struct GNUNET_MessageHeader)); |
8257 | dv_decrypt (key, &ppay, hdr, sizeof(ppay)); | 8260 | if (GNUNET_OK != dv_decrypt (key, &ppay, hdr, sizeof(ppay))) |
8258 | dv_decrypt (key, &body, &hdr[sizeof(ppay)], hdr_len - sizeof(ppay)); | 8261 | { |
8262 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
8263 | "Error decrypting DV payload header\n"); | ||
8264 | GNUNET_break_op (0); | ||
8265 | finish_cmc_handling (cmc); | ||
8266 | return; | ||
8267 | } | ||
8268 | if (GNUNET_OK != dv_decrypt (key, &body, &hdr[sizeof(ppay)], hdr_len - sizeof(ppay))) | ||
8269 | { | ||
8270 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
8271 | "Error decrypting DV payload\n"); | ||
8272 | GNUNET_break_op (0); | ||
8273 | finish_cmc_handling (cmc); | ||
8274 | return; | ||
8275 | } | ||
8259 | dv_key_clean (key); | 8276 | dv_key_clean (key); |
8260 | if (ntohs (mh->size) != sizeof(body)) | 8277 | if (ntohs (mh->size) != sizeof(body)) |
8261 | { | 8278 | { |