1*df8bdeb3Sjohnz /* 2*df8bdeb3Sjohnz * CDDL HEADER START 3*df8bdeb3Sjohnz * 4*df8bdeb3Sjohnz * The contents of this file are subject to the terms of the 5*df8bdeb3Sjohnz * Common Development and Distribution License (the "License"). 6*df8bdeb3Sjohnz * You may not use this file except in compliance with the License. 7*df8bdeb3Sjohnz * 8*df8bdeb3Sjohnz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*df8bdeb3Sjohnz * or http://www.opensolaris.org/os/licensing. 10*df8bdeb3Sjohnz * See the License for the specific language governing permissions 11*df8bdeb3Sjohnz * and limitations under the License. 12*df8bdeb3Sjohnz * 13*df8bdeb3Sjohnz * When distributing Covered Code, include this CDDL HEADER in each 14*df8bdeb3Sjohnz * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*df8bdeb3Sjohnz * If applicable, add the following below this CDDL HEADER, with the 16*df8bdeb3Sjohnz * fields enclosed by brackets "[]" replaced with your own identifying 17*df8bdeb3Sjohnz * information: Portions Copyright [yyyy] [name of copyright owner] 18*df8bdeb3Sjohnz * 19*df8bdeb3Sjohnz * CDDL HEADER END 20*df8bdeb3Sjohnz */ 21*df8bdeb3Sjohnz 22*df8bdeb3Sjohnz /* 23*df8bdeb3Sjohnz * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24*df8bdeb3Sjohnz * Use is subject to license terms. 25*df8bdeb3Sjohnz */ 26*df8bdeb3Sjohnz 27*df8bdeb3Sjohnz #ifndef _LIBELFSIGN_H 28*df8bdeb3Sjohnz #define _LIBELFSIGN_H 29*df8bdeb3Sjohnz 30*df8bdeb3Sjohnz #pragma ident "%Z%%M% %I% %E% SMI" 31*df8bdeb3Sjohnz 32*df8bdeb3Sjohnz #ifdef __cplusplus 33*df8bdeb3Sjohnz extern "C" { 34*df8bdeb3Sjohnz #endif 35*df8bdeb3Sjohnz 36*df8bdeb3Sjohnz /* 37*df8bdeb3Sjohnz * libelfsign Private Interfaces 38*df8bdeb3Sjohnz * This Header file should not be shipped as part of Solaris binary or 39*df8bdeb3Sjohnz * source products. 40*df8bdeb3Sjohnz */ 41*df8bdeb3Sjohnz 42*df8bdeb3Sjohnz #include <sys/crypto/elfsign.h> 43*df8bdeb3Sjohnz #include <libelf.h> 44*df8bdeb3Sjohnz #include <fcntl.h> 45*df8bdeb3Sjohnz #include <md5.h> 46*df8bdeb3Sjohnz #include <sha1.h> 47*df8bdeb3Sjohnz #include <kmfapi.h> 48*df8bdeb3Sjohnz 49*df8bdeb3Sjohnz /* 50*df8bdeb3Sjohnz * Certificate-related definitions 51*df8bdeb3Sjohnz */ 52*df8bdeb3Sjohnz #define ELFSIGN_CRYPTO "Solaris Cryptographic Framework" 53*df8bdeb3Sjohnz #define USAGELIMITED "OU=UsageLimited" 54*df8bdeb3Sjohnz #define ESA ".esa" 55*df8bdeb3Sjohnz #define ESA_LEN sizeof (".esa") 56*df8bdeb3Sjohnz 57*df8bdeb3Sjohnz typedef enum ELFCert_VStatus_e { 58*df8bdeb3Sjohnz E_UNCHECKED, 59*df8bdeb3Sjohnz E_OK, 60*df8bdeb3Sjohnz E_IS_TA, 61*df8bdeb3Sjohnz E_FAILED 62*df8bdeb3Sjohnz } ELFCert_VStatus_t; 63*df8bdeb3Sjohnz 64*df8bdeb3Sjohnz typedef struct ELFCert_s { 65*df8bdeb3Sjohnz ELFCert_VStatus_t c_verified; 66*df8bdeb3Sjohnz char *c_subject; 67*df8bdeb3Sjohnz char *c_issuer; 68*df8bdeb3Sjohnz KMF_X509_DER_CERT c_cert; 69*df8bdeb3Sjohnz KMF_KEY_HANDLE c_privatekey; 70*df8bdeb3Sjohnz } *ELFCert_t; 71*df8bdeb3Sjohnz 72*df8bdeb3Sjohnz #define CRYPTO_CERTS_DIR "/etc/crypto/certs" 73*df8bdeb3Sjohnz #define ETC_CERTS_DIR "/etc/certs" 74*df8bdeb3Sjohnz 75*df8bdeb3Sjohnz /* 76*df8bdeb3Sjohnz * libelfsign actions 77*df8bdeb3Sjohnz */ 78*df8bdeb3Sjohnz enum ES_ACTION { 79*df8bdeb3Sjohnz ES_GET, 80*df8bdeb3Sjohnz ES_GET_CRYPTO, 81*df8bdeb3Sjohnz ES_UPDATE, 82*df8bdeb3Sjohnz ES_UPDATE_RSA_MD5_SHA1, 83*df8bdeb3Sjohnz ES_UPDATE_RSA_SHA1 84*df8bdeb3Sjohnz }; 85*df8bdeb3Sjohnz #define ES_ACTISUPDATE(a) ((a) >= ES_UPDATE) 86*df8bdeb3Sjohnz 87*df8bdeb3Sjohnz /* 88*df8bdeb3Sjohnz * Context for elfsign operation 89*df8bdeb3Sjohnz */ 90*df8bdeb3Sjohnz struct ELFsign_s { 91*df8bdeb3Sjohnz Elf *es_elf; 92*df8bdeb3Sjohnz char *es_pathname; 93*df8bdeb3Sjohnz char *es_certpath; 94*df8bdeb3Sjohnz int es_fd; 95*df8bdeb3Sjohnz size_t es_shstrndx; 96*df8bdeb3Sjohnz enum ES_ACTION es_action; 97*df8bdeb3Sjohnz KMF_KEY_HANDLE es_privatekey; 98*df8bdeb3Sjohnz filesig_vers_t es_version; 99*df8bdeb3Sjohnz boolean_t es_same_endian; 100*df8bdeb3Sjohnz boolean_t es_has_phdr; 101*df8bdeb3Sjohnz char es_ei_class; 102*df8bdeb3Sjohnz struct flock es_flock; 103*df8bdeb3Sjohnz KMF_HANDLE_T es_kmfhandle; 104*df8bdeb3Sjohnz void *es_callbackctx; 105*df8bdeb3Sjohnz void (*es_sigvercallback)(void *, void *, size_t, ELFCert_t); 106*df8bdeb3Sjohnz void (*es_certCAcallback)(void *, ELFCert_t, char *); 107*df8bdeb3Sjohnz void (*es_certvercallback)(void *, ELFCert_t, ELFCert_t); 108*df8bdeb3Sjohnz }; 109*df8bdeb3Sjohnz 110*df8bdeb3Sjohnz #define ES_FMT_RSA_MD5_SHA1 "rsa_md5_sha1" 111*df8bdeb3Sjohnz #define ES_FMT_RSA_SHA1 "rsa_sha1" 112*df8bdeb3Sjohnz 113*df8bdeb3Sjohnz /* 114*df8bdeb3Sjohnz * ELF signature handling 115*df8bdeb3Sjohnz */ 116*df8bdeb3Sjohnz typedef struct ELFsign_s *ELFsign_t; 117*df8bdeb3Sjohnz struct ELFsign_sig_info { 118*df8bdeb3Sjohnz char *esi_format; 119*df8bdeb3Sjohnz char *esi_signer; 120*df8bdeb3Sjohnz time_t esi_time; 121*df8bdeb3Sjohnz }; 122*df8bdeb3Sjohnz 123*df8bdeb3Sjohnz extern struct filesignatures *elfsign_insert_dso(ELFsign_t ess, 124*df8bdeb3Sjohnz struct filesignatures *fsp, const char *dn, int dn_len, 125*df8bdeb3Sjohnz const uchar_t *sig, int sig_len, const char *oid, int oid_len); 126*df8bdeb3Sjohnz extern filesig_vers_t elfsign_extract_sig(ELFsign_t ess, 127*df8bdeb3Sjohnz struct filesignatures *fsp, uchar_t *sig, size_t *sig_len); 128*df8bdeb3Sjohnz extern ELFsign_status_t elfsign_begin(const char *, 129*df8bdeb3Sjohnz enum ES_ACTION, ELFsign_t *); 130*df8bdeb3Sjohnz extern void elfsign_end(ELFsign_t ess); 131*df8bdeb3Sjohnz extern ELFsign_status_t elfsign_setcertpath(ELFsign_t ess, const char *path); 132*df8bdeb3Sjohnz extern ELFsign_status_t elfsign_verify_signature(ELFsign_t ess, 133*df8bdeb3Sjohnz struct ELFsign_sig_info **esipp); 134*df8bdeb3Sjohnz extern ELFsign_status_t elfsign_hash(ELFsign_t ess, uchar_t *hash, 135*df8bdeb3Sjohnz size_t *hash_len); 136*df8bdeb3Sjohnz extern ELFsign_status_t elfsign_hash_mem_resident(ELFsign_t ess, 137*df8bdeb3Sjohnz uchar_t *hash, size_t *hash_len); 138*df8bdeb3Sjohnz extern ELFsign_status_t elfsign_hash_esa(ELFsign_t ess, 139*df8bdeb3Sjohnz uchar_t *esa_buf, size_t esa_buf_len, uchar_t **hash, size_t *hash_len); 140*df8bdeb3Sjohnz extern void elfsign_buffer_len(ELFsign_t ess, size_t *ip, uchar_t *cp, 141*df8bdeb3Sjohnz enum ES_ACTION action); 142*df8bdeb3Sjohnz 143*df8bdeb3Sjohnz extern void elfsign_setcallbackctx(ELFsign_t ess, void *ctx); 144*df8bdeb3Sjohnz extern void elfsign_setsigvercallback(ELFsign_t ess, 145*df8bdeb3Sjohnz void (*cb)(void *, void *, size_t, ELFCert_t)); 146*df8bdeb3Sjohnz extern ELFsign_status_t elfsign_signatures(ELFsign_t ess, 147*df8bdeb3Sjohnz struct filesignatures **fspp, size_t *fs_len, enum ES_ACTION action); 148*df8bdeb3Sjohnz 149*df8bdeb3Sjohnz extern char const *elfsign_strerror(ELFsign_status_t); 150*df8bdeb3Sjohnz extern boolean_t elfsign_sig_info(struct filesignatures *fssp, 151*df8bdeb3Sjohnz struct ELFsign_sig_info **esipp); 152*df8bdeb3Sjohnz extern void elfsign_sig_info_free(struct ELFsign_sig_info *); 153*df8bdeb3Sjohnz 154*df8bdeb3Sjohnz /* 155*df8bdeb3Sjohnz * ELF "Certificate Library" 156*df8bdeb3Sjohnz */ 157*df8bdeb3Sjohnz 158*df8bdeb3Sjohnz extern const char _PATH_ELFSIGN_CERTS[]; 159*df8bdeb3Sjohnz 160*df8bdeb3Sjohnz #define ELFCERT_MAX_DN_LEN 255 161*df8bdeb3Sjohnz 162*df8bdeb3Sjohnz extern boolean_t elfcertlib_init(ELFsign_t); 163*df8bdeb3Sjohnz extern void elfcertlib_fini(ELFsign_t); 164*df8bdeb3Sjohnz extern boolean_t elfcertlib_settoken(ELFsign_t, char *); 165*df8bdeb3Sjohnz extern void elfcertlib_setcertCAcallback(ELFsign_t ess, 166*df8bdeb3Sjohnz void (*cb)(void *, ELFCert_t, char *)); 167*df8bdeb3Sjohnz extern void elfcertlib_setcertvercallback(ELFsign_t ess, 168*df8bdeb3Sjohnz void (*cb)(void *, ELFCert_t, ELFCert_t)); 169*df8bdeb3Sjohnz 170*df8bdeb3Sjohnz extern boolean_t elfcertlib_getcert(ELFsign_t ess, char *cert_pathname, 171*df8bdeb3Sjohnz char *signer_DN, ELFCert_t *certp, enum ES_ACTION action); 172*df8bdeb3Sjohnz extern void elfcertlib_releasecert(ELFsign_t, ELFCert_t); 173*df8bdeb3Sjohnz extern char *elfcertlib_getdn(ELFCert_t cert); 174*df8bdeb3Sjohnz extern char *elfcertlib_getissuer(ELFCert_t cert); 175*df8bdeb3Sjohnz 176*df8bdeb3Sjohnz extern boolean_t elfcertlib_loadprivatekey(ELFsign_t ess, ELFCert_t cert, 177*df8bdeb3Sjohnz const char *path); 178*df8bdeb3Sjohnz extern boolean_t elfcertlib_loadtokenkey(ELFsign_t ess, ELFCert_t cert, 179*df8bdeb3Sjohnz const char *token_id, const char *pin); 180*df8bdeb3Sjohnz 181*df8bdeb3Sjohnz extern boolean_t elfcertlib_sign(ELFsign_t ess, ELFCert_t cert, 182*df8bdeb3Sjohnz const uchar_t *data, size_t data_len, uchar_t *sig, 183*df8bdeb3Sjohnz size_t *sig_len); 184*df8bdeb3Sjohnz 185*df8bdeb3Sjohnz extern boolean_t elfcertlib_verifycert(ELFsign_t ess, ELFCert_t cert); 186*df8bdeb3Sjohnz extern boolean_t elfcertlib_verifysig(ELFsign_t ess, ELFCert_t cert, 187*df8bdeb3Sjohnz const uchar_t *sig, size_t sig_len, 188*df8bdeb3Sjohnz const uchar_t *data, size_t data_len); 189*df8bdeb3Sjohnz 190*df8bdeb3Sjohnz #ifdef __cplusplus 191*df8bdeb3Sjohnz } 192*df8bdeb3Sjohnz #endif 193*df8bdeb3Sjohnz 194*df8bdeb3Sjohnz #endif /* _LIBELFSIGN_H */ 195