diff --git a/LICENSE b/LICENSE index 3b1a8e8..6cda2b4 100644 --- a/LICENSE +++ b/LICENSE @@ -83,41 +83,8 @@ OF THE POSSIBILITY OF SUCH DAMAGE. ## base64.[ch] /* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Hgskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Kungliga Tekniska - * Hgskolan and its contributors. - * - * 4. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * This code is public domain software. + * (obtained from from https://github.com/perl6/nqp/) */ --------------------------------------------------------------------------- diff --git a/Makefile b/Makefile index 2c02aac..543cb76 100644 --- a/Makefile +++ b/Makefile @@ -80,7 +80,7 @@ ocat: ocat.o $(OTR_OBJS) $(OTR_OBJS): config.mk Makefile -recorder.o: recorder.c storage.h util.h Makefile geo.h udata.h json.h http.h gcache.h config.mk hooks.h +recorder.o: recorder.c storage.h util.h Makefile geo.h udata.h json.h http.h gcache.h config.mk hooks.h base64.h geo.o: geo.h geo.c udata.h geohash.o: geohash.h geohash.c udata.h base64.o: base64.h base64.c diff --git a/base64.c b/base64.c index f77d271..241c54a 100755 --- a/base64.c +++ b/base64.c @@ -1,151 +1,119 @@ /* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Hgskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Kungliga Tekniska - * Hgskolan and its contributors. - * - * 4. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifdef HAVE_CONFIG_H -#include -/*RCSID("$Id: base64.c,v 1.1 2005/02/11 07:34:35 jpm Exp jpm $");*/ -#endif -#include -#include + This code is public domain software. + +*/ + #include "base64.h" -static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +#include +#include -static int pos(char c) +// base64 encoding +// +// buf: binary input data +// size: size of input (bytes) +// return: base64-encoded string (null-terminated) +// memory for output will be allocated here, free it later +// +char* base64_encode(const void* buf, size_t size) { - char *p; - for(p = base64; *p; p++) - if(*p == c) - return p - base64; - return -1; + static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + char* str = (char*) malloc((size+3)*4/3 + 1); + + char* p = str; + const unsigned char* q = (const unsigned char*) buf; + size_t i = 0; + + while (i < size) { + int c = q[i++]; + c *= 256; + if (i < size) + c += q[i]; + i++; + + c *= 256; + if (i < size) + c += q[i]; + i++; + + *p++ = base64[(c & 0x00fc0000) >> 18]; + *p++ = base64[(c & 0x0003f000) >> 12]; + + if (i > size + 1) + *p++ = '='; + else + *p++ = base64[(c & 0x00000fc0) >> 6]; + + if (i > size) + *p++ = '='; + else + *p++ = base64[c & 0x0000003f]; + } + + *p = 0; + + return str; } -int base64_encode(const void *data, int size, char **str) -{ - char *s, *p; - int i; - int c; - unsigned char *q; - p = s = (char*)malloc(size*4/3+4); - if (p == NULL) - return -1; - q = (unsigned char*)data; - i=0; - for(i = 0; i < size;){ - c=q[i++]; - c*=256; - if(i < size) - c+=q[i]; - i++; - c*=256; - if(i < size) - c+=q[i]; - i++; - p[0]=base64[(c&0x00fc0000) >> 18]; - p[1]=base64[(c&0x0003f000) >> 12]; - p[2]=base64[(c&0x00000fc0) >> 6]; - p[3]=base64[(c&0x0000003f) >> 0]; - if(i > size) - p[3]='='; - if(i > size+1) - p[2]='='; - p+=4; - } - *p=0; - *str = s; - return strlen(s); +// single base64 character conversion +// +static int POS(char c) +{ + if (c>='A' && c<='Z') return c - 'A'; + if (c>='a' && c<='z') return c - 'a' + 26; + if (c>='0' && c<='9') return c - '0' + 52; + if (c == '+') return 62; + if (c == '/') return 63; + if (c == '=') return -1; + return -2; } -int base64_decode(const char *str, void *data) +// base64 decoding +// +// s: base64 string, must be null-terminated +// data: output buffer for decoded data +// data_len size of decoded data +// return: allocated data buffer +// +void* base64_decode(const char* s, size_t *data_len) { - const char *p; - unsigned char *q; - int c; - int x; - int done = 0; - q=(unsigned char*)data; - for(p=str; *p && !done; p+=4){ - x = pos(p[0]); - if(x >= 0) - c = x; - else{ - done = 3; - break; - } - c*=64; - - x = pos(p[1]); - if(x >= 0) - c += x; - else - return -1; - c*=64; - - if(p[2] == '=') - done++; - else{ - x = pos(p[2]); - if(x >= 0) - c += x; - else - return -1; - } - c*=64; - - if(p[3] == '=') - done++; - else{ - if(done) - return -1; - x = pos(p[3]); - if(x >= 0) - c += x; - else - return -1; - } - if(done < 3) - *q++=(c&0x00ff0000)>>16; - - if(done < 2) - *q++=(c&0x0000ff00)>>8; - if(done < 1) - *q++=(c&0x000000ff)>>0; - } - return q - (unsigned char*)data; + const char *p; + unsigned char *q, *data; + int n[4]; + + size_t len = strlen(s); + if (len % 4) + return NULL; + data = (unsigned char*) malloc(len/4*3); + q = (unsigned char*) data; + + for (p = s; *p; ) { + n[0] = POS(*p++); + n[1] = POS(*p++); + n[2] = POS(*p++); + n[3] = POS(*p++); + + if (n[0] == -2 || n[1] == -2 || n[2] == -2 || n[3] == -2) + return NULL; + + if (n[0] == -1 || n[1] == -1) + return NULL; + + if (n[2] == -1 && n[3] != -1) + return NULL; + + q[0] = (n[0] << 2) + (n[1] >> 4); + if (n[2] != -1) + q[1] = ((n[1] & 15) << 4) + (n[2] >> 2); + if (n[3] != -1) + q[2] = ((n[2] & 3) << 6) + n[3]; + q += 3; + } + + *data_len = q-data - (n[2]==-1) - (n[3]==-1); + + return data; } diff --git a/base64.h b/base64.h index 380a31d..e49c3ab 100755 --- a/base64.h +++ b/base64.h @@ -1,47 +1,9 @@ -/* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Hgskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Kungliga Tekniska - * Hgskolan and its contributors. - * - * 4. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ +#ifndef BASE64_H_GUARD +#define BASE64_H_GUARD -/* $Id: base64.h,v 1.1 2005/02/11 07:34:35 jpm Exp jpm $ */ +#include -#ifndef _BASE64_H_ -#define _BASE64_H_ - -int base64_encode(const void *data, int size, char **str); -int base64_decode(const char *str, void *data); +char* base64_encode(const void* buf, size_t size); +void* base64_decode(const char* s, size_t *data_len); #endif diff --git a/recorder.c b/recorder.c index b1eb4b1..dd64c3b 100644 --- a/recorder.c +++ b/recorder.c @@ -104,6 +104,7 @@ int do_info(void *userdata, UT_string *username, UT_string *device, JsonNode *js FILE *fp; char *img; int rc = FALSE; + size_t imglen; utstring_renew(name); utstring_renew(face); @@ -141,19 +142,14 @@ int do_info(void *userdata, UT_string *username, UT_string *device, JsonNode *js /* We have a base64-encoded "face". Decode it and store binary image */ - if ((img = malloc(utstring_len(face))) != NULL) { - int imglen; - - if ((imglen = base64_decode(UB(face), img)) > 0) { - if ((fp = pathn("wb", "photos", username, NULL, "png")) != NULL) { - fwrite(img, sizeof(char), imglen, fp); - fclose(fp); - } + if ((img = base64_decode(UB(face), &imglen)) != NULL) { + if ((fp = pathn("wb", "photos", username, NULL, "png")) != NULL) { + fwrite(img, sizeof(char), imglen, fp); + fclose(fp); } free(img); } - return (rc); } @@ -591,11 +587,11 @@ struct mosquitto_message *decrypt(struct udata *ud, const struct mosquitto_messa msg->qos = m->qos; msg->retain = m->retain; - if ((ciphertext = malloc(n)) == NULL) { + if ((ciphertext = base64_decode(p64, &ciphertext_len)) == NULL) { + olog(LOG_ERR, "payload of %s cannot be base64-decoded", m->topic); free(msg); return (NULL); } - ciphertext_len = base64_decode(p64, ciphertext); fprintf(stderr, "START DECRYPT. clen==%lu\n", ciphertext_len);