1 /* Asymmetric public-key algorithm definitions 2 * 3 * See Documentation/crypto/asymmetric-keys.txt 4 * 5 * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved. 6 * Written by David Howells (dhowells@redhat.com) 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public Licence 10 * as published by the Free Software Foundation; either version 11 * 2 of the Licence, or (at your option) any later version. 12 */ 13 14 #ifndef _LINUX_PUBLIC_KEY_H 15 #define _LINUX_PUBLIC_KEY_H 16 17 #include <linux/mpi.h> 18 19 enum pkey_algo { 20 PKEY_ALGO_DSA, 21 PKEY_ALGO_RSA, 22 PKEY_ALGO__LAST 23 }; 24 25 extern const char *const pkey_algo[PKEY_ALGO__LAST]; 26 27 enum pkey_hash_algo { 28 PKEY_HASH_MD4, 29 PKEY_HASH_MD5, 30 PKEY_HASH_SHA1, 31 PKEY_HASH_RIPE_MD_160, 32 PKEY_HASH_SHA256, 33 PKEY_HASH_SHA384, 34 PKEY_HASH_SHA512, 35 PKEY_HASH_SHA224, 36 PKEY_HASH__LAST 37 }; 38 39 extern const char *const pkey_hash_algo[PKEY_HASH__LAST]; 40 41 enum pkey_id_type { 42 PKEY_ID_PGP, /* OpenPGP generated key ID */ 43 PKEY_ID_X509, /* X.509 arbitrary subjectKeyIdentifier */ 44 PKEY_ID_TYPE__LAST 45 }; 46 47 extern const char *const pkey_id_type[PKEY_ID_TYPE__LAST]; 48 49 /* 50 * Cryptographic data for the public-key subtype of the asymmetric key type. 51 * 52 * Note that this may include private part of the key as well as the public 53 * part. 54 */ 55 struct public_key { 56 const struct public_key_algorithm *algo; 57 u8 capabilities; 58 #define PKEY_CAN_ENCRYPT 0x01 59 #define PKEY_CAN_DECRYPT 0x02 60 #define PKEY_CAN_SIGN 0x04 61 #define PKEY_CAN_VERIFY 0x08 62 enum pkey_id_type id_type : 8; 63 union { 64 MPI mpi[5]; 65 struct { 66 MPI p; /* DSA prime */ 67 MPI q; /* DSA group order */ 68 MPI g; /* DSA group generator */ 69 MPI y; /* DSA public-key value = g^x mod p */ 70 MPI x; /* DSA secret exponent (if present) */ 71 } dsa; 72 struct { 73 MPI n; /* RSA public modulus */ 74 MPI e; /* RSA public encryption exponent */ 75 MPI d; /* RSA secret encryption exponent (if present) */ 76 MPI p; /* RSA secret prime (if present) */ 77 MPI q; /* RSA secret prime (if present) */ 78 } rsa; 79 }; 80 }; 81 82 extern void public_key_destroy(void *payload); 83 84 /* 85 * Public key cryptography signature data 86 */ 87 struct public_key_signature { 88 u8 *digest; 89 u8 digest_size; /* Number of bytes in digest */ 90 u8 nr_mpi; /* Occupancy of mpi[] */ 91 enum pkey_hash_algo pkey_hash_algo : 8; 92 union { 93 MPI mpi[2]; 94 struct { 95 MPI s; /* m^d mod n */ 96 } rsa; 97 struct { 98 MPI r; 99 MPI s; 100 } dsa; 101 }; 102 }; 103 104 struct key; 105 extern int verify_signature(const struct key *key, 106 const struct public_key_signature *sig); 107 108 #endif /* _LINUX_PUBLIC_KEY_H */ 109