예제 #1
0
static int dek_on_device_unlocked(dek_arg_on_device_unlocked *evt) {
	int key_arr_idx = PERSONA_KEY_ARR_IDX(evt->persona_id);

	/*
	 * TODO : lock needed
	 */

	memcpy(mas_key[key_arr_idx].buf, evt->mas_key.buf, evt->mas_key.len);
	mas_key[key_arr_idx].len = evt->mas_key.len;
	memcpy(priv_key[key_arr_idx].buf, evt->priv_key.buf, evt->priv_key.len);
	priv_key[key_arr_idx].len = evt->priv_key.len;

	tfm[key_arr_idx] = dek_aes_key_setup(evt->mas_key.buf, evt->mas_key.len);
	if (IS_ERR(tfm[key_arr_idx])) {
		printk("dek: error setting up key\n");
		dek_add_to_log(evt->persona_id, "error setting up key");
		tfm[key_arr_idx] = NULL;
	}

#if DEK_DEBUG
	dump_all_keys(key_arr_idx);
#endif

	return 0;
}
예제 #2
0
static int dek_on_user_removed(dek_arg_on_user_removed *evt) {
	int userid = evt->userid;
	int key_arr_idx;

	/*
	 * TODO : lock needed
	 */

	if (!dek_is_persona(userid)) {
		DEK_LOGE("%s invalid userid %d\n", __func__, userid);
		return -EFAULT;
	}
	key_arr_idx = PERSONA_KEY_ARR_IDX(userid);

	zero_out((char *)&SDPK_sym[key_arr_idx], sizeof(kek_t));
	zero_out((char *)&SDPK_Rpub[key_arr_idx], sizeof(kek_t));
	zero_out((char *)&SDPK_Rpri[key_arr_idx], sizeof(kek_t));
	zero_out((char *)&SDPK_Dpub[key_arr_idx], sizeof(kek_t));
	zero_out((char *)&SDPK_Dpri[key_arr_idx], sizeof(kek_t));
    zero_out((char *)&SDPK_EDpub[key_arr_idx], sizeof(kek_t));
    zero_out((char *)&SDPK_EDpri[key_arr_idx], sizeof(kek_t));

#ifdef CONFIG_SDP_KEY_DUMP
    if(get_sdp_sysfs_key_dump()) {
        dump_all_keys(key_arr_idx);
    }
#endif

	dek_aes_key_free(sdp_tfm[key_arr_idx]);
	sdp_tfm[key_arr_idx] = NULL;

	return 0;
}
예제 #3
0
static int dek_on_user_added(dek_arg_on_user_added *evt) {
	int userid = evt->userid;
	int key_arr_idx = PERSONA_KEY_ARR_IDX(userid);

	/*
	 * TODO : lock needed
	 */

	if (!dek_is_persona(userid)) {
		DEK_LOGE("%s invalid userid %d\n", __func__, userid);
		return -EFAULT;
	}

	if((evt->SDPK_Rpub.len > KEK_MAX_LEN) ||
			(evt->SDPK_Dpub.len > KEK_MAX_LEN)) {
		DEK_LOGE("Invalid args\n");
		DEK_LOGE("SDPK_Rpub.len : %d\n", evt->SDPK_Rpub.len);
		DEK_LOGE("SDPK_Dpub.len : %d\n", evt->SDPK_Dpub.len);
		return -EINVAL;
	}

	memcpy(SDPK_Rpub[key_arr_idx].buf, evt->SDPK_Rpub.buf, evt->SDPK_Rpub.len);
	SDPK_Rpub[key_arr_idx].len = evt->SDPK_Rpub.len;
	memcpy(SDPK_Dpub[key_arr_idx].buf, evt->SDPK_Dpub.buf, evt->SDPK_Dpub.len);
	SDPK_Dpub[key_arr_idx].len = evt->SDPK_Dpub.len;

#if DEK_DEBUG
	dump_all_keys(key_arr_idx);
#endif
	return 0;
}
예제 #4
0
static int dek_on_user_added(dek_arg_on_user_added *evt) {
	int key_arr_idx = PERSONA_KEY_ARR_IDX(evt->persona_id);

	memcpy(pub_key[key_arr_idx].buf, evt->pub_key.buf, evt->pub_key.len);
	pub_key[key_arr_idx].len = evt->pub_key.len;

#if DEK_DEBUG
	dump_all_keys(key_arr_idx);
#endif
	return 0;
}
예제 #5
0
static int dek_on_device_locked(dek_arg_on_device_locked *evt) {
	int key_arr_idx = PERSONA_KEY_ARR_IDX(evt->persona_id);
	dek_aes_key_free(tfm[key_arr_idx]);
	tfm[key_arr_idx] = NULL;

	memset(&priv_key[key_arr_idx], 0, sizeof(kek));
	memset(&mas_key[key_arr_idx], 0, sizeof(kek));

#if DEK_DEBUG
	dump_all_keys(key_arr_idx);
#endif

	return 0;
}
예제 #6
0
static int dek_on_device_unlocked(dek_arg_on_device_unlocked *evt) {
	int userid = evt->userid;
	int key_arr_idx;

	/*
	 * TODO : lock needed
	 */

	if (!dek_is_persona(userid)) {
		DEK_LOGE("%s invalid userid %d\n", __func__, userid);
		return -EFAULT;
	}
	key_arr_idx = PERSONA_KEY_ARR_IDX(userid);

	if((evt->SDPK_sym.len > KEK_MAX_LEN) ||
            (evt->SDPK_Rpri.len > KEK_MAX_LEN) ||
            (evt->SDPK_Dpri.len > KEK_MAX_LEN) ||
			(evt->SDPK_EDpri.len > KEK_MAX_LEN)) {
		DEK_LOGE("%s Invalid args\n", __func__);
		DEK_LOGE("SDPK_sym.len : %d\n", evt->SDPK_sym.len);
		DEK_LOGE("SDPK_Rpri.len : %d\n", evt->SDPK_Rpri.len);
        DEK_LOGE("SDPK_Dpri.len : %d\n", evt->SDPK_Dpri.len);
        DEK_LOGE("SDPK_EDpri.len : %d\n", evt->SDPK_EDpri.len);
		return -EINVAL;
	}

    copy_kek(&SDPK_Rpri[key_arr_idx], &evt->SDPK_Rpri, KEK_TYPE_RSA_PRIV);
    copy_kek(&SDPK_Dpri[key_arr_idx], &evt->SDPK_Dpri, KEK_TYPE_DH_PRIV);
    copy_kek(&SDPK_EDpri[key_arr_idx], &evt->SDPK_EDpri, KEK_TYPE_ECDH256_PRIV);
    copy_kek(&SDPK_sym[key_arr_idx], &evt->SDPK_sym, KEK_TYPE_SYM);

	sdp_tfm[key_arr_idx] = dek_aes_key_setup(evt->SDPK_sym.buf, evt->SDPK_sym.len);
	if (IS_ERR(sdp_tfm[key_arr_idx])) {
		DEK_LOGE("error setting up key\n");
		dek_add_to_log(evt->userid, "error setting up key");
		sdp_tfm[key_arr_idx] = NULL;
	}

#ifdef CONFIG_SDP_KEY_DUMP
	if(get_sdp_sysfs_key_dump()) {
	    dump_all_keys(key_arr_idx);
	}
#endif

	return 0;
}
예제 #7
0
static int dek_on_device_unlocked(dek_arg_on_device_unlocked *evt) {
	int userid = evt->userid;
	int key_arr_idx = PERSONA_KEY_ARR_IDX(userid);

	/*
	 * TODO : lock needed
	 */

	if (!dek_is_persona(userid)) {
		DEK_LOGE("%s invalid userid %d\n", __func__, userid);
		return -EFAULT;
	}

	if((evt->SDPK_sym.len > KEK_MAX_LEN) ||
			(evt->SDPK_Rpri.len > KEK_MAX_LEN) ||
			(evt->SDPK_Dpri.len > KEK_MAX_LEN)) {
		DEK_LOGE("%s Invalid args\n", __func__);
		DEK_LOGE("SDPK_Rpub.len : %d\n", evt->SDPK_sym.len);
		DEK_LOGE("SDPK_Dpub.len : %d\n", evt->SDPK_Rpri.len);
		DEK_LOGE("SDPK_Dpub.len : %d\n", evt->SDPK_Dpri.len);
		return -EINVAL;
	}

	memcpy(SDPK_sym[key_arr_idx].buf, evt->SDPK_sym.buf, evt->SDPK_sym.len);
	SDPK_sym[key_arr_idx].len = evt->SDPK_sym.len;
	memcpy(SDPK_Rpri[key_arr_idx].buf, evt->SDPK_Rpri.buf, evt->SDPK_Rpri.len);
	SDPK_Rpri[key_arr_idx].len = evt->SDPK_Rpri.len;
	memcpy(SDPK_Dpri[key_arr_idx].buf, evt->SDPK_Dpri.buf, evt->SDPK_Dpri.len);
	SDPK_Dpri[key_arr_idx].len = evt->SDPK_Dpri.len;

	sdp_tfm[key_arr_idx] = dek_aes_key_setup(evt->SDPK_sym.buf, evt->SDPK_sym.len);
	if (IS_ERR(sdp_tfm[key_arr_idx])) {
		DEK_LOGE("error setting up key\n");
		dek_add_to_log(evt->userid, "error setting up key");
		sdp_tfm[key_arr_idx] = NULL;
	}

#if DEK_DEBUG
	dump_all_keys(key_arr_idx);
#endif

	return 0;
}
예제 #8
0
static int dek_on_device_locked(dek_arg_on_device_locked *evt) {
	int userid = evt->userid;
	int key_arr_idx = PERSONA_KEY_ARR_IDX(userid);

	if (!dek_is_persona(userid)) {
		DEK_LOGE("%s invalid userid %d\n", __func__, userid);
		return -EFAULT;
	}

	dek_aes_key_free(sdp_tfm[key_arr_idx]);
	sdp_tfm[key_arr_idx] = NULL;

	zero_out((char *)&SDPK_sym[key_arr_idx], sizeof(kek_t));
	zero_out((char *)&SDPK_Rpri[key_arr_idx], sizeof(kek_t));
	zero_out((char *)&SDPK_Dpri[key_arr_idx], sizeof(kek_t));

	ecryptfs_mm_drop_cache(userid);
#if DEK_DEBUG
	dump_all_keys(key_arr_idx);
#endif

	return 0;
}
예제 #9
0
static int dek_on_boot(dek_arg_on_boot *evt) {
	int ret = 0;
	int userid = evt->userid;
	int key_arr_idx;

	/*
	 * TODO : lock needed
	 */

	if (!dek_is_persona(userid)) {
		DEK_LOGE("%s invalid userid %d\n", __func__, userid);
		return -EFAULT;
	}
	key_arr_idx = PERSONA_KEY_ARR_IDX(userid);

	if((evt->SDPK_Rpub.len > KEK_MAX_LEN) ||
	        (evt->SDPK_Dpub.len > KEK_MAX_LEN) ||
	        (evt->SDPK_EDpub.len > KEK_MAX_LEN)) {
	    DEK_LOGE("Invalid args\n");
	    DEK_LOGE("SDPK_Rpub.len : %d\n", evt->SDPK_Rpub.len);
	    DEK_LOGE("SDPK_Dpub.len : %d\n", evt->SDPK_Dpub.len);
	    DEK_LOGE("SDPK_EDpub.len : %d\n", evt->SDPK_EDpub.len);
	    return -EINVAL;
	}

    copy_kek(&SDPK_Rpub[key_arr_idx], &evt->SDPK_Rpub, KEK_TYPE_RSA_PUB);
    copy_kek(&SDPK_Dpub[key_arr_idx], &evt->SDPK_Dpub, KEK_TYPE_DH_PUB);
    copy_kek(&SDPK_EDpub[key_arr_idx], &evt->SDPK_EDpub, KEK_TYPE_ECDH256_PUB);

#ifdef CONFIG_SDP_KEY_DUMP
    if(get_sdp_sysfs_key_dump()) {
        dump_all_keys(key_arr_idx);
    }
#endif

	return ret;
}