• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# SPDX-License-Identifier: GPL-2.0-only
2# This file is part of Scapy
3# See https://scapy.net/ for more information
4# Copyright (C) Philippe Biondi <phil@secdev.org>
5
6"""
7ASN.1 Packet
8
9Packet holding data in Abstract Syntax Notation (ASN.1).
10"""
11
12from scapy.base_classes import Packet_metaclass
13from scapy.packet import Packet
14
15from typing import (
16    Any,
17    Dict,
18    Tuple,
19    Type,
20    cast,
21    TYPE_CHECKING,
22)
23
24if TYPE_CHECKING:
25    from scapy.asn1fields import ASN1F_field  # noqa: F401
26
27
28class ASN1Packet_metaclass(Packet_metaclass):
29    def __new__(cls,
30                name,  # type: str
31                bases,  # type: Tuple[type, ...]
32                dct  # type: Dict[str, Any]
33                ):
34        # type: (...) -> Type[ASN1_Packet]
35        if dct["ASN1_root"] is not None:
36            dct["fields_desc"] = dct["ASN1_root"].get_fields_list()
37        return cast(
38            'Type[ASN1_Packet]',
39            super(ASN1Packet_metaclass, cls).__new__(cls, name, bases, dct),
40        )
41
42
43class ASN1_Packet(Packet, metaclass=ASN1Packet_metaclass):
44    ASN1_root = cast('ASN1F_field[Any, Any]', None)
45    ASN1_codec = None
46
47    def self_build(self):
48        # type: () -> bytes
49        if self.raw_packet_cache is not None:
50            return self.raw_packet_cache
51        return self.ASN1_root.build(self)
52
53    def do_dissect(self, x):
54        # type: (bytes) -> bytes
55        return self.ASN1_root.dissect(self, x)
56