YateOTA compatible keystore

This page describes how a Keystore API should look like to be compatible with YateOTA, in case you opt to build your own Keystore/middleware instead of deploying YateOTA with YateHSS/HLR.

The two main operations of the Keystore when working with YateOTA:

* return sim specific information to build OTA message: kic,kid,kik,counter and profile specific info: spi, cla, kik alb.kid alg, tar ram, tar rfm sim, tar rfm usim. This information should also contain the subscriber MSISDN, as this is needed to deliver the update to using the SMSC connection

* update counter value per IMSI/ICCID/MSISDN when YateOTA deems it necessary

The URLs listed below are configurable, but YateOTA will do a HTTP GET request to the them after replacing IMSI / MSISDN / ICCid, depending on how campaign is made.

Retrieve sim info to build messages

URL SIM Info:

http://ip_datastore/api.php?request=get_sims&imsi=${imsi}&msisdn=${msisdn}&iccid=${iccid}

YateOTA does a GET request to url_get_siminfo after substituting imsi/msisdn/iccid, depending on how campaign was created.

Response should have:

Content-Type: application/json

Body:

 

				
					{
    "code": 0,
    "sim_range": [
        {
            "imsi": "232030000020009",
            "msisdn": "43332300009",
            "pin": "0000",
            "pin2": "0311",
            "puk": "56149650",
            "puk2": "76986469",
            "adm1": "71711968",
            "ota": {
                "kic": "5CDC70C28563FEF9966E6DC75EA0D4C46B5BEABB270697CA",
                "kid": "39EE78062AD5B798851814042AA8FA81662DF84ACCD0A462",
                "kik": "127945D0E67A315545A68897EBF7CEC1B6D442458CCF9AC3"
            },
            "ota_counter": "0000000002",
            "ota_profile": {
                "cla": "80",
                "spi": "1621",
                "kid": "19",
                "kic": "19",
                "tar_ram": "000000",
                "tar_rfm_sim": "B00010",
                "tar_rfm_usim": "B00001"
            }
        }
    ]
}
				
			

Where:

code”: 0 – success

and single object in “sim_range”. Essential fields for YateOTA are:

* msisdn – we need it to deliver campaign to it. It should appear in response even if campaign is done based on msisdn and it appears in url_get_siminfo

* ota object

* ota_counter

* ota_profile_object

All extra fields in sim object are ignored.

The other fields in my example pin/puk/adm are not needed for yate-ota campaign manager but you need to know them to use Local mode with card reader attached

HTTP errors / code !=0 in response are considered errors.

Empty sim_range array is mapped to “Unknown”. Participant state is automatically marked as failed.

Update counter field and indication of this comes in response from SIM card

URL Update Counter:

http://ip_datastore/api.php?request=set_sim&node=hss&imsi=${imsi}&msisdn=${msisdn}&ota_counter=${ota_counter}

YateOTA will increment counter it received when calling get_siminfo when

  • response from sim card indicates that
  • no response is received in configured expire time if “Update counter on expire” is checked in configuration wizard

Response should have:

Content-Type: application/json

Body:

				
					

{
"code": 0
}