Re: Can no longer receive short ASN1 messages

"'Sands, Daniel N.' via openssl-users" <[email protected]> Thu, 12 Mar 2026 18:56:56 +0000
Newsgroups gmane.comp.encryption.openssl.user
Message-ID <SA9PR09MB53090373295528C65E94BC3FDB44A@SA9PR09MB5309.namprd09.prod.outlook.com>
Okay, I just submitted a pull request referencing issue 22704.  Please kick it around and offer any critique.

> -----Original Message-----
> From: 'Tomas Mraz' via openssl-users <[email protected]>
> Sent: Thursday, March 12, 2026 4:17 AM
> To: Sands, Daniel N. <[email protected]>; [email protected]
> Subject: [EXTERNAL] Re: Can no longer receive short ASN1 messages
> 
> Yeah, I think you have it right. In the current code (where we read at least 8
> bytes) it does not matter much, but the condition should be `max < i`.
> 
> Tomas Mraz, OpenSSL Foundation
> 
> 
> On Thu, 2026-03-12 at 03:38 +0000, 'Sands, Daniel N.' via openssl-users
> wrote:
> > I'm looking into this to suggest a patch, but I also noticed what I
> > believe to be an off-by-one error in asn1_get_length.
> >
> > 131	        if (*p++ & 0x80) {
> > 132	            if (max < i + 1)
> > 133	                return 0;
> >
> > At this point, 'max' is the number of octets left in the buffer so
> > far.  'i' is the number of additional octets to gather into a length
> > word.  If we have read only enough octets to form a full header at
> > this point, 'max' will equal 'i'.  So I don't think it should be
> > comparing to 'i+1'.  Certainly, in my test change that only makes sure
> > it has read enough for a complete header, this test always fails for
> > multi-byte lengths.  Is there an error in my thinking here?
> >
> > > -----Original Message-----
> > > From: Tomas Mraz <[email protected]>
> > > Sent: Tuesday, March 10, 2026 3:48 AM
> > > To: Neil Horman <[email protected]>; Sands, Daniel N.
> > > <[email protected]>
> > > Cc: [email protected]
> > > Subject: Re: [EXTERNAL] Re: Can no longer receive short ASN1
> > > messages
> > >
> > > On Mon, 2026-03-09 at 20:28 -0400, Neil Horman wrote:
> > > > Ok, that did it, If I stream in data from a process that never
> > > > closes stdout, to stdin of the above program, I see the hang
> > > >
> > > > It appears (at least in this case, but I presume in the socket
> > > > case as well, since TCP generally uses blocking sockets), we get
> > > > stuck in the read syscall, waiting for more bytes that never
> > > > appear.
> > > >
> > > > Unsure what to do about it.  Possibly just reduce the HEADER_SIZE
> > > > to be two bytes, which is the minimal size IIRC for an ASN1 object
> > >
> > > No, that won't work (alone). We would have to examine the two bytes
> > > and read further if the header is not complete yet before calling
> > > ASN1_get_object().
> > >
> > > Tomas
> > >
> > > > On Mon, Mar 9, 2026 at 7:49 PM Sands, Daniel N.
> > > > <[email protected]>
> > > > wrote:
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > Small correction:  Use fwrite instead of fprintf since there’s
> > > > > an embedded NULL.
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > From: 'Sands, Daniel N.' via openssl-users
> > > > > <[email protected]>
> > > > > Sent: Monday, March 9, 2026 5:47 PM
> > > > > To: Neil Horman <[email protected]>
> > > > > Cc: [email protected]
> > > > > Subject: RE: [EXTERNAL] Re: Can no longer receive short ASN1
> > > > > messages
> > > > >
> > > > > Do you have a reproducer available?
> > > > >
> > > > > I tried this quickly with the following code (need to link it
> > > > > statically since I'm hacking into internal interfaces)
> > > > >
> > > > > The problem with your reproducer is that you are not reading a
> > > > > socket.  So when you hit end of file, you get a definite end of
> > > > > file condition.  The same works for my case:  When the sender is
> > > > > killed after sending the message, it shuts down the socket,
> > > > > which allows the receiver to go ahead and try to use what it
> > > > > got.  Let’s have it receive through stdin or something like
> > > > > that, and then run the program with a separate program that
> > > > > writes those bytes to stdout and then does not exit.  Pipe this
> > > > > into the receiver program.
> > > > >
> > > > > Sender:  Something like,
> > > > >
> > > > > #include <stdio.h>
> > > > >
> > > > > int main() {
> > > > >     fprintf(stdout, “\001\002\000\001”);
> > > > >     sleep(1000);
> > > > > }
> > > > >
> > > > > Receiver:
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > #include <stdlib.h>
> > > > > #include <stdio.h>
> > > > > #include <openssl/bio.h>
> > > > > #include <openssl/buffer.h>
> > > > > #include "internal/asn1.h"
> > > > >
> > > > >
> > > > >
> > > > > int main(int argc, char **argv)
> > > > > {
> > > > >     BIO *in = BIO_new_fd(stdin, 0);
> > > > >     BUF_MEM *membuf = NULL;
> > > > >
> > > > >     asn1_d2i_read_bio(in, &membuf); }
> > > > >
> > > > > Run as:  sender | receiver
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > On Mon, Mar 9, 2026 at 4:49 PM 'Sands, Daniel N.' via openssl-
> > > > > users <[email protected]> wrote:
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > As of 3.5.x, after an issue having something to do with
> > > > > > headers, I can no longer receive messages of less than 8
> > > > > > bytes.  As an example, if I only need to send a status code as
> > > > > > a response, I will send 1 tag byte, 1 length byte, and
> > > > > > possibly 1 byte indicating an integer status code.  Since this
> > > > > > is a TCP socket, I keep the socket open for further
> > > > > > communication.  The receiving side now insists on receiving at
> > > > > > least HEADER_SIZE bytes (8) before it will do anything, so now
> > > > > > both sides are at a stalemate—the receiver still waiting for
> > > > > > its message, and the sender waiting for further communication
> > > > > > from the sender.
> > > > > >
> > > > > > I saw in issue 21777 why this was done, but the strategy is
> > > > > > not working for short messages.  I suggest an alternate
> > > > > > strategy where you add a “need” variable, which is the very
> > > > > > least amount of bytes necessary to decode the next part, and
> > > > > > want will be some value higher than that.  If “want” bytes can
> > > > > > be read, awesome.
> > > > > > If it’s stalled between “want” and “need” then just go ahead
> > > > > > and process it.  If it’s less than “need”, then, and only
> > > > > > then, do you continue the loop.  Obviously, “need” would only
> > > > > > start at 2, since the smallest legal DER encoding is 2 bytes
> > > > > > (the NULL type).
> > > > > > It
> > > > > > would expand if the tag or length turn out to be multiple
> > > > > > bytes.
> > > > > >
> > > > > > Anyway, is there a workaround for this, other than reducing
> > > > > > HEADER_SIZE and recompiling, or attaching non-sequitur data
> > > > > > just to reach the 8-byte minimum?
> > > > > > --
> > > > > > You received this message because you are subscribed to the
> > > > > > Google Groups "openssl-users" group.
> > > > > > To unsubscribe from this group and stop receiving emails from
> > > > > > it, send an email toopenssl-users+unsubscribe-MCmKBN63+Bmbup2nOX2J7Q@public.gmane.org
> > > > > > To view this discussion visit
> > > > > > https://gcc02.safelinks.protection.outlook.com/?url=https%3A%2
> > > > > > F%2F
> > > > > > groups.google.com%2Fa%2Fopenssl.org%2Fd%2Fmsgid%2Fopenssl-
> > > users%2F
> > > > > >
> > >
> SA9PR09MB5309355179862CB0C56F6C35DB79A%2540SA9PR09MB5309.
> nampr
> > > d09.
> > > > > >
> > >
> prod.outlook.com&data=05%7C02%7Cdnsands%40sandia.gov%7Cc16ca75c
> 03d
> > > > > >
> > >
> 3496346dc08de7e8a1d52%7C7ccb5a20a303498cb0c129007381b574%7C
> 1%7C0
> > > %7
> > > > > >
> > >
> C639087328848814562%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcG
> kiOnR
> > > ydW
> > > > > > UsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjo
> > > > > > yfQ%3
> > > > > >
> > >
> D%3D%7C0%7C%7C%7C&sdata=P25Bgjl%2FWW%2Fb5LTa%2Bd9yrPNQ6AC
> %2F
> > > 2Tg%2F
> > > > > > 6MfgKek7HVU%3D&reserved=0
> > > > > > .
> > >
> > > --
> > > Tomáš Mráz, Chief Technology Officer, OpenSSL Foundation Join the
> > > Code Protectors or support us on Github Sponsors
> > > https://gcc02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fop
> > >
> enssl%2F&data=05%7C02%7Cdnsands%40sandia.gov%7C35f6f425b425465
> ef1b80
> > >
> 8de80208c0c%7C7ccb5a20a303498cb0c129007381b574%7C1%7C0%7C63
> 908907445
> > >
> 1441685%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYi
> OiIwLjAu
> > >
> MDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C
> %7C%7
> > >
> C&sdata=bPbzXbSEWWSgYgX%2BXYBSCN5wsor2MQFBaQwKS7hrNfE%3D&r
> eserved=0
> > > -
> > >
> foundation.org%2Fdonate%2F&data=05%7C02%7Cdnsands%40sandia.gov%
> 7Cc1
> > >
> 6ca75c03d3496346dc08de7e8a1d52%7C7ccb5a20a303498cb0c12900738
> 1b574
> > >
> %7C1%7C0%7C639087328848838859%7CUnknown%7CTWFpbGZsb3d8ey
> JFbXB
> > >
> 0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFp
> bC
> > > Is
> > >
> IldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=3KIVU5bgk6rsaB8ZpGKFShtsd
> KpjW
> > > mOkSmpO3kjnFws%3D&reserved=0
> 
> --
> Tomáš Mráz, Chief Technology Officer, OpenSSL Foundation We need your
> support! Help us protect digital privacy… everywhere.
> https://gcc02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fopen
> ssl.foundation%2Fdonate%2Fways-to-
> give&data=05%7C02%7Cdnsands%40sandia.gov%7C35f6f425b425465ef1b
> 808de80208c0c%7C7ccb5a20a303498cb0c129007381b574%7C1%7C0%7C
> 639089074451463248%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGk
> iOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIj
> oyfQ%3D%3D%7C0%7C%7C%7C&sdata=VqwfnPxgymoCiS%2FvnWV7fLvnq
> dT9EizIPslB5L2MmQk%3D&reserved=0
> 
> --
> You received this message because you are subscribed to the Google Groups
> "openssl-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to openssl-users+unsubscribe-MCmKBN63+Bmbup2nOX2J7Q@public.gmane.org
> To view this discussion visit
> https://gcc02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgroup
> s.google.com%2Fa%2Fopenssl.org%2Fd%2Fmsgid%2Fopenssl-
> users%2F757ff5c2184c34b04d1c1bc6227b3b4b66382cb0.camel%2540ope
> nssl.foundation&data=05%7C02%7Cdnsands%40sandia.gov%7C35f6f425b4
> 25465ef1b808de80208c0c%7C7ccb5a20a303498cb0c129007381b574%7C
> 1%7C0%7C639089074451480506%7CUnknown%7CTWFpbGZsb3d8eyJFbX
> B0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWF
> pbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=Q7asFFY6EvRMM6Jowv
> EnCM128SvuuVBo0UKOWoO7bu4%3D&reserved=0.

-- 
You received this message because you are subscribed to the Google Groups "openssl-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to openssl-users+unsubscribe-MCmKBN63+Bmbup2nOX2J7Q@public.gmane.org
To view this discussion visit https://groups.google.com/a/openssl.org/d/msgid/openssl-users/SA9PR09MB53090373295528C65E94BC3FDB44A%40SA9PR09MB5309.namprd09.prod.outlook.com.