/** * Parse OCSP response status * * @v ocsp OCSP check * @v raw ASN.1 cursor * @ret rc Return status code */ static int ocsp_parse_response_status ( struct ocsp_check *ocsp, const struct asn1_cursor *raw ) { struct asn1_cursor cursor; uint8_t status; int rc; /* Enter responseStatus */ memcpy ( &cursor, raw, sizeof ( cursor ) ); if ( ( rc = asn1_enter ( &cursor, ASN1_ENUMERATED ) ) != 0 ) { DBGC ( ocsp, "OCSP %p \"%s\" could not locate responseStatus: " "%s\n", ocsp, x509_name ( ocsp->cert ), strerror ( rc )); return rc; } /* Extract response status */ if ( cursor.len != sizeof ( status ) ) { DBGC ( ocsp, "OCSP %p \"%s\" invalid status:\n", ocsp, x509_name ( ocsp->cert ) ); DBGC_HDA ( ocsp, 0, cursor.data, cursor.len ); return -EINVAL; } memcpy ( &status, cursor.data, sizeof ( status ) ); /* Check response status */ if ( status != OCSP_STATUS_SUCCESSFUL ) { DBGC ( ocsp, "OCSP %p \"%s\" response status %d\n", ocsp, x509_name ( ocsp->cert ), status ); return EPROTO_STATUS ( status ); } return 0; }
/** * Get DHCPv6 status code * * @v options DHCPv6 option list * @ret rc Return status code */ static int dhcpv6_status_code ( struct dhcpv6_option_list *options ) { const union dhcpv6_any_option *option; const struct dhcpv6_status_code_option *status_code; unsigned int status; /* Find status code option, if present */ option = dhcpv6_option ( options, DHCPV6_STATUS_CODE ); if ( ! option ) { /* Omitted status code should be treated as "success" */ return 0; } status_code = &option->status_code; /* Sanity check */ if ( ntohs ( status_code->header.len ) < ( sizeof ( *status_code ) - sizeof ( status_code->header ) ) ) { return -EINVAL; } /* Calculate iPXE error code from DHCPv6 status code */ status = ntohs ( status_code->status ); return ( status ? -EPROTO_STATUS ( status ) : 0 ); }