/** * Initialize crypto library, generate keys */ void key_init() { unsigned char *prf_buf; time_t t; uint32_t t2; int explen, len; if (keytype == KEY_NONE) { return; } set_sys_keys(sys_keys); get_key_info(keytype, &keylen, &ivlen); hmaclen = get_hash_len(hashtype); memset(groupkey, 0, sizeof(groupkey)); memset(groupsalt, 0, sizeof(groupsalt)); memset(grouphmackey, 0, sizeof(grouphmackey)); if (!get_random_bytes(groupmaster, sizeof(groupmaster))) { log(0, 0, "Failed to generate group master"); exit(1); } groupmaster[0] = UFTP_VER_NUM; if (!get_random_bytes(rand1, sizeof(rand1))) { log(0, 0, "Failed to generate rand1"); exit(1); } // Sets the first 4 bytes of rand1 to the current time t = time(NULL); t2 = (uint32_t)(t & 0xFFFFFFFF); *(uint32_t *)rand1 = t2; explen = hmaclen + keylen + ivlen; prf_buf = calloc(explen + hmaclen, 1); if (prf_buf == NULL) { syserror(0, 0, "calloc failed!"); exit(1); } PRF(hashtype, explen, groupmaster, sizeof(groupmaster), "key expansion", rand1, sizeof(rand1), prf_buf, &len); memcpy(grouphmackey, prf_buf, hmaclen); memcpy(groupkey, prf_buf + hmaclen, keylen); memcpy(groupsalt, prf_buf + hmaclen + keylen, ivlen); free(prf_buf); if ((!strcmp(keyfile, "")) || (newkeylen != 0)) { privkey = gen_RSA_key(newkeylen, RSA_EXP, keyfile); } else { privkey = read_RSA_key(keyfile); } if (!privkey) { log(0, 0, "Failed to read/generate private key"); exit(1); } rsalen = RSA_keylen(privkey); }
/** * Initialize crypto library, generate keys */ void key_init(void) { unsigned char *prf_buf; time_t t; uint32_t t2; int explen, len; if (keytype == KEY_NONE) { return; } set_sys_keys(sys_keys); get_key_info(keytype, &keylen, &ivlen); hmaclen = get_hash_len(hashtype); memset(groupkey, 0, sizeof(groupkey)); memset(groupsalt, 0, sizeof(groupsalt)); memset(grouphmackey, 0, sizeof(grouphmackey)); if (!get_random_bytes(groupmaster, sizeof(groupmaster))) { log0(0, 0, 0, "Failed to generate group master"); exit(ERR_CRYPTO); } groupmaster[0] = UFTP_VER_NUM; if (!get_random_bytes(rand1, sizeof(rand1))) { log0(0, 0, 0, "Failed to generate rand1"); exit(ERR_CRYPTO); } // Sets the first 4 bytes of rand1 to the current time t = time(NULL); t2 = (uint32_t)(t & 0xFFFFFFFF); *(uint32_t *)rand1 = t2; explen = hmaclen + keylen + SALT_LEN; prf_buf = safe_calloc(explen + hmaclen, 1); PRF(hashtype, explen, groupmaster, sizeof(groupmaster), "key expansion", rand1, sizeof(rand1), prf_buf, &len); memcpy(grouphmackey, prf_buf, hmaclen); memcpy(groupkey, prf_buf + hmaclen, keylen); memcpy(groupsalt, prf_buf + hmaclen + keylen, SALT_LEN); ivctr = 0; free(prf_buf); if ((keyextype == KEYEX_RSA) || (keyextype == KEYEX_ECDH_RSA)) { if ((!strcmp(keyfile, "")) || (newkeylen != 0)) { privkey.rsa = gen_RSA_key(newkeylen, RSA_EXP, keyfile); } else { privkey.rsa = read_RSA_key(keyfile); } if (!privkey.key) { log0(0, 0, 0, "Failed to read/generate private key"); exit(ERR_CRYPTO); } privkeylen = RSA_keylen(privkey.rsa); } else { if ((!strcmp(keyfile, "")) || (ecdsa_curve != 0)) { privkey.ec = gen_EC_key(ecdsa_curve, 0, keyfile); } else { privkey.ec = read_EC_key(keyfile); } if (!privkey.key) { log0(0, 0, 0, "Failed to read/generate private key"); exit(ERR_CRYPTO); } privkeylen = ECDSA_siglen(privkey.ec); } if ((keyextype == KEYEX_ECDH_RSA) || (keyextype == KEYEX_ECDH_ECDSA)) { dhkey.ec = gen_EC_key(ecdh_curve, 1, NULL); if (!dhkey.key) { log0(0, 0, 0, "Failed to generate DH key"); exit(ERR_CRYPTO); } } }