Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 5x 5x 2x 5x 5x 5x 1x 4x 4x 1x 1x 1x 1x 2x 2x 2x 2x 1x 1x 1x 1x 5x 5x 1x 1x 1x 1x 2x 2x 9x 5x 5x 1x 4x | import {ASN1Assignment} from './asn1/ASN1Assignment';
import {ASN1ComponentType} from './asn1/ASN1ComponentType';
import {ASN1DefinedType} from './asn1/ASN1DefinedType';
import {ASN1Module} from './asn1/ASN1Module';
import {ASN1NamedType} from './asn1/ASN1NamedType';
import {ASN1Sequence} from './asn1/ASN1Sequence';
import {ASN1Message, ASN1Type} from './interfaces/ASN1Message';
import {Props} from './interfaces/Props';
import {TagClass} from './interfaces/TagClass';
import {TagUniversal} from './interfaces/TagUniversal';
export class ASN1Generator {
asn1Message: ASN1Message;
constructor(public module: ASN1Module, public type: string) {
const assignment = module.getAssignment(type);
this.asn1Message = this.generateFromAssignement(assignment);
}
generateFromJson(data: Props): ASN1Message {
generateFromJson(this.asn1Message, data);
return this.asn1Message;
}
generateFromAssignement(assignment: ASN1Assignment): ASN1Message {
Eif (assignment.type instanceof ASN1Sequence) {
return this.generateFromSequence(assignment.type);
}
throw new Error('not yet implemented');
}
generateFromSequence(sequence: ASN1Sequence): ASN1Message {
const message = {
isConstructed: true,
tagClass: TagClass.UNIVERSAL,
tagCode: TagUniversal.SEQUENCE.code,
tagLabel: TagUniversal.SEQUENCE.label,
value: [] as ASN1Message[],
};
for (let i = 0; i < sequence.components.length; i++) {
const msg = this.generateFromComponent(sequence.components[i]);
message.value.push(msg);
}
return message;
}
generateFromComponent(component: ASN1ComponentType): ASN1Message {
Iif (!(component instanceof ASN1NamedType)) {
throw new Error('only implement ASN1NamedType at this time');
}
let message: ASN1Message;
Iif (component.type instanceof ASN1Sequence) {
message = this.generateFromSequence(component.type);
} else if (component.type instanceof ASN1DefinedType) {
message = this.generateFromDefinedType(component.type);
} else {
message = {
isConstructed: false,
tagClass: TagClass.UNIVERSAL,
tagCode: -1,
tagLabel: 'TBD',
value: null,
};
switch (component.type.constructor.name) {
case 'ASN1BooleanType':
message.tagLabel = TagUniversal.BOOLEAN.label;
message.tagCode = TagUniversal.BOOLEAN.code;
message.value = false;
break;
case 'ASN1GeneralStringType':
message.tagLabel = TagUniversal.GENERAL_STRING.label;
message.tagCode = TagUniversal.GENERAL_STRING.code;
message.value = 'to be replaced';
break;
case 'ASN1IA5StringType':
message.tagLabel = TagUniversal.IA5STRING.label;
message.tagCode = TagUniversal.IA5STRING.code;
message.value = 'to be replaced';
break;
case 'ASN1IntegerType':
message.tagLabel = TagUniversal.INTEGER.label;
message.tagCode = TagUniversal.INTEGER.code;
message.value = 1337;
break;
default:
throw new Error(
'not yet implemented: type = ' + component.type.constructor.name
);
}
}
message.tagName = component.name;
return message;
}
generateFromDefinedType(type: ASN1DefinedType): ASN1Message {
const assignment = this.module.getAssignment(type.name);
const message = this.generateFromAssignement(assignment);
message.tagDefinedType = type.name;
return message;
}
}
function generateFromJson(msg: ASN1Message, data: Props) {
const array = msg.value as ASN1Message[];
for (const key of Object.keys(data)) {
const cell = array.find(c => c.tagName === key);
Iif (cell === undefined) {
throw new Error('cell not found for key = ' + key);
}
if (cell.tagCode === TagUniversal.SEQUENCE.code) {
generateFromJson(cell, data[key] as Props);
} else {
cell.value = data[key] as ASN1Type;
}
}
}
|