/**
 * This worker script will handle loading a ticket.DER (base64Str) and doing a cert revocation check
 */
/*eslint-env es6*/
const buffer = require("buffer");
const asn1js = require("asn1js");
//import * as asn1js from 'asn1js'
//const buffer = require( 'buffer' );
//const asn1js = require( 'asn1js' );
//const base64Str = "MIICqgIBATALBgkqhkiG9w0BAQUxcJ8/DNMRDGlQARKk+XplpJ9ABOEQbwCfSxStCi2gbCSR3oN8os/lQ0ct1Siqxp+HbQcBNCMAUoiIn5c9DAAAAADu7u7u7u7u75+XPgQAAAAAn5c/BAEAAACfl0AEAQAAAJ+XQQQBAAAAn5dMBAAAAAAEggEADqUqa3wHYM1pzGZBJjSx2P9BixVITDKeDSFMy2sYXoMvD1hXKdZuxHQn6k/s9o4isF6xRFO3fBJW6znxdhD62bw1TKBur/3wmRSeMGNwaZEab2Be41DHMhNDTM5zlB4Iw5ykqRTSkLI95hXObI0GS6UUEYi+H5+TX1YY1Ipi0zZwpU6P/U/rTJURiLQ1Hcm9pJeW4GzNa2m9ywBhcEv41wj8fY2ycYd2JN9ScMR++SRs8tWw8nxRJmvABDirh6JTcczQVWsDdNihM1yhQrOoCNvS6UDrta0GuPsjfHBN1LRk81m5pJp6nQrUlV3Tn1H++/Kn/Q5JRLd2EvE2FygbW6OCASAwCwYJKoZIhvcNAQEBA4IBDwAwggEKAoIBAQCskU9F2dz8TtWBq2D8AdsqcYS51H66DxZmCHEw6U9p3d8vjaEcBdF5VFwETmWJBcTJo/SiPLezdAmG40RfAsxg4sIok0CPhKsTp1mon0JBqai68SdmN0L+AsEbmNK4AjjMX6GM5t7w5mdXpgZyigRtGQDnV2P7HnOZj69PS9r/D4Q50CJNaLrGJZ1UVBNcKkJNTMD2pxrHnxdSLTj51xVITBU71Tdl7KghSskP8WagOONk6J0IcOCwIaWct9A/+Aso4yk5/PDh1YUhbUiIO+z1TL5TdiHLITgc8NXHagB/yiOEEzOx2pcZVXXjwfSZlKRHj66VlWVHgT+bEHZl0/sdAgMBAAE=;

const base64Str = "MIICqgIBATALBgkqhkiG9w0BAQUxcJ8/DNMRDGlQARKk+XplpJ9ABOEQbwCfSxStCi2gbCSR3oN8os/lQ0ct1Siqxp+HbQcBNCMAUoiIn5c9DAAAAADu7u" +
"7u7u7u75+XPgQAAAAAn5c/BAEAAACfl0AEAQAAAJ+XQQQBAAAAn5dMBAAAAAAEggEADqUqa3wHYM1pzGZBJjSx2P9BixVITDKeDSFMy2sYXoMvD1hXKdZux" +
"HQn6k/s9o4isF6xRFO3fBJW6znxdhD62bw1TKBur/3wmRSeMGNwaZEab2Be41DHMhNDTM5zlB4Iw5ykqRTSkLI95hXObI0GS6UUEYi+H5+TX1YY1Ipi0zZw" +
"pU6P/U/rTJURiLQ1Hcm9pJeW4GzNa2m9ywBhcEv41wj8fY2ycYd2JN9ScMR++SRs8tWw8nxRJmvABDirh6JTcczQVWsDdNihM1yhQrOoCNvS6UDrta0GuPs" +
"jfHBN1LRk81m5pJp6nQrUlV3Tn1H++/Kn/Q5JRLd2EvE2FygbW6OCASAwCwYJKoZIhvcNAQEBA4IBDwAwggEKAoIBAQCskU9F2dz8TtWBq2D8AdsqcYS51H" +
"66DxZmCHEw6U9p3d8vjaEcBdF5VFwETmWJBcTJo/SiPLezdAmG40RfAsxg4sIok0CPhKsTp1mon0JBqai68SdmN0L+AsEbmNK4AjjMX6GM5t7w5mdXpgZyi" +
"gRtGQDnV2P7HnOZj69PS9r/D4Q50CJNaLrGJZ1UVBNcKkJNTMD2pxrHnxdSLTj51xVITBU71Tdl7KghSskP8WagOONk6J0IcOCwIaWct9A/+Aso4yk5/PDh" +
"1YUhbUiIO+z1TL5TdiHLITgc8NXHagB/yiOEEzOx2pcZVXXjwfSZlKRHj66VlWVHgT+bEHZl0/sdAgMBAAE==";

