Esempio n. 1
0
File: utils.c Progetto: lclc/mcu
void utils_send_cmd(const char *command, PASSWORD_ID enc_id)
{
    if (enc_id == PASSWORD_NONE) {
        utils_decrypt_report(commander(command));
    } else {
        int encrypt_len;
        char *enc = aes_cbc_b64_encrypt((const unsigned char *)command, strlens(command),
                                        &encrypt_len,
                                        enc_id);
        char cmd[COMMANDER_REPORT_SIZE] = {0};
        assert(encrypt_len < COMMANDER_REPORT_SIZE);
        memcpy(cmd, enc, encrypt_len);
        free(enc);
        utils_decrypt_report(commander(cmd));
    }
}
Esempio n. 2
0
// Encrypted storage
static int memory_eeprom_crypt(const uint8_t *write_b, uint8_t *read_b,
                               const int32_t addr)
{
    int enc_len, dec_len;
    char *enc, *dec, enc_r[MEM_PAGE_LEN * 4 + 1] = {0};
    if (read_b) {
        enc = aes_cbc_b64_encrypt((unsigned char *)utils_uint8_to_hex(read_b, MEM_PAGE_LEN),
                                  MEM_PAGE_LEN * 2, &enc_len, PASSWORD_MEMORY);
        if (!enc) {
            goto err;
        }
        memcpy(enc_r, enc, enc_len);
        free(enc);
    }

    if (write_b) {
        char enc_w[MEM_PAGE_LEN * 4 + 1] = {0};
        enc = aes_cbc_b64_encrypt((unsigned char *)utils_uint8_to_hex(write_b, MEM_PAGE_LEN),
                                  MEM_PAGE_LEN * 2, &enc_len, PASSWORD_MEMORY);
        if (!enc) {
            goto err;
        }
        memcpy(enc_w, enc, enc_len);
        free(enc);
        if (memory_eeprom((uint8_t *)enc_w, (uint8_t *)enc_r, addr,
                          MEM_PAGE_LEN) == STATUS_ERROR) {
            goto err;
        }
        if (memory_eeprom((uint8_t *)enc_w + MEM_PAGE_LEN, (uint8_t *)enc_r + MEM_PAGE_LEN,
                          addr + MEM_PAGE_LEN, MEM_PAGE_LEN) == STATUS_ERROR) {
            goto err;
        }
        if (memory_eeprom((uint8_t *)enc_w + MEM_PAGE_LEN * 2,
                          (uint8_t *)enc_r + MEM_PAGE_LEN * 2, addr + MEM_PAGE_LEN * 2,
                          MEM_PAGE_LEN) == STATUS_ERROR) {
            goto err;
        }
        if (memory_eeprom((uint8_t *)enc_w + MEM_PAGE_LEN * 3,
                          (uint8_t *)enc_r + MEM_PAGE_LEN * 3, addr + MEM_PAGE_LEN * 3,
                          MEM_PAGE_LEN) == STATUS_ERROR) {
            goto err;
        }
    } else {
        if (memory_eeprom(NULL, (uint8_t *)enc_r, addr, MEM_PAGE_LEN) == STATUS_ERROR) {
            goto err;
        }
        if (memory_eeprom(NULL, (uint8_t *)enc_r + MEM_PAGE_LEN, addr + MEM_PAGE_LEN,
                          MEM_PAGE_LEN) == STATUS_ERROR) {
            goto err;
        }
        if (memory_eeprom(NULL, (uint8_t *)enc_r + MEM_PAGE_LEN * 2, addr + MEM_PAGE_LEN * 2,
                          MEM_PAGE_LEN) == STATUS_ERROR) {
            goto err;
        }
        if (memory_eeprom(NULL, (uint8_t *)enc_r + MEM_PAGE_LEN * 3, addr + MEM_PAGE_LEN * 3,
                          MEM_PAGE_LEN) == STATUS_ERROR) {
            goto err;
        }
    }

    dec = aes_cbc_b64_decrypt((unsigned char *)enc_r, MEM_PAGE_LEN * 4, &dec_len,
                              PASSWORD_MEMORY);
    if (!dec) {
        goto err;
    }
    memcpy(read_b, utils_hex_to_uint8(dec), MEM_PAGE_LEN);
    memset(dec, 0, dec_len);
    free(dec);

    utils_clear_buffers();
    return STATUS_SUCCESS;
err:
    utils_clear_buffers();
    return STATUS_ERROR;
}