Tor 0.4.9.0-alpha-dev
aes_nss.c
Go to the documentation of this file.
1/* Copyright (c) 2001, Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
5/* See LICENSE for licensing information */
6
7/**
8 * \file aes_nss.c
9 * \brief Use NSS to implement AES_CTR.
10 **/
11
12#include "orconfig.h"
13#include "lib/crypt_ops/aes.h"
16#include "lib/log/util_bug.h"
17
18DISABLE_GCC_WARNING("-Wstrict-prototypes")
19#include <pk11pub.h>
20#include <secerr.h>
21ENABLE_GCC_WARNING("-Wstrict-prototypes")
22
23aes_cnt_cipher_t *
24aes_new_cipher(const uint8_t *key, const uint8_t *iv,
25 int key_bits)
26{
27 const CK_MECHANISM_TYPE ckm = CKM_AES_CTR;
28 SECItem keyItem = { .type = siBuffer,
29 .data = (unsigned char *)key,
30 .len = (key_bits / 8) };
31 CK_AES_CTR_PARAMS params;
32 params.ulCounterBits = 128;
33 memcpy(params.cb, iv, 16);
34 SECItem ivItem = { .type = siBuffer,
35 .data = (unsigned char *)&params,
36 .len = sizeof(params) };
37 PK11SlotInfo *slot = NULL;
38 PK11SymKey *keyObj = NULL;
39 SECItem *ivObj = NULL;
40 PK11Context *result = NULL;
41
42 slot = PK11_GetBestSlot(ckm, NULL);
43 if (!slot)
44 goto err;
45
46 keyObj = PK11_ImportSymKey(slot, ckm, PK11_OriginUnwrap,
47 CKA_ENCRYPT, &keyItem, NULL);
48 if (!keyObj)
49 goto err;
50
51 ivObj = PK11_ParamFromIV(ckm, &ivItem);
52 if (!ivObj)
53 goto err;
54
55 PORT_SetError(SEC_ERROR_IO);
56 result = PK11_CreateContextBySymKey(ckm, CKA_ENCRYPT, keyObj, ivObj);
57
58 err:
59 memwipe(&params, 0, sizeof(params));
60 if (ivObj)
61 SECITEM_FreeItem(ivObj, PR_TRUE);
62 if (keyObj)
63 PK11_FreeSymKey(keyObj);
64 if (slot)
65 PK11_FreeSlot(slot);
66
67 tor_assert(result);
68 return (aes_cnt_cipher_t *)result;
69}
70
71void
72aes_cipher_free_(aes_cnt_cipher_t *cipher)
73{
74 if (!cipher)
75 return;
76 PK11_DestroyContext((PK11Context*) cipher, PR_TRUE);
77}
78
79void
80aes_crypt_inplace(aes_cnt_cipher_t *cipher, char *data_, size_t len_)
81{
82 tor_assert(len_ <= INT_MAX);
83
84 SECStatus s;
85 PK11Context *ctx = (PK11Context*)cipher;
86 unsigned char *data = (unsigned char *)data_;
87 int len = (int) len_;
88 int result_len = 0;
89
90 s = PK11_CipherOp(ctx, data, &result_len, len, data, len);
91 tor_assert(s == SECSuccess);
92 tor_assert(result_len == len);
93}
94
95int
96evaluate_evp_for_aes(int force_value)
97{
98 (void)force_value;
99 return 0;
100}
101
102int
103evaluate_ctr_for_aes(void)
104{
105 return 0;
106}
Headers for aes.c.
Headers for crypto_nss_mgt.c.
void memwipe(void *mem, uint8_t byte, size_t sz)
Definition: crypto_util.c:55
Common functions for cryptographic routines.
Macros to manage assertions, fatal and non-fatal.
#define tor_assert(expr)
Definition: util_bug.h:103