[winpr] Add initializer functions

* Add initializer for wStream
* Add initializer for ASN1 decoder
This commit is contained in:
Armin Novak
2026-02-24 21:23:47 +01:00
parent 48267edf2f
commit 208bcbd153
10 changed files with 63 additions and 40 deletions

View File

@@ -394,9 +394,9 @@ static char* KERB_RPC_UNICODESTR_to_charptr(const RPC_UNICODE_STRING* src)
static BOOL extractAuthData(const KERB_ASN1_DATA* src, krb5_authdata* authData, BOOL* haveData)
{
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec3 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec3 = WinPrAsn1Decoder_init();
WinPrAsn1Decoder_InitMem(&dec, WINPR_ASN1_DER, src->Asn1Buffer, src->Asn1BufferHints.count);
BOOL error = FALSE;
WinPrAsn1_INTEGER adType = 0;
@@ -429,8 +429,8 @@ static BOOL extractAuthData(const KERB_ASN1_DATA* src, krb5_authdata* authData,
static BOOL extractChecksum(const KERB_ASN1_DATA* src, krb5_checksum* dst)
{
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
WinPrAsn1Decoder_InitMem(&dec, WINPR_ASN1_DER, src->Asn1Buffer, src->Asn1BufferHints.count);
BOOL error = FALSE;
WinPrAsn1_OctetString os;
@@ -626,8 +626,8 @@ out:
static BOOL rdpear_findEncryptedData(const KERB_ASN1_DATA* src, int* penctype, krb5_data* data)
{
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
WinPrAsn1Decoder_InitMem(&dec, WINPR_ASN1_DER, src->Asn1Buffer, src->Asn1BufferHints.count);
BOOL error = FALSE;
WinPrAsn1_INTEGER encType = 0;
@@ -974,8 +974,8 @@ static UINT rdpear_on_data_received(IWTSVirtualChannelCallback* pChannelCallback
if (!freerdp_nla_decrypt(rdpear->rdp_context, &inBuffer, &decrypted))
goto out;
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
wStream decodedStream = WINPR_C_ARRAY_INIT;
Stream_StaticInit(&decodedStream, decrypted.pvBuffer, decrypted.cbBuffer);
WinPrAsn1Decoder_Init(&dec, WINPR_ASN1_DER, &decodedStream);

View File

@@ -1355,8 +1355,8 @@ typedef enum
static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data)
{
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
WinPrAsn1_OctetString credentials = WINPR_C_ARRAY_INIT;
BOOL error = FALSE;
WinPrAsn1_INTEGER credType = -1;
@@ -1423,7 +1423,7 @@ static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data)
settings->PasswordIsSmartcardPin = TRUE;
/* cspData [1] TSCspDataDetail */
WinPrAsn1Decoder cspDetails = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder cspDetails = WinPrAsn1Decoder_init();
if (!WinPrAsn1DecReadContextualSequence(&dec, 1, &error, &cspDetails) && error)
return FALSE;
if (!nla_read_TSCspDataDetail(&cspDetails, settings))
@@ -1450,7 +1450,7 @@ static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data)
.ServiceTicket = NULL,
.TicketGrantingTicket = NULL };
WinPrAsn1Decoder logonCredsSeq = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder logonCredsSeq = WinPrAsn1Decoder_init();
if (!WinPrAsn1DecReadContextualSequence(&dec2, 0, &error, &logonCredsSeq) || error)
return FALSE;
@@ -1474,12 +1474,12 @@ static BOOL nla_read_ts_credentials(rdpNla* nla, SecBuffer* data)
/* supplementalCreds [1] SEQUENCE OF TSRemoteGuardPackageCred OPTIONAL, */
MSV1_0_REMOTE_SUPPLEMENTAL_CREDENTIAL* suppCreds = NULL;
WinPrAsn1Decoder suppCredsSeq = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder suppCredsSeq = WinPrAsn1Decoder_init();
if (WinPrAsn1DecReadContextualSequence(&dec2, 1, &error, &suppCredsSeq) &&
Stream_GetRemainingLength(&suppCredsSeq.source))
{
WinPrAsn1Decoder ntlmCredsSeq = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder ntlmCredsSeq = WinPrAsn1Decoder_init();
if (!WinPrAsn1DecReadSequence(&suppCredsSeq, &ntlmCredsSeq))
return FALSE;
@@ -2065,8 +2065,8 @@ fail:
static int nla_decode_ts_request(rdpNla* nla, wStream* s)
{
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
BOOL error = FALSE;
WinPrAsn1_tagId tag = WINPR_C_ARRAY_INIT;
WinPrAsn1_INTEGER val = WINPR_C_ARRAY_INIT;
@@ -2108,7 +2108,7 @@ static int nla_decode_ts_request(rdpNla* nla, wStream* s)
while (WinPrAsn1DecReadContextualTag(&dec, &tag, &dec2) != 0)
{
WinPrAsn1Decoder dec3 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec3 = WinPrAsn1Decoder_init();
WinPrAsn1_OctetString octet_string = WINPR_C_ARRAY_INIT;
switch (tag)

View File

@@ -68,6 +68,18 @@ struct WinPrAsn1Decoder
typedef struct WinPrAsn1Decoder WinPrAsn1Decoder;
/** @brief helper initializing a \b WinPrAsn1Decoder context
*
* @return The initialized context
* @since version 3.24.0
*/
static inline WinPrAsn1Decoder WinPrAsn1Decoder_init(void)
{
const wStream stream = Stream_Init();
const WinPrAsn1Decoder empty = { WINPR_ASN1_BER, stream };
return empty;
}
typedef BYTE WinPrAsn1_tag;
typedef BYTE WinPrAsn1_tagId;
typedef BOOL WinPrAsn1_BOOL;

View File

@@ -51,6 +51,17 @@ extern "C"
BOOL isOwner;
} wStream;
/** @brief helper initializing a \b wStream context
*
* @return The initialized context
* @since version 3.24.0
*/
static inline wStream Stream_Init(void)
{
const wStream empty = { NULL, NULL, 0, 0, 0, NULL, FALSE, FALSE };
return empty;
}
static inline size_t Stream_Capacity(const wStream* _s);
WINPR_API size_t Stream_GetRemainingCapacity(const wStream* _s);
WINPR_API size_t Stream_GetRemainingLength(const wStream* _s);

View File

@@ -875,8 +875,8 @@ static SECURITY_STATUS get_piv_container_name(NCryptP11KeyHandle* key, const BYT
char container_name[PIV_CONTAINER_NAME_LEN + 1] = WINPR_C_ARRAY_INIT;
DWORD buf_len = 0;
SECURITY_STATUS ret = NTE_BAD_KEY;
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
size_t len = 0;
BYTE tag = 0;
BYTE* p = NULL;

View File

@@ -725,7 +725,7 @@ static BOOL append(char* dst, size_t dstSize, const char* src)
static BOOL kerberos_rd_tgt_req_tag2(WinPrAsn1Decoder* dec, char* buf, size_t len)
{
BOOL rc = FALSE;
WinPrAsn1Decoder seq = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder seq = WinPrAsn1Decoder_init();
/* server-name [2] PrincipalName (SEQUENCE) */
if (!WinPrAsn1DecReadSequence(dec, &seq))
@@ -810,7 +810,7 @@ static BOOL kerberos_rd_tgt_req(WinPrAsn1Decoder* dec, char** target)
if (len == 0)
return TRUE;
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
WinPrAsn1_tagId tag = 0;
if (WinPrAsn1DecReadContextualTag(dec, &tag, &dec2) == 0)
return FALSE;
@@ -856,7 +856,7 @@ static BOOL kerberos_rd_tgt_rep(WinPrAsn1Decoder* dec, krb5_data* ticket)
return FALSE;
/* ticket [2] Ticket */
WinPrAsn1Decoder asnTicket = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder asnTicket = WinPrAsn1Decoder_init();
WinPrAsn1_tagId tag = 0;
if (WinPrAsn1DecReadContextualTag(dec, &tag, &asnTicket) == 0)
return FALSE;
@@ -884,11 +884,11 @@ static BOOL kerberos_rd_tgt_token(const sspi_gss_data* token, char** target, krb
if (target)
*target = NULL;
WinPrAsn1Decoder der = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder der = WinPrAsn1Decoder_init();
WinPrAsn1Decoder_InitMem(&der, WINPR_ASN1_DER, (BYTE*)token->data, token->length);
/* KERB-TGT-REQUEST (SEQUENCE) */
WinPrAsn1Decoder seq = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder seq = WinPrAsn1Decoder_init();
if (!WinPrAsn1DecReadSequence(&der, &seq))
return FALSE;

View File

@@ -477,8 +477,8 @@ cleanup:
static BOOL negotiate_read_neg_token(PSecBuffer input, NegToken* token)
{
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
WinPrAsn1_OID oid = WINPR_C_ARRAY_INIT;
WinPrAsn1_tagId contextual = 0;
WinPrAsn1_tag tag = 0;
@@ -990,8 +990,8 @@ static SECURITY_STATUS SEC_ENTRY negotiate_InitializeSecurityContextA(
static const Mech* guessMech(PSecBuffer input_buffer, BOOL* spNego, WinPrAsn1_OID* oid)
{
WinPrAsn1Decoder decoder = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder appDecoder = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder decoder = WinPrAsn1Decoder_init();
WinPrAsn1Decoder appDecoder = WinPrAsn1Decoder_init();
WinPrAsn1_tagId tag = 0;
const char ssp[] = "NTLMSSP";
@@ -1039,8 +1039,8 @@ static SECURITY_STATUS SEC_ENTRY negotiate_AcceptSecurityContext(
SecBufferDesc mech_input = { SECBUFFER_VERSION, 1, &input_token.mechToken };
SecBufferDesc mech_output = { SECBUFFER_VERSION, 1, &output_token.mechToken };
SECURITY_STATUS status = SEC_E_INTERNAL_ERROR;
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
WinPrAsn1_tagId tag = 0;
WinPrAsn1_OID oid = WINPR_C_ARRAY_INIT;
const Mech* first_mech = NULL;

View File

@@ -86,8 +86,8 @@ cleanup:
BOOL sspi_gss_unwrap_token(const SecBuffer* buf, WinPrAsn1_OID* oid, uint16_t* tok_id,
sspi_gss_data* token)
{
WinPrAsn1Decoder dec = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec2 = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder dec = WinPrAsn1Decoder_init();
WinPrAsn1Decoder dec2 = WinPrAsn1Decoder_init();
WinPrAsn1_tagId tag = 0;
wStream sbuffer = WINPR_C_ARRAY_INIT;
wStream* s = NULL;

View File

@@ -1388,7 +1388,7 @@ size_t WinPrAsn1DecReadContextualBool(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tag
{
size_t ret = 0;
size_t ret2 = 0;
WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder content = WinPrAsn1Decoder_init();
ret = readContextualHeader(dec, tagId, error, &content);
if (!ret)
@@ -1410,7 +1410,7 @@ size_t WinPrAsn1DecReadContextualInteger(WinPrAsn1Decoder* dec, WinPrAsn1_tagId
{
size_t ret = 0;
size_t ret2 = 0;
WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder content = WinPrAsn1Decoder_init();
ret = readContextualHeader(dec, tagId, error, &content);
if (!ret)
@@ -1432,7 +1432,7 @@ size_t WinPrAsn1DecReadContextualOID(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagI
{
size_t ret = 0;
size_t ret2 = 0;
WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder content = WinPrAsn1Decoder_init();
ret = readContextualHeader(dec, tagId, error, &content);
if (!ret)
@@ -1455,7 +1455,7 @@ size_t WinPrAsn1DecReadContextualOctetString(WinPrAsn1Decoder* dec, WinPrAsn1_ta
{
size_t ret = 0;
size_t ret2 = 0;
WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder content = WinPrAsn1Decoder_init();
ret = readContextualHeader(dec, tagId, error, &content);
if (!ret)
@@ -1477,7 +1477,7 @@ size_t WinPrAsn1DecReadContextualSequence(WinPrAsn1Decoder* dec, WinPrAsn1_tagId
{
size_t ret = 0;
size_t ret2 = 0;
WinPrAsn1Decoder content = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder content = WinPrAsn1Decoder_init();
ret = readContextualHeader(dec, tagId, error, &content);
if (!ret)

View File

@@ -30,8 +30,8 @@ static const BYTE utctimeContent[] = { 0x17, 0x0D, 0x32, 0x31, 0x30, 0x33, 0x31,
int TestASN1Read(int argc, char* argv[])
{
WinPrAsn1Decoder decoder = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder seqDecoder = { .encoding = WINPR_ASN1_BER, { 0 } };
WinPrAsn1Decoder decoder = WinPrAsn1Decoder_init();
WinPrAsn1Decoder seqDecoder = WinPrAsn1Decoder_init();
wStream staticS = WINPR_C_ARRAY_INIT;
WinPrAsn1_BOOL boolV = 0;
WinPrAsn1_INTEGER integerV = 0;