Skip to content

Commit 24f5b7d

Browse files
inashivbvictorjulien
authored andcommitted
tls/serial: use byte array instead of string
Bug 7887
1 parent f025e07 commit 24f5b7d

6 files changed

Lines changed: 21 additions & 15 deletions

File tree

rust/src/x509/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,18 @@ pub unsafe extern "C" fn SCX509GetIssuer(ptr: *const X509, issuer_name: *mut *mu
144144
}
145145

146146
#[no_mangle]
147-
pub unsafe extern "C" fn SCX509GetSerial(ptr: *const X509) -> *mut c_char {
147+
pub unsafe extern "C" fn SCX509GetSerial(ptr: *const X509, serial_num: *mut *mut u8, serial_len: *mut u32) {
148148
if ptr.is_null() {
149-
return std::ptr::null_mut();
149+
*serial_len = 0;
150+
*serial_num = std::ptr::null_mut();
151+
return;
150152
}
151153
let x509 = cast_pointer! {ptr, X509};
152154
let raw_serial = x509.0.tbs_certificate.raw_serial();
153155
let v: Vec<_> = raw_serial.iter().map(|x| format!("{:02X}", x)).collect();
154156
let serial = v.join(":");
155-
rust_string_to_c(serial)
157+
*serial_len = serial.len() as u32;
158+
*serial_num = Box::into_raw(serial.into_bytes().into_boxed_slice()) as *mut u8;
156159
}
157160

158161
/// Extract validity from input X.509 object

src/app-layer-ssl.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -511,12 +511,12 @@ static int TlsDecodeHSCertificate(SSLState *ssl_state, SSLStateConnp *connp,
511511
sans[i] = SCX509GetSubjectAltNameAt(x509, i);
512512
}
513513
connp->cert0_sans = sans;
514-
char *str = SCX509GetSerial(x509);
515-
if (str == NULL) {
514+
515+
SCX509GetSerial(x509, &connp->cert0_serial, &connp->cert0_serial_len);
516+
if (connp->cert0_serial == NULL) {
516517
err_code = ERR_INVALID_SERIAL;
517518
goto error;
518519
}
519-
connp->cert0_serial = str;
520520

521521
rc = SCX509GetValidity(x509, &connp->cert0_not_before, &connp->cert0_not_after);
522522
if (rc != 0) {
@@ -2859,7 +2859,8 @@ static void SSLStateFree(void *p)
28592859
SCX509ArrayFree(
28602860
ssl_state->client_connp.cert0_issuerdn, ssl_state->client_connp.cert0_issuerdn_len);
28612861
if (ssl_state->client_connp.cert0_serial)
2862-
SCRustCStringFree(ssl_state->client_connp.cert0_serial);
2862+
SCX509ArrayFree(
2863+
ssl_state->client_connp.cert0_serial, ssl_state->client_connp.cert0_serial_len);
28632864
if (ssl_state->client_connp.cert0_fingerprint)
28642865
SCFree(ssl_state->client_connp.cert0_fingerprint);
28652866
if (ssl_state->client_connp.sni)
@@ -2876,7 +2877,8 @@ static void SSLStateFree(void *p)
28762877
SCX509ArrayFree(
28772878
ssl_state->server_connp.cert0_issuerdn, ssl_state->server_connp.cert0_issuerdn_len);
28782879
if (ssl_state->server_connp.cert0_serial)
2879-
SCRustCStringFree(ssl_state->server_connp.cert0_serial);
2880+
SCX509ArrayFree(
2881+
ssl_state->server_connp.cert0_serial, ssl_state->server_connp.cert0_serial_len);
28802882
if (ssl_state->server_connp.cert0_fingerprint)
28812883
SCFree(ssl_state->server_connp.cert0_fingerprint);
28822884
if (ssl_state->server_connp.sni)

src/app-layer-ssl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,12 @@ typedef struct SSLStateConnp_ {
184184
uint16_t session_id_length;
185185

186186
uint8_t random[TLS_RANDOM_LEN];
187-
char *cert0_serial;
188187
uint8_t *cert0_subject;
189188
uint32_t cert0_subject_len;
190189
uint8_t *cert0_issuerdn;
191190
uint32_t cert0_issuerdn_len;
191+
uint8_t *cert0_serial;
192+
uint32_t cert0_serial_len;
192193
int64_t cert0_not_before;
193194
int64_t cert0_not_after;
194195
char *cert0_fingerprint;

src/detect-tls-cert-serial.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
148148
return NULL;
149149
}
150150

151-
const uint32_t data_len = (uint32_t)strlen(connp->cert0_serial);
152-
const uint8_t *data = (uint8_t *)connp->cert0_serial;
151+
const uint32_t data_len = connp->cert0_serial_len;
152+
const uint8_t *data = connp->cert0_serial;
153153

154154
InspectionBufferSetupAndApplyTransforms(
155155
det_ctx, list_id, buffer, data, data_len, transforms);

src/output-json-tls.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ static void JsonTlsLogSni(SCJsonBuilder *js, SSLState *ssl_state)
195195
static void JsonTlsLogSerial(SCJsonBuilder *js, SSLState *ssl_state)
196196
{
197197
if (ssl_state->server_connp.cert0_serial) {
198-
SCJbSetString(js, "serial", ssl_state->server_connp.cert0_serial);
198+
SCJbSetStringFromBytes(js, "serial", ssl_state->server_connp.cert0_serial,
199+
ssl_state->server_connp.cert0_serial_len);
199200
}
200201
}
201202

@@ -366,7 +367,7 @@ static void JsonTlsLogClientCert(
366367
SCJbSetString(js, "fingerprint", connp->cert0_fingerprint);
367368
}
368369
if (connp->cert0_serial) {
369-
SCJbSetString(js, "serial", connp->cert0_serial);
370+
SCJbSetStringFromBytes(js, "serial", connp->cert0_serial, connp->cert0_serial_len);
370371
}
371372
if (connp->cert0_not_before != 0) {
372373
char timebuf[64];

src/util-lua-tls.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,7 @@ static int GetCertSerial(lua_State *luastate, bool client)
291291
if (connp->cert0_serial == NULL)
292292
return LuaCallbackError(luastate, "error: no certificate serial");
293293

294-
return LuaPushStringBuffer(
295-
luastate, (uint8_t *)connp->cert0_serial, strlen(connp->cert0_serial));
294+
return LuaPushStringBuffer(luastate, connp->cert0_serial, connp->cert0_serial_len);
296295
}
297296

298297
static int LuaTlsGetServerCertSerial(lua_State *luastate)

0 commit comments

Comments
 (0)