1 /* $Id: base64.c,v 1.9 2017/01/24 13:32:55 jsing Exp $ */ 2 /* 3 * Copyright (c) 2016 Kristaps Dzonsons <kristaps@bsd.lv> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <netinet/in.h> 19 #include <resolv.h> 20 21 #include <stdlib.h> 22 23 #include "extern.h" 24 25 /* 26 * Compute the maximum buffer required for a base64 encoded string of 27 * length "len". 28 */ 29 size_t 30 base64len(size_t len) 31 { 32 33 return (len + 2) / 3 * 4 + 1; 34 } 35 36 /* 37 * Pass a stream of bytes to be base64 encoded, then converted into 38 * base64url format. 39 * Returns NULL on allocation failure (not logged). 40 */ 41 char * 42 base64buf_url(const char *data, size_t len) 43 { 44 size_t i, sz; 45 char *buf; 46 47 sz = base64len(len); 48 if ((buf = malloc(sz)) == NULL) 49 return NULL; 50 51 b64_ntop(data, len, buf, sz); 52 53 for (i = 0; i < sz; i++) 54 switch (buf[i]) { 55 case '+': 56 buf[i] = '-'; 57 break; 58 case '/': 59 buf[i] = '_'; 60 break; 61 case '=': 62 buf[i] = '\0'; 63 break; 64 } 65 66 return buf; 67 } 68