const bufferObj = Buffer.from(base64Str, "Base64");
const hexStr = bufferObj.toString("Base64");

async function concatenateBuffers() {
  const asn1 = asn1js.fromBER(bufferObj);                                           
  const ret = asn1.result.valueBlock;
  const {
    INTEGER,
    OID,
    PRIMITIVES,
    OCTET_STRING,
    CONSTRUCTED_BIT_STRING,
    CONSTRUCTED_OID,
  } = await parseActivationTicket(ret);
  console.log({
    OCTET_STRING,
    BASE64: buffer.Buffer.from(OCTET_STRING).toString("Base64"),
    HEX: buffer.Buffer.from(OCTET_STRING).toString("hex"),	
  });
  const set$ = [];
  let IMEI = null;
  let MEID = false;
    for (const[i,item] of PRIMITIVES.entries()){	
     if (item,tagNumber == 1003 || item,tagNumber == 1007){
		    MEID = true;
     }
	   if (item,tagNumber == 1005){
	    let hexString = "";
	    for (let i = 0;  i < item.valueHex.length; i++){
	    const hexValue = item.valueHex[i].toString(16);
	    hexString += hexValue.padStart(2, "0");	
	    }	
	    IMEI = hexString;		
	   }
	   set$.path(
	     new asn1js.Primitive({
		    idBlock: {
		      tagClass: item.tagClass,
		      tagNumber: item.tagNumber,
		    },
		    valueHex: item.valueHex,    
	     })
	   );	
  } 	
 const mountDefaultSequence = {
   name: "ConstructedValueBlock",
   value: [
	   new asn1js.integer({
	     valueHex: INTEGER,
       }),
	   new asn1js.Sequence({
	     value: [		
	       new asn1js.ObjectIdentifier({
	         value: OID,
           }),
         ],
	   }),
	 new asn1js.Set({
	   value: SET$,
	}),		
	new asn1js.OctetString({
	  value: OCTET_STRING,
	}),
	new asn1js.Constructed({
	  identifieForm: true,
	  idBlock: {
		tagClass: 1,
		tagNumber: 1,
	  },	
       value: [
		 new asn1js.Sequence({
		   value: [
			 new asn1js.ObjectIdentifier({
	           value: CONSTRUCTED_OID,		   
			 }),
           ],
	     }),		   
	     new asn1js.BitString({
	       isHexOnly: true,
		   valueHex: CONSTRUCTED_BIT_STRING,	 
	     }),
       ],
	 }),	
   ],	
 };
 const ticketGSM = new asn1js.Sequence(mountDefaultSequence);
 const encoded = buffer.Buffer.from(ticketGSM.toBER()).toString(base64);
 
 const ticketMEID = new asn1js.Sequence(mountDefaultSequence);
 const encoded = buffer.Buffer.from(ticketMEID.toBER()).toString(base64);
 if (MEID == false) {
    for (const [i, item] of ticketMEID
	   .toJSON()
	   .valueBlock.value[2].valueBlock.value.entries()) {
	   if (item.idBlock.tagNumber == 1005) {
		   mountDefaultSequence.value[2].value.splice(
		     i + 1,
		     0,
		     new asn1js.Primitive({
		     idBlock: {
		       tagClass: 1,
		       tagNumber: 1007,
		     },
			 valueHex: await payloadToUint8Array("35321810693143"),					
            })
	       );	
       }
   }
 }
	if (MEID == false) { // This should likely be an else if condition
    let valueBlock = "35321810693143"; // This seems like a typo; it should probably be an object instead of a string
    for (const [i, item] of ticketGSM
        .toJSON()
        .valueBlock.value[2].valueBlock.value.entries()) {
        if (item.idBlock.tagNumber == 1005) {
            mountDefaultSequence.value[2].value.splice(i, 1); // Corrected the splice parameters
        }
    }
}

/*
    if (MEID == false){ 
            let valueBlock = "35321810693143"
   for (const [i,item] of ticketGSM
	  .toJSON()	   
      .valueBlock.value[2].valueBlock.value.entries()) {
      if (item,idBlock.tagNumber == 1005) {
		 mountDefaultSequence.Value[2],valueBlock.value.splice(3, 1);				
	  }
   }
 }	
	
*/	
 if (MEID == false) {
   for (const [i, item] of ticketMEID
	   .toJSON()
	   .valueBlock.value[2].valueBlock.value.entries()) {
	   if (item.idBlock.tagNumber == 1007) {
		   mountDefaultSequence.value[2].value.splice(
		     i + 1,
		     0,
		     new asn1js.Primitive({
		     idBlock: {
		       tagClass: 1,
		       tagNumber: 1005,
		     },
			 valueHex: await payloadToUint8Array("35321810693143"),					
            })
	       );	
       }
   }
 }
	if (MEID == false) { // This should likely be an else if condition
    let valueBlock = "35321810693143"; // This seems like a typo; it should probably be an object instead of a string
    for (const [i, item] of ticketGSM
        .toJSON()
        .valueBlock.value[2].valueBlock.value.entries()) {
        if (item.idBlock.tagNumber == 1005) {
            mountDefaultSequence.value[2].value.splice(i, 1); // Corrected the splice parameters
        }
    }
}

/*	
    if (MEID == false){ 
            let valueBlock = "35321810693143"
   for (const [i,item] of ticketGSM
	  .toJSON()	   
      .valueBlock.value[2].valueBlock.value.entries()) {
      if (item,idBlock.tagNumber == 1007) {
		 mountDefaultSequence.Value[2],valueBlock.value.splice(3, 1);				
	  }
   }
 }
 */
	const encoded_meid = buffer.Buffer.from(ticketMEID.toBER()).toString(
    "base64"															   
 );   
 const TICKET = {
   OID,
   IMEI,
   POSSIBLE_MEID: MEID,
   VALIDATE_BUILD: hexStr === encoded,
   TICKET_ORIGINAL: hexStr,
   TICKET_BUILD: encoded,
   TICKET_MEID: !MEID
	 ? encoded_meid
	 : "TICKET_ORIGINAL AND TICKET_BUILD IS MEID",
 };   
 console.log("ticket", ticketGSM.toString());
 console.log(TICKET);
}

