13#define TOR_AES_PRIVATE
21DISABLE_GCC_WARNING(
"-Wstrict-prototypes")
24ENABLE_GCC_WARNING(
"-Wstrict-prototypes")
27aes_new_cipher(const uint8_t *key, const uint8_t *iv,
30 const CK_MECHANISM_TYPE ckm = CKM_AES_CTR;
31 SECItem keyItem = { .type = siBuffer,
32 .data = (
unsigned char *)key,
33 .len = (key_bits / 8) };
34 CK_AES_CTR_PARAMS params;
35 params.ulCounterBits = 128;
36 memcpy(params.cb, iv, 16);
37 SECItem ivItem = { .type = siBuffer,
38 .data = (
unsigned char *)¶ms,
39 .len =
sizeof(params) };
40 PK11SlotInfo *slot = NULL;
41 PK11SymKey *keyObj = NULL;
42 SECItem *ivObj = NULL;
43 PK11Context *result = NULL;
45 slot = PK11_GetBestSlot(ckm, NULL);
49 keyObj = PK11_ImportSymKey(slot, ckm, PK11_OriginUnwrap,
50 CKA_ENCRYPT, &keyItem, NULL);
54 ivObj = PK11_ParamFromIV(ckm, &ivItem);
58 PORT_SetError(SEC_ERROR_IO);
59 result = PK11_CreateContextBySymKey(ckm, CKA_ENCRYPT, keyObj, ivObj);
62 memwipe(¶ms, 0,
sizeof(params));
64 SECITEM_FreeItem(ivObj, PR_TRUE);
66 PK11_FreeSymKey(keyObj);
71 return (aes_cnt_cipher_t *)result;
75aes_cipher_free_(aes_cnt_cipher_t *cipher)
79 PK11_DestroyContext((PK11Context*) cipher, PR_TRUE);
83aes_crypt_inplace(aes_cnt_cipher_t *cipher,
char *data_,
size_t len_)
88 PK11Context *ctx = (PK11Context*)cipher;
89 unsigned char *data = (
unsigned char *)data_;
93 s = PK11_CipherOp(ctx, data, &result_len, len, data, len);
99evaluate_evp_for_aes(
int force_value)
106evaluate_ctr_for_aes(
void)
112aes_raw_new(
const uint8_t *key,
int key_bits,
bool encrypt)
114 const CK_MECHANISM_TYPE ckm = CKM_AES_ECB;
115 SECItem keyItem = { .type = siBuffer,
116 .data = (
unsigned char *)key,
117 .len = (key_bits / 8) };
118 SECItem ivItem = { .type = siBuffer,
121 PK11SlotInfo *slot = NULL;
122 PK11SymKey *keyObj = NULL;
123 SECItem *ivObj = NULL;
124 PK11Context *result = NULL;
126 slot = PK11_GetBestSlot(ckm, NULL);
130 CK_ATTRIBUTE_TYPE mode = encrypt ? CKA_ENCRYPT : CKA_DECRYPT;
132 keyObj = PK11_ImportSymKey(slot, ckm, PK11_OriginUnwrap,
133 mode, &keyItem, NULL);
137 ivObj = PK11_ParamFromIV(ckm, &ivItem);
141 PORT_SetError(SEC_ERROR_IO);
142 result = PK11_CreateContextBySymKey(ckm, mode, keyObj, ivObj);
147 SECITEM_FreeItem(ivObj, PR_TRUE);
149 PK11_FreeSymKey(keyObj);
154 return (aes_raw_t *)result;
161 PK11Context *ctx = (PK11Context*)cipher_;
162 PK11_DestroyContext(ctx, PR_TRUE);
166 int key_bits,
bool encrypt)
170 aes_raw_free(*cipher);
177 PK11Context *ctx = (PK11Context*)cipher;
179 s = PK11_CipherOp(ctx, block, &result_len, 16, block, 16);
191xor_bytes(uint8_t *outp,
const uint8_t *inp,
size_t n)
193 for (
size_t i = 0; i < n; ++i) {
200 const uint8_t *iv, uint32_t iv_offset,
201 uint8_t *data,
size_t n)
206 memcpy(counter, iv, 16);
207 aes_ctr_add_iv_offset(counter, iv_offset);
210 memcpy(buf, counter, 16);
213 xor_bytes(data, buf, 16);
217 xor_bytes(data, buf, n);
220 aes_ctr_add_iv_offset(counter, 1);
void aes_raw_set_key(aes_raw_t **cipher_, const uint8_t *key, int key_bits, bool encrypt)
void aes_raw_encrypt(const aes_raw_t *cipher, uint8_t *block)
void aes_raw_decrypt(const aes_raw_t *cipher, uint8_t *block)
void aes_raw_free_(aes_raw_t *cipher_)
aes_raw_t * aes_raw_new(const uint8_t *key, int key_bits, bool encrypt)
void aes_raw_counter_xor(const aes_raw_t *cipher, const uint8_t *iv, uint32_t iv_offset, uint8_t *data, size_t n)
Headers for crypto_nss_mgt.c.
void memwipe(void *mem, uint8_t byte, size_t sz)
Common functions for cryptographic routines.
Macros to manage assertions, fatal and non-fatal.