Пример #1
0
int main(int argc, char *argv[])
{
    xmpp_ctx_t *ctx;
    unsigned char *udec;
    char *dec;
    char *enc;
    size_t len;
    int i;

    printf("BASE64 tests.\n");

    ctx = xmpp_ctx_new(NULL, NULL);
    if (ctx == NULL) {
        fprintf(stderr, "failed to create context\n");
        return 1;
    }

    for (i = 0; i < ARRAY_SIZE(tests); ++i) {
        printf("Test #%d: ", (int)i + 1);
        enc = xmpp_base64_encode(ctx, (unsigned char *)tests[i].raw,
                                 strlen(tests[i].raw));
        assert(enc != NULL);
        COMPARE(tests[i].base64, enc);
        xmpp_free(ctx, enc);

        dec = xmpp_base64_decode_str(ctx, tests[i].base64,
                                     strlen(tests[i].base64));
        assert(dec != NULL);
        COMPARE_BUF(tests[i].raw, strlen(tests[i].raw), dec, strlen(dec));
        xmpp_free(ctx, dec);
        printf("ok\n");
    }

    printf("Test with binary data: ");
    enc = xmpp_base64_encode(ctx, bin_data, sizeof(bin_data));
    assert(enc != NULL);
    xmpp_base64_decode_bin(ctx, enc, strlen(enc), &udec, &len);
    assert(udec != NULL);
    assert(len != 0);
    assert(len == sizeof(bin_data));
    COMPARE_BUF(bin_data, sizeof(bin_data), udec, len);
    xmpp_free(ctx, udec);
    xmpp_free(ctx, enc);
    printf("ok\n");

    xmpp_ctx_free(ctx);

    return 0;
}
Пример #2
0
/** generate auth response string for the SASL SCRAM-SHA-1 mechanism */
char *sasl_scram_sha1(xmpp_ctx_t *ctx, const char *challenge,
                      const char *first_bare, const char *jid,
                      const char *password)
{
    uint8_t key[SHA1_DIGEST_SIZE];
    uint8_t sign[SHA1_DIGEST_SIZE];
    char *r = NULL;
    char *s = NULL;
    char *i = NULL;
    unsigned char *sval;
    size_t sval_len;
    long ival;
    char *tmp;
    char *ptr;
    char *saveptr = NULL;
    char *response;
    char *auth;
    char *response_b64;
    char *sign_b64;
    char *result = NULL;
    size_t response_len;
    size_t auth_len;
    int j;

    tmp = xmpp_strdup(ctx, challenge);
    if (!tmp) {
        return NULL;
    }

    ptr = strtok_r(tmp, ",", &saveptr);
    while (ptr) {
        if (strncmp(ptr, "r=", 2) == 0) {
            r = ptr;
        } else if (strncmp(ptr, "s=", 2) == 0) {
            s = ptr + 2;
        } else if (strncmp(ptr, "i=", 2) == 0) {
            i = ptr + 2;
        }
        ptr = strtok_r(NULL, ",", &saveptr);
    }

    if (!r || !s || !i) {
        goto out;
    }

    xmpp_base64_decode_bin(ctx, s, strlen(s), &sval, &sval_len);
    if (!sval) {
        goto out;
    }
    ival = strtol(i, &saveptr, 10);

    auth_len = 10 + strlen(r) + strlen(first_bare) + strlen(challenge);
    auth = xmpp_alloc(ctx, auth_len);
    if (!auth) {
        goto out_sval;
    }

    response_len = 39 + strlen(r);
    response = xmpp_alloc(ctx, response_len);
    if (!response) {
        goto out_auth;
    }

    xmpp_snprintf(response, response_len, "c=biws,%s", r);
    xmpp_snprintf(auth, auth_len, "%s,%s,%s", first_bare + 3, challenge,
                  response);

    SCRAM_SHA1_ClientKey((uint8_t *)password, strlen(password),
                         (uint8_t *)sval, sval_len, (uint32_t)ival, key);
    SCRAM_SHA1_ClientSignature(key, (uint8_t *)auth, strlen(auth), sign);
    for (j = 0; j < SHA1_DIGEST_SIZE; j++) {
        sign[j] ^= key[j];
    }

    sign_b64 = xmpp_base64_encode(ctx, sign, sizeof(sign));
    if (!sign_b64) {
        goto out_response;
    }

    if (strlen(response) + strlen(sign_b64) + 3 + 1 > response_len) {
        xmpp_free(ctx, sign_b64);
        goto out_response;
    }
    strcat(response, ",p=");
    strcat(response, sign_b64);
    xmpp_free(ctx, sign_b64);

    response_b64 = xmpp_base64_encode(ctx, (unsigned char *)response,
                                      strlen(response));
    if (!response_b64) {
        goto out_response;
    }
    result = response_b64;

out_response:
    xmpp_free(ctx, response);
out_auth:
    xmpp_free(ctx, auth);
out_sval:
    xmpp_free(ctx, sval);
out:
    xmpp_free(ctx, tmp);
    return result;
}
Пример #3
0
    int
