summaryrefslogtreecommitdiffstats
path: root/comm/third_party/asn1js/src/internals/LocalOctetStringValueBlock.ts
blob: fb2dfd562b9c6811408eb1dd54fd485091e152a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/* eslint-disable @typescript-eslint/ban-ts-comment */
import { ViewWriter } from "../ViewWriter";
import { HexBlockJson, HexBlockParams, HexBlock } from "../HexBlock";
import { END_OF_CONTENT_NAME, OCTET_STRING_NAME } from "./constants";
import { LocalConstructedValueBlockParams, LocalConstructedValueBlockJson, LocalConstructedValueBlock } from "./LocalConstructedValueBlock";
import type { OctetString } from "../OctetString";

export interface ILocalOctetStringValueBlock {
  isConstructed: boolean;
}

export interface LocalOctetStringValueBlockParams extends HexBlockParams, LocalConstructedValueBlockParams, Partial<ILocalOctetStringValueBlock> {
  value?: OctetString[];
}

export interface LocalOctetStringValueBlockJson extends HexBlockJson, LocalConstructedValueBlockJson, ILocalOctetStringValueBlock { }

export class LocalOctetStringValueBlock extends HexBlock(LocalConstructedValueBlock) {

  public static override NAME = "OctetStringValueBlock";

  public isConstructed: boolean;

  constructor({
    isConstructed = false,
    ...parameters
  }: LocalOctetStringValueBlockParams = {}) {
    super(parameters);

    this.isConstructed = isConstructed;
  }

  public override fromBER(inputBuffer: ArrayBuffer, inputOffset: number, inputLength: number): number {
    let resultOffset = 0;

    if (this.isConstructed) {
      this.isHexOnly = false;

      resultOffset = LocalConstructedValueBlock.prototype.fromBER.call(this, inputBuffer, inputOffset, inputLength);
      if (resultOffset === -1)
        return resultOffset;

      for (let i = 0; i < this.value.length; i++) {
        const currentBlockName = (this.value[i].constructor as typeof LocalOctetStringValueBlock).NAME;

        if (currentBlockName === END_OF_CONTENT_NAME) {
          if (this.isIndefiniteForm)
            break;
          else {
            this.error = "EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only";

            return -1;
          }
        }

        if (currentBlockName !== OCTET_STRING_NAME) {
          this.error = "OCTET STRING may consists of OCTET STRINGs only";

          return -1;
        }
      }
    } else {
      this.isHexOnly = true;

      resultOffset = super.fromBER(inputBuffer, inputOffset, inputLength);
      this.blockLength = inputLength;
    }

    return resultOffset;
  }

  public override toBER(sizeOnly?: boolean, writer?: ViewWriter): ArrayBuffer {
    if (this.isConstructed)
      return LocalConstructedValueBlock.prototype.toBER.call(this, sizeOnly, writer);

    return sizeOnly
      ? new ArrayBuffer(this.valueHexView.byteLength)
      : this.valueHexView.slice().buffer;
  }

  public override toJSON(): LocalOctetStringValueBlockJson {
    return {
      ...super.toJSON(),
      isConstructed: this.isConstructed,
    } as LocalOctetStringValueBlockJson;
  }

}

export interface LocalOctetStringValueBlock {
  /**
   * @deprecated since version 3.0.0
   */
  // @ts-ignore
  valueBeforeDecode: ArrayBuffer;
  /**
   * Binary data in ArrayBuffer representation
   *
   * @deprecated since version 3.0.0
   */
  // @ts-ignore
  valueHex: ArrayBuffer;
}