blob: 9dcc42962ae30879d7920825a4ae3fd01ed67748 [file] [log] [blame]
/*
* Copyright (C) 2017 Samsung Electronics Co., Ltd.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _FSCRYPTO_SDP_H
#define _FSCRYPTO_SDP_H
#ifdef CONFIG_EXT4CRYPT_SDP
#include <sdp/dek_common.h>
#ifndef CONFIG_DDAR
#define FSCRYPT_KNOX_FLG_SDP_MASK 0xFFFF0000
#else
#include "../fscrypt_knox_private.h"
#endif
#include "fscrypto_sdp_cache.h"
#include "fscrypto_sdp_ioctl.h"
#include "fscrypto_sdp_name.h"
// #include "fscrypto_sdp_dek_private.h"
#include "fscrypto_sdp_xattr_private.h"
#ifdef CONFIG_SDP_ENHANCED
#include "sdp_crypto.h"
#endif
/**
* SDP Encryption context for inode
*/
#define PKG_NAME_SIZE 16
#ifdef CONFIG_SDP_ENHANCED
#define SDP_DEK_SDP_ENABLED 0x00100000
#else
//#define SDP_DEK_SDP_ENABLED 0x00100000
#endif
#define SDP_DEK_IS_SENSITIVE 0x00200000
#ifdef CONFIG_SDP_ENHANCED
#define SDP_DEK_IS_UNINITIALIZED 0x00400000
#endif
//#define SDP_DEK_MULTI_ENGINE 0x00400000
#define SDP_DEK_TO_SET_SENSITIVE 0x00800000
#define SDP_DEK_TO_CONVERT_KEY_TYPE 0x01000000
//#define SDP_DEK_DECRYPTED_FEK_SET 0x02000000
//#define SDP_DEK_IS_EMPTY_CTFM_SET 0x04000000
//#define SDP_DEK_TO_CLEAR_NONCE 0x08000000
//#define SDP_DEK_TO_CLEAR_CACHE 0x10000000
#define SDP_IS_CHAMBER_DIR 0x20000000
#define SDP_IS_DIRECTORY 0x40000000
#define SDP_IS_INO_CACHED 0x80000000
#define SDP_IS_CLEARING_ONGOING 0x00010000
#define SDP_IS_FILE_IO_ONGOING 0x00020000
#define RV_PAGE_CACHE_CLEANED 1
#define RV_PAGE_CACHE_NOT_CLEANED 2
struct fscrypt_sdp_context {
//Store knox_flags to fscrypt_context, not in this context.
__u32 engine_id;
__u32 sdp_dek_type;
__u32 sdp_dek_len;
#ifdef CONFIG_SDP_ENHANCED
__u8 sdp_dek_buf[DEK_MAXLEN];
__u8 sdp_en_buf[MAX_EN_BUF_LEN];
#else
char sdp_dek_buf[DEK_MAXLEN];
char comm[PKG_NAME_SIZE];
__u32 euid;
#endif
} __attribute__((__packed__));
extern int dek_is_locked(int engine_id);
extern int dek_encrypt_dek_efs(int engine_id, dek_t *plainDek, dek_t *encDek);
extern int dek_decrypt_dek_efs(int engine_id, dek_t *encDek, dek_t *plainDek);
#ifdef CONFIG_SDP_ENHANCED
extern int dek_encrypt_fek(unsigned char *master_key, unsigned int master_key_len,
unsigned char *fek, unsigned int fek_len,
unsigned char *efek, unsigned int *efek_len);
extern int dek_decrypt_fek(unsigned char *master_key, unsigned int master_key_len,
unsigned char *efek, unsigned int efek_len,
unsigned char *fek, unsigned int *fek_len);
#endif
extern int fscrypt_sdp_get_engine_id(struct inode *inode);
#ifndef IS_ENCRYPTED //Implemented from 4.14(Beyond)
#define IS_ENCRYPTED(inode) (1)
#endif
//Exclusively masking the shared flags
#define FSCRYPT_SDP_PARSE_FLAG_SDP_ONLY(flag) (flag & FSCRYPT_KNOX_FLG_SDP_MASK)
#define FSCRYPT_SDP_PARSE_FLAG_OUT_OF_SDP(flag) (flag & ~FSCRYPT_KNOX_FLG_SDP_MASK)
#endif
#endif /* _FSCRYPTO_SDP_H */