Add FPLMN read and program

Change-Id: I9ce8c1af691c28ea9ed69e7b5f03f0c02d1f029b
diff --git a/pySim/cards.py b/pySim/cards.py
index 0f34f9b..d3a43f3 100644
--- a/pySim/cards.py
+++ b/pySim/cards.py
@@ -381,6 +381,22 @@
         data, sw = self._scc.update_binary(EF_USIM_ADF_map['EHPLMN'], ehplmn)
         return sw
 
+    def read_fplmn(self):
+        res, sw = self._scc.read_binary(EF_USIM_ADF_map['FPLMN'])
+        if sw == '9000':
+            return format_xplmn(res), sw
+        else:
+            return None, sw
+
+    def update_fplmn(self, fplmn):
+        self._scc.select_file('3f00')
+        self.select_adf_by_aid('USIM')
+        size = self._scc.binary_size(EF_USIM_ADF_map['FPLMN'])
+        encoded = ''.join([enc_plmn(plmn[:3], plmn[3:]) for plmn in fplmn])
+        encoded = rpad(encoded, size)
+        data, sw = self._scc.update_binary(EF_USIM_ADF_map['FPLMN'], encoded)
+        return sw
+
     def read_epdgid(self):
         (res, sw) = self._scc.read_binary(EF_USIM_ADF_map['ePDGId'])
         if sw == '9000':
@@ -1702,6 +1718,7 @@
             'smsp': self.update_smsp,
             'ki': self.update_ki,
             'opc': self.update_opc,
+            'fplmn': self.update_fplmn,
         }
 
     @classmethod
@@ -1715,6 +1732,7 @@
         return None
 
     def program(self, p):
+        self.set_apdu_parameter('00', '0004')
         # Authenticate
         self._scc.verify_chv(0xc, h2b('3834373936313533'))
         for handler in self._program_handlers: