mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 18:57:07 -07:00
Finish RPCrypt
This commit is contained in:
parent
9a71e88819
commit
9e61417617
3 changed files with 191 additions and 1 deletions
|
@ -21,6 +21,7 @@
|
|||
#include "common.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -39,6 +40,8 @@ CHIAKI_EXPORT void chiaki_rpcrypt_bright_ambassador(uint8_t *bright, uint8_t *am
|
|||
|
||||
CHIAKI_EXPORT void chiaki_rpcrypt_init(ChiakiRPCrypt *rpcrypt, const uint8_t *nonce, const uint8_t *morning);
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_rpcrypt_generate_iv(ChiakiRPCrypt *rpcrypt, uint8_t *iv, uint64_t counter);
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_rpcrypt_encrypt(ChiakiRPCrypt *rpcrypt, uint64_t counter, uint8_t *buf, size_t buf_size);
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_rpcrypt_decrypt(ChiakiRPCrypt *rpcrypt, uint64_t counter, uint8_t *buf, size_t buf_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <openssl/evp.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
CHIAKI_EXPORT void chiaki_rpcrypt_bright_ambassador(uint8_t *bright, uint8_t *ambassador, const uint8_t *nonce, const uint8_t *morning)
|
||||
|
@ -79,4 +80,89 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_rpcrypt_generate_iv(ChiakiRPCrypt *rpcrypt,
|
|||
|
||||
memcpy(iv, hmac, CHIAKI_KEY_BYTES);
|
||||
return CHIAKI_ERR_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
static ChiakiErrorCode chiaki_rpcrypt_crypt(ChiakiRPCrypt *rpcrypt, uint64_t counter, uint8_t *buf, size_t buf_size, bool encrypt)
|
||||
{
|
||||
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
|
||||
if(!ctx)
|
||||
return CHIAKI_ERR_UNKNOWN;
|
||||
|
||||
uint8_t iv[CHIAKI_KEY_BYTES];
|
||||
ChiakiErrorCode err = chiaki_rpcrypt_generate_iv(rpcrypt, iv, counter);
|
||||
if(err != CHIAKI_ERR_SUCCESS)
|
||||
return err;
|
||||
|
||||
#define FAIL(err) do { EVP_CIPHER_CTX_free(ctx); return (err); } while(0);
|
||||
|
||||
if(encrypt)
|
||||
{
|
||||
if(!EVP_EncryptInit_ex(ctx, EVP_aes_128_cfb128(), NULL, rpcrypt->bright, iv))
|
||||
FAIL(CHIAKI_ERR_UNKNOWN);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!EVP_DecryptInit_ex(ctx, EVP_aes_128_cfb128(), NULL, rpcrypt->bright, iv))
|
||||
FAIL(CHIAKI_ERR_UNKNOWN);
|
||||
}
|
||||
|
||||
if(!EVP_CIPHER_CTX_set_padding(ctx, 0))
|
||||
FAIL(CHIAKI_ERR_UNKNOWN);
|
||||
|
||||
if(buf_size % CHIAKI_KEY_BYTES)
|
||||
{
|
||||
size_t padded_size = ((buf_size + CHIAKI_KEY_BYTES - 1) / CHIAKI_KEY_BYTES) * CHIAKI_KEY_BYTES;
|
||||
uint8_t *tmp = malloc(padded_size);
|
||||
if(!tmp)
|
||||
FAIL(CHIAKI_ERR_MEMORY);
|
||||
memcpy(tmp, buf, buf_size);
|
||||
memset(tmp + buf_size, 0, padded_size - buf_size);
|
||||
int outl = (int)padded_size;
|
||||
|
||||
int success;
|
||||
if(encrypt)
|
||||
success = EVP_EncryptUpdate(ctx, tmp, &outl, tmp, outl);
|
||||
else
|
||||
success = EVP_DecryptUpdate(ctx, tmp, &outl, tmp, outl);
|
||||
|
||||
if(!success || outl != (int)padded_size)
|
||||
{
|
||||
free(tmp);
|
||||
FAIL(CHIAKI_ERR_UNKNOWN);
|
||||
}
|
||||
|
||||
memcpy(buf, tmp, buf_size);
|
||||
free(tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
int outl = (int)buf_size;
|
||||
if(encrypt)
|
||||
{
|
||||
if(!EVP_EncryptUpdate(ctx, buf, &outl, buf, outl))
|
||||
FAIL(CHIAKI_ERR_UNKNOWN);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!EVP_DecryptUpdate(ctx, buf, &outl, buf, outl))
|
||||
FAIL(CHIAKI_ERR_UNKNOWN);
|
||||
}
|
||||
|
||||
if(outl != (int)buf_size)
|
||||
FAIL(CHIAKI_ERR_UNKNOWN);
|
||||
}
|
||||
|
||||
#undef FAIL
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
return CHIAKI_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_rpcrypt_encrypt(ChiakiRPCrypt *rpcrypt, uint64_t counter, uint8_t *buf, size_t buf_size)
|
||||
{
|
||||
return chiaki_rpcrypt_crypt(rpcrypt, counter, buf, buf_size, true);
|
||||
}
|
||||
|
||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_rpcrypt_decrypt(ChiakiRPCrypt *rpcrypt, uint64_t counter, uint8_t *buf, size_t buf_size)
|
||||
{
|
||||
return chiaki_rpcrypt_crypt(rpcrypt, counter, buf, buf_size, false);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue