ASN1_STRING_LENGTH(3ssl)
πΈ ASN1_STRING_LENGTH β the ASN1_STRING utility functions bestie π
okay so this is the ASN1_STRING_LENGTH(3ssl) page, part of the OpenSSL fam, and it's literally all about wrangling that ASN1_STRING structure β¨ no cap, these are the little helper functions you'll reach for constantly. sit down, hydrate, let's go π«Ά
β¨ SYNOPSIS β¨
#include <openssl/asn1.h>
const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x);
ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *a);
int ASN1_STRING_cmp(ASN1_STRING *a, ASN1_STRING *b);
int ASN1_STRING_type(const ASN1_STRING *x);
int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in);
int ASN1_STRING_set1_data(ASN1_STRING *str, const uint8_t *data, size_t len);
int ASN1_STRING_set1_string(ASN1_STRING *str, const char *data);
size_t ASN1_STRING_get_length(const ASN1_STRING *x);
and now the part with the little "vintage" sticker on it π these have been deprecated since OpenSSL 4.1, and you can hide them entirely by defining OPENSSL_API_COMPAT with a suitable version value β peep openssl_user_macros(7) for the deets:
int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len);
int ASN1_STRING_length(ASN1_STRING *x);
π DESCRIPTION π
these functions let you manipulate an ASN1_STRING structure. that's the whole vibe. let's go one by one π¦
ASN1_STRING_length()β returns the length of the content ofx. andxMUST NOT beNULL. like, do not. πASN1_STRING_get0_data()β hands you an internal pointer to the data ofx. and because it's internal, bestie, do not free it and do not modify it in any way.xMUST NOT beNULLhere either.ASN1_STRING_dup()β returns a copy of the structurea. clone era πASN1_STRING_cmp()β comparesaandb, returning0if the two are identical. it compares both the string types and the content. iykyk.ASN1_STRING_set()β allocates memory for stringstrto holdlenbytes of data. any previously allocated memory owned bystrwill be freed or re-used. ifdatais notNULL,lenbytes are copied from the memory pointed to bydatatostr. and iflenis-1then the length is determined bystrlen(data). cute shortcut, honestly.ASN1_STRING_set1_data()β allocates memory for stringstrto holdlenbytes of data. any previously allocated memory owned bystrwill be freed or re-used. ifdatais notNULL,lenbytes are copied from the memory pointed to bydatatostr. β οΈ it is an error to use this function on a string of typeASN1_BIT_STRING.ASN1_STRING_set1_string()β allocates memory for the stringstrand makes a copy of the characters fromcstring. any previously allocated memory owned bystrwill be freed or re-used.cstringmust point to a valid NUL-terminated C string, and must not beNULL. the terminating NUL byte is not included in the data copied intostr. β οΈ it is an error to use this function on a string of typeASN1_BIT_STRING.ASN1_STRING_type()β returns the type ofx, using standard constants such asV_ASN1_OCTET_STRING.ASN1_STRING_to_UTF8()β converts the stringinto UTF8 format, and the converted data is allocated in a buffer in*out. the buffer is NUL terminated, so it is a valid C string, but the returned length does not include the terminating NUL. the length ofoutis returned, or a negative error code. the buffer*outshould be freed usingOPENSSL_free(). and please read "WARNINGS" below, i'm begging π₯Ί
π§ NOTES π§
almost all ASN1 types in OpenSSL are represented as an ASN1_STRING structure. other types such as ASN1_OCTET_STRING are simply typedef'ed to ASN1_STRING and the functions call the ASN1_STRING equivalents. ASN1_STRING is also used for some CHOICE types which consist entirely of primitive string types such as DirectoryString and Time. versatility icon π
these functions should not be used to examine or modifyASN1_INTEGERorASN1_ENUMERATEDtypes β the relevant INTEGER or ENUMERATED utility functions should be used instead. wrong tool, wrong job, we don't do that here π«
in general it cannot be assumed that the data returned by ASN1_STRING_get0_data() is null terminated or does not contain embedded nulls. π the actual format of the data will depend on the actual string type itself: for example for an IA5String the data will be ASCII, for a BMPString two bytes per character in big endian format, and for a UTF8String it will be in UTF8 format.
similar care should be taken to ensure the data is in the correct format when calling ASN1_STRING_set(), ASN1_STRING_set1_data(), or ASN1_STRING_set1_string(). format check first, always π
π₯ WARNINGS π₯
okay this part is important, listen up fr fr π
although the buffer returned by ASN1_STRING_to_UTF8() is NUL terminated and is therefore a valid C string, the converted data may itself contain embedded NUL bytes. using C string functions such as strlen() or strcmp() on the output is therefore inherently dangerous: they will stop at the first embedded NUL and silently process only part of the string, which can lead to incorrect comparisons or truncated data. π callers should use the returned length and not rely on NUL termination. that's the rule. periodt.
π RETURN VALUES π
ASN1_STRING_length()β returns the length of the content ofx.ASN1_STRING_get0_data()β returns an internal pointer to the data ofx.ASN1_STRING_dup()β returns a validASN1_STRINGstructure orNULLif an error occurred.ASN1_STRING_cmp()β returns an integer greater than, equal to, or less than0, according to whetherais greater than, equal to, or less thanb.ASN1_STRING_set(),ASN1_STRING_set1_data(), andASN1_STRING_set1_string()β return1on success or0on error or failure.ASN1_STRING_type()β returns the type ofx.ASN1_STRING_to_UTF8()β returns the number of bytes in output stringoutor a negative value if an error occurred.
π SEE ALSO π
β HISTORY β
ASN1_STRING_set1_data(), ASN1_STRING_set1_string(), and ASN1_STRING_get_length() were added in OpenSSL 4.1. fresh out the box, slay β¨
π COPYRIGHT π
Copyright 2002-2026 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 tea π this was 4.1.0, dated 2026-10-23, page ASN1_STRING_LENGTH(3ssl) β mwah π go forth and string responsibly, bestie ππ¦
π¦ where this page comes from
- nixos 26.05: openssl 4.1.0
- nixpkgs unstable: openssl 4.1.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms