BN_BN2BIN(3SSL)
πΈ NAME πΈ
okay so bestie, welcome to BN_BN2BIN(3SSL) β it's the OpenSSL page that's literally all about format conversions. like, numbers to bytes, bytes to numbers, hex, decimal, MPI, the whole glow-up pipeline. π
the squad of functions here is:
BN_bn2binpad, BN_signed_bn2bin, BN_bn2bin, BN_bin2bn, BN_signed_bin2bn, BN_bn2lebinpad, BN_signed_bn2lebin, BN_lebin2bn, BN_signed_lebin2bn, BN_bn2nativepad, BN_signed_bn2native, BN_native2bn, BN_signed_native2bn, BN_bn2hex, BN_bn2dec, BN_hex2bn, BN_dec2bn, BN_print, BN_print_fp, BN_bn2mpi, BN_mpi2bn
and their whole deal? format conversions. that's it, that's the vibe. β¨
π¦ SYNOPSIS π¦
#include <openssl/bn.h>
int BN_bn2bin(const BIGNUM *a, unsigned char *to);
int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen);
int BN_signed_bn2bin(const BIGNUM *a, unsigned char *to, int tolen);
BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret);
BIGNUM *BN_signed_bin2bn(const unsigned char *s, int len, BIGNUM *ret);
int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen);
int BN_signed_bn2lebin(const BIGNUM *a, unsigned char *to, int tolen);
BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret);
BIGNUM *BN_signed_lebin2bn(const unsigned char *s, int len, BIGNUM *ret);
int BN_bn2nativepad(const BIGNUM *a, unsigned char *to, int tolen);
int BN_signed_bn2native(const BIGNUM *a, unsigned char *to, int tolen);
BIGNUM *BN_native2bn(const unsigned char *s, int len, BIGNUM *ret);
BIGNUM *BN_signed_native2bn(const unsigned char *s, int len, BIGNUM *ret);
char *BN_bn2hex(const BIGNUM *a);
char *BN_bn2dec(const BIGNUM *a);
int BN_hex2bn(BIGNUM **a, const char *str);
int BN_dec2bn(BIGNUM **a, const char *str);
int BN_print(BIO *fp, const BIGNUM *a);
int BN_print_fp(FILE *fp, const BIGNUM *a);
int BN_bn2mpi(const BIGNUM *a, unsigned char *to);
BIGNUM *BN_mpi2bn(unsigned char *s, int len, BIGNUM *ret);
π DESCRIPTION π
π big-endian byte stuff
BN_bn2bin()β takes the absolute value ofa, glows it up into big-endian form, and drops it atto.toneeds to point atBN_num_bytes(a)bytes of memory, no shortcuts. and listen:aandtoMUST NOT be NULL. like at all. π«BN_bn2binpad()β same cute big-endian absolute-value energy, also written toto.tolenis the length of the output bufferto. it pads with zeros if it needs to. but iftolenis less thanBN_num_bytes(a)? error, bestie, sorry. πBN_signed_bn2bin()β converts the value ofa(not just abs, we're doing signs now) into big-endian signed 2's complement form, stored atto.tolen= length of the output bufferto. if needed it signs-extends: padded with0x00for positive numbers, or0xfffor negative numbers. and iftolenis smaller than the necessary size (which may be<BN_num_bytes(a) + 1>), you get an error. π
π bytes β BIGNUM
BN_bin2bn()β takes the positive integer in big-endian form, lengthlen, sitting ats, and turns it into aBIGNUM, placing it inret. ifretisNULL, a brand-newBIGNUMgets born β¨. andsMUST NOT be NULL.BN_signed_bin2bn()β takes the integer in big-endian signed 2's complement form, lengthlen, ats, and makes it aBIGNUMinret.retisNULL? newBIGNUM, same deal.
π little-endian remixes (they're literally the same but endian-swapped)
BN_bn2lebinpad(), BN_signed_bn2lebin() and BN_lebin2bn() are identical to BN_bn2binpad(), BN_signed_bn2bin() and BN_bin2bn()... except the buffer is in little-endian format. that's the whole plot twist. π¦
π§ native format (aka "it depends on your platform, iykyk")
BN_bn2nativepad(), BN_signed_bn2native() and BN_native2bn() are identical to BN_bn2binpad(), BN_signed_bn2bin() and BN_bin2bn()... except the buffer is in native format. meaning: most significant byte first on big-endian platforms, and least significant byte first on little-endian platforms. your machine decides. main character energy is platform-dependent fr fr. π
π hex + dec, the printable girlies
BN_bn2hex()andBN_bn2dec()β return printable strings holding the hexadecimal and decimal encoding ofa, respectively. negative numbers get a leading'-'prefaced on there. and β οΈ you must free the string later usingOPENSSL_free()β don't leave it hanging, that's not the vibe.BN_hex2bn()β grabs as many characters as it possibly can from the stringstr, including a leading'-'character (which means negative, obvi), to form a valid hexadecimal number representation, converts them to aBIGNUM, and stores it in**a. if*aisNULL, a newBIGNUMis created. ifaisNULL, it only computes the length of the valid representation. also a "negative zero" gets converted to zero β iconic, honestly.BN_dec2bn()is the exact same thing but in the decimal system. π
π₯ printing
BN_print()andBN_print_fp()β write the hexadecimal encoding ofato theBIOorFILEfp, with a leading'-'for negative numbers. simple, clean, slay.
β MPI format
BN_bn2mpi() and BN_mpi2bn() convert BIGNUMs from and to a format that's made of two parts: the number's length in bytes represented as a 4-byte big-endian number, plus the number itself in big-endian format, where the most significant bit signals a negative number (and the representation of numbers with the MSB set is prefixed with a null byte). β¨
BN_bn2mpi()β stores the representation ofaatto, wheretohas to be large enough to hold the result. wanna know the size first? callBN_bn2mpi(a, NULL). cute lil trick. πBN_mpi2bn()β converts thelenbytes long representation atsto aBIGNUMand stores it atret, or in a newly allocatedBIGNUMifretisNULL.
π RETURN VALUES π
BN_bn2bin()returns the length of the big-endian number placed atto.BN_bin2bn()returns theBIGNUM, orNULLon error.BN_bn2binpad(),BN_signed_bn2bin(),BN_bn2lebinpad(),BN_signed_bn2lebin(),BN_bn2nativepad(), and_signedBN_bn2native()return the number of bytes written, or-1if the supplied buffer is too small. (yes that "and_signed" reads wild in the original manpage β keeping it exactly as written, no editing bestie π«Ά)BN_bn2hex()andBN_bn2dec()return a NUL-terminated string, orNULLon error.BN_hex2bn()andBN_dec2bn()return the number of characters used in parsing, or0on error β and in that error case, no newBIGNUMwill be created. πBN_print_fp()andBN_print()return1on success,0on write errors.BN_bn2mpi()returns the length of the representation.BN_mpi2bn()returns theBIGNUM, andNULLon error.- the error codes can be obtained by
ERR_get_error(3). π
πΈ SEE ALSO πΈ
ERR_get_error(3), BN_zero(3), ASN1_INTEGER_to_BN(3), BN_num_bytes(3)
β¨ HISTORY β¨
the functions BN_signed_bin2bn(), BN_signed_bn2bin(), BN_signed_lebin2bn(), BN_signed_bn2lebin(), BN_signed_native2bn(), BN_signed_bn2native() were added in OpenSSL 3.2. the signed girlies are the newbies of the group. π
π COPYRIGHT π
Copyright 2000-2024 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.
and that's the whole page bestie π«Ά this was BN_BN2BIN, from OpenSSL 4.0.3, dated 2026-09-29. go forth and convert formats responsibly, mwah πβ¨πΈ
π¦ where this page comes from
- ubuntu stonking: libssl-doc 4.0.3-1ubuntu1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms