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