/* * Display a date either in local or UTC time */ void lswlog_realtime(struct lswlog *buf, const realtime_t rtm, bool utc) { if (is_realtime_epoch(rtm)) { lswlogf(buf, "--- -- --:--:--%s----", (utc) ? " UTC " : " "); } else { struct realtm t = (utc ? utc_realtime : local_realtime)(rtm); lswlogf(buf, "%s %02d %02d:%02d:%02d%s%04d", months[t.tm.tm_mon], t.tm.tm_mday, t.tm.tm_hour, t.tm.tm_min, t.tm.tm_sec, (utc) ? " UTC " : " ", t.tm.tm_year + 1900); } }
/* * If there is still space, increment the retransmit counter. * * Used by the duplicate packet code to cap the number of times * duplicate packets are replied to. */ bool count_duplicate(struct state *st, unsigned long limit) { retransmit_t *rt = &st->st_retransmit; unsigned long nr_retransmits = retransmit_count(st); if (nr_retransmits < limit) { double_delay(rt, nr_retransmits); rt->nr_duplicate_replies++; LSWDBGP(DBG_RETRANSMITS, buf) { lswlog_retransmit_prefix(buf, st); lswlogf(buf, "duplicate reply %lu + retransmit %lu of duplicate limit %lu (retransmit limit %lu)", rt->nr_duplicate_replies, rt->nr_retransmits, limit, rt->limit); }
size_t lswlog_nss_ckm(struct lswlog *buf, CK_MECHANISM_TYPE mechanism) { switch (mechanism) { #define CASE(T) case T: return lswlogs(buf, #T + strlen("CKM_")) CASE(CKM_CONCATENATE_BASE_AND_DATA); CASE(CKM_CONCATENATE_BASE_AND_KEY); CASE(CKM_CONCATENATE_DATA_AND_BASE); CASE(CKM_XOR_BASE_AND_DATA); CASE(CKM_EXTRACT_KEY_FROM_KEY); CASE(CKM_AES_CBC); CASE(CKM_DES3_CBC); CASE(CKM_CAMELLIA_CBC); CASE(CKM_AES_CTR); CASE(CKM_AES_GCM); CASE(CKM_AES_MAC); CASE(CKM_AES_KEY_GEN); CASE(CKM_MD5); CASE(CKM_SHA_1); CASE(CKM_SHA256); CASE(CKM_SHA384); CASE(CKM_SHA512); CASE(CKM_MD5_KEY_DERIVATION); CASE(CKM_SHA1_KEY_DERIVATION); CASE(CKM_SHA256_KEY_DERIVATION); CASE(CKM_SHA384_KEY_DERIVATION); CASE(CKM_SHA512_KEY_DERIVATION); CASE(CKM_MD5_HMAC); CASE(CKM_SHA_1_HMAC); CASE(CKM_SHA256_HMAC); CASE(CKM_SHA384_HMAC); CASE(CKM_SHA512_HMAC); CASE(CKM_DH_PKCS_DERIVE); CASE(CKM_ECDH1_DERIVE); CASE(CKM_VENDOR_DEFINED); #undef CASE default: return lswlogf(buf, "CKM_%08lx", (long)mechanism); } }
size_t lswlog_bytes(struct lswlog *buf, const uint8_t *bytes, size_t sizeof_bytes) { if (bytes == NULL) { return lswlogs(buf, NULL); /* appends error */ } size_t size = 0; const char *sep = ""; for (size_t byte = 0; byte < sizeof_bytes; byte++) { size += lswlogf(buf, "%s%02x", sep, bytes[byte]); /* * Roughly mimic DBG_dump(): use a space separator; * and after the 4th byte, a double space separator. * * This is so that values dumped by DBG_dump() and * lswlog_bytes() have the same 'look' - make * searching and grepping easier. */ sep = (byte % 4 == 3) ? " " : " "; } return size; }
size_t lswlog_retransmit_prefix(struct lswlog *buf, struct state *st) { return lswlogf(buf, "#%ld %s: retransmits: ", st->st_serialno, st->st_state->name); }
size_t lswlog_errno(struct lswlog *buf, int e) { return lswlogf(buf, " Errno %d: %s", e, strerror(e)); }
size_t lswlog_source_line(struct lswlog *buf, const char *func, const char *file, unsigned long line) { return lswlogf(buf, " (in %s() at %s:%lu)", func, file, line); }