···360360let tlv_header_codec =
361361 Wire.Codec.v "TLV_Header"
362362 (fun tag data_len -> { tag; data_len })
363363- Wire.Codec.
364364- [
365365- (f_tag $ fun h -> h.tag);
366366- (f_data_len $ fun h -> h.data_len);
367367- ]
363363+ Wire.Codec.[ (f_tag $ fun h -> h.tag); (f_data_len $ fun h -> h.data_len) ]
368364369365let tlv_header_size = Wire.Codec.wire_size tlv_header_codec
370366···382378 Wire.Codec.
383379 [
384380 (f_ev_spi $ fun r -> r.spi);
385385- (f_ev_code $ fun r ->
381381+ ( f_ev_code $ fun r ->
386382 let base = r.code land 0x7F in
387387- base lor if Option.is_some r.vcid then 0x80 else 0);
383383+ base lor if Option.is_some r.vcid then 0x80 else 0 );
388384 ]
389385390386let spi_code_size = Wire.Codec.wire_size spi_code_codec
···396392 let buf = Bytes.create total in
397393 let rec_val = { spi; code; vcid } in
398394 Wire.Codec.encode spi_code_codec rec_val buf 0;
399399- (match vcid with
400400- | Some v -> Bytes.set_uint8 buf spi_code_size v
401401- | None -> ());
395395+ (match vcid with Some v -> Bytes.set_uint8 buf spi_code_size v | None -> ());
402396 buf
403397404398(** Decode the SPI + code byte + optional VCID from [buf] at [off] with
···413407 let code = r.code land 0x7F in
414408 if has_vcid && data_len >= spi_code_size + 1 then
415409 let v = Bytes.get_uint8 buf (off + spi_code_size) in
416416- if v > 63 then Error (`Invalid_vcid v)
417417- else Ok (r.spi, code, Some v)
410410+ if v > 63 then Error (`Invalid_vcid v) else Ok (r.spi, code, Some v)
418411 else Ok (r.spi, code, None)
419412420413(* SPI + u64 remaining codec (iv_warning) *)
···428421 Wire.Codec.v "IV_Warning"
429422 (fun spi remaining -> { spi; remaining })
430423 Wire.Codec.
431431- [
432432- (f_iv_spi $ fun r -> r.spi);
433433- (f_remaining $ fun r -> r.remaining);
434434- ]
424424+ [ (f_iv_spi $ fun r -> r.spi); (f_remaining $ fun r -> r.remaining) ]
435425436426let iv_warning_data_size = Wire.Codec.wire_size iv_warning_codec
437427···445435let spi_trans_codec =
446436 Wire.Codec.v "SPI_Trans"
447437 (fun spi trans -> { spi; trans })
448448- Wire.Codec.
449449- [
450450- (f_tr_spi $ fun r -> r.spi);
451451- (f_trans $ fun r -> r.trans);
452452- ]
438438+ Wire.Codec.[ (f_tr_spi $ fun r -> r.spi); (f_trans $ fun r -> r.trans) ]
453439454440let spi_trans_data_size = Wire.Codec.wire_size spi_trans_codec
455441···462448 (fun v -> v = 0)
463449 Wire.Codec.[ (f_success $ fun s -> if s then 0 else 1) ]
464450465465-(** Encode a TLV header and return a buffer with header + data_len spare room. *)
451451+(** Encode a TLV header and return a buffer with header + data_len spare room.
452452+*)
466453let encode_tlv tag data_len =
467454 let buf = Bytes.create (tlv_header_size + data_len) in
468455 Wire.Codec.encode tlv_header_codec { tag; data_len } buf 0;
···496483 | Sa_change { spi; transition } ->
497484 let buf = encode_tlv tag_sa_change spi_trans_data_size in
498485 Wire.Codec.encode spi_trans_codec
499499- { spi; trans = int_of_sa_trans transition } buf tlv_header_size;
486486+ { spi; trans = int_of_sa_trans transition }
487487+ buf tlv_header_size;
500488 buf
501489 | Key_change { kid; transition } ->
502490 let buf = encode_tlv tag_key_change spi_trans_data_size in
503491 Wire.Codec.encode spi_trans_codec
504504- { spi = kid; trans = int_of_key_trans transition } buf tlv_header_size;
492492+ { spi = kid; trans = int_of_key_trans transition }
493493+ buf tlv_header_size;
505494 buf
506495 | Alarm_reset -> encode_tlv tag_alarm_reset 0
507496 | Self_test { success } ->
···525514 else
526515 match Wire.Codec.decode tlv_header_codec buf off with
527516 | Error _ -> Error `Truncated
528528- | Ok { tag; data_len } ->
529529- if remaining < tlv_header_size + data_len then Error `Truncated
530530- else
531531- let data_off = off + tlv_header_size in
532532- let consumed = tlv_header_size + data_len in
533533- let decode_frame_dir_event mk =
534534- match decode_spi_code_vcid buf data_off data_len with
535535- | Error _ as e -> e
536536- | Ok (spi, code, vcid) ->
537537- let direction = direction_of_int code in
538538- Ok (mk ~spi ~direction ~vcid, consumed)
539539- in
540540- match tag with
541541- | t when t = tag_auth_failure -> (
542542- match decode_spi_code_vcid buf data_off data_len with
543543- | Error _ as e -> e
544544- | Ok (spi, code, vcid) ->
545545- let reason = auth_reason_of_int code in
546546- Ok (Auth_failure { spi; reason; vcid }, consumed))
547547- | t when t = tag_frame_protected ->
548548- decode_frame_dir_event (fun ~spi ~direction ~vcid ->
549549- Frame_protected { spi; direction; vcid })
550550- | t when t = tag_frame_unprotected ->
551551- decode_frame_dir_event (fun ~spi ~direction ~vcid ->
552552- Frame_unprotected { spi; direction; vcid })
553553- | t when t = tag_iv_warning ->
554554- if data_len < iv_warning_data_size then Error `Truncated
555555- else (
556556- match Wire.Codec.decode iv_warning_codec buf data_off with
557557- | Error _ -> Error `Truncated
558558- | Ok r -> Ok (Iv_warning { spi = r.spi; remaining = r.remaining },
559559- consumed))
560560- | t when t = tag_sa_change ->
561561- if data_len < spi_trans_data_size then Error `Truncated
562562- else (
563563- match Wire.Codec.decode spi_trans_codec buf data_off with
564564- | Error _ -> Error `Truncated
565565- | Ok r ->
566566- let transition = sa_trans_of_int r.trans in
567567- Ok (Sa_change { spi = r.spi; transition }, consumed))
568568- | t when t = tag_key_change ->
569569- if data_len < spi_trans_data_size then Error `Truncated
570570- else (
571571- match Wire.Codec.decode spi_trans_codec buf data_off with
572572- | Error _ -> Error `Truncated
573573- | Ok r ->
574574- let transition = key_trans_of_int r.trans in
575575- Ok (Key_change { kid = r.spi; transition }, consumed))
576576- | t when t = tag_alarm_reset -> Ok (Alarm_reset, consumed)
577577- | t when t = tag_self_test ->
578578- if data_len >= 1 then
579579- match Wire.Codec.decode success_codec buf data_off with
580580- | Error _ -> Ok (Self_test { success = true }, consumed)
581581- | Ok success -> Ok (Self_test { success }, consumed)
582582- else Ok (Self_test { success = true }, consumed)
583583- | t when t = tag_log_erased -> Ok (Log_erased, consumed)
584584- | t -> Error (`Invalid_tag t)
517517+ | Ok { tag; data_len } -> (
518518+ if remaining < tlv_header_size + data_len then Error `Truncated
519519+ else
520520+ let data_off = off + tlv_header_size in
521521+ let consumed = tlv_header_size + data_len in
522522+ let decode_frame_dir_event mk =
523523+ match decode_spi_code_vcid buf data_off data_len with
524524+ | Error _ as e -> e
525525+ | Ok (spi, code, vcid) ->
526526+ let direction = direction_of_int code in
527527+ Ok (mk ~spi ~direction ~vcid, consumed)
528528+ in
529529+ match tag with
530530+ | t when t = tag_auth_failure -> (
531531+ match decode_spi_code_vcid buf data_off data_len with
532532+ | Error _ as e -> e
533533+ | Ok (spi, code, vcid) ->
534534+ let reason = auth_reason_of_int code in
535535+ Ok (Auth_failure { spi; reason; vcid }, consumed))
536536+ | t when t = tag_frame_protected ->
537537+ decode_frame_dir_event (fun ~spi ~direction ~vcid ->
538538+ Frame_protected { spi; direction; vcid })
539539+ | t when t = tag_frame_unprotected ->
540540+ decode_frame_dir_event (fun ~spi ~direction ~vcid ->
541541+ Frame_unprotected { spi; direction; vcid })
542542+ | t when t = tag_iv_warning -> (
543543+ if data_len < iv_warning_data_size then Error `Truncated
544544+ else
545545+ match Wire.Codec.decode iv_warning_codec buf data_off with
546546+ | Error _ -> Error `Truncated
547547+ | Ok r ->
548548+ Ok
549549+ ( Iv_warning { spi = r.spi; remaining = r.remaining },
550550+ consumed ))
551551+ | t when t = tag_sa_change -> (
552552+ if data_len < spi_trans_data_size then Error `Truncated
553553+ else
554554+ match Wire.Codec.decode spi_trans_codec buf data_off with
555555+ | Error _ -> Error `Truncated
556556+ | Ok r ->
557557+ let transition = sa_trans_of_int r.trans in
558558+ Ok (Sa_change { spi = r.spi; transition }, consumed))
559559+ | t when t = tag_key_change -> (
560560+ if data_len < spi_trans_data_size then Error `Truncated
561561+ else
562562+ match Wire.Codec.decode spi_trans_codec buf data_off with
563563+ | Error _ -> Error `Truncated
564564+ | Ok r ->
565565+ let transition = key_trans_of_int r.trans in
566566+ Ok (Key_change { kid = r.spi; transition }, consumed))
567567+ | t when t = tag_alarm_reset -> Ok (Alarm_reset, consumed)
568568+ | t when t = tag_self_test ->
569569+ if data_len >= 1 then
570570+ match Wire.Codec.decode success_codec buf data_off with
571571+ | Error _ -> Ok (Self_test { success = true }, consumed)
572572+ | Ok success -> Ok (Self_test { success }, consumed)
573573+ else Ok (Self_test { success = true }, consumed)
574574+ | t when t = tag_log_erased -> Ok (Log_erased, consumed)
575575+ | t -> Error (`Invalid_tag t))
585576586577(* {1 Dump Log PDU (PID=3)}
587578
+8-9
lib/sdls.ml
···85858686let p_iv_len = Wire.Param.input "iv_len" Wire.uint16be
8787let p_sn_len = Wire.Param.input "sn_len" Wire.uint16be
8888-8988let f_spi = Wire.Field.v "SPI" Wire.uint16be
9089let f_iv = Wire.Field.v "IV" (Wire.byte_array ~size:(Wire.Param.expr p_iv_len))
9190let f_sn = Wire.Field.v "SN" (Wire.byte_array ~size:(Wire.Param.expr p_sn_len))
···123122 let need = sec_hdr_len sa in
124123 match Binary.Reader.ensure r need with
125124 | Error (`Truncated _) -> Error Invalid_frame_length
126126- | Ok () ->
125125+ | Ok () -> (
127126 let buf = Binary.Reader.bytes r need in
128127 let env =
129128 Wire.Codec.env sec_hdr_codec
130129 |> Wire.Param.bind p_iv_len sa.config.iv_len
131130 |> Wire.Param.bind p_sn_len sa.config.sn_len
132131 in
133133- (match Wire.Codec.decode_with sec_hdr_codec env buf 0 with
134134- | Ok sh -> Ok sh
135135- | Error _ -> Error Invalid_frame_length)
132132+ match Wire.Codec.decode_with sec_hdr_codec env buf 0 with
133133+ | Ok sh -> Ok sh
134134+ | Error _ -> Error Invalid_frame_length)
136135137136let write_security_trailer w (st : Sa.security_trailer) =
138137 Binary.Writer.bytes w st.mac
···140139let read_security_trailer ~(sa : Sa.entry) r =
141140 match Binary.Reader.ensure r sa.config.mac_len with
142141 | Error (`Truncated _) -> Error Invalid_frame_length
143143- | Ok () ->
142142+ | Ok () -> (
144143 let buf = Binary.Reader.bytes r sa.config.mac_len in
145144 let env =
146145 Wire.Codec.env sec_trl_codec
147146 |> Wire.Param.bind p_mac_len sa.config.mac_len
148147 in
149149- (match Wire.Codec.decode_with sec_trl_codec env buf 0 with
150150- | Ok st -> Ok st
151151- | Error _ -> Error Invalid_frame_length)
148148+ match Wire.Codec.decode_with sec_trl_codec env buf 0 with
149149+ | Ok st -> Ok st
150150+ | Error _ -> Error Invalid_frame_length)
152151153152let encode_security_header (sh : Sa.security_header) =
154153 let len = 2 + Bytes.length sh.iv + Bytes.length sh.sn in