an oldie but a goodie .. ISO C90 does not support 'long long'
Tomas Mraz
tomas at openssl.org
Fri Nov 11 15:13:08 UTC 2022
On Fri, 2022-11-11 at 16:01 +0100, Jakob Bohm via openssl-users wrote:
> On 2022-11-06 23:14, raf via openssl-users wrote:
> > On Sat, Nov 05, 2022 at 02:22:55PM +0000, Michael Wojcik
> > <Michael.Wojcikatmicrofocus.com> wrote:
> >
> > > > From: openssl-users <openssl-users-bounces at openssl.org> On
> > > > Behalf Of raf via
> > > > openssl-users
> > > > Sent: Friday, 4 November, 2022 18:54
> > > >
> > > > On Wed, Nov 02, 2022 at 06:29:45PM +0000, Michael Wojcik via
> > > > openssl-users
> > > > <openssl-users at openssl.org> wrote:
> > > >
> > > > > I'm inclined to agree. While there's an argument for backward
> > > > > compatibility,
> > > > > C99 was standardized nearly a quarter of a century ago.
> > > > > OpenSSL 1.x is
> > > > > younger than C99. It doesn't seem like an unreasonable
> > > > > requirement.
> > > > Would this be a choice between backwards-compatibility with C90
> > > > compilers and compatibility with 32-bit architectures?
> > > I don't see how.
> > >
> > > It's a question of the C implementation, not the underlying
> > > architecture. A C implementation for a 32-bit system can
> > > certainly
> > > provide a 64-bit integer type. If that C implementation conforms
> > > to
> > > C99 or later, it ought to do so using long long and unsigned long
> > > long. (I'm excluding C implementations for exotic systems where,
> > > for
> > > example, CHAR_BIT != 8, such as some DSPs; those aren't going to
> > > be
> > > viable targets for OpenSSL anyway.)
> > >
> > > > Is there another way to get 64-bit integers on 32-bit systems?
> > > Sure. There's a standard one, which is to include <stdint.h> and
> > > use int64_t and uint64_t. That also requires C99 or later and an
> > > implementation which provides those types; they're not required.
> > Sorry. I assumed that it was clear from context that I was only
> > thinking about C90-compliant 64-bit integers on 32-bit systems.
> >
> > > And for some implementations there are implementation-specific
> > > extensions, which by definition are not standard.
> > >
> > > And you can roll your own. In a non-OO language like C, this
> > > would
> > > be intrusive for the parts of the source base that rely on a 64-
> > > bit
> > > integer type.
> > >
> > > > I suspect that that there are more 32-bit systems than there
> > > > are
> > > > C90 compilers.
> > > Perhaps, but I don't think it's relevant here. In any case,
> > > OpenSSL is
> > > not in the business of supporting every platform and C
> > > implementation
> > > in existence. There are the platforms supported by the project,
> > > and
> > > there are contributed platforms which are included in the code
> > > base
> > > and supported by the community (hopefully), and there are
> > > unsupported
> > > platforms.
> > >
> > > If someone wants OpenSSL on an unsupported platform, then it's up
> > > to
> > > them to do the work.
> > So it sounds like C90 is now officially unsupported.
> > I got the impression that, before this thread, it was believed
> > that C90 was supported, and the suggestion of a pull request
> > indicated a willingness to retain/return support for C90.
> > Perhaps it just indicated a willingness to accept community
> > support for it.
> >
> > I'd be amazed if anyone could actually still be using a
> > 30 year old C90 compiler, rather than a compiler that
> > just gives warnings about C90. :-)
> >
> Regarding C90 compilers, it is important to realize that some system
> vendors kept providing (arbitrarily extended) C90 compiler long after
> 1999. Microsoft is one example, with many of their system compilers
> for "older" OS versions being based on Microsoft's C90 compilers.
> These compilers did not provide a good stdint.h, but might be
> coached
> to load a porter provided stdint.h that maps int64_t and uint64_t to
> their vendor specific C90 extensions (named __int64 and unsigned
> __int64).
>
> Even worse, I seem to recall at least one of those compilers
> miscompiling
> 64 bit integer arithmetic, but working acceptably with the older
> OpenSSL
> 1.0.x library implementations of stuff like bignums (BN) and various
> pure
> C algorithm implementations in OpenSSL 1.0.x, that happened to do
> everything
> by means of 32 and 16 bit types.
>
> As part of our company business is to provide software for the
> affected
> "older" systems, thus desiring the ability to compile OpenSSL 3.x
> with
> options indicating "compiler has no good integral types larger than
> uint32_t, floating point is also problematic"
>
> Other major vendors with somewhat old C compilers include a few
> embedded
> platforms such as older ARM and MIPS chips that were mass produced in
> vast quantities.
>
> Performance wise, using a newer compiler that implements int64_t etc.
> via
> frequent library calls, while technically correct, is going to run
> unnecessarily slow compared to having algorithms that actually use
> the
> optimal integral sizes for the hardware/compiler combination.
>
> I seem to recall using at least one bignum library (not sure if
> OpenSSL
> or not) that could be configured to use uint32_t and uint16_t using
> the
> same C code that combines uint64_t and uint32_t on newer hardware.
That ship has sailed long long time ago. And it is NOT about the BIGNUM
type implementation which definitely supports native 32bit BN_WORD.
Although it might be possible to avoid using 'long long' or 'unsigned
long long' with some patching, the int64_t/uint64_t support is
absolutely required in other parts of OpenSSL than BIGNUM library and I
do not see any reasonable way to avoid it at all.
Yeah current OpenSSL library is definitely not a crypto library that
targets constrained 32 bit platforms that do not support 64 bit
integers.
--
Tomáš Mráz, OpenSSL
More information about the openssl-users
mailing list