handle_message(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
        void * const userdata)
{
    xmpp_stanza_t *child = NULL;
    xmppipe_state_t *state = userdata;

    char *message = NULL;
    const char *type = NULL;
    const char *from = NULL;
    const char *to = NULL;
    const char *ns;

    char *etype = NULL;
    char *efrom = NULL;
    char *eto = NULL;
    char *emessage = NULL;

    char *symbol = "m";

    if (xmpp_stanza_get_child_by_name(stanza, "delay"))
        return 1;

    from = xmpp_stanza_get_attribute(stanza, "from");
    if (from == NULL)
        return 1;

    to = xmpp_stanza_get_attribute(stanza, "to");
    if (to == NULL)
        return 1;

    type = xmpp_stanza_get_type(stanza);
    if (type == NULL)
        return 1;

    /* Check if the message is from us */
    if (XMPPIPE_STREQ(type, "groupchat") && XMPPIPE_STREQ(from, state->mucjid))
        return 1;

    child = xmpp_stanza_get_child_by_name(stanza, "displayed");
    if (child != NULL) {
        ns = xmpp_stanza_get_ns(child);
        if (XMPPIPE_STREQ(ns, "urn:xmpp:chat-markers:0")) {
          if (!(state->opt & XMPPIPE_OPT_CHAT_MARKER))
            return 1;

          symbol = "M";
        }
    }

    child = xmpp_stanza_get_child_by_name(stanza, "body");

    if (child != NULL) {
        message = xmpp_stanza_get_text(child);
        if (message != NULL) {
          if (state->encode) {
            size_t len = strlen(message);
            unsigned char *buf = NULL;
            size_t n = 0;

            xmpp_base64_decode_bin(state->ctx, message, len, &buf, &n);

            if (buf == NULL) {
                /* Not a base64 message */
                return 1;
            }

            emessage = xmppipe_nfmt_encode((char *)buf, n);
            xmpp_free(state->ctx, buf);
          }
          else {
            emessage = xmppipe_fmt_encode(message);
          }

          xmpp_free(state->ctx, message);
        }
        goto XMPPIPE_STDOUT;
    }

    child = xmpp_stanza_get_child_by_name(stanza, "subject");
    if (child != NULL) {
        message = xmpp_stanza_get_text(child);
        if (message != NULL)
          emessage = xmppipe_fmt_encode(message);
        symbol = "S";
        xmpp_free(state->ctx, message);
    }

XMPPIPE_STDOUT:
    etype = xmppipe_fmt_encode(type);
    efrom = xmppipe_fmt_encode(from);
    eto = xmppipe_fmt_encode(to);

    (void)printf("%s:%s:%s:%s:%s\n", symbol, etype, efrom, eto,
        emessage == NULL ? "" : emessage);

    state->interval = 0;

    free(etype);
    free(efrom);
    free(eto);
    free(emessage);

    return 1;
}