Skip to content

Commit

Permalink
decode data from shells keys
Browse files Browse the repository at this point in the history
  • Loading branch information
Matei94 committed Mar 25, 2015
1 parent 60f953f commit 79b3b14
Show file tree
Hide file tree
Showing 4 changed files with 173 additions and 4 deletions.
9 changes: 6 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
CC = gcc
CFLAGS = -g -Wall -DERR -DLOG -DSHELLS
CFLAGS = -Wall -DERR -DLOG -DSHELLS

.PHONY: init clean

init: init.o wjson.o wxmpp.o wxmpp_handlers.o shells.o libds
init: init.o wjson.o wxmpp.o wxmpp_handlers.o shells.o base64.o libds
make -C libds
$(CC) init.o wjson.o wxmpp.o wxmpp_handlers.o shells.o libds/*.o -o init -ljansson -lstrophe
$(CC) init.o wjson.o wxmpp.o wxmpp_handlers.o shells.o base64.o libds/*.o -o init -ljansson -lstrophe

init.o: init.c winternals/winternals.h wjson/wjson.h wxmpp/wxmpp.h
$(CC) $(CFLAGS) -c init.c
Expand All @@ -22,5 +22,8 @@ wxmpp_handlers.o: wxmpp/wxmpp_handlers.c wxmpp/wxmpp.h wxmpp/wxmpp_handlers.h wi
shells.o: shells/shells.c winternals/winternals.h shells/shells.h
$(CC) $(CFLAGS) -c shells/shells.c

base64.o: base64/base64.c base64/base64.h
$(CC) $(CFLAGS) -c base64/base64.c

clean:
rm -f *.o init
102 changes: 102 additions & 0 deletions base64/base64.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
* Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com)
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

/**
* @file
* @brief Base64 encode/decode
* @author Ryan Martell <rdm4@martellventures.com> (with lots of Michael)
*/

#include <stdio.h>
#include <limits.h>
//#include "utils.h"
#include "base64.h"

/* ---------------- private code */
static const uint8_t map2[] =
{
0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34, 0x35, 0x36,
0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1b,
0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33
};

int base64_decode(uint8_t *out, const char *in, int out_size)
{
int i, v;
uint8_t *dst = out;

v = 0;
for (i = 0; in[i] && in[i] != '='; i++) {
unsigned int index= in[i]-43;
if (index>=SIZEOF_ARRAY(map2) || map2[index] == 0xff)
return -1;
v = (v << 6) + map2[index];
if (i & 3) {
if (dst - out < out_size) {
*dst++ = v >> (6 - 2 * (i & 3));
}
}
}

return dst - out;
}

/*****************************************************************************
* b64_encode: Stolen from VLC's http.c.
* Simplified by Michael.
* Fixed edge cases and made it work from data (vs. strings) by Ryan.
*****************************************************************************/

char *base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
{
static const char b64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char *ret, *dst;
unsigned i_bits = 0;
int i_shift = 0;
int bytes_remaining = in_size;

if (in_size >= UINT_MAX / 4 ||
out_size < BASE64_SIZE(in_size))
return NULL;
ret = dst = out;
while (bytes_remaining) {
i_bits = (i_bits << 8) + *in++;
bytes_remaining--;
i_shift += 8;

do {
*dst++ = b64[(i_bits << 6 >> i_shift) & 0x3f];
i_shift -= 6;
} while (i_shift > 6 || (bytes_remaining == 0 && i_shift > 0));
}
while ((dst - ret) & 3)
*dst++ = '=';
*dst = '\0';

return ret;
}
56 changes: 56 additions & 0 deletions base64/base64.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com)
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#ifndef BASE64_H
#define BASE64_H

#include <stdint.h>

#define SIZEOF_ARRAY(arr) (sizeof(arr) / sizeof(arr[0]))

/**
* Decode a base64-encoded string.
*
* @param out buffer for decoded data
* @param in null-terminated input string
* @param out_size size in bytes of the out buffer, must be at
* least 3/4 of the length of in
* @return number of bytes written, or a negative value in case of
* invalid input
*/
int base64_decode(uint8_t *out, const char *in, int out_size);

/**
* Encode data to base64 and null-terminate.
*
* @param out buffer for encoded data
* @param out_size size in bytes of the output buffer, must be at
* least BASE64_SIZE(in_size)
* @param in_size size in bytes of the 'in' buffer
* @return 'out' or NULL in case of error
*/
char *base64_encode(char *out, int out_size, const uint8_t *in, int in_size);

/**
* Calculate the output size needed to base64-encode x bytes.
*/
#define BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1)

#endif /* BASE64_H */
10 changes: 9 additions & 1 deletion shells/shells.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

#include <strophe.h> /* Strophe XMPP stuff */
#include <strings.h> /* strncasecmp */
#include <string.h>
#include <string.h> /* strlen */
#include <stdlib.h> /* malloc */

#include "../winternals/winternals.h" /* logs and errs */
#include "../wxmpp/wxmpp.h" /* WNS */
#include "../base64/base64.h" /* encode decode */
#include "shells.h" /* shells module api */

#ifdef SHELLS
Expand Down Expand Up @@ -87,6 +89,12 @@ void shells_keys(xmpp_stanza_t *stanza, xmpp_conn_t *const conn, void *const use
return;
}

/* Decode */
int dec_size = strlen(data_str) * 3 / 4 + 1; /* decoded data length */
uint8_t *decoded = (uint8_t *)calloc(dec_size, sizeof(uint8_t)); /* decoded data */
base64_decode(decoded, data_str, dec_size); /* decode */
werr("decoded data = %s\n\n\n", decoded);

/* Send back keys */
xmpp_ctx_t *ctx = (xmpp_ctx_t*)userdata; /* Strophe context */

Expand Down

0 comments on commit 79b3b14

Please sign in to comment.