1295367Sdes/* $OpenBSD: uuencode.c,v 1.28 2015/04/24 01:36:24 deraadt Exp $ */
260573Skris/*
360573Skris * Copyright (c) 2000 Markus Friedl.  All rights reserved.
465668Skris *
565668Skris * Redistribution and use in source and binary forms, with or without
665668Skris * modification, are permitted provided that the following conditions
765668Skris * are met:
865668Skris * 1. Redistributions of source code must retain the above copyright
965668Skris *    notice, this list of conditions and the following disclaimer.
1065668Skris * 2. Redistributions in binary form must reproduce the above copyright
1165668Skris *    notice, this list of conditions and the following disclaimer in the
1265668Skris *    documentation and/or other materials provided with the distribution.
1365668Skris *
1465668Skris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1565668Skris * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1665668Skris * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1765668Skris * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1865668Skris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1965668Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2065668Skris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2165668Skris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2265668Skris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2365668Skris * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2460573Skris */
2565668Skris
2660573Skris#include "includes.h"
27106121Sdes
28162852Sdes#include <sys/types.h>
29162852Sdes#include <netinet/in.h>
30162852Sdes#include <resolv.h>
31162852Sdes#include <stdio.h>
32255767Sdes#include <stdlib.h>
33162852Sdes
3460573Skris#include "xmalloc.h"
3576259Sgreen#include "uuencode.h"
3660573Skris
37197679Sdes/*
38197679Sdes * Encode binary 'src' of length 'srclength', writing base64-encoded text
39197679Sdes * to 'target' of size 'targsize'. Will always nul-terminate 'target'.
40197679Sdes * Returns the number of bytes stored in 'target' or -1 on error (inc.
41197679Sdes * 'targsize' too small).
42197679Sdes */
4360573Skrisint
44126274Sdesuuencode(const u_char *src, u_int srclength,
4560573Skris    char *target, size_t targsize)
4660573Skris{
4760573Skris	return __b64_ntop(src, srclength, target, targsize);
4860573Skris}
4960573Skris
50197679Sdes/*
51197679Sdes * Decode base64-encoded 'src' into buffer 'target' of 'targsize' bytes.
52197679Sdes * Will skip leading and trailing whitespace. Returns the number of bytes
53197679Sdes * stored in 'target' or -1 on error (inc. targsize too small).
54197679Sdes */
5560573Skrisint
5676259Sgreenuudecode(const char *src, u_char *target, size_t targsize)
5760573Skris{
5860573Skris	int len;
5960573Skris	char *encoded, *p;
6060573Skris
6160573Skris	/* copy the 'readonly' source */
6260573Skris	encoded = xstrdup(src);
6360573Skris	/* skip whitespace and data */
6460573Skris	for (p = encoded; *p == ' ' || *p == '\t'; p++)
6560573Skris		;
6660573Skris	for (; *p != '\0' && *p != ' ' && *p != '\t'; p++)
6760573Skris		;
6892555Sdes	/* and remove trailing whitespace because __b64_pton needs this */
6960573Skris	*p = '\0';
7060573Skris	len = __b64_pton(encoded, target, targsize);
71255767Sdes	free(encoded);
7260573Skris	return len;
7360573Skris}
7460573Skris
7560573Skrisvoid
76221420Sdesdump_base64(FILE *fp, const u_char *data, u_int len)
7760573Skris{
78162852Sdes	char *buf;
7960573Skris	int i, n;
8076259Sgreen
81162852Sdes	if (len > 65536) {
82162852Sdes		fprintf(fp, "dump_base64: len > 65536\n");
83162852Sdes		return;
84162852Sdes	}
85295367Sdes	buf = xreallocarray(NULL, 2, len);
8660573Skris	n = uuencode(data, len, buf, 2*len);
8760573Skris	for (i = 0; i < n; i++) {
8860573Skris		fprintf(fp, "%c", buf[i]);
8960573Skris		if (i % 70 == 69)
9060573Skris			fprintf(fp, "\n");
9160573Skris	}
9260573Skris	if (i % 70 != 69)
9360573Skris		fprintf(fp, "\n");
94255767Sdes	free(buf);
9560573Skris}
96