@@ -1351,17 +1351,10 @@ static ssize_t fr_der_encode_X509_extensions(fr_dbuff_t *dbuff, fr_dcursor_t *cu
13511351 fr_dbuff_marker (& length_start , & our_dbuff );
13521352 FR_DBUFF_ADVANCE_RETURN (& our_dbuff , 1 );
13531353
1354- /*
1355- * Encode the data either as raw garbage, or as an OID pair.
1356- */
1357- child = fr_dcursor_current (& child_cursor );
1358- fr_assert (child != NULL );
1359-
1360- if (child -> da -> flags .is_raw ) {
1361- slen = fr_der_encode_octetstring (& our_dbuff , & child_cursor , encode_ctx );
1362- } else {
1363- slen = encode_value (& our_dbuff , & child_cursor , encode_ctx );
1364- }
1354+ /*
1355+ * Encode the data
1356+ */
1357+ slen = encode_value (& our_dbuff , & child_cursor , encode_ctx );
13651358 if (slen < 0 ) {
13661359 fr_dbuff_marker_release (& length_start );
13671360 fr_dbuff_marker_release (& inner_seq_len_start );
@@ -1523,16 +1516,9 @@ static ssize_t fr_der_encode_oid_and_value(fr_dbuff_t *dbuff, fr_dcursor_t *curs
15231516 if (slen < 0 ) return slen ;
15241517
15251518 /*
1526- * Encode the data either as raw garbage, or as an OID pair .
1519+ * And then encode the actual data .
15271520 */
1528- child = fr_dcursor_current (& child_cursor );
1529- fr_assert (child );
1530-
1531- if (child -> da -> flags .is_raw ) {
1532- slen = fr_der_encode_octetstring (& our_dbuff , & child_cursor , encode_ctx );
1533- } else {
1534- slen = encode_value (& our_dbuff , & child_cursor , encode_ctx );
1535- }
1521+ slen = encode_value (& our_dbuff , & child_cursor , encode_ctx );
15361522 if (slen < 0 ) return slen ;
15371523
15381524 return fr_dbuff_set (dbuff , & our_dbuff );
@@ -1727,7 +1713,7 @@ static inline CC_HINT(always_inline) ssize_t
17271713static ssize_t encode_value (fr_dbuff_t * dbuff , fr_dcursor_t * cursor , void * encode_ctx )
17281714{
17291715 fr_pair_t const * vp ;
1730- fr_dbuff_t our_dbuff = FR_DBUFF ( dbuff ) ;
1716+ fr_dbuff_t our_dbuff ;
17311717 fr_dbuff_marker_t marker ;
17321718 fr_der_tag_encode_t const * func ;
17331719 fr_der_tag_t tag ;
@@ -1754,6 +1740,21 @@ static ssize_t encode_value(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *encod
17541740 flags = fr_der_attr_flags (vp -> da );
17551741 fr_assert (flags != NULL );
17561742
1743+ /*
1744+ * Raw things get encoded as-is, so that we can encode the correct tag and class.
1745+ */
1746+ if (unlikely (vp -> da -> flags .is_raw )) {
1747+ fr_assert (vp -> vp_type == FR_TYPE_OCTETS );
1748+
1749+ slen = fr_der_encode_octetstring (dbuff , cursor , encode_ctx );
1750+ if (slen < 0 ) return 0 ;
1751+
1752+ fr_dcursor_next (cursor );
1753+ return slen ;
1754+ }
1755+
1756+ our_dbuff = FR_DBUFF (dbuff );
1757+
17571758 /*
17581759 * ISO/IEC 8825-1:2021
17591760 * The structure of a DER encoding is as follows:
@@ -1850,13 +1851,10 @@ static ssize_t encode_value(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *encod
18501851 fr_dbuff_marker (& marker , & our_dbuff );
18511852 FR_DBUFF_ADVANCE_RETURN (& our_dbuff , 1 );
18521853
1853- if (vp -> da -> flags .is_raw ) {
1854- slen = fr_der_encode_octetstring (& our_dbuff , cursor , uctx );
1855-
1856- } else if (flags -> is_extensions ) {
1854+ if (flags -> is_extensions ) {
18571855 slen = fr_der_encode_X509_extensions (& our_dbuff , cursor , uctx );
1858-
18591856 } else {
1857+
18601858 slen = func -> encode (& our_dbuff , cursor , uctx );
18611859 }
18621860 if (slen < 0 ) {
0 commit comments