1195618Srpaulo/* $OpenBSD: uuencode.c,v 1.28 2015/04/24 01:36:24 deraadt Exp $ */ 2195618Srpaulo/* 3195618Srpaulo * Copyright (c) 2000 Markus Friedl. All rights reserved. 4195618Srpaulo * 5195618Srpaulo * Redistribution and use in source and binary forms, with or without 6195618Srpaulo * modification, are permitted provided that the following conditions 7195618Srpaulo * are met: 8195618Srpaulo * 1. Redistributions of source code must retain the above copyright 9195618Srpaulo * notice, this list of conditions and the following disclaimer. 10195618Srpaulo * 2. Redistributions in binary form must reproduce the above copyright 11195618Srpaulo * notice, this list of conditions and the following disclaimer in the 12195618Srpaulo * documentation and/or other materials provided with the distribution. 13195618Srpaulo * 14195618Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15195618Srpaulo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16195618Srpaulo * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17195618Srpaulo * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18195618Srpaulo * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19195618Srpaulo * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20195618Srpaulo * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21195618Srpaulo * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22195618Srpaulo * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23195618Srpaulo * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24195618Srpaulo */ 25195618Srpaulo 26195618Srpaulo#include "includes.h" 27195618Srpaulo 28195618Srpaulo#include <sys/types.h> 29195618Srpaulo#include <netinet/in.h> 30195618Srpaulo#include <resolv.h> 31195618Srpaulo#include <stdio.h> 32195618Srpaulo#include <stdlib.h> 33195618Srpaulo 34195618Srpaulo#include "xmalloc.h" 35195618Srpaulo#include "uuencode.h" 36195618Srpaulo 37195618Srpaulo/* 38195618Srpaulo * Encode binary 'src' of length 'srclength', writing base64-encoded text 39195618Srpaulo * to 'target' of size 'targsize'. Will always nul-terminate 'target'. 40195618Srpaulo * Returns the number of bytes stored in 'target' or -1 on error (inc. 41195618Srpaulo * 'targsize' too small). 42195618Srpaulo */ 43195618Srpauloint 44195618Srpaulouuencode(const u_char *src, u_int srclength, 45195618Srpaulo char *target, size_t targsize) 46195618Srpaulo{ 47195618Srpaulo return __b64_ntop(src, srclength, target, targsize); 48195618Srpaulo} 49195618Srpaulo 50195618Srpaulo/* 51195618Srpaulo * Decode base64-encoded 'src' into buffer 'target' of 'targsize' bytes. 52195618Srpaulo * Will skip leading and trailing whitespace. Returns the number of bytes 53195618Srpaulo * stored in 'target' or -1 on error (inc. targsize too small). 54195618Srpaulo */ 55195618Srpauloint 56195618Srpaulouudecode(const char *src, u_char *target, size_t targsize) 57195618Srpaulo{ 58195618Srpaulo int len; 59195618Srpaulo char *encoded, *p; 60195618Srpaulo 61195618Srpaulo /* copy the 'readonly' source */ 62195618Srpaulo encoded = xstrdup(src); 63195618Srpaulo /* skip whitespace and data */ 64195618Srpaulo for (p = encoded; *p == ' ' || *p == '\t'; p++) 65195618Srpaulo ; 66195618Srpaulo for (; *p != '\0' && *p != ' ' && *p != '\t'; p++) 67195618Srpaulo ; 68195618Srpaulo /* and remove trailing whitespace because __b64_pton needs this */ 69195618Srpaulo *p = '\0'; 70195618Srpaulo len = __b64_pton(encoded, target, targsize); 71195618Srpaulo free(encoded); 72195618Srpaulo return len; 73195618Srpaulo} 74195618Srpaulo 75195618Srpaulovoid 76195618Srpaulodump_base64(FILE *fp, const u_char *data, u_int len) 77195618Srpaulo{ 78195618Srpaulo char *buf; 79195618Srpaulo int i, n; 80195618Srpaulo 81195618Srpaulo if (len > 65536) { 82195618Srpaulo fprintf(fp, "dump_base64: len > 65536\n"); 83195618Srpaulo return; 84195618Srpaulo } 85195618Srpaulo buf = xreallocarray(NULL, 2, len); 86195618Srpaulo n = uuencode(data, len, buf, 2*len); 87195618Srpaulo for (i = 0; i < n; i++) { 88195618Srpaulo fprintf(fp, "%c", buf[i]); 89195618Srpaulo if (i % 70 == 69) 90195618Srpaulo fprintf(fp, "\n"); 91195618Srpaulo } 92195618Srpaulo if (i % 70 != 69) 93195618Srpaulo fprintf(fp, "\n"); 94195618Srpaulo free(buf); 95195618Srpaulo} 96195618Srpaulo