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
  19enum pkey_algo {
  20        PKEY_ALGO_DSA,
  21        PKEY_ALGO_RSA,
  22        PKEY_ALGO__LAST
  23};
  24
  25extern const char *const pkey_algo[PKEY_ALGO__LAST];
  26
  27enum 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
  39extern const char *const pkey_hash_algo[PKEY_HASH__LAST];
  40
  41enum 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
  47extern 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 */
  55struct 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
  82extern void public_key_destroy(void *payload);
  83
  84/*
  85 * Public key cryptography signature data
  86 */
  87struct 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
 104struct key;
 105extern int verify_signature(const struct key *key,
 106                            const struct public_key_signature *sig);
 107
 108#endif /* _LINUX_PUBLIC_KEY_H */
 109