github.com/maenmax/kairep@v0.0.0-20210218001208-55bf3df36788/src/golang.org/x/crypto/otr/libotr_test_helper.c (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This code can be compiled and used to test the otr package against libotr. 6 // See otr_test.go. 7 8 // +build ignore 9 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <unistd.h> 13 14 #include <proto.h> 15 #include <message.h> 16 #include <privkey.h> 17 18 static int g_session_established = 0; 19 20 OtrlPolicy policy(void *opdata, ConnContext *context) { 21 return OTRL_POLICY_ALWAYS; 22 } 23 24 int is_logged_in(void *opdata, const char *accountname, const char *protocol, 25 const char *recipient) { 26 return 1; 27 } 28 29 void inject_message(void *opdata, const char *accountname, const char *protocol, 30 const char *recipient, const char *message) { 31 printf("%s\n", message); 32 fflush(stdout); 33 fprintf(stderr, "libotr helper sent: %s\n", message); 34 } 35 36 void update_context_list(void *opdata) {} 37 38 void new_fingerprint(void *opdata, OtrlUserState us, const char *accountname, 39 const char *protocol, const char *username, 40 unsigned char fingerprint[20]) { 41 fprintf(stderr, "NEW FINGERPRINT\n"); 42 g_session_established = 1; 43 } 44 45 void write_fingerprints(void *opdata) {} 46 47 void gone_secure(void *opdata, ConnContext *context) {} 48 49 void gone_insecure(void *opdata, ConnContext *context) {} 50 51 void still_secure(void *opdata, ConnContext *context, int is_reply) {} 52 53 int max_message_size(void *opdata, ConnContext *context) { return 99999; } 54 55 const char *account_name(void *opdata, const char *account, 56 const char *protocol) { 57 return "ACCOUNT"; 58 } 59 60 void account_name_free(void *opdata, const char *account_name) {} 61 62 const char *error_message(void *opdata, ConnContext *context, 63 OtrlErrorCode err_code) { 64 return "ERR"; 65 } 66 67 void error_message_free(void *opdata, const char *msg) {} 68 69 void resent_msg_prefix_free(void *opdata, const char *prefix) {} 70 71 void handle_smp_event(void *opdata, OtrlSMPEvent smp_event, 72 ConnContext *context, unsigned short progress_event, 73 char *question) {} 74 75 void handle_msg_event(void *opdata, OtrlMessageEvent msg_event, 76 ConnContext *context, const char *message, 77 gcry_error_t err) { 78 fprintf(stderr, "msg event: %d %s\n", msg_event, message); 79 } 80 81 OtrlMessageAppOps uiops = { 82 policy, 83 NULL, 84 is_logged_in, 85 inject_message, 86 update_context_list, 87 new_fingerprint, 88 write_fingerprints, 89 gone_secure, 90 gone_insecure, 91 still_secure, 92 max_message_size, 93 account_name, 94 account_name_free, 95 NULL, /* received_symkey */ 96 error_message, 97 error_message_free, 98 NULL, /* resent_msg_prefix */ 99 resent_msg_prefix_free, 100 handle_smp_event, 101 handle_msg_event, 102 NULL /* create_instag */, 103 NULL /* convert_msg */, 104 NULL /* convert_free */, 105 NULL /* timer_control */, 106 }; 107 108 static const char kPrivateKeyData[] = 109 "(privkeys (account (name \"account\") (protocol proto) (private-key (dsa " 110 "(p " 111 "#00FC07ABCF0DC916AFF6E9AE47BEF60C7AB9B4D6B2469E436630E36F8A489BE812486A09F" 112 "30B71224508654940A835301ACC525A4FF133FC152CC53DCC59D65C30A54F1993FE13FE63E" 113 "5823D4C746DB21B90F9B9C00B49EC7404AB1D929BA7FBA12F2E45C6E0A651689750E8528AB" 114 "8C031D3561FECEE72EBB4A090D450A9B7A857#) (q " 115 "#00997BD266EF7B1F60A5C23F3A741F2AEFD07A2081#) (g " 116 "#535E360E8A95EBA46A4F7DE50AD6E9B2A6DB785A66B64EB9F20338D2A3E8FB0E94725848F" 117 "1AA6CC567CB83A1CC517EC806F2E92EAE71457E80B2210A189B91250779434B41FC8A8873F" 118 "6DB94BEA7D177F5D59E7E114EE10A49CFD9CEF88AE43387023B672927BA74B04EB6BBB5E57" 119 "597766A2F9CE3857D7ACE3E1E3BC1FC6F26#) (y " 120 "#0AC8670AD767D7A8D9D14CC1AC6744CD7D76F993B77FFD9E39DF01E5A6536EF65E775FCEF" 121 "2A983E2A19BD6415500F6979715D9FD1257E1FE2B6F5E1E74B333079E7C880D39868462A93" 122 "454B41877BE62E5EF0A041C2EE9C9E76BD1E12AE25D9628DECB097025DD625EF49C3258A1A" 123 "3C0FF501E3DC673B76D7BABF349009B6ECF#) (x " 124 "#14D0345A3562C480A039E3C72764F72D79043216#)))))\n"; 125 126 int main() { 127 OTRL_INIT; 128 129 // We have to write the private key information to a file because the libotr 130 // API demands a filename to read from. 131 const char *tmpdir = "/tmp"; 132 if (getenv("TMP")) { 133 tmpdir = getenv("TMP"); 134 } 135 136 char private_key_file[256]; 137 snprintf(private_key_file, sizeof(private_key_file), 138 "%s/libotr_test_helper_privatekeys-XXXXXX", tmpdir); 139 int fd = mkstemp(private_key_file); 140 if (fd == -1) { 141 perror("creating temp file"); 142 } 143 write(fd, kPrivateKeyData, sizeof(kPrivateKeyData) - 1); 144 close(fd); 145 146 OtrlUserState userstate = otrl_userstate_create(); 147 otrl_privkey_read(userstate, private_key_file); 148 unlink(private_key_file); 149 150 fprintf(stderr, "libotr helper started\n"); 151 152 char buf[4096]; 153 154 for (;;) { 155 char *message = fgets(buf, sizeof(buf), stdin); 156 if (strlen(message) == 0) { 157 break; 158 } 159 message[strlen(message) - 1] = 0; 160 fprintf(stderr, "libotr helper got: %s\n", message); 161 162 char *newmessage = NULL; 163 OtrlTLV *tlvs; 164 int ignore_message = otrl_message_receiving( 165 userstate, &uiops, NULL, "account", "proto", "peer", message, 166 &newmessage, &tlvs, NULL, NULL, NULL); 167 if (tlvs) { 168 otrl_tlv_free(tlvs); 169 } 170 171 if (newmessage != NULL) { 172 fprintf(stderr, "libotr got: %s\n", newmessage); 173 otrl_message_free(newmessage); 174 175 gcry_error_t err; 176 char *newmessage = NULL; 177 178 err = otrl_message_sending(userstate, &uiops, NULL, "account", "proto", 179 "peer", 0, "test message", NULL, &newmessage, 180 OTRL_FRAGMENT_SEND_SKIP, NULL, NULL, NULL); 181 if (newmessage == NULL) { 182 fprintf(stderr, "libotr didn't encrypt message\n"); 183 return 1; 184 } 185 write(1, newmessage, strlen(newmessage)); 186 write(1, "\n", 1); 187 fprintf(stderr, "libotr sent: %s\n", newmessage); 188 otrl_message_free(newmessage); 189 190 g_session_established = 0; 191 write(1, "?OTRv2?\n", 8); 192 fprintf(stderr, "libotr sent: ?OTRv2\n"); 193 } 194 } 195 196 return 0; 197 }