import { AxdrOctetString } from "../asn1.axdr/AxdrOctetString"; import { Apdu } from "../axdr/Apdu"; import { M698pdu } from "../axdr/M698pdu"; import { MAC } from "../axdr/MAC"; import { RN } from "../axdr/RN"; import { RN_MAC } from "../axdr/RN_MAC"; import { Security_Request, SubChoiceAppUnit, SubChoiceDataValid } from "../axdr/Security_Request"; import { SID } from "../axdr/SID"; import { SID_MAC } from "../axdr/SID_MAC"; import { Unsigned32 } from "../axdr/Unsigned32"; import { DataUtils } from "../DataUtils"; import { LinkOption } from "../opt/LinkOption"; import { RequestOption } from "../opt/RequestOption"; import { SecurityRequestOption } from "../opt/SecurityRequestOption"; import { buildLinkFrame } from "./BuildTools"; import { resultCode } from "../tools/DataTool"; export function buildSecurityRequest(sec_opt: SecurityRequestOption, link_opt: LinkOption, req_opt: RequestOption): [number, String] { let result: [number, String]; if (sec_opt.dataValidChoice == null || sec_opt.appUnitChoice == null) { result = [resultCode.emptyError, "param is not allow empty"]; return result; } if (req_opt.time_tag == true) { result = [resultCode.illegalError, "security request not allow timetag"]; return result; } let m698pdu = new M698pdu(); let security_request = new Security_Request(); let subChoiceAppUnit = new SubChoiceAppUnit(); let dataVaild = new SubChoiceDataValid(); if (sec_opt.appUnitChoice == 1) { let cipher_unit = new AxdrOctetString(); cipher_unit.set_dataCode(DataUtils.toBytes(sec_opt.appDataUnit.toString())); subChoiceAppUnit.setAppUnit(cipher_unit); } else if (sec_opt.appUnitChoice == 0) { let plain_unit = new AxdrOctetString(); plain_unit.set_dataCode(DataUtils.toBytes(sec_opt.appDataUnit.toString())); subChoiceAppUnit.setAppUnitPalin(plain_unit); } else { throw new Error("no such index"); } if (sec_opt.dataValidChoice == 1) { let rn = new RN(); rn.set_oct_string(DataUtils.toBytes(sec_opt.rn.oct.toString())); dataVaild.setRn(rn); } else if (sec_opt.dataValidChoice == 2) { let rn_mac = new RN_MAC(); let rn = new RN(); let mac = new MAC(); rn.set_oct_string(DataUtils.toBytes(sec_opt.rn_mac.oct.toString())); mac.set_oct_string(DataUtils.toBytes(sec_opt.rn_mac.mac.toString())); rn_mac.set_all(rn, mac); dataVaild.setRnMac(rn_mac); } else if (sec_opt.dataValidChoice == 3) { let sid = new SID(); let inid = new Unsigned32(); let fdata = new AxdrOctetString(); inid.set_dataCode(DataUtils.toBytes(sec_opt.sid.sid.toString())); fdata.set_dataCode(DataUtils.toBytes(sec_opt.sid.attachData.toString())); sid.set_all(inid, fdata); dataVaild.setSID(sid); } else if (sec_opt.dataValidChoice == 0) { let sid_mac = new SID_MAC(); let sid = new SID(); let mac = new MAC(); let inid = new Unsigned32(); let fdata = new AxdrOctetString(); inid.set_dataCode(DataUtils.toBytes(sec_opt.sid_mac.sid.toString())); fdata.set_dataCode(DataUtils.toBytes(sec_opt.sid_mac.attachData.toString())); sid.set_all(inid, fdata); mac.set_oct_string(DataUtils.toBytes(sec_opt.sid_mac.mac.toString())); sid_mac.set_all(sid, mac); dataVaild.setSidMac(sid_mac); } else { throw new Error("no such index"); } security_request.set_all(subChoiceAppUnit, dataVaild); m698pdu.setSecurity_Request(security_request); let apdu = new Apdu(m698pdu); let frame = buildLinkFrame(apdu, link_opt, req_opt); result = [resultCode.success, frame] return result; }