1 /*
   2  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
   3  *
   4  * Redistribution and use in source and binary forms, with or without
   5  * modification, are permitted provided that the following conditions
   6  * are met:
   7  * 1. Redistributions of source code must retain the above copyright
   8  *    notice, this list of conditions and the following disclaimer.
   9  * 2. Redistributions in binary form must reproduce the above copyright
  10  *    notice, this list of conditions and the following disclaimer in the
  11  *    documentation and/or other materials provided with the distribution.
  12  *
  13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  23  */
  24 
  25 #include "includes.h"
  26 RCSID("$OpenBSD: uuencode.c,v 1.16 2002/09/09 14:54:15 markus Exp $");
  27 
  28 #pragma ident   "%Z%%M% %I%     %E% SMI"
  29 
  30 #include "xmalloc.h"
  31 #include "uuencode.h"
  32 
  33 int
  34 uuencode(u_char *src, u_int srclength,
  35     char *target, size_t targsize)
  36 {
  37         return __b64_ntop(src, srclength, target, targsize);
  38 }
  39 
  40 int
  41 uudecode(const char *src, u_char *target, size_t targsize)
  42 {
  43         int len;
  44         char *encoded, *p;
  45 
  46         /* copy the 'readonly' source */
  47         encoded = xstrdup(src);
  48         /* skip whitespace and data */
  49         for (p = encoded; *p == ' ' || *p == '\t'; p++)
  50                 ;
  51         for (; *p != '\0' && *p != ' ' && *p != '\t'; p++)
  52                 ;
  53         /* and remove trailing whitespace because __b64_pton needs this */
  54         *p = '\0';
  55         len = __b64_pton((u_char *) encoded, target, targsize);
  56         xfree(encoded);
  57         return len;
  58 }
  59 
  60 void
  61 dump_base64(FILE *fp, u_char *data, u_int len)
  62 {
  63         char *buf = xmalloc(2*len);
  64         int i, n;
  65 
  66         n = uuencode(data, len, buf, 2*len);
  67         for (i = 0; i < n; i++) {
  68                 fprintf(fp, "%c", buf[i]);
  69                 if (i % 70 == 69)
  70                         fprintf(fp, "\n");
  71         }
  72         if (i % 70 != 69)
  73                 fprintf(fp, "\n");
  74         xfree(buf);
  75 }