@@ -1355,17 +1355,10 @@ static ssize_t fr_der_encode_X509_extensions(fr_dbuff_t *dbuff, fr_dcursor_t *cu
13551355 fr_dbuff_marker (& length_start , & our_dbuff );
13561356 FR_DBUFF_ADVANCE_RETURN (& our_dbuff , 1 );
13571357
1358- /*
1359- * Encode the data either as raw garbage, or as an OID pair.
1360- */
1361- child = fr_dcursor_current (& child_cursor );
1362- fr_assert (child != NULL );
1363-
1364- if (child -> da -> flags .is_raw ) {
1365- slen = fr_der_encode_octetstring (& our_dbuff , & child_cursor , encode_ctx );
1366- } else {
1367- slen = encode_value (& our_dbuff , & child_cursor , encode_ctx );
1368- }
1358+ /*
1359+ * Encode the data
1360+ */
1361+ slen = encode_value (& our_dbuff , & child_cursor , encode_ctx );
13691362 if (slen < 0 ) {
13701363 fr_dbuff_marker_release (& length_start );
13711364 fr_dbuff_marker_release (& inner_seq_len_start );
@@ -1527,16 +1520,9 @@ static ssize_t fr_der_encode_oid_and_value(fr_dbuff_t *dbuff, fr_dcursor_t *curs
15271520 if (slen < 0 ) return slen ;
15281521
15291522 /*
1530- * Encode the data either as raw garbage, or as an OID pair .
1523+ * And then encode the actual data .
15311524 */
1532- child = fr_dcursor_current (& child_cursor );
1533- fr_assert (child );
1534-
1535- if (child -> da -> flags .is_raw ) {
1536- slen = fr_der_encode_octetstring (& our_dbuff , & child_cursor , encode_ctx );
1537- } else {
1538- slen = encode_value (& our_dbuff , & child_cursor , encode_ctx );
1539- }
1525+ slen = encode_value (& our_dbuff , & child_cursor , encode_ctx );
15401526 if (slen < 0 ) return slen ;
15411527
15421528 return fr_dbuff_set (dbuff , & our_dbuff );
@@ -1731,7 +1717,7 @@ static inline CC_HINT(always_inline) ssize_t
17311717static ssize_t encode_value (fr_dbuff_t * dbuff , fr_dcursor_t * cursor , void * encode_ctx )
17321718{
17331719 fr_pair_t const * vp ;
1734- fr_dbuff_t our_dbuff = FR_DBUFF ( dbuff ) ;
1720+ fr_dbuff_t our_dbuff ;
17351721 fr_dbuff_marker_t marker ;
17361722 fr_der_tag_encode_t const * func ;
17371723 fr_der_tag_t tag ;
@@ -1758,6 +1744,21 @@ static ssize_t encode_value(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *encod
17581744 flags = fr_der_attr_flags (vp -> da );
17591745 fr_assert (flags != NULL );
17601746
1747+ /*
1748+ * Raw things get encoded as-is, so that we can encode the correct tag and class.
1749+ */
1750+ if (unlikely (vp -> da -> flags .is_raw )) {
1751+ fr_assert (vp -> vp_type == FR_TYPE_OCTETS );
1752+
1753+ slen = fr_der_encode_octetstring (dbuff , cursor , encode_ctx );
1754+ if (slen < 0 ) return 0 ;
1755+
1756+ fr_dcursor_next (cursor );
1757+ return slen ;
1758+ }
1759+
1760+ our_dbuff = FR_DBUFF (dbuff );
1761+
17611762 /*
17621763 * ISO/IEC 8825-1:2021
17631764 * The structure of a DER encoding is as follows:
@@ -1854,13 +1855,10 @@ static ssize_t encode_value(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *encod
18541855 fr_dbuff_marker (& marker , & our_dbuff );
18551856 FR_DBUFF_ADVANCE_RETURN (& our_dbuff , 1 );
18561857
1857- if (vp -> da -> flags .is_raw ) {
1858- slen = fr_der_encode_octetstring (& our_dbuff , cursor , uctx );
1859-
1860- } else if (flags -> is_extensions ) {
1858+ if (flags -> is_extensions ) {
18611859 slen = fr_der_encode_X509_extensions (& our_dbuff , cursor , uctx );
1862-
18631860 } else {
1861+
18641862 slen = func -> encode (& our_dbuff , cursor , uctx );
18651863 }
18661864 if (slen < 0 ) {
0 commit comments