linux/include/crypto/public_key.h
<<
>>
Prefs
   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#include <keys/asymmetric-type.h>
  19#include <crypto/hash_info.h>
  20
  21enum pkey_algo {
  22        PKEY_ALGO_DSA,
  23        PKEY_ALGO_RSA,
  24        PKEY_ALGO__LAST
  25};
  26
  27extern const char *const pkey_algo_name[PKEY_ALGO__LAST];
  28extern const struct public_key_algorithm *pkey_algo[PKEY_ALGO__LAST];
  29
  30/* asymmetric key implementation supports only up to SHA224 */
  31#define PKEY_HASH__LAST         (HASH_ALGO_SHA224 + 1)
  32
  33enum pkey_id_type {
  34        PKEY_ID_PGP,            /* OpenPGP generated key ID */
  35        PKEY_ID_X509,           /* X.509 arbitrary subjectKeyIdentifier */
  36        PKEY_ID_TYPE__LAST
  37};
  38
  39extern const char *const pkey_id_type_name[PKEY_ID_TYPE__LAST];
  40
  41/*
  42 * Cryptographic data for the public-key subtype of the asymmetric key type.
  43 *
  44 * Note that this may include private part of the key as well as the public
  45 * part.
  46 */
  47struct public_key {
  48        const struct public_key_algorithm *algo;
  49        u8      capabilities;
  50#define PKEY_CAN_ENCRYPT        0x01
  51#define PKEY_CAN_DECRYPT        0x02
  52#define PKEY_CAN_SIGN           0x04
  53#define PKEY_CAN_VERIFY         0x08
  54        enum pkey_algo pkey_algo : 8;
  55        enum pkey_id_type id_type : 8;
  56        union {
  57                MPI     mpi[5];
  58                struct {
  59                        MPI     p;      /* DSA prime */
  60                        MPI     q;      /* DSA group order */
  61                        MPI     g;      /* DSA group generator */
  62                        MPI     y;      /* DSA public-key value = g^x mod p */
  63                        MPI     x;      /* DSA secret exponent (if present) */
  64                } dsa;
  65                struct {
  66                        MPI     n;      /* RSA public modulus */
  67                        MPI     e;      /* RSA public encryption exponent */
  68                        MPI     d;      /* RSA secret encryption exponent (if present) */
  69                        MPI     p;      /* RSA secret prime (if present) */
  70                        MPI     q;      /* RSA secret prime (if present) */
  71                } rsa;
  72        };
  73};
  74
  75extern void public_key_destroy(void *payload);
  76
  77/*
  78 * Public key cryptography signature data
  79 */
  80struct public_key_signature {
  81        u8 *digest;
  82        u8 digest_size;                 /* Number of bytes in digest */
  83        u8 nr_mpi;                      /* Occupancy of mpi[] */
  84        enum pkey_algo pkey_algo : 8;
  85        enum hash_algo pkey_hash_algo : 8;
  86        union {
  87                MPI mpi[2];
  88                struct {
  89                        MPI s;          /* m^d mod n */
  90                } rsa;
  91                struct {
  92                        MPI r;
  93                        MPI s;
  94                } dsa;
  95        };
  96};
  97
  98struct key;
  99extern int verify_signature(const struct key *key,
 100                            const struct public_key_signature *sig);
 101
 102struct asymmetric_key_id;
 103extern struct key *x509_request_asymmetric_key(struct key *keyring,
 104                                               const struct asymmetric_key_id *kid,
 105                                               bool partial);
 106
 107#endif /* _LINUX_PUBLIC_KEY_H */
 108