A client for the SmartREST protocol from Cumulocity.
Fork of MbedSmartRest by
b64.cpp@13:e76920d5e1ec, 2014-04-11 (annotated)
- Committer:
- vwochnik
- Date:
- Fri Apr 11 09:33:45 2014 +0000
- Revision:
- 13:e76920d5e1ec
fix
Who changed what in which revision?
User | Revision | Line number | New 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 |