aboutsummaryrefslogtreecommitdiff
path: root/src/service/messenger/messenger_api_message.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/service/messenger/messenger_api_message.c')
-rw-r--r--src/service/messenger/messenger_api_message.c253
1 files changed, 188 insertions, 65 deletions
diff --git a/src/service/messenger/messenger_api_message.c b/src/service/messenger/messenger_api_message.c
index 1f7e8dbf2..3ccbbd378 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.c
@@ -233,6 +233,9 @@ get_message_body_kind_size (enum GNUNET_MESSENGER_MessageKind kind)
233 length += member_size (struct GNUNET_MESSENGER_Message, body.file.hash); 233 length += member_size (struct GNUNET_MESSENGER_Message, body.file.hash);
234 length += member_size (struct GNUNET_MESSENGER_Message, body.file.name); 234 length += member_size (struct GNUNET_MESSENGER_Message, body.file.name);
235 break; 235 break;
236 case GNUNET_MESSENGER_KIND_PRIVATE:
237 length += member_size (struct GNUNET_MESSENGER_Message, body.privacy.key);
238 break;
236 case GNUNET_MESSENGER_KIND_DELETE: 239 case GNUNET_MESSENGER_KIND_DELETE:
237 length += member_size (struct GNUNET_MESSENGER_Message, body.deletion.hash); 240 length += member_size (struct GNUNET_MESSENGER_Message, body.deletion.hash);
238 length += member_size (struct GNUNET_MESSENGER_Message, 241 length += member_size (struct GNUNET_MESSENGER_Message,
@@ -275,9 +278,6 @@ get_message_body_size (enum GNUNET_MESSENGER_MessageKind kind,
275 278
276 switch (kind) 279 switch (kind)
277 { 280 {
278 case GNUNET_MESSENGER_KIND_INFO:
279 length += GNUNET_CRYPTO_public_key_get_length (&(body->info.host_key));
280 break;
281 case GNUNET_MESSENGER_KIND_JOIN: 281 case GNUNET_MESSENGER_KIND_JOIN:
282 length += GNUNET_CRYPTO_public_key_get_length (&(body->join.key)); 282 length += GNUNET_CRYPTO_public_key_get_length (&(body->join.key));
283 break; 283 break;
@@ -390,32 +390,32 @@ calc_padded_length (uint16_t length)
390#define min(x, y) (x < y? x : y) 390#define min(x, y) (x < y? x : y)
391 391
392#define encode_step_ext(dst, offset, src, size) do { \ 392#define encode_step_ext(dst, offset, src, size) do { \
393 GNUNET_memcpy (dst + offset, src, size); \ 393 GNUNET_memcpy (dst + offset, src, size); \
394 offset += size; \ 394 offset += size; \
395} while (0) 395} while (0)
396 396
397#define encode_step(dst, offset, src) do { \ 397#define encode_step(dst, offset, src) do { \
398 encode_step_ext (dst, offset, src, sizeof(*src)); \ 398 encode_step_ext (dst, offset, src, sizeof(*src)); \
399} while (0) 399} while (0)
400 400
401#define encode_step_key(dst, offset, src, length) do { \ 401#define encode_step_key(dst, offset, src, length) do { \
402 ssize_t result = GNUNET_CRYPTO_write_public_key_to_buffer ( \ 402 ssize_t result = GNUNET_CRYPTO_write_public_key_to_buffer ( \
403 src, dst + offset, length - offset \ 403 src, dst + offset, length - offset \
404 ); \ 404 ); \
405 if (result < 0) \ 405 if (result < 0) \
406 GNUNET_break (0); \ 406 GNUNET_break (0); \
407 else \ 407 else \
408 offset += result; \ 408 offset += result; \
409} while (0) 409} while (0)
410 410
411#define encode_step_signature(dst, offset, src, length) do { \ 411#define encode_step_signature(dst, offset, src, length) do { \
412 ssize_t result = GNUNET_CRYPTO_write_signature_to_buffer ( \ 412 ssize_t result = GNUNET_CRYPTO_write_signature_to_buffer ( \
413 src, dst + offset, length - offset \ 413 src, dst + offset, length - offset \
414 ); \ 414 ); \
415 if (result < 0) \ 415 if (result < 0) \
416 GNUNET_break (0); \ 416 GNUNET_break (0); \
417 else \ 417 else \
418 offset += result; \ 418 offset += result; \
419} while (0) 419} while (0)
420 420
421static void 421static void
@@ -431,7 +431,6 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
431 case GNUNET_MESSENGER_KIND_INFO: 431 case GNUNET_MESSENGER_KIND_INFO:
432 version = GNUNET_htobe32 (body->info.messenger_version); 432 version = GNUNET_htobe32 (body->info.messenger_version);
433 433
434 encode_step_key (buffer, offset, &(body->info.host_key), length);
435 encode_step (buffer, offset, &version); 434 encode_step (buffer, offset, &version);
436 break; 435 break;
437 case GNUNET_MESSENGER_KIND_JOIN: 436 case GNUNET_MESSENGER_KIND_JOIN:
@@ -479,6 +478,7 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
479 body->file.uri))); 478 body->file.uri)));
480 break; 479 break;
481 case GNUNET_MESSENGER_KIND_PRIVATE: 480 case GNUNET_MESSENGER_KIND_PRIVATE:
481 encode_step (buffer, offset, &(body->privacy.key));
482 encode_step_ext (buffer, offset, body->privacy.data, min (length - offset, 482 encode_step_ext (buffer, offset, body->privacy.data, min (length - offset,
483 body->privacy. 483 body->privacy.
484 length)); 484 length));
@@ -564,30 +564,30 @@ encode_short_message (const struct GNUNET_MESSENGER_ShortMessage *message,
564 564
565 565
566#define decode_step_ext(src, offset, dst, size) do { \ 566#define decode_step_ext(src, offset, dst, size) do { \
567 GNUNET_memcpy (dst, src + offset, size); \ 567 GNUNET_memcpy (dst, src + offset, size); \
568 offset += size; \ 568 offset += size; \
569} while (0) 569} while (0)
570 570
571#define decode_step(src, offset, dst) do { \ 571#define decode_step(src, offset, dst) do { \
572 decode_step_ext (src, offset, dst, sizeof(*dst)); \ 572 decode_step_ext (src, offset, dst, sizeof(*dst)); \
573} while (0) 573} while (0)
574 574
575#define decode_step_malloc(src, offset, dst, size, zero) do { \ 575#define decode_step_malloc(src, offset, dst, size, zero) do { \
576 dst = GNUNET_malloc (size + zero); \ 576 dst = GNUNET_malloc (size + zero); \
577 if (zero) dst[size] = 0; \ 577 if (zero) dst[size] = 0; \
578 decode_step_ext (src, offset, dst, size); \ 578 decode_step_ext (src, offset, dst, size); \
579} while (0) 579} while (0)
580 580
581#define decode_step_key(src, offset, dst, length) do { \ 581#define decode_step_key(src, offset, dst, length) do { \
582 enum GNUNET_GenericReturnValue result; \ 582 enum GNUNET_GenericReturnValue result; \
583 size_t read; \ 583 size_t read; \
584 result = GNUNET_CRYPTO_read_public_key_from_buffer ( \ 584 result = GNUNET_CRYPTO_read_public_key_from_buffer ( \
585 src + offset, length - offset, dst, &read \ 585 src + offset, length - offset, dst, &read \
586 ); \ 586 ); \
587 if (GNUNET_SYSERR == result) \ 587 if (GNUNET_SYSERR == result) \
588 GNUNET_break (0); \ 588 GNUNET_break (0); \
589 else \ 589 else \
590 offset += read; \ 590 offset += read; \
591} while (0) 591} while (0)
592 592
593static uint16_t 593static uint16_t
@@ -615,7 +615,6 @@ decode_message_body (enum GNUNET_MESSENGER_MessageKind *kind,
615 switch (*kind) 615 switch (*kind)
616 { 616 {
617 case GNUNET_MESSENGER_KIND_INFO: { 617 case GNUNET_MESSENGER_KIND_INFO: {
618 decode_step_key (buffer, offset, &(body->info.host_key), length);
619 decode_step (buffer, offset, &version); 618 decode_step (buffer, offset, &version);
620 619
621 body->info.messenger_version = GNUNET_be32toh (version); 620 body->info.messenger_version = GNUNET_be32toh (version);
@@ -661,6 +660,8 @@ decode_message_body (enum GNUNET_MESSENGER_MessageKind *kind,
661 decode_step_malloc (buffer, offset, body->file.uri, length - offset, 1); 660 decode_step_malloc (buffer, offset, body->file.uri, length - offset, 1);
662 break; 661 break;
663 case GNUNET_MESSENGER_KIND_PRIVATE: 662 case GNUNET_MESSENGER_KIND_PRIVATE:
663 decode_step (buffer, offset, &(body->privacy.key));
664
664 body->privacy.length = (length - offset); 665 body->privacy.length = (length - offset);
665 decode_step_malloc (buffer, offset, body->privacy.data, length - offset, 0); 666 decode_step_malloc (buffer, offset, body->privacy.data, length - offset, 0);
666 break; 667 break;
@@ -801,9 +802,39 @@ sign_message (struct GNUNET_MESSENGER_Message *message,
801 uint16_t length, 802 uint16_t length,
802 char *buffer, 803 char *buffer,
803 const struct GNUNET_HashCode *hash, 804 const struct GNUNET_HashCode *hash,
804 const struct GNUNET_MESSENGER_Ego *ego) 805 const struct GNUNET_CRYPTO_PrivateKey *key)
806{
807 GNUNET_assert ((message) && (buffer) && (hash) && (key));
808
809 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sign message by member: %s\n",
810 GNUNET_h2s (hash));
811
812 struct GNUNET_MESSENGER_MessageSignature signature;
813
814 signature.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE);
815 signature.purpose.size = htonl (sizeof(signature));
816
817 GNUNET_memcpy (&(signature.hash), hash, sizeof(struct GNUNET_HashCode));
818 GNUNET_CRYPTO_sign (key, &signature, &(message->header.signature));
819
820 message->header.signature.type = key->type;
821
822 uint16_t offset = 0;
823 encode_step_signature (buffer, offset, &(message->header.signature), length);
824}
825
826
827void
828sign_message_by_peer (struct GNUNET_MESSENGER_Message *message,
829 uint16_t length,
830 char *buffer,
831 const struct GNUNET_HashCode *hash,
832 const struct GNUNET_CONFIGURATION_Handle *cfg)
805{ 833{
806 GNUNET_assert ((message) && (buffer) && (hash) && (ego)); 834 GNUNET_assert ((message) && (buffer) && (hash) && (cfg));
835
836 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sign message by peer: %s\n",
837 GNUNET_h2s (hash));
807 838
808 struct GNUNET_MESSENGER_MessageSignature signature; 839 struct GNUNET_MESSENGER_MessageSignature signature;
809 840
@@ -811,7 +842,11 @@ sign_message (struct GNUNET_MESSENGER_Message *message,
811 signature.purpose.size = htonl (sizeof(signature)); 842 signature.purpose.size = htonl (sizeof(signature));
812 843
813 GNUNET_memcpy (&(signature.hash), hash, sizeof(struct GNUNET_HashCode)); 844 GNUNET_memcpy (&(signature.hash), hash, sizeof(struct GNUNET_HashCode));
814 GNUNET_CRYPTO_sign (&(ego->priv), &signature, &(message->header.signature)); 845 GNUNET_CRYPTO_sign_by_peer_identity (cfg, &signature.purpose,
846 &(message->header.signature.
847 eddsa_signature));
848
849 message->header.signature.type = htonl (GNUNET_PUBLIC_KEY_TYPE_EDDSA);
815 850
816 uint16_t offset = 0; 851 uint16_t offset = 0;
817 encode_step_signature (buffer, offset, &(message->header.signature), length); 852 encode_step_signature (buffer, offset, &(message->header.signature), length);
@@ -825,7 +860,7 @@ verify_message (const struct GNUNET_MESSENGER_Message *message,
825{ 860{
826 GNUNET_assert ((message) && (hash) && (key)); 861 GNUNET_assert ((message) && (hash) && (key));
827 862
828 if (ntohl (key->type) != ntohl (message->header.signature.type)) 863 if (key->type != message->header.signature.type)
829 return GNUNET_SYSERR; 864 return GNUNET_SYSERR;
830 865
831 struct GNUNET_MESSENGER_MessageSignature signature; 866 struct GNUNET_MESSENGER_MessageSignature signature;
@@ -842,11 +877,38 @@ verify_message (const struct GNUNET_MESSENGER_Message *message,
842 877
843 878
844int 879int
880verify_message_by_peer (const struct GNUNET_MESSENGER_Message *message,
881 const struct GNUNET_HashCode *hash,
882 const struct GNUNET_PeerIdentity *identity)
883{
884 GNUNET_assert ((message) && (hash) && (identity));
885
886 if (ntohl (GNUNET_PUBLIC_KEY_TYPE_EDDSA) != message->header.signature.type)
887 return GNUNET_SYSERR;
888
889 struct GNUNET_MESSENGER_MessageSignature signature;
890
891 signature.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE);
892 signature.purpose.size = htonl (sizeof(signature));
893
894 GNUNET_memcpy (&(signature.hash), hash, sizeof(struct GNUNET_HashCode));
895
896 return GNUNET_CRYPTO_verify_peer_identity (
897 GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE, &signature.purpose,
898 &(message->header.signature.
899 eddsa_signature), identity);
900}
901
902
903int
845encrypt_message (struct GNUNET_MESSENGER_Message *message, 904encrypt_message (struct GNUNET_MESSENGER_Message *message,
846 const struct GNUNET_CRYPTO_PublicKey *key) 905 const struct GNUNET_CRYPTO_PublicKey *key)
847{ 906{
848 GNUNET_assert ((message) && (key)); 907 GNUNET_assert ((message) && (key));
849 908
909 if (GNUNET_YES == is_service_message (message))
910 return GNUNET_NO;
911
850 struct GNUNET_MESSENGER_ShortMessage shortened; 912 struct GNUNET_MESSENGER_ShortMessage shortened;
851 913
852 fold_short_message (message, &shortened); 914 fold_short_message (message, &shortened);
@@ -867,10 +929,10 @@ encrypt_message (struct GNUNET_MESSENGER_Message *message,
867 encode_short_message (&shortened, encoded_length, message->body.privacy.data); 929 encode_short_message (&shortened, encoded_length, message->body.privacy.data);
868 930
869 if (GNUNET_OK != GNUNET_CRYPTO_encrypt (message->body.privacy.data, 931 if (GNUNET_OK != GNUNET_CRYPTO_encrypt (message->body.privacy.data,
870 encoded_length, 932 encoded_length,
871 key, 933 key,
872 message->body.privacy.data, 934 message->body.privacy.data,
873 padded_length)) 935 padded_length))
874 { 936 {
875 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Encrypting message failed!\n"); 937 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Encrypting message failed!\n");
876 938
@@ -904,10 +966,10 @@ decrypt_message (struct GNUNET_MESSENGER_Message *message,
904 ); 966 );
905 967
906 if (GNUNET_OK != GNUNET_CRYPTO_decrypt (message->body.privacy.data, 968 if (GNUNET_OK != GNUNET_CRYPTO_decrypt (message->body.privacy.data,
907 padded_length, 969 padded_length,
908 key, 970 key,
909 message->body.privacy.data, 971 message->body.privacy.data,
910 encoded_length)) 972 encoded_length))
911 { 973 {
912 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Decrypting message failed!\n"); 974 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Decrypting message failed!\n");
913 975
@@ -934,15 +996,13 @@ decrypt_message (struct GNUNET_MESSENGER_Message *message,
934struct GNUNET_MQ_Envelope* 996struct GNUNET_MQ_Envelope*
935pack_message (struct GNUNET_MESSENGER_Message *message, 997pack_message (struct GNUNET_MESSENGER_Message *message,
936 struct GNUNET_HashCode *hash, 998 struct GNUNET_HashCode *hash,
937 const struct GNUNET_MESSENGER_Ego *ego, 999 const GNUNET_MESSENGER_SignFunction sign,
938 int mode) 1000 int mode,
1001 const void *cls)
939{ 1002{
940 GNUNET_assert (message); 1003 GNUNET_assert (message);
941 1004
942 if (ego) 1005 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
943 message->header.signature.type = ego->priv.type;
944
945 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
946 "Packing message kind=%u and sender: %s\n", 1006 "Packing message kind=%u and sender: %s\n",
947 message->header.kind, GNUNET_sh2s (&(message->header.sender_id))); 1007 message->header.kind, GNUNET_sh2s (&(message->header.sender_id)));
948 1008
@@ -974,8 +1034,8 @@ pack_message (struct GNUNET_MESSENGER_Message *message,
974 { 1034 {
975 hash_message (message, length, buffer, hash); 1035 hash_message (message, length, buffer, hash);
976 1036
977 if (ego) 1037 if (sign)
978 sign_message (message, length, buffer, hash, ego); 1038 sign (cls, message, length, buffer, hash);
979 } 1039 }
980 1040
981 if (GNUNET_MESSENGER_PACK_MODE_ENVELOPE != mode) 1041 if (GNUNET_MESSENGER_PACK_MODE_ENVELOPE != mode)
@@ -986,8 +1046,71 @@ pack_message (struct GNUNET_MESSENGER_Message *message,
986 1046
987 1047
988int 1048int
1049is_peer_message (const struct GNUNET_MESSENGER_Message *message)
1050{
1051 switch (message->header.kind)
1052 {
1053 case GNUNET_MESSENGER_KIND_INFO:
1054 case GNUNET_MESSENGER_KIND_PEER:
1055 case GNUNET_MESSENGER_KIND_MISS:
1056 case GNUNET_MESSENGER_KIND_MERGE:
1057 return GNUNET_YES;
1058 default:
1059 return GNUNET_NO;
1060 }
1061}
1062
1063
1064int
1065is_service_message (const struct GNUNET_MESSENGER_Message *message)
1066{
1067 if (GNUNET_YES == is_peer_message (message))
1068 return GNUNET_YES;
1069
1070 switch (message->header.kind)
1071 {
1072 case GNUNET_MESSENGER_KIND_INFO:
1073 return GNUNET_YES; // Reserved for connection handling only!
1074 case GNUNET_MESSENGER_KIND_JOIN:
1075 return GNUNET_YES; // Reserved for member handling only!
1076 case GNUNET_MESSENGER_KIND_LEAVE:
1077 return GNUNET_YES; // Reserved for member handling only!
1078 case GNUNET_MESSENGER_KIND_NAME:
1079 return GNUNET_YES; // Reserved for member name handling only!
1080 case GNUNET_MESSENGER_KIND_KEY:
1081 return GNUNET_YES; // Reserved for member key handling only!
1082 case GNUNET_MESSENGER_KIND_PEER:
1083 return GNUNET_YES; // Reserved for connection handling only!
1084 case GNUNET_MESSENGER_KIND_ID:
1085 return GNUNET_YES; // Reserved for member id handling only!
1086 case GNUNET_MESSENGER_KIND_MISS:
1087 return GNUNET_YES; // Reserved for connection handling only!
1088 case GNUNET_MESSENGER_KIND_MERGE:
1089 return GNUNET_YES; // Reserved for peers only!
1090 case GNUNET_MESSENGER_KIND_REQUEST:
1091 return GNUNET_YES; // Requests should not apply individually! (inefficieny)
1092 case GNUNET_MESSENGER_KIND_INVITE:
1093 return GNUNET_NO;
1094 case GNUNET_MESSENGER_KIND_TEXT:
1095 return GNUNET_NO;
1096 case GNUNET_MESSENGER_KIND_FILE:
1097 return GNUNET_NO;
1098 case GNUNET_MESSENGER_KIND_PRIVATE:
1099 return GNUNET_YES; // Prevent duplicate encryption breaking all access!
1100 case GNUNET_MESSENGER_KIND_DELETE:
1101 return GNUNET_YES; // Deletion should not apply individually! (inefficieny)
1102 default:
1103 return GNUNET_SYSERR;
1104 }
1105}
1106
1107
1108int
989filter_message_sending (const struct GNUNET_MESSENGER_Message *message) 1109filter_message_sending (const struct GNUNET_MESSENGER_Message *message)
990{ 1110{
1111 if (GNUNET_YES == is_peer_message (message))
1112 return GNUNET_SYSERR; // Requires signature of peer rather than ego!
1113
991 switch (message->header.kind) 1114 switch (message->header.kind)
992 { 1115 {
993 case GNUNET_MESSENGER_KIND_INFO: 1116 case GNUNET_MESSENGER_KIND_INFO:
@@ -999,15 +1122,15 @@ filter_message_sending (const struct GNUNET_MESSENGER_Message *message)
999 case GNUNET_MESSENGER_KIND_NAME: 1122 case GNUNET_MESSENGER_KIND_NAME:
1000 return GNUNET_YES; 1123 return GNUNET_YES;
1001 case GNUNET_MESSENGER_KIND_KEY: 1124 case GNUNET_MESSENGER_KIND_KEY:
1002 return GNUNET_NO; // Use #GNUNET_MESSENGER_update(...) instead! 1125 return GNUNET_NO; // Use #GNUNET_MESSENGER_set_key_by_ego(...) instead!
1003 case GNUNET_MESSENGER_KIND_PEER: 1126 case GNUNET_MESSENGER_KIND_PEER:
1004 return GNUNET_NO; // Use #GNUNET_MESSENGER_open_room(...) instead! 1127 return GNUNET_SYSERR; // Use #GNUNET_MESSENGER_open_room(...) instead!
1005 case GNUNET_MESSENGER_KIND_ID: 1128 case GNUNET_MESSENGER_KIND_ID:
1006 return GNUNET_SYSERR; // Reserved for member id handling only! 1129 return GNUNET_NO; // Reserved for member id handling only!
1007 case GNUNET_MESSENGER_KIND_MISS: 1130 case GNUNET_MESSENGER_KIND_MISS:
1008 return GNUNET_SYSERR; // Reserved for connection handling only! 1131 return GNUNET_SYSERR; // Reserved for connection handling only!
1009 case GNUNET_MESSENGER_KIND_MERGE: 1132 case GNUNET_MESSENGER_KIND_MERGE:
1010 return GNUNET_YES; 1133 return GNUNET_SYSERR; // Reserved for peers only!
1011 case GNUNET_MESSENGER_KIND_REQUEST: 1134 case GNUNET_MESSENGER_KIND_REQUEST:
1012 return GNUNET_YES; 1135 return GNUNET_YES;
1013 case GNUNET_MESSENGER_KIND_INVITE: 1136 case GNUNET_MESSENGER_KIND_INVITE: