ts_31_102: Add DF.SAIP support

DF.SAIP (SIMalliance Interoperable Profile) is not part of 31.102,
but something from the eSIM/eUICC universe of TCA (formerly known as
SIMalliance).  However, as 3GPP does not specify how/where the card
stores the information required for SUCI calculation, the
TCA/SIMalliance standard is the only standard there is.  Some CardOS
start to use this standard even for non-eSIM/eUICC use cases.

Change-Id: Iffb65af335dfdbd7791fca9a0a6ad4b79814a57c
diff --git a/pySim/ts_31_102.py b/pySim/ts_31_102.py
index 77b8325..76f1358 100644
--- a/pySim/ts_31_102.py
+++ b/pySim/ts_31_102.py
@@ -1451,6 +1451,18 @@
         self.add_files(files)
 
 
+class DF_SAIP(CardDF):
+    """This is not really TS 31.102 but part of the eUICC Profile Package: Interoperable Format Technical
+    Specification as released by TCA (formerly SIMalliance)"""
+    def __init__(self, fid='5FD0', name='DF.SAIP', desc='SIMalliance Interoperable Profile', **kwargs):
+        super().__init__(fid=fid, name=name, desc=desc, **kwargs)
+        files = [
+            # uses the same file format as DF.5GS/EF_SUCI_Calc_Info, but different FID
+            EF_SUCI_Calc_Info(fid='4f01')
+        ]
+        self.add_files(files)
+
+
 class ADF_USIM(CardADF):
     def __init__(self, aid='a0000000871002', name='ADF.USIM', fid=None, sfid=None,
                  desc='USIM Application'):
@@ -1576,6 +1588,7 @@
             DF_USIM_5GS(service=[122, 123, 124, 125, 126, 127, 129, 130]),
             DF_SNPN(service=[143,146]),
             DF_5G_ProSe(service=139),
+            DF_SAIP(),
         ]
         self.add_files(files)