1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner.
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works.
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h"
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  @file base64_encode.c
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  Compliant base64 encoder donated by Wayne Scott (wscott@bitmover.com)
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BASE64
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const char *codes =
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   base64 Encode a buffer (NUL terminated)
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param in      The input buffer to encode
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param inlen   The length of the input buffer
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param out     [out] The destination of the base64 encoded data
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param outlen  [in/out] The max size and resulting size
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint base64_encode(const unsigned char *in,  unsigned long inlen,
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                        unsigned char *out, unsigned long *outlen)
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long i, len2, leven;
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char *p;
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(in     != NULL);
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(out    != NULL);
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(outlen != NULL);
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* valid output size ? */
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   len2 = 4 * ((inlen + 2) / 3);
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (*outlen < len2 + 1) {
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      *outlen = len2 + 1;
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_BUFFER_OVERFLOW;
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   p = out;
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   leven = 3*(inlen / 3);
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (i = 0; i < leven; i += 3) {
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       *p++ = codes[(in[0] >> 2) & 0x3F];
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       *p++ = codes[(((in[0] & 3) << 4) + (in[1] >> 4)) & 0x3F];
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       *p++ = codes[(((in[1] & 0xf) << 2) + (in[2] >> 6)) & 0x3F];
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       *p++ = codes[in[2] & 0x3F];
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       in += 3;
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* Pad it if necessary...  */
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (i < inlen) {
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       unsigned a = in[0];
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       unsigned b = (i+1 < inlen) ? in[1] : 0;
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       *p++ = codes[(a >> 2) & 0x3F];
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       *p++ = codes[(((a & 3) << 4) + (b >> 4)) & 0x3F];
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       *p++ = (i+1 < inlen) ? codes[(((b & 0xf) << 2)) & 0x3F] : '=';
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       *p++ = '=';
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* append a NULL byte */
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   *p = '\0';
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* return ok */
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   *outlen = p - out;
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/misc/base64/base64_encode.c,v $ */
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.5 $ */
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/06/16 21:53:41 $ */
82