1*00b67f09SDavid van Moolenbroek /* $NetBSD: dst_internal.h,v 1.10 2014/12/10 04:37:58 christos Exp $ */ 2*00b67f09SDavid van Moolenbroek 3*00b67f09SDavid van Moolenbroek /* 4*00b67f09SDavid van Moolenbroek * Portions Copyright (C) 2004-2014 Internet Systems Consortium, Inc. ("ISC") 5*00b67f09SDavid van Moolenbroek * Portions Copyright (C) 2000-2002 Internet Software Consortium. 6*00b67f09SDavid van Moolenbroek * 7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any 8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above 9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies. 10*00b67f09SDavid van Moolenbroek * 11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC AND NETWORK ASSOCIATES DISCLAIMS 12*00b67f09SDavid van Moolenbroek * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 13*00b67f09SDavid van Moolenbroek * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE 14*00b67f09SDavid van Moolenbroek * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15*00b67f09SDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16*00b67f09SDavid van Moolenbroek * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 17*00b67f09SDavid van Moolenbroek * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18*00b67f09SDavid van Moolenbroek * 19*00b67f09SDavid van Moolenbroek * Portions Copyright (C) 1995-2000 by Network Associates, Inc. 20*00b67f09SDavid van Moolenbroek * 21*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any 22*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above 23*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies. 24*00b67f09SDavid van Moolenbroek * 25*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC AND NETWORK ASSOCIATES DISCLAIMS 26*00b67f09SDavid van Moolenbroek * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 27*00b67f09SDavid van Moolenbroek * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE 28*00b67f09SDavid van Moolenbroek * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 29*00b67f09SDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 30*00b67f09SDavid van Moolenbroek * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 31*00b67f09SDavid van Moolenbroek * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 32*00b67f09SDavid van Moolenbroek */ 33*00b67f09SDavid van Moolenbroek 34*00b67f09SDavid van Moolenbroek /* Id: dst_internal.h,v 1.31 2011/10/20 21:20:02 marka Exp */ 35*00b67f09SDavid van Moolenbroek 36*00b67f09SDavid van Moolenbroek #ifndef DST_DST_INTERNAL_H 37*00b67f09SDavid van Moolenbroek #define DST_DST_INTERNAL_H 1 38*00b67f09SDavid van Moolenbroek 39*00b67f09SDavid van Moolenbroek #include <isc/lang.h> 40*00b67f09SDavid van Moolenbroek #include <isc/buffer.h> 41*00b67f09SDavid van Moolenbroek #include <isc/int.h> 42*00b67f09SDavid van Moolenbroek #include <isc/magic.h> 43*00b67f09SDavid van Moolenbroek #include <isc/region.h> 44*00b67f09SDavid van Moolenbroek #include <isc/types.h> 45*00b67f09SDavid van Moolenbroek #include <isc/md5.h> 46*00b67f09SDavid van Moolenbroek #include <isc/refcount.h> 47*00b67f09SDavid van Moolenbroek #include <isc/sha1.h> 48*00b67f09SDavid van Moolenbroek #include <isc/sha2.h> 49*00b67f09SDavid van Moolenbroek #include <isc/stdtime.h> 50*00b67f09SDavid van Moolenbroek #include <isc/hmacmd5.h> 51*00b67f09SDavid van Moolenbroek #include <isc/hmacsha.h> 52*00b67f09SDavid van Moolenbroek 53*00b67f09SDavid van Moolenbroek #include <dns/time.h> 54*00b67f09SDavid van Moolenbroek 55*00b67f09SDavid van Moolenbroek #include <dst/dst.h> 56*00b67f09SDavid van Moolenbroek 57*00b67f09SDavid van Moolenbroek #ifdef OPENSSL 58*00b67f09SDavid van Moolenbroek #include <openssl/dh.h> 59*00b67f09SDavid van Moolenbroek #include <openssl/dsa.h> 60*00b67f09SDavid van Moolenbroek #include <openssl/err.h> 61*00b67f09SDavid van Moolenbroek #include <openssl/evp.h> 62*00b67f09SDavid van Moolenbroek #include <openssl/objects.h> 63*00b67f09SDavid van Moolenbroek #include <openssl/rsa.h> 64*00b67f09SDavid van Moolenbroek #endif 65*00b67f09SDavid van Moolenbroek 66*00b67f09SDavid van Moolenbroek ISC_LANG_BEGINDECLS 67*00b67f09SDavid van Moolenbroek 68*00b67f09SDavid van Moolenbroek #define KEY_MAGIC ISC_MAGIC('D','S','T','K') 69*00b67f09SDavid van Moolenbroek #define CTX_MAGIC ISC_MAGIC('D','S','T','C') 70*00b67f09SDavid van Moolenbroek 71*00b67f09SDavid van Moolenbroek #define VALID_KEY(x) ISC_MAGIC_VALID(x, KEY_MAGIC) 72*00b67f09SDavid van Moolenbroek #define VALID_CTX(x) ISC_MAGIC_VALID(x, CTX_MAGIC) 73*00b67f09SDavid van Moolenbroek 74*00b67f09SDavid van Moolenbroek extern isc_mem_t *dst__memory_pool; 75*00b67f09SDavid van Moolenbroek 76*00b67f09SDavid van Moolenbroek /*** 77*00b67f09SDavid van Moolenbroek *** Types 78*00b67f09SDavid van Moolenbroek ***/ 79*00b67f09SDavid van Moolenbroek 80*00b67f09SDavid van Moolenbroek typedef struct dst_func dst_func_t; 81*00b67f09SDavid van Moolenbroek 82*00b67f09SDavid van Moolenbroek typedef struct dst_hmacmd5_key dst_hmacmd5_key_t; 83*00b67f09SDavid van Moolenbroek typedef struct dst_hmacsha1_key dst_hmacsha1_key_t; 84*00b67f09SDavid van Moolenbroek typedef struct dst_hmacsha224_key dst_hmacsha224_key_t; 85*00b67f09SDavid van Moolenbroek typedef struct dst_hmacsha256_key dst_hmacsha256_key_t; 86*00b67f09SDavid van Moolenbroek typedef struct dst_hmacsha384_key dst_hmacsha384_key_t; 87*00b67f09SDavid van Moolenbroek typedef struct dst_hmacsha512_key dst_hmacsha512_key_t; 88*00b67f09SDavid van Moolenbroek 89*00b67f09SDavid van Moolenbroek /*% 90*00b67f09SDavid van Moolenbroek * Indicate whether a DST context will be used for signing 91*00b67f09SDavid van Moolenbroek * or for verification 92*00b67f09SDavid van Moolenbroek */ 93*00b67f09SDavid van Moolenbroek typedef enum { DO_SIGN, DO_VERIFY } dst_use_t; 94*00b67f09SDavid van Moolenbroek 95*00b67f09SDavid van Moolenbroek /*% DST Key Structure */ 96*00b67f09SDavid van Moolenbroek struct dst_key { 97*00b67f09SDavid van Moolenbroek unsigned int magic; 98*00b67f09SDavid van Moolenbroek isc_refcount_t refs; 99*00b67f09SDavid van Moolenbroek dns_name_t * key_name; /*%< name of the key */ 100*00b67f09SDavid van Moolenbroek unsigned int key_size; /*%< size of the key in bits */ 101*00b67f09SDavid van Moolenbroek unsigned int key_proto; /*%< protocols this key is used for */ 102*00b67f09SDavid van Moolenbroek unsigned int key_alg; /*%< algorithm of the key */ 103*00b67f09SDavid van Moolenbroek isc_uint32_t key_flags; /*%< flags of the public key */ 104*00b67f09SDavid van Moolenbroek isc_uint16_t key_id; /*%< identifier of the key */ 105*00b67f09SDavid van Moolenbroek isc_uint16_t key_rid; /*%< identifier of the key when 106*00b67f09SDavid van Moolenbroek revoked */ 107*00b67f09SDavid van Moolenbroek isc_uint16_t key_bits; /*%< hmac digest bits */ 108*00b67f09SDavid van Moolenbroek dns_rdataclass_t key_class; /*%< class of the key record */ 109*00b67f09SDavid van Moolenbroek dns_ttl_t key_ttl; /*%< default/initial dnskey ttl */ 110*00b67f09SDavid van Moolenbroek isc_mem_t *mctx; /*%< memory context */ 111*00b67f09SDavid van Moolenbroek char *engine; /*%< engine name (HSM) */ 112*00b67f09SDavid van Moolenbroek char *label; /*%< engine label (HSM) */ 113*00b67f09SDavid van Moolenbroek union { 114*00b67f09SDavid van Moolenbroek void *generic; 115*00b67f09SDavid van Moolenbroek gss_ctx_id_t gssctx; 116*00b67f09SDavid van Moolenbroek #ifdef OPENSSL 117*00b67f09SDavid van Moolenbroek #if !defined(USE_EVP) || !USE_EVP 118*00b67f09SDavid van Moolenbroek RSA *rsa; 119*00b67f09SDavid van Moolenbroek #endif 120*00b67f09SDavid van Moolenbroek DSA *dsa; 121*00b67f09SDavid van Moolenbroek DH *dh; 122*00b67f09SDavid van Moolenbroek EVP_PKEY *pkey; 123*00b67f09SDavid van Moolenbroek #elif PKCS11CRYPTO 124*00b67f09SDavid van Moolenbroek pk11_object_t *pkey; 125*00b67f09SDavid van Moolenbroek #endif 126*00b67f09SDavid van Moolenbroek dst_hmacmd5_key_t *hmacmd5; 127*00b67f09SDavid van Moolenbroek dst_hmacsha1_key_t *hmacsha1; 128*00b67f09SDavid van Moolenbroek dst_hmacsha224_key_t *hmacsha224; 129*00b67f09SDavid van Moolenbroek dst_hmacsha256_key_t *hmacsha256; 130*00b67f09SDavid van Moolenbroek dst_hmacsha384_key_t *hmacsha384; 131*00b67f09SDavid van Moolenbroek dst_hmacsha512_key_t *hmacsha512; 132*00b67f09SDavid van Moolenbroek 133*00b67f09SDavid van Moolenbroek } keydata; /*%< pointer to key in crypto pkg fmt */ 134*00b67f09SDavid van Moolenbroek 135*00b67f09SDavid van Moolenbroek isc_stdtime_t times[DST_MAX_TIMES + 1]; /*%< timing metadata */ 136*00b67f09SDavid van Moolenbroek isc_boolean_t timeset[DST_MAX_TIMES + 1]; /*%< data set? */ 137*00b67f09SDavid van Moolenbroek isc_stdtime_t nums[DST_MAX_NUMERIC + 1]; /*%< numeric metadata */ 138*00b67f09SDavid van Moolenbroek isc_boolean_t numset[DST_MAX_NUMERIC + 1]; /*%< data set? */ 139*00b67f09SDavid van Moolenbroek isc_boolean_t inactive; /*%< private key not present as it is 140*00b67f09SDavid van Moolenbroek inactive */ 141*00b67f09SDavid van Moolenbroek isc_boolean_t external; /*%< external key */ 142*00b67f09SDavid van Moolenbroek 143*00b67f09SDavid van Moolenbroek int fmt_major; /*%< private key format, major version */ 144*00b67f09SDavid van Moolenbroek int fmt_minor; /*%< private key format, minor version */ 145*00b67f09SDavid van Moolenbroek 146*00b67f09SDavid van Moolenbroek dst_func_t * func; /*%< crypto package specific functions */ 147*00b67f09SDavid van Moolenbroek isc_buffer_t *key_tkeytoken; /*%< TKEY token data */ 148*00b67f09SDavid van Moolenbroek }; 149*00b67f09SDavid van Moolenbroek 150*00b67f09SDavid van Moolenbroek struct dst_context { 151*00b67f09SDavid van Moolenbroek unsigned int magic; 152*00b67f09SDavid van Moolenbroek dst_use_t use; 153*00b67f09SDavid van Moolenbroek dst_key_t *key; 154*00b67f09SDavid van Moolenbroek isc_mem_t *mctx; 155*00b67f09SDavid van Moolenbroek isc_logcategory_t *category; 156*00b67f09SDavid van Moolenbroek union { 157*00b67f09SDavid van Moolenbroek void *generic; 158*00b67f09SDavid van Moolenbroek dst_gssapi_signverifyctx_t *gssctx; 159*00b67f09SDavid van Moolenbroek isc_md5_t *md5ctx; 160*00b67f09SDavid van Moolenbroek isc_sha1_t *sha1ctx; 161*00b67f09SDavid van Moolenbroek isc_sha256_t *sha256ctx; 162*00b67f09SDavid van Moolenbroek isc_sha512_t *sha512ctx; 163*00b67f09SDavid van Moolenbroek isc_hmacmd5_t *hmacmd5ctx; 164*00b67f09SDavid van Moolenbroek isc_hmacsha1_t *hmacsha1ctx; 165*00b67f09SDavid van Moolenbroek isc_hmacsha224_t *hmacsha224ctx; 166*00b67f09SDavid van Moolenbroek isc_hmacsha256_t *hmacsha256ctx; 167*00b67f09SDavid van Moolenbroek isc_hmacsha384_t *hmacsha384ctx; 168*00b67f09SDavid van Moolenbroek isc_hmacsha512_t *hmacsha512ctx; 169*00b67f09SDavid van Moolenbroek #ifdef OPENSSL 170*00b67f09SDavid van Moolenbroek EVP_MD_CTX *evp_md_ctx; 171*00b67f09SDavid van Moolenbroek #elif PKCS11CRYPTO 172*00b67f09SDavid van Moolenbroek pk11_context_t *pk11_ctx; 173*00b67f09SDavid van Moolenbroek #endif 174*00b67f09SDavid van Moolenbroek } ctxdata; 175*00b67f09SDavid van Moolenbroek }; 176*00b67f09SDavid van Moolenbroek 177*00b67f09SDavid van Moolenbroek struct dst_func { 178*00b67f09SDavid van Moolenbroek /* 179*00b67f09SDavid van Moolenbroek * Context functions 180*00b67f09SDavid van Moolenbroek */ 181*00b67f09SDavid van Moolenbroek isc_result_t (*createctx)(dst_key_t *key, dst_context_t *dctx); 182*00b67f09SDavid van Moolenbroek isc_result_t (*createctx2)(dst_key_t *key, int maxbits, 183*00b67f09SDavid van Moolenbroek dst_context_t *dctx); 184*00b67f09SDavid van Moolenbroek void (*destroyctx)(dst_context_t *dctx); 185*00b67f09SDavid van Moolenbroek isc_result_t (*adddata)(dst_context_t *dctx, const isc_region_t *data); 186*00b67f09SDavid van Moolenbroek 187*00b67f09SDavid van Moolenbroek /* 188*00b67f09SDavid van Moolenbroek * Key operations 189*00b67f09SDavid van Moolenbroek */ 190*00b67f09SDavid van Moolenbroek isc_result_t (*sign)(dst_context_t *dctx, isc_buffer_t *sig); 191*00b67f09SDavid van Moolenbroek isc_result_t (*verify)(dst_context_t *dctx, const isc_region_t *sig); 192*00b67f09SDavid van Moolenbroek isc_result_t (*verify2)(dst_context_t *dctx, int maxbits, 193*00b67f09SDavid van Moolenbroek const isc_region_t *sig); 194*00b67f09SDavid van Moolenbroek isc_result_t (*computesecret)(const dst_key_t *pub, 195*00b67f09SDavid van Moolenbroek const dst_key_t *priv, 196*00b67f09SDavid van Moolenbroek isc_buffer_t *secret); 197*00b67f09SDavid van Moolenbroek isc_boolean_t (*compare)(const dst_key_t *key1, const dst_key_t *key2); 198*00b67f09SDavid van Moolenbroek isc_boolean_t (*paramcompare)(const dst_key_t *key1, 199*00b67f09SDavid van Moolenbroek const dst_key_t *key2); 200*00b67f09SDavid van Moolenbroek isc_result_t (*generate)(dst_key_t *key, int parms, 201*00b67f09SDavid van Moolenbroek void (*callback)(int)); 202*00b67f09SDavid van Moolenbroek isc_boolean_t (*isprivate)(const dst_key_t *key); 203*00b67f09SDavid van Moolenbroek void (*destroy)(dst_key_t *key); 204*00b67f09SDavid van Moolenbroek 205*00b67f09SDavid van Moolenbroek /* conversion functions */ 206*00b67f09SDavid van Moolenbroek isc_result_t (*todns)(const dst_key_t *key, isc_buffer_t *data); 207*00b67f09SDavid van Moolenbroek isc_result_t (*fromdns)(dst_key_t *key, isc_buffer_t *data); 208*00b67f09SDavid van Moolenbroek isc_result_t (*tofile)(const dst_key_t *key, const char *directory); 209*00b67f09SDavid van Moolenbroek isc_result_t (*parse)(dst_key_t *key, 210*00b67f09SDavid van Moolenbroek isc_lex_t *lexer, 211*00b67f09SDavid van Moolenbroek dst_key_t *pub); 212*00b67f09SDavid van Moolenbroek 213*00b67f09SDavid van Moolenbroek /* cleanup */ 214*00b67f09SDavid van Moolenbroek void (*cleanup)(void); 215*00b67f09SDavid van Moolenbroek 216*00b67f09SDavid van Moolenbroek isc_result_t (*fromlabel)(dst_key_t *key, const char *engine, 217*00b67f09SDavid van Moolenbroek const char *label, const char *pin); 218*00b67f09SDavid van Moolenbroek isc_result_t (*dump)(dst_key_t *key, isc_mem_t *mctx, char **buffer, 219*00b67f09SDavid van Moolenbroek int *length); 220*00b67f09SDavid van Moolenbroek isc_result_t (*restore)(dst_key_t *key, const char *keystr); 221*00b67f09SDavid van Moolenbroek }; 222*00b67f09SDavid van Moolenbroek 223*00b67f09SDavid van Moolenbroek /*% 224*00b67f09SDavid van Moolenbroek * Initializers 225*00b67f09SDavid van Moolenbroek */ 226*00b67f09SDavid van Moolenbroek isc_result_t dst__openssl_init(const char *engine); 227*00b67f09SDavid van Moolenbroek #define dst__pkcs11_init pk11_initialize 228*00b67f09SDavid van Moolenbroek 229*00b67f09SDavid van Moolenbroek isc_result_t dst__hmacmd5_init(struct dst_func **funcp); 230*00b67f09SDavid van Moolenbroek isc_result_t dst__hmacsha1_init(struct dst_func **funcp); 231*00b67f09SDavid van Moolenbroek isc_result_t dst__hmacsha224_init(struct dst_func **funcp); 232*00b67f09SDavid van Moolenbroek isc_result_t dst__hmacsha256_init(struct dst_func **funcp); 233*00b67f09SDavid van Moolenbroek isc_result_t dst__hmacsha384_init(struct dst_func **funcp); 234*00b67f09SDavid van Moolenbroek isc_result_t dst__hmacsha512_init(struct dst_func **funcp); 235*00b67f09SDavid van Moolenbroek isc_result_t dst__opensslrsa_init(struct dst_func **funcp, 236*00b67f09SDavid van Moolenbroek unsigned char algorithm); 237*00b67f09SDavid van Moolenbroek isc_result_t dst__pkcs11rsa_init(struct dst_func **funcp); 238*00b67f09SDavid van Moolenbroek isc_result_t dst__openssldsa_init(struct dst_func **funcp); 239*00b67f09SDavid van Moolenbroek isc_result_t dst__pkcs11dsa_init(struct dst_func **funcp); 240*00b67f09SDavid van Moolenbroek isc_result_t dst__openssldh_init(struct dst_func **funcp); 241*00b67f09SDavid van Moolenbroek isc_result_t dst__pkcs11dh_init(struct dst_func **funcp); 242*00b67f09SDavid van Moolenbroek isc_result_t dst__gssapi_init(struct dst_func **funcp); 243*00b67f09SDavid van Moolenbroek #ifdef HAVE_OPENSSL_ECDSA 244*00b67f09SDavid van Moolenbroek isc_result_t dst__opensslecdsa_init(struct dst_func **funcp); 245*00b67f09SDavid van Moolenbroek #endif 246*00b67f09SDavid van Moolenbroek #ifdef HAVE_PKCS11_ECDSA 247*00b67f09SDavid van Moolenbroek isc_result_t dst__pkcs11ecdsa_init(struct dst_func **funcp); 248*00b67f09SDavid van Moolenbroek #endif 249*00b67f09SDavid van Moolenbroek #ifdef HAVE_OPENSSL_GOST 250*00b67f09SDavid van Moolenbroek isc_result_t dst__opensslgost_init(struct dst_func **funcp); 251*00b67f09SDavid van Moolenbroek #endif 252*00b67f09SDavid van Moolenbroek #ifdef HAVE_PKCS11_GOST 253*00b67f09SDavid van Moolenbroek isc_result_t dst__pkcs11gost_init(struct dst_func **funcp); 254*00b67f09SDavid van Moolenbroek #endif 255*00b67f09SDavid van Moolenbroek 256*00b67f09SDavid van Moolenbroek /*% 257*00b67f09SDavid van Moolenbroek * Destructors 258*00b67f09SDavid van Moolenbroek */ 259*00b67f09SDavid van Moolenbroek void dst__openssl_destroy(void); 260*00b67f09SDavid van Moolenbroek #define dst__pkcs11_destroy pk11_finalize 261*00b67f09SDavid van Moolenbroek 262*00b67f09SDavid van Moolenbroek /*% 263*00b67f09SDavid van Moolenbroek * Memory allocators using the DST memory pool. 264*00b67f09SDavid van Moolenbroek */ 265*00b67f09SDavid van Moolenbroek void * dst__mem_alloc(size_t size); 266*00b67f09SDavid van Moolenbroek void dst__mem_free(void *ptr); 267*00b67f09SDavid van Moolenbroek void * dst__mem_realloc(void *ptr, size_t size); 268*00b67f09SDavid van Moolenbroek 269*00b67f09SDavid van Moolenbroek /*% 270*00b67f09SDavid van Moolenbroek * Entropy retriever using the DST entropy pool. 271*00b67f09SDavid van Moolenbroek */ 272*00b67f09SDavid van Moolenbroek isc_result_t dst__entropy_getdata(void *buf, unsigned int len, 273*00b67f09SDavid van Moolenbroek isc_boolean_t pseudo); 274*00b67f09SDavid van Moolenbroek 275*00b67f09SDavid van Moolenbroek /* 276*00b67f09SDavid van Moolenbroek * Entropy status hook. 277*00b67f09SDavid van Moolenbroek */ 278*00b67f09SDavid van Moolenbroek unsigned int dst__entropy_status(void); 279*00b67f09SDavid van Moolenbroek 280*00b67f09SDavid van Moolenbroek ISC_LANG_ENDDECLS 281*00b67f09SDavid van Moolenbroek 282*00b67f09SDavid van Moolenbroek #endif /* DST_DST_INTERNAL_H */ 283*00b67f09SDavid van Moolenbroek /*! \file */ 284