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  }