1 /* 2 * Crypto wrapper functions for NSS 3 * Copyright (c) 2009, Jouni Malinen <j (at) w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15 #include "includes.h" 16 #include <nspr/prtypes.h> 17 #include <nspr/plarenas.h> 18 #include <nspr/plhash.h> 19 #include <nspr/prtime.h> 20 #include <nspr/prinrval.h> 21 #include <nspr/prclist.h> 22 #include <nspr/prlock.h> 23 #include <nss/sechash.h> 24 #include <nss/pk11pub.h> 25 26 #include "common.h" 27 #include "crypto.h" 28 29 30 static int nss_hash(HASH_HashType type, unsigned int max_res_len, 31 size_t num_elem, const u8 *addr[], const size_t *len, 32 u8 *mac) 33 { 34 HASHContext *ctx; 35 size_t i; 36 unsigned int reslen; 37 38 ctx = HASH_Create(type); 39 if (ctx == NULL) 40 return -1; 41 42 HASH_Begin(ctx); 43 for (i = 0; i < num_elem; i++) 44 HASH_Update(ctx, addr[i], len[i]); 45 HASH_End(ctx, mac, &reslen, max_res_len); 46 HASH_Destroy(ctx); 47 48 return 0; 49 } 50 51 52 void des_encrypt(const u8 *clear, const u8 *key, u8 *cypher) 53 { 54 PK11Context *ctx = NULL; 55 PK11SlotInfo *slot; 56 SECItem *param = NULL; 57 PK11SymKey *symkey = NULL; 58 SECItem item; 59 int olen; 60 u8 pkey[8], next, tmp; 61 int i; 62 63 /* Add parity bits to the key */ 64 next = 0; 65 for (i = 0; i < 7; i++) { 66 tmp = key[i]; 67 pkey[i] = (tmp >> i) | next | 1; 68 next = tmp << (7 - i); 69 } 70 pkey[i] = next | 1; 71 72 slot = PK11_GetBestSlot(CKM_DES_ECB, NULL); 73 if (slot == NULL) { 74 wpa_printf(MSG_ERROR, "NSS: PK11_GetBestSlot failed"); 75 goto out; 76 } 77 78 item.type = siBuffer; 79 item.data = pkey; 80 item.len = 8; 81 symkey = PK11_ImportSymKey(slot, CKM_DES_ECB, PK11_OriginDerive, 82 CKA_ENCRYPT, &item, NULL); 83 if (symkey == NULL) { 84 wpa_printf(MSG_ERROR, "NSS: PK11_ImportSymKey failed"); 85 goto out; 86 } 87 88 param = PK11_GenerateNewParam(CKM_DES_ECB, symkey); 89 if (param == NULL) { 90 wpa_printf(MSG_ERROR, "NSS: PK11_GenerateNewParam failed"); 91 goto out; 92 } 93 94 ctx = PK11_CreateContextBySymKey(CKM_DES_ECB, CKA_ENCRYPT, 95 symkey, param); 96 if (ctx == NULL) { 97 wpa_printf(MSG_ERROR, "NSS: PK11_CreateContextBySymKey(" 98 "CKM_DES_ECB) failed"); 99 goto out; 100 } 101 102 if (PK11_CipherOp(ctx, cypher, &olen, 8, (void *) clear, 8) != 103 SECSuccess) { 104 wpa_printf(MSG_ERROR, "NSS: PK11_CipherOp failed"); 105 goto out; 106 } 107 108 out: 109 if (ctx) 110 PK11_DestroyContext(ctx, PR_TRUE); 111 if (symkey) 112 PK11_FreeSymKey(symkey); 113 if (param) 114 SECITEM_FreeItem(param, PR_TRUE); 115 } 116 117 118 int rc4_skip(const u8 *key, size_t keylen, size_t skip, 119 u8 *data, size_t data_len) 120 { 121 return -1; 122 } 123 124 125 int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) 126 { 127 return nss_hash(HASH_AlgMD5, 16, num_elem, addr, len, mac); 128 } 129 130 131 int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) 132 { 133 return nss_hash(HASH_AlgSHA1, 20, num_elem, addr, len, mac); 134 } 135 136 137 int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, 138 u8 *mac) 139 { 140 return nss_hash(HASH_AlgSHA256, 32, num_elem, addr, len, mac); 141 } 142 143 144 void * aes_encrypt_init(const u8 *key, size_t len) 145 { 146 return NULL; 147 } 148 149 150 void aes_encrypt(void *ctx, const u8 *plain, u8 *crypt) 151 { 152 } 153 154 155 void aes_encrypt_deinit(void *ctx) 156 { 157 } 158 159 160 void * aes_decrypt_init(const u8 *key, size_t len) 161 { 162 return NULL; 163 } 164 165 166 void aes_decrypt(void *ctx, const u8 *crypt, u8 *plain) 167 { 168 } 169 170 171 void aes_decrypt_deinit(void *ctx) 172 { 173 } 174 175 176 int crypto_mod_exp(const u8 *base, size_t base_len, 177 const u8 *power, size_t power_len, 178 const u8 *modulus, size_t modulus_len, 179 u8 *result, size_t *result_len) 180 { 181 return -1; 182 } 183 184 185 struct crypto_cipher { 186 }; 187 188 189 struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg, 190 const u8 *iv, const u8 *key, 191 size_t key_len) 192 { 193 return NULL; 194 } 195 196 197 int crypto_cipher_encrypt(struct crypto_cipher *ctx, const u8 *plain, 198 u8 *crypt, size_t len) 199 { 200 return -1; 201 } 202 203 204 int crypto_cipher_decrypt(struct crypto_cipher *ctx, const u8 *crypt, 205 u8 *plain, size_t len) 206 { 207 return -1; 208 } 209 210 211 void crypto_cipher_deinit(struct crypto_cipher *ctx) 212 { 213 } 214