<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic What is SECO API? in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/What-is-SECO-API/m-p/1481602#M192005</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I'm currently developing a secure boot solution for one of our customers using i.MX8DXL&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;why the SECO API (sc_seco_authenticate() api) inside the authenticate_os_container() api from the NXP Guide is called 3 times?&lt;/P&gt;&lt;P&gt;authenticate_os_container api code:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;int authenticate_os_container(ulong addr)&lt;/SPAN&gt;
&lt;SPAN class=""&gt;{&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	struct container_hdr *phdr;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	int i, ret = 0;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	int err;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	sc_rm_mr_t mr;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	sc_faddr_t start, end;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	u16 length;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	struct boot_img_t *img;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	unsigned long s, e;&lt;/SPAN&gt;

&lt;SPAN class=""&gt;	if (addr % 4) {&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		puts("Error: Image's address is not 4 byte aligned\n");&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		return -EINVAL;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	}&lt;/SPAN&gt;
              .....&lt;BR /&gt;              .....&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;	err = &lt;EM&gt;&lt;U&gt;&lt;STRONG&gt;sc_seco_authenticate&lt;/STRONG&gt;&lt;/U&gt;&lt;/EM&gt;(-1, SC_SECO_AUTH_CONTAINER,&lt;/SPAN&gt;
&lt;SPAN class=""&gt;				   SECO_LOCAL_SEC_SEC_SECURE_RAM_BASE);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;	for (i = 0; i &amp;lt; phdr-&amp;gt;num_images; i++) {&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		img = (struct boot_img_t *)(addr +&lt;/SPAN&gt;
&lt;SPAN class=""&gt;					    sizeof(struct container_hdr) +&lt;/SPAN&gt;
&lt;SPAN class=""&gt;					    i * sizeof(struct boot_img_t));&lt;/SPAN&gt;

&lt;SPAN class=""&gt;		debug("img %d, dst 0x%x, src 0x%x, size 0x%x\n",&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		      i, (uint32_t) img-&amp;gt;dst, img-&amp;gt;offset + addr, img-&amp;gt;size);&lt;/SPAN&gt;

&lt;SPAN class=""&gt;		memcpy((void *)img-&amp;gt;dst, (const void *)(img-&amp;gt;offset + addr),&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		       img-&amp;gt;size);&lt;BR /&gt;&lt;/SPAN&gt;                   ......&lt;BR /&gt;                   .....&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;err = &lt;EM&gt;&lt;U&gt;&lt;STRONG&gt;sc_seco_authenticate&lt;/STRONG&gt;&lt;/U&gt;&lt;/EM&gt;(-1, SC_SECO_VERIFY_IMAGE,&lt;/SPAN&gt;
&lt;SPAN class=""&gt;					   (1 &amp;lt;&amp;lt; i));&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		if (err) {&lt;/SPAN&gt;
&lt;SPAN class=""&gt;			printf("Authenticate img %d failed, return %d\n",&lt;/SPAN&gt;
&lt;SPAN class=""&gt;			       i, err);&lt;/SPAN&gt;
&lt;SPAN class=""&gt;			ret = -EIO;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;exit:&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	if (&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;sc_seco_authenticate&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;(-1, SC_SECO_REL_CONTAINER, 0) != SC_ERR_NONE)&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		printf("Error: release container failed!\n");&lt;/SPAN&gt;

&lt;SPAN class=""&gt;	return ret;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What do the sc_seco_authenticate apis called 3 times authenticate the signed image?&lt;BR /&gt;(At each step, which part of the signed image is authenticated?)&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;sc_seco_authenticate(ipc,&amp;nbsp;&lt;STRONG&gt;&lt;SPAN class=""&gt;SC_SECO_AUTH_CONTAINER&lt;/SPAN&gt; &lt;/STRONG&gt;) : Authenticate whether an image is a container or not?&lt;/LI&gt;&lt;LI&gt;sc_seco_authenticate(ipc, &lt;STRONG&gt;&lt;SPAN class=""&gt;SC_SECO_VERIFY_IMAGE&lt;/SPAN&gt;&lt;/STRONG&gt;) : Hash value authentication of container internal image?&lt;/LI&gt;&lt;LI&gt;sc_seco_authenticate(ipc, &lt;STRONG&gt;&lt;SPAN class=""&gt;SC_SECO_REL_CONTAINER&lt;/SPAN&gt;&lt;/STRONG&gt;) : ?&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Regards,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Duncan&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 30 Jun 2022 00:42:21 GMT</pubDate>
    <dc:creator>minsiklee</dc:creator>
    <dc:date>2022-06-30T00:42:21Z</dc:date>
    <item>
      <title>What is SECO API?</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/What-is-SECO-API/m-p/1481602#M192005</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I'm currently developing a secure boot solution for one of our customers using i.MX8DXL&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;why the SECO API (sc_seco_authenticate() api) inside the authenticate_os_container() api from the NXP Guide is called 3 times?&lt;/P&gt;&lt;P&gt;authenticate_os_container api code:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;int authenticate_os_container(ulong addr)&lt;/SPAN&gt;
&lt;SPAN class=""&gt;{&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	struct container_hdr *phdr;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	int i, ret = 0;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	int err;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	sc_rm_mr_t mr;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	sc_faddr_t start, end;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	u16 length;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	struct boot_img_t *img;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	unsigned long s, e;&lt;/SPAN&gt;

&lt;SPAN class=""&gt;	if (addr % 4) {&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		puts("Error: Image's address is not 4 byte aligned\n");&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		return -EINVAL;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	}&lt;/SPAN&gt;
              .....&lt;BR /&gt;              .....&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;	err = &lt;EM&gt;&lt;U&gt;&lt;STRONG&gt;sc_seco_authenticate&lt;/STRONG&gt;&lt;/U&gt;&lt;/EM&gt;(-1, SC_SECO_AUTH_CONTAINER,&lt;/SPAN&gt;
&lt;SPAN class=""&gt;				   SECO_LOCAL_SEC_SEC_SECURE_RAM_BASE);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;	for (i = 0; i &amp;lt; phdr-&amp;gt;num_images; i++) {&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		img = (struct boot_img_t *)(addr +&lt;/SPAN&gt;
&lt;SPAN class=""&gt;					    sizeof(struct container_hdr) +&lt;/SPAN&gt;
&lt;SPAN class=""&gt;					    i * sizeof(struct boot_img_t));&lt;/SPAN&gt;

&lt;SPAN class=""&gt;		debug("img %d, dst 0x%x, src 0x%x, size 0x%x\n",&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		      i, (uint32_t) img-&amp;gt;dst, img-&amp;gt;offset + addr, img-&amp;gt;size);&lt;/SPAN&gt;

&lt;SPAN class=""&gt;		memcpy((void *)img-&amp;gt;dst, (const void *)(img-&amp;gt;offset + addr),&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		       img-&amp;gt;size);&lt;BR /&gt;&lt;/SPAN&gt;                   ......&lt;BR /&gt;                   .....&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;err = &lt;EM&gt;&lt;U&gt;&lt;STRONG&gt;sc_seco_authenticate&lt;/STRONG&gt;&lt;/U&gt;&lt;/EM&gt;(-1, SC_SECO_VERIFY_IMAGE,&lt;/SPAN&gt;
&lt;SPAN class=""&gt;					   (1 &amp;lt;&amp;lt; i));&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		if (err) {&lt;/SPAN&gt;
&lt;SPAN class=""&gt;			printf("Authenticate img %d failed, return %d\n",&lt;/SPAN&gt;
&lt;SPAN class=""&gt;			       i, err);&lt;/SPAN&gt;
&lt;SPAN class=""&gt;			ret = -EIO;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;exit:&lt;/SPAN&gt;
&lt;SPAN class=""&gt;	if (&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;sc_seco_authenticate&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;(-1, SC_SECO_REL_CONTAINER, 0) != SC_ERR_NONE)&lt;/SPAN&gt;
&lt;SPAN class=""&gt;		printf("Error: release container failed!\n");&lt;/SPAN&gt;

&lt;SPAN class=""&gt;	return ret;&lt;/SPAN&gt;
&lt;SPAN class=""&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What do the sc_seco_authenticate apis called 3 times authenticate the signed image?&lt;BR /&gt;(At each step, which part of the signed image is authenticated?)&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;sc_seco_authenticate(ipc,&amp;nbsp;&lt;STRONG&gt;&lt;SPAN class=""&gt;SC_SECO_AUTH_CONTAINER&lt;/SPAN&gt; &lt;/STRONG&gt;) : Authenticate whether an image is a container or not?&lt;/LI&gt;&lt;LI&gt;sc_seco_authenticate(ipc, &lt;STRONG&gt;&lt;SPAN class=""&gt;SC_SECO_VERIFY_IMAGE&lt;/SPAN&gt;&lt;/STRONG&gt;) : Hash value authentication of container internal image?&lt;/LI&gt;&lt;LI&gt;sc_seco_authenticate(ipc, &lt;STRONG&gt;&lt;SPAN class=""&gt;SC_SECO_REL_CONTAINER&lt;/SPAN&gt;&lt;/STRONG&gt;) : ?&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Regards,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Duncan&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Jun 2022 00:42:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/What-is-SECO-API/m-p/1481602#M192005</guid>
      <dc:creator>minsiklee</dc:creator>
      <dc:date>2022-06-30T00:42:21Z</dc:date>
    </item>
  </channel>
</rss>

