…lines 1–240 unchanged (240 lines)
241 { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))kdf_snmpkdf_set_ctx_params },
242 { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS,
243 (void (*)(void))kdf_snmpkdf_gettable_ctx_params },
244 { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))kdf_snmpkdf_get_ctx_params },
245 { 0, NULL }
246};
247
248/*
249 * SNMPKDF - In compliance with SP800-135 and RFC7860, calculate
250 * a master key using the engine ID and password.
251 *
252 * Denote engineLength and passwordlen to be the lengths (in bytes) of an
253 * snmpEngineID and a password, respectively.
…lines 254–261 unchanged (8 lines)
262 *
263 * Let Shared_key to be the key that the user shares with the authoritative
264 * SNMP engine with ID snmpEngineID. The Shared_key is generated as follows:
265 *
266 * Shared_key = SHA-1(Derived_password || snmpEngineID || Derived_password).
267 *
268 * Input:
269 * e_id - engine ID(eid)
270 * e_len - engineID length
271 * password - password
272 * password_len - password length
273 * okey - pointer to key output, FIPS testing limited to SHA-1.
274 * keylen - key length
275 * Output:
276 * okey - filled with derived key
277 * return - 1 on pass, 0 fail
278 */
279static int SNMPKDF(const EVP_MD *evp_md,
280 const unsigned char *e_id, size_t e_len,
281 unsigned char *password, size_t password_len,
282 unsigned char *okey, size_t keylen)
283{
284 EVP_MD_CTX *md = NULL;
285 unsigned char digest[EVP_MAX_MD_SIZE];
286 size_t mdsize = 0, len = 0;
287 unsigned int md_len = 0;
288 int ret = 0;
289
290 /* Limited to SHA-1 and SHA-2 hashes presently */
291 if (okey == NULL || keylen == 0)
292 return 0;
293
294 md = EVP_MD_CTX_new();
295 if (md == NULL) {
296 ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
297 goto err;
298 }
299
300 mdsize = EVP_MD_get_size(evp_md);
301 if (mdsize <= 0 || mdsize > keylen)
302 goto err;
303
304 if (!EVP_DigestInit_ex(md, evp_md, NULL))
305 goto err;
306
307 for (len = 0; len < KDF_SNMP_PASSWORD_HASH_AMOUNT - password_len; len += password_len) {
…lines 308–314 unchanged (7 lines)
315 || !EVP_DigestUpdate(md, digest, mdsize)
316 || !EVP_DigestUpdate(md, e_id, e_len)
317 || !EVP_DigestUpdate(md, digest, mdsize)
318 || !EVP_DigestFinal_ex(md, digest, &md_len))
319 goto err;
320
321 memcpy(okey, digest, md_len);
322
323 ret = 1;
324
325err:
326 EVP_MD_CTX_free(md);
327 OPENSSL_cleanse(digest, EVP_MAX_MD_SIZE);
328 return ret;
329}
330