A client for the SmartREST protocol from Cumulocity.

Dependencies:   SmartRest

Fork of MbedSmartRest by Vincent Wochnik

Committer:
vwochnik
Date:
Fri Apr 11 09:33:45 2014 +0000
Revision:
13:e76920d5e1ec
fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 13:e76920d5e1ec 1 // Simple Base64 code
vwochnik 13:e76920d5e1ec 2 // (c) Copyright 2010 MCQN Ltd.
vwochnik 13:e76920d5e1ec 3 // Released under Apache License, version 2.0
vwochnik 13:e76920d5e1ec 4
vwochnik 13:e76920d5e1ec 5 #include "b64.h"
vwochnik 13:e76920d5e1ec 6
vwochnik 13:e76920d5e1ec 7 /* Simple test program
vwochnik 13:e76920d5e1ec 8 #include <stdio.h>
vwochnik 13:e76920d5e1ec 9 void main()
vwochnik 13:e76920d5e1ec 10 {
vwochnik 13:e76920d5e1ec 11 char* in = "amcewen";
vwochnik 13:e76920d5e1ec 12 char out[22];
vwochnik 13:e76920d5e1ec 13
vwochnik 13:e76920d5e1ec 14 b64_encode(in, 15, out, 22);
vwochnik 13:e76920d5e1ec 15 out[21] = '\0';
vwochnik 13:e76920d5e1ec 16
vwochnik 13:e76920d5e1ec 17 printf(out);
vwochnik 13:e76920d5e1ec 18 }
vwochnik 13:e76920d5e1ec 19 */
vwochnik 13:e76920d5e1ec 20
vwochnik 13:e76920d5e1ec 21 int b64_encode(const unsigned char* aInput, int aInputLen, unsigned char* aOutput, int aOutputLen)
vwochnik 13:e76920d5e1ec 22 {
vwochnik 13:e76920d5e1ec 23 // Work out if we've got enough space to encode the input
vwochnik 13:e76920d5e1ec 24 // Every 6 bits of input becomes a byte of output
vwochnik 13:e76920d5e1ec 25 if (aOutputLen < (aInputLen*8)/6)
vwochnik 13:e76920d5e1ec 26 {
vwochnik 13:e76920d5e1ec 27 // FIXME Should we return an error here, or just the length
vwochnik 13:e76920d5e1ec 28 return (aInputLen*8)/6;
vwochnik 13:e76920d5e1ec 29 }
vwochnik 13:e76920d5e1ec 30
vwochnik 13:e76920d5e1ec 31 // If we get here we've got enough space to do the encoding
vwochnik 13:e76920d5e1ec 32
vwochnik 13:e76920d5e1ec 33 const char* b64_dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
vwochnik 13:e76920d5e1ec 34 if (aInputLen == 3)
vwochnik 13:e76920d5e1ec 35 {
vwochnik 13:e76920d5e1ec 36 aOutput[0] = b64_dictionary[aInput[0] >> 2];
vwochnik 13:e76920d5e1ec 37 aOutput[1] = b64_dictionary[(aInput[0] & 0x3)<<4|(aInput[1]>>4)];
vwochnik 13:e76920d5e1ec 38 aOutput[2] = b64_dictionary[(aInput[1]&0x0F)<<2|(aInput[2]>>6)];
vwochnik 13:e76920d5e1ec 39 aOutput[3] = b64_dictionary[aInput[2]&0x3F];
vwochnik 13:e76920d5e1ec 40 }
vwochnik 13:e76920d5e1ec 41 else if (aInputLen == 2)
vwochnik 13:e76920d5e1ec 42 {
vwochnik 13:e76920d5e1ec 43 aOutput[0] = b64_dictionary[aInput[0] >> 2];
vwochnik 13:e76920d5e1ec 44 aOutput[1] = b64_dictionary[(aInput[0] & 0x3)<<4|(aInput[1]>>4)];
vwochnik 13:e76920d5e1ec 45 aOutput[2] = b64_dictionary[(aInput[1]&0x0F)<<2];
vwochnik 13:e76920d5e1ec 46 aOutput[3] = '=';
vwochnik 13:e76920d5e1ec 47 }
vwochnik 13:e76920d5e1ec 48 else if (aInputLen == 1)
vwochnik 13:e76920d5e1ec 49 {
vwochnik 13:e76920d5e1ec 50 aOutput[0] = b64_dictionary[aInput[0] >> 2];
vwochnik 13:e76920d5e1ec 51 aOutput[1] = b64_dictionary[(aInput[0] & 0x3)<<4];
vwochnik 13:e76920d5e1ec 52 aOutput[2] = '=';
vwochnik 13:e76920d5e1ec 53 aOutput[3] = '=';
vwochnik 13:e76920d5e1ec 54 }
vwochnik 13:e76920d5e1ec 55 else
vwochnik 13:e76920d5e1ec 56 {
vwochnik 13:e76920d5e1ec 57 // Break the input into 3-byte chunks and process each of them
vwochnik 13:e76920d5e1ec 58 int i;
vwochnik 13:e76920d5e1ec 59 for (i = 0; i < aInputLen/3; i++)
vwochnik 13:e76920d5e1ec 60 {
vwochnik 13:e76920d5e1ec 61 b64_encode(&aInput[i*3], 3, &aOutput[i*4], 4);
vwochnik 13:e76920d5e1ec 62 }
vwochnik 13:e76920d5e1ec 63 if (aInputLen % 3 > 0)
vwochnik 13:e76920d5e1ec 64 {
vwochnik 13:e76920d5e1ec 65 // It doesn't fit neatly into a 3-byte chunk, so process what's left
vwochnik 13:e76920d5e1ec 66 b64_encode(&aInput[i*3], aInputLen % 3, &aOutput[i*4], aOutputLen - (i*4));
vwochnik 13:e76920d5e1ec 67 }
vwochnik 13:e76920d5e1ec 68 }
vwochnik 13:e76920d5e1ec 69 }
vwochnik 13:e76920d5e1ec 70