+ * Read a triplet from the SIM card
+ */
+static bool get_card_triplet(private_eap_sim_t *this,
+ char *rand, char *sres, char *kc)
+{
+ enumerator_t *enumerator;
+ sim_card_t *card = NULL, *current;
+ id_match_t match, best = ID_MATCH_NONE;
+ bool success = FALSE;
+
+ /* find the best matching SIM */
+ enumerator = charon->sim->create_card_enumerator(charon->sim);
+ while (enumerator->enumerate(enumerator, ¤t))
+ {
+ match = this->peer->matches(this->peer, current->get_imsi(current));
+ if (match > best)
+ {
+ card = current;
+ best = match;
+ break;
+ }
+ }
+ if (card)
+ {
+ success = card->get_triplet(card, rand, sres, kc);
+ }
+ enumerator->destroy(enumerator);
+ if (!card)
+ {
+ DBG1(DBG_IKE, "no SIM card found matching '%D'", this->peer);
+ }
+ return success;
+}
+
+/**