LCOV - code coverage report
Current view: top level - security/integrity - integrity.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 4 4 100.0 %
Date: 2022-04-01 14:35:51 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0-only */
       2                 :            : /*
       3                 :            :  * Copyright (C) 2009-2010 IBM Corporation
       4                 :            :  *
       5                 :            :  * Authors:
       6                 :            :  * Mimi Zohar <zohar@us.ibm.com>
       7                 :            :  */
       8                 :            : 
       9                 :            : #include <linux/types.h>
      10                 :            : #include <linux/integrity.h>
      11                 :            : #include <crypto/sha.h>
      12                 :            : #include <linux/key.h>
      13                 :            : #include <linux/audit.h>
      14                 :            : 
      15                 :            : /* iint action cache flags */
      16                 :            : #define IMA_MEASURE             0x00000001
      17                 :            : #define IMA_MEASURED            0x00000002
      18                 :            : #define IMA_APPRAISE            0x00000004
      19                 :            : #define IMA_APPRAISED           0x00000008
      20                 :            : /*#define IMA_COLLECT           0x00000010  do not use this flag */
      21                 :            : #define IMA_COLLECTED           0x00000020
      22                 :            : #define IMA_AUDIT               0x00000040
      23                 :            : #define IMA_AUDITED             0x00000080
      24                 :            : #define IMA_HASH                0x00000100
      25                 :            : #define IMA_HASHED              0x00000200
      26                 :            : 
      27                 :            : /* iint cache flags */
      28                 :            : #define IMA_ACTION_FLAGS        0xff000000
      29                 :            : #define IMA_DIGSIG_REQUIRED     0x01000000
      30                 :            : #define IMA_PERMIT_DIRECTIO     0x02000000
      31                 :            : #define IMA_NEW_FILE            0x04000000
      32                 :            : #define EVM_IMMUTABLE_DIGSIG    0x08000000
      33                 :            : #define IMA_FAIL_UNVERIFIABLE_SIGS      0x10000000
      34                 :            : #define IMA_MODSIG_ALLOWED      0x20000000
      35                 :            : #define IMA_CHECK_BLACKLIST     0x40000000
      36                 :            : 
      37                 :            : #define IMA_DO_MASK             (IMA_MEASURE | IMA_APPRAISE | IMA_AUDIT | \
      38                 :            :                                  IMA_HASH | IMA_APPRAISE_SUBMASK)
      39                 :            : #define IMA_DONE_MASK           (IMA_MEASURED | IMA_APPRAISED | IMA_AUDITED | \
      40                 :            :                                  IMA_HASHED | IMA_COLLECTED | \
      41                 :            :                                  IMA_APPRAISED_SUBMASK)
      42                 :            : 
      43                 :            : /* iint subaction appraise cache flags */
      44                 :            : #define IMA_FILE_APPRAISE       0x00001000
      45                 :            : #define IMA_FILE_APPRAISED      0x00002000
      46                 :            : #define IMA_MMAP_APPRAISE       0x00004000
      47                 :            : #define IMA_MMAP_APPRAISED      0x00008000
      48                 :            : #define IMA_BPRM_APPRAISE       0x00010000
      49                 :            : #define IMA_BPRM_APPRAISED      0x00020000
      50                 :            : #define IMA_READ_APPRAISE       0x00040000
      51                 :            : #define IMA_READ_APPRAISED      0x00080000
      52                 :            : #define IMA_CREDS_APPRAISE      0x00100000
      53                 :            : #define IMA_CREDS_APPRAISED     0x00200000
      54                 :            : #define IMA_APPRAISE_SUBMASK    (IMA_FILE_APPRAISE | IMA_MMAP_APPRAISE | \
      55                 :            :                                  IMA_BPRM_APPRAISE | IMA_READ_APPRAISE | \
      56                 :            :                                  IMA_CREDS_APPRAISE)
      57                 :            : #define IMA_APPRAISED_SUBMASK   (IMA_FILE_APPRAISED | IMA_MMAP_APPRAISED | \
      58                 :            :                                  IMA_BPRM_APPRAISED | IMA_READ_APPRAISED | \
      59                 :            :                                  IMA_CREDS_APPRAISED)
      60                 :            : 
      61                 :            : /* iint cache atomic_flags */
      62                 :            : #define IMA_CHANGE_XATTR        0
      63                 :            : #define IMA_UPDATE_XATTR        1
      64                 :            : #define IMA_CHANGE_ATTR         2
      65                 :            : #define IMA_DIGSIG              3
      66                 :            : #define IMA_MUST_MEASURE        4
      67                 :            : 
      68                 :            : enum evm_ima_xattr_type {
      69                 :            :         IMA_XATTR_DIGEST = 0x01,
      70                 :            :         EVM_XATTR_HMAC,
      71                 :            :         EVM_IMA_XATTR_DIGSIG,
      72                 :            :         IMA_XATTR_DIGEST_NG,
      73                 :            :         EVM_XATTR_PORTABLE_DIGSIG,
      74                 :            :         IMA_XATTR_LAST
      75                 :            : };
      76                 :            : 
      77                 :            : struct evm_ima_xattr_data {
      78                 :            :         u8 type;
      79                 :            :         u8 data[];
      80                 :            : } __packed;
      81                 :            : 
      82                 :            : /* Only used in the EVM HMAC code. */
      83                 :            : struct evm_xattr {
      84                 :            :         struct evm_ima_xattr_data data;
      85                 :            :         u8 digest[SHA1_DIGEST_SIZE];
      86                 :            : } __packed;
      87                 :            : 
      88                 :            : #define IMA_MAX_DIGEST_SIZE     64
      89                 :            : 
      90                 :            : struct ima_digest_data {
      91                 :            :         u8 algo;
      92                 :            :         u8 length;
      93                 :            :         union {
      94                 :            :                 struct {
      95                 :            :                         u8 unused;
      96                 :            :                         u8 type;
      97                 :            :                 } sha1;
      98                 :            :                 struct {
      99                 :            :                         u8 type;
     100                 :            :                         u8 algo;
     101                 :            :                 } ng;
     102                 :            :                 u8 data[2];
     103                 :            :         } xattr;
     104                 :            :         u8 digest[0];
     105                 :            : } __packed;
     106                 :            : 
     107                 :            : /*
     108                 :            :  * signature format v2 - for using with asymmetric keys
     109                 :            :  */
     110                 :            : struct signature_v2_hdr {
     111                 :            :         uint8_t type;           /* xattr type */
     112                 :            :         uint8_t version;        /* signature format version */
     113                 :            :         uint8_t hash_algo;      /* Digest algorithm [enum hash_algo] */
     114                 :            :         __be32 keyid;           /* IMA key identifier - not X509/PGP specific */
     115                 :            :         __be16 sig_size;        /* signature size */
     116                 :            :         uint8_t sig[0];         /* signature payload */
     117                 :            : } __packed;
     118                 :            : 
     119                 :            : /* integrity data associated with an inode */
     120                 :            : struct integrity_iint_cache {
     121                 :            :         struct rb_node rb_node; /* rooted in integrity_iint_tree */
     122                 :            :         struct mutex mutex;     /* protects: version, flags, digest */
     123                 :            :         struct inode *inode;    /* back pointer to inode in question */
     124                 :            :         u64 version;            /* track inode changes */
     125                 :            :         unsigned long flags;
     126                 :            :         unsigned long measured_pcrs;
     127                 :            :         unsigned long atomic_flags;
     128                 :            :         enum integrity_status ima_file_status:4;
     129                 :            :         enum integrity_status ima_mmap_status:4;
     130                 :            :         enum integrity_status ima_bprm_status:4;
     131                 :            :         enum integrity_status ima_read_status:4;
     132                 :            :         enum integrity_status ima_creds_status:4;
     133                 :            :         enum integrity_status evm_status:4;
     134                 :            :         struct ima_digest_data *ima_hash;
     135                 :            : };
     136                 :            : 
     137                 :            : /* rbtree tree calls to lookup, insert, delete
     138                 :            :  * integrity data associated with an inode.
     139                 :            :  */
     140                 :            : struct integrity_iint_cache *integrity_iint_find(struct inode *inode);
     141                 :            : 
     142                 :            : int integrity_kernel_read(struct file *file, loff_t offset,
     143                 :            :                           void *addr, unsigned long count);
     144                 :            : 
     145                 :            : #define INTEGRITY_KEYRING_EVM           0
     146                 :            : #define INTEGRITY_KEYRING_IMA           1
     147                 :            : #define INTEGRITY_KEYRING_PLATFORM      2
     148                 :            : #define INTEGRITY_KEYRING_MAX           3
     149                 :            : 
     150                 :            : extern struct dentry *integrity_dir;
     151                 :            : 
     152                 :            : struct modsig;
     153                 :            : 
     154                 :            : #ifdef CONFIG_INTEGRITY_SIGNATURE
     155                 :            : 
     156                 :            : int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen,
     157                 :            :                             const char *digest, int digestlen);
     158                 :            : int integrity_modsig_verify(unsigned int id, const struct modsig *modsig);
     159                 :            : 
     160                 :            : int __init integrity_init_keyring(const unsigned int id);
     161                 :            : int __init integrity_load_x509(const unsigned int id, const char *path);
     162                 :            : int __init integrity_load_cert(const unsigned int id, const char *source,
     163                 :            :                                const void *data, size_t len, key_perm_t perm);
     164                 :            : #else
     165                 :            : 
     166                 :            : static inline int integrity_digsig_verify(const unsigned int id,
     167                 :            :                                           const char *sig, int siglen,
     168                 :            :                                           const char *digest, int digestlen)
     169                 :            : {
     170                 :            :         return -EOPNOTSUPP;
     171                 :            : }
     172                 :            : 
     173                 :            : static inline int integrity_modsig_verify(unsigned int id,
     174                 :            :                                           const struct modsig *modsig)
     175                 :            : {
     176                 :            :         return -EOPNOTSUPP;
     177                 :            : }
     178                 :            : 
     179                 :            : static inline int integrity_init_keyring(const unsigned int id)
     180                 :            : {
     181                 :            :         return 0;
     182                 :            : }
     183                 :            : 
     184                 :            : static inline int __init integrity_load_cert(const unsigned int id,
     185                 :            :                                              const char *source,
     186                 :            :                                              const void *data, size_t len,
     187                 :            :                                              key_perm_t perm)
     188                 :            : {
     189                 :            :         return 0;
     190                 :            : }
     191                 :            : #endif /* CONFIG_INTEGRITY_SIGNATURE */
     192                 :            : 
     193                 :            : #ifdef CONFIG_INTEGRITY_ASYMMETRIC_KEYS
     194                 :            : int asymmetric_verify(struct key *keyring, const char *sig,
     195                 :            :                       int siglen, const char *data, int datalen);
     196                 :            : #else
     197                 :            : static inline int asymmetric_verify(struct key *keyring, const char *sig,
     198                 :            :                                     int siglen, const char *data, int datalen)
     199                 :            : {
     200                 :            :         return -EOPNOTSUPP;
     201                 :            : }
     202                 :            : #endif
     203                 :            : 
     204                 :            : #ifdef CONFIG_IMA_APPRAISE_MODSIG
     205                 :            : int ima_modsig_verify(struct key *keyring, const struct modsig *modsig);
     206                 :            : #else
     207                 :            : static inline int ima_modsig_verify(struct key *keyring,
     208                 :            :                                     const struct modsig *modsig)
     209                 :            : {
     210                 :            :         return -EOPNOTSUPP;
     211                 :            : }
     212                 :            : #endif
     213                 :            : 
     214                 :            : #ifdef CONFIG_IMA_LOAD_X509
     215                 :            : void __init ima_load_x509(void);
     216                 :            : #else
     217                 :         21 : static inline void ima_load_x509(void)
     218                 :            : {
     219                 :         21 : }
     220                 :            : #endif
     221                 :            : 
     222                 :            : #ifdef CONFIG_EVM_LOAD_X509
     223                 :            : void __init evm_load_x509(void);
     224                 :            : #else
     225                 :         21 : static inline void evm_load_x509(void)
     226                 :            : {
     227                 :         21 : }
     228                 :            : #endif
     229                 :            : 
     230                 :            : #ifdef CONFIG_INTEGRITY_AUDIT
     231                 :            : /* declarations */
     232                 :            : void integrity_audit_msg(int audit_msgno, struct inode *inode,
     233                 :            :                          const unsigned char *fname, const char *op,
     234                 :            :                          const char *cause, int result, int info);
     235                 :            : 
     236                 :            : static inline struct audit_buffer *
     237                 :            : integrity_audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type)
     238                 :            : {
     239                 :            :         return audit_log_start(ctx, gfp_mask, type);
     240                 :            : }
     241                 :            : 
     242                 :            : #else
     243                 :            : static inline void integrity_audit_msg(int audit_msgno, struct inode *inode,
     244                 :            :                                        const unsigned char *fname,
     245                 :            :                                        const char *op, const char *cause,
     246                 :            :                                        int result, int info)
     247                 :            : {
     248                 :            : }
     249                 :            : 
     250                 :            : static inline struct audit_buffer *
     251                 :            : integrity_audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type)
     252                 :            : {
     253                 :            :         return NULL;
     254                 :            : }
     255                 :            : 
     256                 :            : #endif
     257                 :            : 
     258                 :            : #ifdef CONFIG_INTEGRITY_PLATFORM_KEYRING
     259                 :            : void __init add_to_platform_keyring(const char *source, const void *data,
     260                 :            :                                     size_t len);
     261                 :            : #else
     262                 :            : static inline void __init add_to_platform_keyring(const char *source,
     263                 :            :                                                   const void *data, size_t len)
     264                 :            : {
     265                 :            : }
     266                 :            : #endif

Generated by: LCOV version 1.14