On Thu, Jan 27, 2022 at 07:46:32AM +0100, Theo Buehler wrote:
> On Wed, Jan 26, 2022 at 04:42:04PM +0100, Claudio Jeker wrote:
> > So the RFC is not very clear but in general the idea is that if multiple
> > MFTs are available the newest one (highest manifest number) should be
> > used.
> > 
> > In our case there are two possible MFTs available the previously valid on
> > and the now downloaded one. So adjust the parser code so that both files
> > are opened and parsed and the x509 is verified. Checks like the
> > thisUpdate/nextUpdate validity and FileAndHash sequence are postponed.
> > Compare these two mfts and decide which one should be used.
> > Now check everything that was postponed.
> > 
> > When checking the hash of files in the MFT check both locations and
> > remember which file was the actual match. It is important that later on
> > the same file is opened.
> > 
> > The error checking around MFTs had to be adjusted in some places since it
> > turned out to be too noisy on stale caches.
> > 
> > Please test and report unexpected behaviour.
> 
> This seems to work fine here. I have read the diff and it looks good,
> but have not reviewed it thoroughly. Do you consider it ready for that?

I have parts I'm not super happy with but have no better idea yet.
Mainly the changes to parse_entity() make that function even more complex
and error prone. proc_parser_mft_check() is the other function where I'm
not sure. So happy for any feedback to improve those bits.
 
> One thing that stood out in mft_compare():
> 
> > +int
> > +mft_compare(const struct mft *a, const struct mft *b)
> > +{
> > +   BIGNUM *abn = NULL, *bbn = NULL;
> > +   int r;
> > +
> > +   if (b == NULL)
> > +           return 1;
> > +   if (a == NULL)
> > +           return 0;
> > +
> > +   BN_hex2bn(&abn, a->seqnum);
> > +   BN_hex2bn(&bbn, b->seqnum);
> 
> These need error checking.
> 
> Is it necessary to convert these back into BIGNUMs? Can't we compare
> first the string length and if it's equal do a strcmp?

I think it is possible but I was not sure if it is always correct so I
bailed on that plan and used BN_cmp().
I have to look at how OpenSSL does the BN_bn2hex() conversion. I noticed
that the numbers seen are mostly 2 or 4 bytes long with leding 0.

I agree that this comparision should be easier. Another option would be to
not convert seqnum and keep it as BIGNUM but I'm not a fan of that.
Especially inside struct mft.
 
> > +   r = BN_cmp(abn, bbn);
> > +   BN_free(abn);
> > +   BN_free(bbn);
> > +
> > +   if (r < 0)
> > +           return 0;
> > +
> > +   /*
> > +    * Equal sequence numbers should not happen for different content.
> > +    * In this case we prefer the newer MFT.
> > +    */
> > +   return 1;
> >  }
> 

-- 
:wq Claudio

Reply via email to