Home | History | Annotate | Line # | Download | only in internal
      1  1.1  christos /*
      2  1.1  christos  * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
      3  1.1  christos  *
      4  1.1  christos  * Licensed under the OpenSSL license (the "License").  You may not use
      5  1.1  christos  * this file except in compliance with the License.  You can obtain a copy
      6  1.1  christos  * in the file LICENSE in the source distribution or at
      7  1.1  christos  * https://www.openssl.org/source/license.html
      8  1.1  christos  */
      9  1.1  christos 
     10  1.1  christos #ifndef OSSL_INTERNAL_DANE_H
     11  1.1  christos #define OSSL_INTERNAL_DANE_H
     12  1.1  christos 
     13  1.1  christos #include <openssl/safestack.h>
     14  1.1  christos 
     15  1.1  christos /*-
     16  1.1  christos  * Certificate usages:
     17  1.1  christos  * https://tools.ietf.org/html/rfc6698#section-2.1.1
     18  1.1  christos  */
     19  1.1  christos #define DANETLS_USAGE_PKIX_TA   0
     20  1.1  christos #define DANETLS_USAGE_PKIX_EE   1
     21  1.1  christos #define DANETLS_USAGE_DANE_TA   2
     22  1.1  christos #define DANETLS_USAGE_DANE_EE   3
     23  1.1  christos #define DANETLS_USAGE_LAST      DANETLS_USAGE_DANE_EE
     24  1.1  christos 
     25  1.1  christos /*-
     26  1.1  christos  * Selectors:
     27  1.1  christos  * https://tools.ietf.org/html/rfc6698#section-2.1.2
     28  1.1  christos  */
     29  1.1  christos #define DANETLS_SELECTOR_CERT   0
     30  1.1  christos #define DANETLS_SELECTOR_SPKI   1
     31  1.1  christos #define DANETLS_SELECTOR_LAST   DANETLS_SELECTOR_SPKI
     32  1.1  christos 
     33  1.1  christos /*-
     34  1.1  christos  * Matching types:
     35  1.1  christos  * https://tools.ietf.org/html/rfc6698#section-2.1.3
     36  1.1  christos  */
     37  1.1  christos #define DANETLS_MATCHING_FULL   0
     38  1.1  christos #define DANETLS_MATCHING_2256   1
     39  1.1  christos #define DANETLS_MATCHING_2512   2
     40  1.1  christos #define DANETLS_MATCHING_LAST   DANETLS_MATCHING_2512
     41  1.1  christos 
     42  1.1  christos typedef struct danetls_record_st {
     43  1.1  christos     uint8_t usage;
     44  1.1  christos     uint8_t selector;
     45  1.1  christos     uint8_t mtype;
     46  1.1  christos     unsigned char *data;
     47  1.1  christos     size_t dlen;
     48  1.1  christos     EVP_PKEY *spki;
     49  1.1  christos } danetls_record;
     50  1.1  christos 
     51  1.1  christos DEFINE_STACK_OF(danetls_record)
     52  1.1  christos 
     53  1.1  christos /*
     54  1.1  christos  * Shared DANE context
     55  1.1  christos  */
     56  1.1  christos struct dane_ctx_st {
     57  1.1  christos     const EVP_MD  **mdevp;      /* mtype -> digest */
     58  1.1  christos     uint8_t        *mdord;      /* mtype -> preference */
     59  1.1  christos     uint8_t         mdmax;      /* highest supported mtype */
     60  1.1  christos     unsigned long   flags;      /* feature bitmask */
     61  1.1  christos };
     62  1.1  christos 
     63  1.1  christos /*
     64  1.1  christos  * Per connection DANE state
     65  1.1  christos  */
     66  1.1  christos struct ssl_dane_st {
     67  1.1  christos     struct dane_ctx_st *dctx;
     68  1.1  christos     STACK_OF(danetls_record) *trecs;
     69  1.1  christos     STACK_OF(X509) *certs;      /* DANE-TA(2) Cert(0) Full(0) certs */
     70  1.1  christos     danetls_record *mtlsa;      /* Matching TLSA record */
     71  1.1  christos     X509           *mcert;      /* DANE matched cert */
     72  1.1  christos     uint32_t        umask;      /* Usages present */
     73  1.1  christos     int             mdpth;      /* Depth of matched cert */
     74  1.1  christos     int             pdpth;      /* Depth of PKIX trust */
     75  1.1  christos     unsigned long   flags;      /* feature bitmask */
     76  1.1  christos };
     77  1.1  christos 
     78  1.1  christos #define DANETLS_ENABLED(dane)  \
     79  1.1  christos     ((dane) != NULL && sk_danetls_record_num((dane)->trecs) > 0)
     80  1.1  christos 
     81  1.1  christos #define DANETLS_USAGE_BIT(u)   (((uint32_t)1) << u)
     82  1.1  christos 
     83  1.1  christos #define DANETLS_PKIX_TA_MASK (DANETLS_USAGE_BIT(DANETLS_USAGE_PKIX_TA))
     84  1.1  christos #define DANETLS_PKIX_EE_MASK (DANETLS_USAGE_BIT(DANETLS_USAGE_PKIX_EE))
     85  1.1  christos #define DANETLS_DANE_TA_MASK (DANETLS_USAGE_BIT(DANETLS_USAGE_DANE_TA))
     86  1.1  christos #define DANETLS_DANE_EE_MASK (DANETLS_USAGE_BIT(DANETLS_USAGE_DANE_EE))
     87  1.1  christos 
     88  1.1  christos #define DANETLS_PKIX_MASK (DANETLS_PKIX_TA_MASK | DANETLS_PKIX_EE_MASK)
     89  1.1  christos #define DANETLS_DANE_MASK (DANETLS_DANE_TA_MASK | DANETLS_DANE_EE_MASK)
     90  1.1  christos #define DANETLS_TA_MASK (DANETLS_PKIX_TA_MASK | DANETLS_DANE_TA_MASK)
     91  1.1  christos #define DANETLS_EE_MASK (DANETLS_PKIX_EE_MASK | DANETLS_DANE_EE_MASK)
     92  1.1  christos 
     93  1.1  christos #define DANETLS_HAS_PKIX(dane) ((dane) && ((dane)->umask & DANETLS_PKIX_MASK))
     94  1.1  christos #define DANETLS_HAS_DANE(dane) ((dane) && ((dane)->umask & DANETLS_DANE_MASK))
     95  1.1  christos #define DANETLS_HAS_TA(dane)   ((dane) && ((dane)->umask & DANETLS_TA_MASK))
     96  1.1  christos #define DANETLS_HAS_EE(dane)   ((dane) && ((dane)->umask & DANETLS_EE_MASK))
     97  1.1  christos 
     98  1.1  christos #define DANETLS_HAS_PKIX_TA(dane) ((dane)&&((dane)->umask & DANETLS_PKIX_TA_MASK))
     99  1.1  christos #define DANETLS_HAS_PKIX_EE(dane) ((dane)&&((dane)->umask & DANETLS_PKIX_EE_MASK))
    100  1.1  christos #define DANETLS_HAS_DANE_TA(dane) ((dane)&&((dane)->umask & DANETLS_DANE_TA_MASK))
    101  1.1  christos #define DANETLS_HAS_DANE_EE(dane) ((dane)&&((dane)->umask & DANETLS_DANE_EE_MASK))
    102  1.1  christos 
    103  1.1  christos #endif /* OSSL_INTERNAL_DANE_H */
    104