mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-04 08:01:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
cencoder.c - c source to a base64 encoding algorithm implementation
 | 
						|
 | 
						|
This is part of the libb64 project, and has been placed in the public domain.
 | 
						|
For details, see http://sourceforge.net/projects/libb64
 | 
						|
*/
 | 
						|
 | 
						|
#include "cencode.h"
 | 
						|
 | 
						|
void base64_init_encodestate(base64_encodestate* state_in)
 | 
						|
{
 | 
						|
    state_in->step = step_A;
 | 
						|
    state_in->result = 0;
 | 
						|
}
 | 
						|
 | 
						|
char base64_encode_value(char value_in)
 | 
						|
{
 | 
						|
    static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 | 
						|
    if (value_in > 63) {
 | 
						|
        return '=';
 | 
						|
    }
 | 
						|
    return encoding[(int)value_in];
 | 
						|
}
 | 
						|
 | 
						|
int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in)
 | 
						|
{
 | 
						|
    const char* plainchar = plaintext_in;
 | 
						|
    const char* const plaintextend = plaintext_in + length_in;
 | 
						|
    char* codechar = code_out;
 | 
						|
    char result;
 | 
						|
    char fragment;
 | 
						|
 | 
						|
    result = state_in->result;
 | 
						|
 | 
						|
    switch (state_in->step) {
 | 
						|
        while (1) {
 | 
						|
        case step_A:
 | 
						|
            if (plainchar == plaintextend) {
 | 
						|
                state_in->result = result;
 | 
						|
                state_in->step = step_A;
 | 
						|
                return codechar - code_out;
 | 
						|
            }
 | 
						|
            fragment = *plainchar++;
 | 
						|
            result = (fragment & 0x0fc) >> 2;
 | 
						|
            *codechar++ = base64_encode_value(result);
 | 
						|
            result = (fragment & 0x003) << 4;
 | 
						|
        case step_B:
 | 
						|
            if (plainchar == plaintextend) {
 | 
						|
                state_in->result = result;
 | 
						|
                state_in->step = step_B;
 | 
						|
                return codechar - code_out;
 | 
						|
            }
 | 
						|
            fragment = *plainchar++;
 | 
						|
            result |= (fragment & 0x0f0) >> 4;
 | 
						|
            *codechar++ = base64_encode_value(result);
 | 
						|
            result = (fragment & 0x00f) << 2;
 | 
						|
        case step_C:
 | 
						|
            if (plainchar == plaintextend) {
 | 
						|
                state_in->result = result;
 | 
						|
                state_in->step = step_C;
 | 
						|
                return codechar - code_out;
 | 
						|
            }
 | 
						|
            fragment = *plainchar++;
 | 
						|
            result |= (fragment & 0x0c0) >> 6;
 | 
						|
            *codechar++ = base64_encode_value(result);
 | 
						|
            result  = (fragment & 0x03f) >> 0;
 | 
						|
            *codechar++ = base64_encode_value(result);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    /* control should not reach here */
 | 
						|
    return codechar - code_out;
 | 
						|
}
 | 
						|
 | 
						|
int base64_encode_blockend(char* code_out, base64_encodestate* state_in)
 | 
						|
{
 | 
						|
    char* codechar = code_out;
 | 
						|
 | 
						|
    switch (state_in->step) {
 | 
						|
    case step_B:
 | 
						|
        *codechar++ = base64_encode_value(state_in->result);
 | 
						|
        *codechar++ = '=';
 | 
						|
        *codechar++ = '=';
 | 
						|
        break;
 | 
						|
    case step_C:
 | 
						|
        *codechar++ = base64_encode_value(state_in->result);
 | 
						|
        *codechar++ = '=';
 | 
						|
        break;
 | 
						|
    case step_A:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    *codechar = 0x00;
 | 
						|
 | 
						|
    return codechar - code_out;
 | 
						|
}
 | 
						|
 | 
						|
int base64_encode_chars(const char* plaintext_in, int length_in, char* code_out)
 | 
						|
{
 | 
						|
    base64_encodestate _state;
 | 
						|
    base64_init_encodestate(&_state);
 | 
						|
    int len = base64_encode_block(plaintext_in, length_in, code_out, &_state);
 | 
						|
    return len + base64_encode_blockend((code_out + len), &_state);
 | 
						|
}
 |