1d059297112922cabb0c674840589be8db821fd9aAdam Langley/* $OpenBSD: uuencode.c,v 1.27 2013/05/17 00:13:14 djm Exp $ */ 2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* 3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 2000 Markus Friedl. All rights reserved. 4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Redistribution and use in source and binary forms, with or without 6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * modification, are permitted provided that the following conditions 7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * are met: 8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 1. Redistributions of source code must retain the above copyright 9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * notice, this list of conditions and the following disclaimer. 10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 2. Redistributions in binary form must reproduce the above copyright 11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * notice, this list of conditions and the following disclaimer in the 12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * documentation and/or other materials provided with the distribution. 13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */ 25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "includes.h" 27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <sys/types.h> 29bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <netinet/in.h> 30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <resolv.h> 31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdio.h> 32d059297112922cabb0c674840589be8db821fd9aAdam Langley#include <stdlib.h> 33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "xmalloc.h" 35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "uuencode.h" 36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 37bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* 38bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Encode binary 'src' of length 'srclength', writing base64-encoded text 39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * to 'target' of size 'targsize'. Will always nul-terminate 'target'. 40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Returns the number of bytes stored in 'target' or -1 on error (inc. 41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 'targsize' too small). 42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */ 43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint 44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanuuencode(const u_char *src, u_int srclength, 45bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman char *target, size_t targsize) 46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return __b64_ntop(src, srclength, target, targsize); 48bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* 51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Decode base64-encoded 'src' into buffer 'target' of 'targsize' bytes. 52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Will skip leading and trailing whitespace. Returns the number of bytes 53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * stored in 'target' or -1 on error (inc. targsize too small). 54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */ 55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint 56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanuudecode(const char *src, u_char *target, size_t targsize) 57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 58bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman int len; 59bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman char *encoded, *p; 60bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* copy the 'readonly' source */ 62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman encoded = xstrdup(src); 63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* skip whitespace and data */ 64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman for (p = encoded; *p == ' ' || *p == '\t'; p++) 65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman ; 66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman for (; *p != '\0' && *p != ' ' && *p != '\t'; p++) 67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman ; 68bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* and remove trailing whitespace because __b64_pton needs this */ 69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *p = '\0'; 70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman len = __b64_pton(encoded, target, targsize); 71d059297112922cabb0c674840589be8db821fd9aAdam Langley free(encoded); 72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return len; 73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 74bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid 76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmandump_base64(FILE *fp, const u_char *data, u_int len) 77bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman char *buf; 79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman int i, n; 80bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (len > 65536) { 82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fprintf(fp, "dump_base64: len > 65536\n"); 83bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return; 84bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 85bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman buf = xmalloc(2*len); 86bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman n = uuencode(data, len, buf, 2*len); 87bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman for (i = 0; i < n; i++) { 88bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fprintf(fp, "%c", buf[i]); 89bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (i % 70 == 69) 90bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fprintf(fp, "\n"); 91bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 92bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (i % 70 != 69) 93bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fprintf(fp, "\n"); 94d059297112922cabb0c674840589be8db821fd9aAdam Langley free(buf); 95bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 96