A simple library to support serving https.
Dependents: oldheating gps motorhome heating
pki/base64.c
- Committer:
- andrewboyson
- Date:
- 2019-07-25
- Revision:
- 0:be515c9019e3
File content as of revision 0:be515c9019e3:
#include <stdbool.h> #include <stdio.h> #include "base64.h" char (*Base64ReadNextCharFunctionPointer)(void) = NULL; static int get6bits() { while (true) { char c = Base64ReadNextCharFunctionPointer(); if (c == 0 ) return -1; //EOF or an error else if (c == '-') return -1; //Finished else if (c == '=') return -1; //Padding else if (c == '/') return 63; else if (c == '+') return 62; else if (c >= 'a') return c - 'a' + 26; else if (c >= 'A') return c - 'A' + 0; else if (c >= '0') return c - '0' + 52; else continue; } } static int last6 = 0; static int posn = 0; static bool finished = false; int Base64ReadByte() { if (finished) return -1; /* L = last T = this out case 0 TTTTTTLL case 1 LLLLTTTT case 2 LLTTTTTT */ int this6 = 0; int bits8 = 0; switch (posn) { case 0: //We have no bits leftover { this6 = get6bits(); if (this6 == -1) return -1; //EOF or an error last6 = get6bits(); if (last6 == -1) { last6 = 0; finished = true; } bits8 = this6 << 2; bits8 &= 0xFF; bits8 |= last6 >> 4; posn = 1; break; } case 1: //We have 4 bits leftover { this6 = get6bits(); if (this6 == -1) return -1; //EOF or an error bits8 = last6 << 4; bits8 &= 0xFF; bits8 |= this6 >> 2; last6 = this6; posn = 2; break; } case 2: //We have 2 bits leftover { this6 = get6bits(); if (this6 == -1) return -1; //EOF or an error bits8 = last6 << 6; bits8 &= 0xFF; bits8 |= this6; posn = 0; break; } } return bits8; } int Base64SkipLine() { last6 = 0; posn = 0; finished = false; while (true) { char c = Base64ReadNextCharFunctionPointer(); if (c == 0 ) return -1; //EOF or an error else if (c == '\n') return 0; //EOL } }