The AID application class handles session managment
so it was removed from simauth. Now, simauth only
implements the authentication algorithms.

Added AID application init code to phonesim and added
a two sample AID applications to default.xml (ISIM/USIM)
---
 src/default.xml  |  14 +++-
 src/phonesim.cpp |  14 +++-
 src/phonesim.h   |   5 ++
 src/simauth.cpp  | 240 -------------------------------------------------------
 src/simauth.h    |  60 +-------------
 5 files changed, 30 insertions(+), 303 deletions(-)

diff --git a/src/default.xml b/src/default.xml
index 39b0216..b32a488 100644
--- a/src/default.xml
+++ b/src/default.xml
@@ -316,8 +316,6 @@
 
 <!-- SIM Auth -->
 <simauth ki="90dca4eda45b53cf0f12d7c9c3bc6a89" 
opc="cb9cccc4b9258e6dca4760379fb82581" sqn="000000000021">
-        
<aid>61184F10A0000000871004FFFFFFFF890619000050044953494DFFFFFFFFFFFFFF</aid>
-        
<aid>61184F10A0000000871002FFFFFFFF890619000050045553494DFFFFFFFFFFFFFF</aid>
 </simauth>
 
 <!-- Time -->
@@ -3680,4 +3678,16 @@ OK</response>
 
 </filesystem>
 
+<application type="ISim" 
id="61184F10A0000000871004FFFFFFFF890619000050044953494DFFFFFFFFFFFFFF">
+    <filesystem>
+        <file name="EFimpi">
+            <!-- [email protected] -->
+            80 15 31 32 33 34 35 36 37 38 40 70 68 6f 6e 65 73 69 6d 2e 6f 72 
67
+        </file>
+    </filesystem>
+</application>
+
+<application type="USim" 
id="61184F10A0000000871002FFFFFFFF890619000050045553494DFFFFFFFFFFFFFF">
+</application>
+
 </simulator>
diff --git a/src/phonesim.cpp b/src/phonesim.cpp
index ec3900a..0e446f6 100644
--- a/src/phonesim.cpp
+++ b/src/phonesim.cpp
@@ -24,6 +24,7 @@
 #include "simapplication.h"
 #include "callmanager.h"
 #include "simauth.h"
+#include "aidapplication.h"
 #include <qatutils.h>
 
 #include <qstring.h>
@@ -630,13 +631,19 @@ SimRules::SimRules( int fd, QObject *p,  const QString& 
filename, HardwareManipu
             loadPhoneBook( *n );
 
         } else if ( n->tag == "simauth" ) {
+
             _simAuth = new SimAuth( this, *n );
-            connect( _simAuth, SIGNAL(send(QString)),
-                    this, SLOT(respond(QString)) );
+
+        } else if ( n->tag == "application" ) {
+            AidApplication *app = new AidApplication( this, *n );
+            _applications.append(app);
         }
         n = n->next;
     }
 
+    if ( _applications.length() > 0 )
+        _app_wrapper = new AidAppWrapper( this, _applications, _simAuth );
+
     // Clean up the XML reader objects.
     delete handler;
 
@@ -1137,8 +1144,7 @@ void SimRules::command( const QString& cmd )
     if ( _callManager->command( cmd ) )
         return;
 
-    // Proccess SIM auth commands
-    if ( _simAuth &&  _simAuth->command( cmd ) )
+    if (_app_wrapper && _app_wrapper->command( cmd ))
         return;
 
     // Process SIM toolkit related commands with the current SIM application.
diff --git a/src/phonesim.h b/src/phonesim.h
index 452dc12..c8bcaad 100644
--- a/src/phonesim.h
+++ b/src/phonesim.h
@@ -45,6 +45,7 @@
 #include <arpa/inet.h>
 #include <netinet/in.h>
 
+
 class SimState;
 class SimItem;
 class SimChat;
@@ -54,6 +55,8 @@ class SimFileSystem;
 class CallManager;
 class SimApplication;
 class SimAuth;
+class AidApplication;
+class AidAppWrapper;
 
 
 class SimXmlNode
@@ -360,6 +363,8 @@ private:
 
     CallManager *_callManager;
     SimAuth *_simAuth;
+    QList<AidApplication *> _applications;
+    AidAppWrapper *_app_wrapper;
 
     bool simCsimOk( const QByteArray& payload );
 };
