@ -63,13 +63,65 @@ static bool supported_iv_ino_lblk_64_policy(
return true ;
}
static bool fscrypt_supported_v1_policy ( const struct fscrypt_policy_v1 * policy ,
const struct inode * inode )
{
if ( ! fscrypt_valid_enc_modes ( policy - > contents_encryption_mode ,
policy - > filenames_encryption_mode ) ) {
fscrypt_warn ( inode ,
" Unsupported encryption modes (contents %d, filenames %d) " ,
policy - > contents_encryption_mode ,
policy - > filenames_encryption_mode ) ;
return false ;
}
if ( policy - > flags & ~ ( FSCRYPT_POLICY_FLAGS_PAD_MASK |
FSCRYPT_POLICY_FLAG_DIRECT_KEY ) ) {
fscrypt_warn ( inode , " Unsupported encryption flags (0x%02x) " ,
policy - > flags ) ;
return false ;
}
return true ;
}
static bool fscrypt_supported_v2_policy ( const struct fscrypt_policy_v2 * policy ,
const struct inode * inode )
{
if ( ! fscrypt_valid_enc_modes ( policy - > contents_encryption_mode ,
policy - > filenames_encryption_mode ) ) {
fscrypt_warn ( inode ,
" Unsupported encryption modes (contents %d, filenames %d) " ,
policy - > contents_encryption_mode ,
policy - > filenames_encryption_mode ) ;
return false ;
}
if ( policy - > flags & ~ FSCRYPT_POLICY_FLAGS_VALID ) {
fscrypt_warn ( inode , " Unsupported encryption flags (0x%02x) " ,
policy - > flags ) ;
return false ;
}
if ( ( policy - > flags & FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 ) & &
! supported_iv_ino_lblk_64_policy ( policy , inode ) )
return false ;
if ( memchr_inv ( policy - > __reserved , 0 , sizeof ( policy - > __reserved ) ) ) {
fscrypt_warn ( inode , " Reserved bits set in encryption policy " ) ;
return false ;
}
return true ;
}
/**
* fscrypt_supported_policy - check whether an encryption policy is supported
*
* Given an encryption policy , check whether all its encryption modes and other
* settings are supported by this kernel . ( But we don ' t currently don ' t check
* for crypto API support here , so attempting to use an algorithm not configured
* into the crypto API will still fail later . )
* settings are supported by this kernel on the given inode . ( But we don ' t
* currently don ' t check for crypto API support here , so attempting to use an
* algorithm not configured into the crypto API will still fail later . )
*
* Return : % true if supported , else % false
*/
@ -77,60 +129,10 @@ bool fscrypt_supported_policy(const union fscrypt_policy *policy_u,
const struct inode * inode )
{
switch ( policy_u - > version ) {
case FSCRYPT_POLICY_V1 : {
const struct fscrypt_policy_v1 * policy = & policy_u - > v1 ;
if ( ! fscrypt_valid_enc_modes ( policy - > contents_encryption_mode ,
policy - > filenames_encryption_mode ) ) {
fscrypt_warn ( inode ,
" Unsupported encryption modes (contents %d, filenames %d) " ,
policy - > contents_encryption_mode ,
policy - > filenames_encryption_mode ) ;
return false ;
}
if ( policy - > flags & ~ ( FSCRYPT_POLICY_FLAGS_PAD_MASK |
FSCRYPT_POLICY_FLAG_DIRECT_KEY ) ) {
fscrypt_warn ( inode ,
" Unsupported encryption flags (0x%02x) " ,
policy - > flags ) ;
return false ;
}
return true ;
}
case FSCRYPT_POLICY_V2 : {
const struct fscrypt_policy_v2 * policy = & policy_u - > v2 ;
if ( ! fscrypt_valid_enc_modes ( policy - > contents_encryption_mode ,
policy - > filenames_encryption_mode ) ) {
fscrypt_warn ( inode ,
" Unsupported encryption modes (contents %d, filenames %d) " ,
policy - > contents_encryption_mode ,
policy - > filenames_encryption_mode ) ;
return false ;
}
if ( policy - > flags & ~ FSCRYPT_POLICY_FLAGS_VALID ) {
fscrypt_warn ( inode ,
" Unsupported encryption flags (0x%02x) " ,
policy - > flags ) ;
return false ;
}
if ( ( policy - > flags & FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 ) & &
! supported_iv_ino_lblk_64_policy ( policy , inode ) )
return false ;
if ( memchr_inv ( policy - > __reserved , 0 ,
sizeof ( policy - > __reserved ) ) ) {
fscrypt_warn ( inode ,
" Reserved bits set in encryption policy " ) ;
return false ;
}
return true ;
}
case FSCRYPT_POLICY_V1 :
return fscrypt_supported_v1_policy ( & policy_u - > v1 , inode ) ;
case FSCRYPT_POLICY_V2 :
return fscrypt_supported_v2_policy ( & policy_u - > v2 , inode ) ;
}
return false ;
}