Lines Matching +full:tlv +full:- +full:layout
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2017-2018 Solarflare Communications Inc.
47 /* DER encodings for ASN.1 tags (see ITU-T X.690) */
68 /* Parse header of DER encoded ASN.1 TLV and match tag */
76 if (cursor == NULL || cursor->buffer == NULL || cursor->length < 2) { in efx_asn1_parse_header_match_tag()
81 cursor->tag = cursor->buffer[0]; in efx_asn1_parse_header_match_tag()
82 if (cursor->tag != tag) { in efx_asn1_parse_header_match_tag()
88 if ((cursor->tag & 0x1F) == 0x1F) { in efx_asn1_parse_header_match_tag()
94 if ((cursor->buffer[1] & 0x80) == 0) { in efx_asn1_parse_header_match_tag()
96 cursor->hdr_size = 2; in efx_asn1_parse_header_match_tag()
97 cursor->val_size = cursor->buffer[1]; in efx_asn1_parse_header_match_tag()
100 uint32_t nbytes = cursor->buffer[1] & 0x7F; in efx_asn1_parse_header_match_tag()
108 if (2 + nbytes > cursor->length) { in efx_asn1_parse_header_match_tag()
118 cursor->hdr_size = 2 + nbytes; in efx_asn1_parse_header_match_tag()
119 cursor->val_size = 0; in efx_asn1_parse_header_match_tag()
120 for (offset = 2; offset < cursor->hdr_size; offset++) { in efx_asn1_parse_header_match_tag()
121 cursor->val_size = in efx_asn1_parse_header_match_tag()
122 (cursor->val_size << 8) | cursor->buffer[offset]; in efx_asn1_parse_header_match_tag()
126 if ((cursor->hdr_size + cursor->val_size) > cursor->length) { in efx_asn1_parse_header_match_tag()
152 /* Enter nested ASN.1 TLV (contained in value of current TLV) */
172 /* Invalid TLV or wrong tag */ in efx_asn1_enter_tag()
176 /* Limit cursor range to nested TLV */ in efx_asn1_enter_tag()
177 cursor->buffer += cursor->hdr_size; in efx_asn1_enter_tag()
178 cursor->length = cursor->val_size; in efx_asn1_enter_tag()
193 * Check that the current ASN.1 TLV matches the given tag and value.
194 * Advance cursor to next TLV on a successful match.
211 /* Invalid TLV or wrong tag */ in efx_asn1_match_tag_value()
214 if (cursor->val_size != val_size) { in efx_asn1_match_tag_value()
219 if (memcmp(cursor->buffer + cursor->hdr_size, valp, val_size) != 0) { in efx_asn1_match_tag_value()
224 cursor->buffer += cursor->hdr_size + cursor->val_size; in efx_asn1_match_tag_value()
225 cursor->length -= cursor->hdr_size + cursor->val_size; in efx_asn1_match_tag_value()
241 /* Advance cursor to next TLV */
256 /* Invalid TLV or wrong tag */ in efx_asn1_skip_tag()
259 cursor->buffer += cursor->hdr_size + cursor->val_size; in efx_asn1_skip_tag()
260 cursor->length -= cursor->hdr_size + cursor->val_size; in efx_asn1_skip_tag()
272 /* Return pointer to value octets and value size from current TLV */
289 /* Invalid TLV or wrong tag */ in efx_asn1_get_tag_value()
292 *valp = cursor->buffer + cursor->hdr_size; in efx_asn1_get_tag_value()
293 *val_sizep = cursor->val_size; in efx_asn1_get_tag_value()
396 * image trailer CRC (same as unsigned image layout). in efx_check_signed_image_header()
418 *content_offsetp = (uint32_t)(valp - (uint8_t *)bufferp); in efx_check_signed_image_header()
470 sizeof (header->eih_size))) { in efx_check_unsigned_image()
476 if (header->eih_magic != EFX_IMAGE_HEADER_MAGIC) { in efx_check_unsigned_image()
485 if (header->eih_version < EFX_IMAGE_HEADER_VERSION) { in efx_check_unsigned_image()
491 if (buffer_size < (header->eih_size + header->eih_code_size + in efx_check_unsigned_image()
499 header->eih_size + header->eih_code_size); in efx_check_unsigned_image()
502 (header->eih_size + header->eih_code_size)); in efx_check_unsigned_image()
504 if (trailer->eit_crc != crc) { in efx_check_unsigned_image()
573 /* Check unsigned image layout (image header, code, image trailer) */ in efx_check_reflash_image()
579 infop->eii_format = format; in efx_check_reflash_image()
580 infop->eii_imagep = bufferp; in efx_check_reflash_image()
581 infop->eii_image_size = buffer_size; in efx_check_reflash_image()
582 infop->eii_headerp = (efx_image_header_t *)imagep; in efx_check_reflash_image()
592 infop->eii_format = EFX_IMAGE_FORMAT_INVALID; in efx_check_reflash_image()
593 infop->eii_imagep = NULL; in efx_check_reflash_image()
594 infop->eii_image_size = 0; in efx_check_reflash_image()
626 if ((infop->eii_format != EFX_IMAGE_FORMAT_SIGNED) || in efx_build_signed_image_write_buffer()
627 (infop->eii_imagep == NULL) || in efx_build_signed_image_write_buffer()
628 (infop->eii_headerp == NULL) || in efx_build_signed_image_write_buffer()
629 ((uint8_t *)infop->eii_headerp < (uint8_t *)infop->eii_imagep) || in efx_build_signed_image_write_buffer()
630 (infop->eii_image_size < EFX_IMAGE_HEADER_SIZE) || in efx_build_signed_image_write_buffer()
631 ((size_t)((uint8_t *)infop->eii_headerp - infop->eii_imagep) > in efx_build_signed_image_write_buffer()
632 (infop->eii_image_size - EFX_IMAGE_HEADER_SIZE))) { in efx_build_signed_image_write_buffer()
641 (uint32_t)((uint8_t *)infop->eii_headerp - infop->eii_imagep); in efx_build_signed_image_write_buffer()
643 (cms_header.offset > (buffer_size - cms_header.size))) { in efx_build_signed_image_write_buffer()
649 image_header.size = infop->eii_headerp->eih_size; in efx_build_signed_image_write_buffer()
651 (image_header.offset > (buffer_size - image_header.size))) { in efx_build_signed_image_write_buffer()
657 code.size = infop->eii_headerp->eih_code_size; in efx_build_signed_image_write_buffer()
659 (code.offset > (buffer_size - code.size))) { in efx_build_signed_image_write_buffer()
667 (image_trailer.offset > (buffer_size - image_trailer.size))) { in efx_build_signed_image_write_buffer()
673 signature.size = (uint32_t)(infop->eii_image_size - signature.offset); in efx_build_signed_image_write_buffer()
675 (signature.offset > (buffer_size - signature.size))) { in efx_build_signed_image_write_buffer()
680 EFSYS_ASSERT3U(infop->eii_image_size, ==, cms_header.size + in efx_build_signed_image_write_buffer()
690 * +-----------------+ +-----------------+ in efx_build_signed_image_write_buffer()
691 * | CMS header | | mcfw.update |<----+ in efx_build_signed_image_write_buffer()
692 * +-----------------+ | | | in efx_build_signed_image_write_buffer()
693 * | reflash header | +-----------------+ | in efx_build_signed_image_write_buffer()
694 * +-----------------+ | chunk header: |-->--|-+ in efx_build_signed_image_write_buffer()
696 * | | +-----------------+ | | in efx_build_signed_image_write_buffer()
697 * +-----------------+ +-->| CMS header | | | in efx_build_signed_image_write_buffer()
698 * | reflash trailer | | +-----------------+ | | in efx_build_signed_image_write_buffer()
699 * +-----------------+ | | chunk header: |->-+ | | in efx_build_signed_image_write_buffer()
701 * +-----------------+ | +-----------------+ | | | in efx_build_signed_image_write_buffer()
702 * | | reflash header |<--+ | | in efx_build_signed_image_write_buffer()
703 * | +-----------------+ | | in efx_build_signed_image_write_buffer()
704 * | | chunk header: |-->--+ | in efx_build_signed_image_write_buffer()
706 * | +-----------------+ | in efx_build_signed_image_write_buffer()
707 * | | reflash trailer |<------+ in efx_build_signed_image_write_buffer()
708 * | +-----------------+ in efx_build_signed_image_write_buffer()
710 * | | SIGNATURE |->-+ in efx_build_signed_image_write_buffer()
711 * | +-----------------+ | in efx_build_signed_image_write_buffer()
712 * | | signature |<--+ in efx_build_signed_image_write_buffer()
713 * | +-----------------+ in efx_build_signed_image_write_buffer()
715 * | +-----------------+ in efx_build_signed_image_write_buffer()
716 * +-<-| chunk header: | in efx_build_signed_image_write_buffer()
717 * >-->| CMS_HEADER | in efx_build_signed_image_write_buffer()
718 * +-----------------+ in efx_build_signed_image_write_buffer()
729 * results in the layout used for the data chunks and chunk headers. in efx_build_signed_image_write_buffer()
744 hdr_offset = buffer_size - SIGNED_IMAGE_CHUNK_HDR_LEN; in efx_build_signed_image_write_buffer()
755 (chunk_hdr.offset > (buffer_size - chunk_hdr.len))) { in efx_build_signed_image_write_buffer()
760 infop->eii_imagep + cms_header.offset, in efx_build_signed_image_write_buffer()
767 if (hdr_offset > (buffer_size - SIGNED_IMAGE_CHUNK_HDR_LEN)) { in efx_build_signed_image_write_buffer()
780 (chunk_hdr.offset > (buffer_size - chunk_hdr.len))) { in efx_build_signed_image_write_buffer()
785 infop->eii_imagep + image_header.offset, in efx_build_signed_image_write_buffer()
794 if (hdr_offset > (buffer_size - SIGNED_IMAGE_CHUNK_HDR_LEN)) { in efx_build_signed_image_write_buffer()
807 (chunk_hdr.offset > (buffer_size - chunk_hdr.len))) { in efx_build_signed_image_write_buffer()
812 infop->eii_imagep + code.offset, in efx_build_signed_image_write_buffer()
825 if (hdr_offset > (buffer_size - SIGNED_IMAGE_CHUNK_HDR_LEN)) { in efx_build_signed_image_write_buffer()
833 (chunk_hdr.offset > (buffer_size - chunk_hdr.len))) { in efx_build_signed_image_write_buffer()
838 infop->eii_imagep + image_trailer.offset, in efx_build_signed_image_write_buffer()
845 if (hdr_offset > (buffer_size - SIGNED_IMAGE_CHUNK_HDR_LEN)) { in efx_build_signed_image_write_buffer()
858 (chunk_hdr.offset > (buffer_size - chunk_hdr.len))) { in efx_build_signed_image_write_buffer()
863 infop->eii_imagep + signature.offset, in efx_build_signed_image_write_buffer()