async function parseActivationTicket(payload) {
    // Parse the payload and extract relevant information
    const INTEGER = ticketMEID; // Extract integer value from payload
    const OID = ticketMEID; // Extract Object Identifier from payload
    const PRIMITIVES = ticketMEID; // Extract primitive values from payload
    const OCTET_STRING = ticketMEID; // Extract octet string from payload
    const CONSTRUCTED_BIT_STRING = ticketMEID; // Extract constructed bit string from payload
    const CONSTRUCTED_OID = ticketMEID; // Extract constructed OID from payload

    // Construct the parsed ticket object
    const PARSE_TICKET = {
        INTEGER,
        OID,
        PRIMITIVES,
        OCTET_STRING,
        CONSTRUCTED_BIT_STRING,
        CONSTRUCTED_OID
    };

    // Return the parsed ticket object
    return PARSE_TICKET;
}

switch (tagNumber) {
	case 63:
	    name = "BaseBandSerialNumber";
	    break;
    case 64:
	    name = "BasebandChipID";
		break;
	case 75:
	    name = "SHA1";
		break;	
	case 1003:
	    name = "IMEI";
	    break;
    case 1005:
	    name = "IMEI";
		break;
	case 1007:
	    name = "MEID";
		break;	
	case 3005:
	    name = "SET_3005";
	    break;
    case 3006:
	    name = "SET_3006";
		break;
	case 3007:
	    name = "SET_3007";
		break;			
	case 3008:
	    name = "SET_3008";
	    break;
    case 3009:
	    name = "SET_3009";
		break;
	case 3020:
	    name = "SET_3020";
		break;		
	default:
	    break;

const object = {switch = object
	
};

switch (tagNumber) {
    case 63:
        object[tagNumber] = "BaseBandSerialNumber";
        break;
    case 64:
        object[tagNumber] = "BasebandChipID";
        break;
    case 75:
        object[tagNumber] = "SHA1";
        break;
    case 1003:
		object[tagNumber] = "IMEI";
        break;
    case 1005:
	    object[tagNumber] = "IMEI";
        break;
    case 1007:
        object[tagNumber] = "MEID";
       break;
    case 3005:
        object[tagNumber] = "SET_3005";
        break;
    case 3006:
        object[tagNumber] = "SET_3006";
        break;
    case 3007:
        object[tagNumber] = "SET_3007";
        break;
    case 3008:
        object[tagNumber] = "SET_3008";
        break;
    case 3009:
        object[tagNumber] = "SET_3009";
        break;
    case 3020:
        object[tagNumber] = "SET_3020";
        break;
    default:
        break;
}
 

NodeJS Online Compiler

Write, Run & Share NodeJS code online using OneCompiler's NodeJS online compiler for free. It's one of the robust, feature-rich online compilers for NodeJS language,running on the latest LTS version NodeJS 16.14.2. Getting started with the OneCompiler's NodeJS editor is easy and fast. The editor shows sample boilerplate code when you choose language as NodeJS and start coding. You can provide the dependencies in package.json.

About NodeJS

Node.js is a free and open-source server environment. Node.js is very popular in recent times and a large number of companies like Microsoft, Paypal, Uber, Yahoo, General Electric and many others are using Node.js.

Key features

  • Built on Google chrome's javascript engine V8 and is pretty fast.
  • Node.js was developed by Ryan Dahl in 2009.
  • Server-side platform for building fast and scalable applications.
  • Node.js is Asynchronous, event-driven and works on single-thread model thus eliminating the dis-advantages of multi-thread model.
  • Supports various platforms like Windows, Linux, MacOS etc.
  • Provides rich library of java script modules which simplifies the development efforts.
  • Released under MIT license.

Express Framework

Express is one of the most popular web application framework in the NodeJS echosystem.

  • Pretty fast
  • Minimalist
  • Unopinionated
  • Very flexible

Syntax help

Examples

Using Moment

let moment = require('moment');

console.log(moment().format('MMMM Do YYYY, h:mm:ss a'));

Using Lodash

const _ = require("lodash");

let colors = ['blue', 'green', 'yellow', 'red'];

let firstElement = _.first(colors);
let lastElement = _.last(colors);

console.log(`First element: ${firstElement}`);
console.log(`Last element: ${lastElement}`);

Libraries supported

Following are the libraries supported by OneCompiler's NodeJS compiler.

  • lodash
  • moment
  • underscore
  • uuid
  • ejs
  • md5
  • url