summaryrefslogtreecommitdiffstats
path: root/friendfinder/crypto.c
diff options
context:
space:
mode:
authorPatrick Hornecker2010-02-20 12:42:23 +0100
committerPatrick Hornecker2010-02-20 12:42:23 +0100
commit5bbe2ca10a09db4c444ce98f4ddea501e7c9be22 (patch)
tree90419438bf2e47a6edc63062e08af0a1f98a7629 /friendfinder/crypto.c
parentfew bugs fixed, redrawing of bubbels changed (diff)
downloadfriendfinder-5bbe2ca10a09db4c444ce98f4ddea501e7c9be22.tar.gz
friendfinder-5bbe2ca10a09db4c444ce98f4ddea501e7c9be22.tar.xz
friendfinder-5bbe2ca10a09db4c444ce98f4ddea501e7c9be22.zip
few code work and tex source
Diffstat (limited to 'friendfinder/crypto.c')
-rw-r--r--friendfinder/crypto.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/friendfinder/crypto.c b/friendfinder/crypto.c
new file mode 100644
index 0000000..465c83f
--- /dev/null
+++ b/friendfinder/crypto.c
@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include <string.h>
+
+#include <openssl/pem.h>
+#include <openssl/bio.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+
+#include "cryptossl.h"
+
+#define dump_sslerror() \
+do {\
+ unsigned long err = ERR_get_error(); \
+ ERR_load_crypto_strings(); \
+ printf("%s:%i %s\n", __FILE__, __LINE__, ERR_error_string(err, NULL)); \
+} while(0)
+
+#define MAX_PEM_SIZE 4096
+static char buff[4096]; //XXX: stat() to get filesize!
+
+BIO* load_pem(char *filename)
+{
+ FILE *file;
+ int size;
+ BIO *bio;
+
+ file = fopen(filename, "r");
+ if(file == NULL)
+ return NULL;
+
+ for(size = 0; fread(buff + size, 1, 1, file) == 1; size++)
+ {
+ if(size >= MAX_PEM_SIZE)
+ {
+ fclose(file);
+ return NULL;
+ }
+ }
+ fclose(file);
+
+ bio = BIO_new_mem_buf(buff, size);
+ if(bio == NULL)
+ dump_sslerror();
+ return bio;
+}
+
+int from_base64(char *in, int inlen, char *out, int maxlen)
+{
+ BIO *b64, *bmem;
+
+ memset(out, 0, maxlen);
+
+ b64 = BIO_new(BIO_f_base64());
+ if(!strchr(in, '\n'))
+ BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
+
+ bmem = BIO_new_mem_buf(in, inlen);
+ bmem = BIO_push(b64, bmem);
+ int j = BIO_ctrl_pending(bmem);
+ int ret = BIO_read(bmem, out, j);
+ BIO_free_all(bmem);
+ return ret;
+}
+
+int to_base64(char *in, int inlen, char *out, int maxlen)
+{
+ BIO *bmem, *b64;
+ BUF_MEM *bptr;
+ int ret;
+
+ b64 = BIO_new(BIO_f_base64());
+ bmem = BIO_new(BIO_s_mem());
+ b64 = BIO_push(b64, bmem);
+ BIO_write(b64, in, inlen);
+ BIO_flush(b64);
+
+ BIO_get_mem_ptr(b64, &bptr);
+ if(bptr->length > maxlen)
+ {
+ BIO_free_all(b64);
+ return -1;
+ }
+
+ memcpy(out, bptr->data, bptr->length-1);
+// XXX: we don't teminate b64 buffer as string
+// XXX: user gets length so wtf ;)
+// out[bptr->length-1] = 0;
+ ret = bptr->length;
+
+ BIO_free_all(b64);
+ return ret;
+}
+
+