diff --git a/src/simauth.cpp b/src/simauth.cpp
index 54184b6..24b2d17 100644
--- a/src/simauth.cpp
+++ b/src/simauth.cpp
@@ -30,255 +30,15 @@ extern "C" {
 SimAuth::SimAuth( QObject *parent, SimXmlNode& n )
     : QObject( parent )
 {
-    SimXmlNode *child = n.children;
-
     _ki = n.getAttribute( "ki" );
     _opc = n.getAttribute( "opc" );
     _sqn = n.getAttribute( "sqn" );
-    _session_start = 257;
-
-    _aid_list = QStringList();
-
-    // parse list of <aid> </aid>
-    while (child) {
-        if ( child->tag == "aid" )
-            _aid_list += QStringList( child->contents );
-
-        child = child->next;
-    }
 }
 
 SimAuth::~SimAuth()
 {
 }
 
-bool SimAuth::command( const QString& cmd )
-{
-    if ( cmd.startsWith( "AT+CUAD") ) {
-        QString response( "+CUAD: " );
-
-        if ( cmd.contains("=?") ) {
-            emit send( "OK" );
-            return true;
-        }
-
-        foreach ( const QString &str, _aid_list )
-            response += str;
-
-        response.append( "\n\nOK" );
-
-        emit send( response );
-    } else if ( cmd.startsWith( "AT+CCHO" ) ) {
-        QString aid;
-        int session_id = -1;
-
-        if ( !cmd.contains("=") ) {
-            emit send( "ERROR" );
-            return true;
-        }
-
-        if ( cmd.contains("=?") ) {
-            emit send( "OK" );
-            return true;
-        }
-
-        aid = cmd.split('=')[1];
-        aid = aid.replace("\"", "");
-
-        foreach ( const QString &str, _aid_list ) {
-            if ( str.contains( aid ) ) {
-                session_id = openChannel( aid );
-                break;
-            }
-        }
-
-        if ( session_id == -1 ) {
-            emit send( "ERROR" );
-            return true;
-        }
-
-        emit send( QString( "+CCHO: %1\n\nOK" ).arg(session_id, 0, 10) );
-    } else if ( cmd.startsWith( "AT+CGLA" ) ) {
-        QString aid;
-        QString data;
-        QString command;
-        QString parameters;
-        QString response;
-        enum CmdType type;
-        int session_id = -1;
-
-        if ( !cmd.contains("=") ) {
-            emit send( "ERROR" );
-            return true;
-        }
-
-        if ( cmd.contains("=?") ) {
-            emit send( "OK" );
-            return true;
-        }
-
-        data = cmd.split('=')[1];
-        session_id = data.split(',')[0].toInt();
-
-        if (!getAidFromSession( session_id, aid )) {
-            emit send( "ERROR" );
-            return true;
-        }
-
-        data = data.split(',')[2].replace("\"", "");
-        parameters = data.mid(10);
-
-        type = checkCommand( data, aid );
-
-        if (type == CMD_TYPE_GSM_AUTH) {
-            QString sres, kc;
-            QString rand = parameters.mid(2, 32);
-
-            gsmAuthenticate( rand, sres, kc );
-
-            response = QString( "+CGLA: 32,\"04 %1 08 %2 \"\n\nOK" )
-                    .arg( sres, kc );
-            response.replace( " ", "");
-
-        } else if (type == CMD_TYPE_UMTS_AUTH) {
-            enum UmtsStatus status;
-            QString res, ck, ik, auts;
-            QString rand = parameters.mid(2, 32);
-            QString autn = parameters.mid(36, 32);
-
-            status = umtsAuthenticate( rand, autn, res, ck, ik, auts );
-
-            response = QString("+CGLA: ");
-
-            QString test;
-
-            switch (status) {
-            case UMTS_OK:
-                response += QString( "88,\"DB08 %1 10 %2 10 %3\"\n\nOK" )
-                        .arg( res, ck, ik );
-                response.replace( " ", "" );
-
-                break;
-            case UMTS_INVALID_MAC:
-                response += QString( "4,\"%1\"\n\nOK")
-                        .arg( CMD_TYPE_APP_ERROR, 0, 16 );
-
-                break;
-            case UMTS_SYNC_FAILURE:
-                response += QString( "34,\"DC0E %1 \"\n\nOK" ).arg( auts );
-                response.replace( " ", "" );
-
-                break;
-            case UMTS_ERROR:
-                response = QString( "ERROR" );
-
-                break;
-            }
-        } else {
-            response = QString("+CGLA: 4,\"%1\"\n\nOK").arg(type, 0, 16);
-        }
-
-        emit send( response );
-    } else if ( cmd.startsWith( "AT+CCHC" ) ) {
-        int session_id = -1;
-
-        if ( !cmd.contains("=") ) {
-            emit send( "ERROR" );
-            return true;
-        }
-
-        if ( cmd.contains("=?") ) {
-            emit send( "OK" );
-            return true;
-        }
-
-        session_id = cmd.split('=')[1].toInt();
-
-        closeChannel(session_id);
-
-        emit send( "OK" );
-    } else {
-        return false;
-    }
-
-    return true;
-}
-
-int SimAuth::openChannel( QString aid )
-{
-    if ( _logical_channels.size() >= MAX_LOGICAL_CHANNELS )
-        return -1;
-
-    _logical_channels.insert( _session_start, aid );
-
-    return _session_start++;
-}
-
-void SimAuth::closeChannel( int session_id )
-{
-    _logical_channels.remove( session_id );
-}
-
-bool SimAuth::getAidFromSession( int session_id, QString& aid )
-{
-    if ( _logical_channels.contains( session_id ) ) {
-        aid = _logical_channels[session_id];
-        return true;
-    }
-
-    return false;
-}
-
-enum AidType SimAuth::getAidType( QString aid )
-{
-    if ( aid.mid(10, 4) == "1004" )
-        return AID_TYPE_ISIM;
-    else if ( aid.mid(10, 4) == "1002")
-        return AID_TYPE_USIM;
-
-    return AID_TYPE_UNKNOWN;
-}
-
-
-enum CmdType SimAuth::checkCommand( QString command, QString aid )
-{
-    QString cls = command.mid(0, 2);
-    QString ins = command.mid(2, 2);
-    QString p1 = command.mid(4, 2);
-    QString p2 = command.mid(6, 2);
-    QString lc = command.mid(8, 2);
-    AidType type = getAidType( aid );
-
-    if ( cls != "00" )
-        return CMD_TYPE_UNSUPPORTED_CLS;
-
-    if ( ins != "88" )
-        return CMD_TYPE_UNSUPPORTED_INS;
-
-    if ( p1 != "00" )
-        return CMD_TYPE_INCORRECT_P2_P1;
-
-    if ( p2 == "80" ) {
-        if ( lc != "11" )
-            return CMD_TYPE_WRONG_LENGTH;
-
-        if ( !(type == AID_TYPE_USIM || type == AID_TYPE_ISIM) )
-            return CMD_TYPE_APP_ERROR;
-
-        return CMD_TYPE_GSM_AUTH;
-    } else if ( p2 == "81" ) {
-        if ( lc != "22" )
-            return CMD_TYPE_WRONG_LENGTH;
-
-        if ( type != AID_TYPE_ISIM )
-            return CMD_TYPE_APP_ERROR;
-
-        return CMD_TYPE_UMTS_AUTH;
-    } else {
-        return CMD_TYPE_UNKNOWN;
-    }
-}
-
 void SimAuth::gsmAuthenticate( QString rand, QString &sres,
         QString &kc )
 {
diff --git a/src/simauth.h b/src/simauth.h
index a66ea52..fb66593 100644
--- a/src/simauth.h
+++ b/src/simauth.h
@@ -22,26 +22,6 @@
 
 #define MAX_LOGICAL_CHANNELS    4
 
-enum AidType {
-    AID_TYPE_USIM,
-    AID_TYPE_ISIM,
-    AID_TYPE_UNKNOWN
-};
-
-/*
- * Some common errors
- */
-enum CmdType {
-    CMD_TYPE_GSM_AUTH = 0,
-    CMD_TYPE_UMTS_AUTH = 1,
-    CMD_TYPE_UNSUPPORTED_CLS = 0x6E00,
-    CMD_TYPE_UNSUPPORTED_INS = 0x6D00,
-    CMD_TYPE_INCORRECT_P2_P1 = 0x6A86,
-    CMD_TYPE_WRONG_LENGTH = 0x6700,
-    CMD_TYPE_APP_ERROR = 0x9862,
-    CMD_TYPE_UNKNOWN = 0xFFFF
-};
-
 enum UmtsStatus {
     UMTS_OK,            // Success
     UMTS_INVALID_MAC,   // MAC did not match AUTN parameter
@@ -56,12 +36,9 @@ public:
     SimAuth( QObject *parent, SimXmlNode& n );
     ~SimAuth();
 
-    // Process an AT command.  Returns false if not a call-related command.
-    bool command( const QString& cmd );
-
-signals:
-    // Send a response to a command.
-    void send( const QString& line );
+    void gsmAuthenticate( QString rand, QString &sres, QString &kc );
+    enum UmtsStatus umtsAuthenticate( QString rand, QString autn,
+            QString &res, QString &ck, QString &ik, QString &auts );
 
 private:
     // secret key, set during initialization (from XML)
@@ -72,37 +49,6 @@ private:
 
     // Sequence number stored on SIM
     QString _sqn;
-
-    // arbitrary session ID starting number
-    int _session_start;
-
-    // parsed list of AID's
-    QStringList _aid_list;
-
-    // map of logical channel integers to AID's
-    QMap<int, QString> _logical_channels;
-
-    // run COMP128v1 algorithm against 'rand' and 'ki'
-    void gsmAuthenticate( QString rand, QString &sres, QString &kc );
-
-    // run Milenage algorithm with ki, rand, and autn
-    enum UmtsStatus umtsAuthenticate( QString rand, QString autn,
-            QString &res, QString &ck, QString &ik, QString &auts);
-
-    // open an AID logical channel
-    int openChannel( QString aid );
-
-    // close an AID logical channel
-    void closeChannel( int session_id );
-
-    // find the AID from a given session ID
-    bool getAidFromSession( int session_id, QString& aid );
-
-    // checks that the AID supports the given command
-    enum CmdType checkCommand( QString command, QString aid );
-
-    // returns the type of AID (USIM/ISIM/UNKNOWN)
-    enum AidType getAidType( QString aid );
 };
 
 #endif
-- 
2.7.4

_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to