static AJ_Status SetPasscode(const char* daemonRealm, const uint8_t* newPasscode, uint8_t newPasscodeLen) { AJ_Status status = AJ_OK; char newStringPasscode[PASSWORD_VALUE_LENGTH + 1]; status = AJ_RawToHex(newPasscode, newPasscodeLen, newStringPasscode, sizeof(newStringPasscode), FALSE); if (status != AJ_OK) { return status; } if (AJSVC_PropertyStore_SetValue(AJSVC_PROPERTY_STORE_REALM_NAME, daemonRealm) && AJSVC_PropertyStore_SetValue(AJSVC_PROPERTY_STORE_PASSCODE, newStringPasscode)) { status = AJSVC_PropertyStore_SaveAll(); if (status != AJ_OK) { return status; } AJ_ClearCredentials(); status = AJ_ERR_READ; //Force disconnect of AJ and services to refresh current sessions } else { status = AJSVC_PropertyStore_LoadAll(); if (status != AJ_OK) { return status; } } return status; }
static AJ_Status FactoryReset() { AJ_Status status = AJ_OK; AJ_InfoPrintf(("GOT FACTORY RESET\n")); status = AJSVC_PropertyStore_ResetAll(); if (status != AJ_OK) { return status; } AJ_ClearCredentials(); return AJ_ERR_RESTART_APP; // Force disconnect of AJ and services and reconnection of WiFi on restart of app }
AJ_Status AJS_FactoryReset(void) { AJ_Status status = AJ_OK; AJ_WarnPrintf(("FactoryReset\n")); status = AJSVC_PropertyStore_ResetAll(); if (status != AJ_OK) { return status; } status = AJOBS_ClearInfo(); if (status != AJ_OK) { return status; } AJ_ClearCredentials(); return AJ_ERR_RESTART; }
int AJ_Main() #endif { AJ_Status status = AJ_OK; AJ_BusAttachment bus; uint8_t connected = FALSE; uint32_t sessionId = 0; AJ_Status authStatus = AJ_ERR_NULL; #ifdef SECURE_INTERFACE uint32_t suites[AJ_AUTH_SUITES_NUM]; size_t numsuites = 0; uint8_t clearkeys = FALSE; #endif #ifdef MAIN_ALLOWS_ARGS #if defined(SECURE_INTERFACE) || defined(SECURE_OBJECT) ac--; av++; /* * Enable authentication mechanism by command line */ if (ac) { if (0 == strncmp(*av, "-ek", 3)) { clearkeys = TRUE; ac--; av++; } else if (0 == strncmp(*av, "-e", 2)) { ac--; av++; } if (!ac) { AJ_AlwaysPrintf(("-e(k) requires an auth mechanism.\n")); return 1; } while (ac) { if (0 == strncmp(*av, "ECDHE_ECDSA", 11)) { suites[numsuites++] = AUTH_SUITE_ECDHE_ECDSA; } else if (0 == strncmp(*av, "ECDHE_PSK", 9)) { suites[numsuites++] = AUTH_SUITE_ECDHE_PSK; } else if (0 == strncmp(*av, "ECDHE_NULL", 10)) { suites[numsuites++] = AUTH_SUITE_ECDHE_NULL; } ac--; av++; } } #endif #else suites[numsuites++] = AUTH_SUITE_ECDHE_ECDSA; clearkeys = TRUE; #endif #ifdef SECURE_INTERFACE if (numsuites == 0) { /* Default security to ECDHE_NULL, if not explicit elsewhere */ suites[numsuites++] = AUTH_SUITE_ECDHE_NULL; } #endif /* * One time initialization before calling any other AllJoyn APIs */ AJ_Initialize(); AJ_PrintXML(ProxyObjects); AJ_RegisterObjects(NULL, ProxyObjects); while (TRUE) { AJ_Message msg; if (!connected) { #if defined (ANNOUNCE_BASED_DISCOVERY) status = AJ_StartClientByPeerDescription(&bus, NULL, CONNECT_TIMEOUT, FALSE, &pingServicePeer, testServicePort, &sessionId, g_peerServiceName, NULL); #elif defined (NGNS) status = AJ_StartClientByInterface(&bus, NULL, CONNECT_TIMEOUT, FALSE, testInterfaceNames, &sessionId, g_peerServiceName, NULL); #else status = AJ_StartClientByName(&bus, NULL, CONNECT_TIMEOUT, FALSE, testServiceName, testServicePort, &sessionId, NULL, g_peerServiceName); #endif if (status == AJ_OK) { AJ_AlwaysPrintf(("StartClient returned %d, sessionId=%u, serviceName=%s\n", status, sessionId, g_peerServiceName)); AJ_AlwaysPrintf(("Connected to Daemon:%s\n", AJ_GetUniqueName(&bus))); connected = TRUE; #if defined(SECURE_INTERFACE) || defined(SECURE_OBJECT) AJ_BusEnableSecurity(&bus, suites, numsuites); AJ_BusSetAuthListenerCallback(&bus, AuthListenerCallback); if (clearkeys) { AJ_ClearCredentials(AJ_GENERIC_MASTER_SECRET | AJ_CRED_TYPE_GENERIC); AJ_ClearCredentials(AJ_GENERIC_ECDSA_MANIFEST | AJ_CRED_TYPE_GENERIC); AJ_ClearCredentials(AJ_GENERIC_ECDSA_KEYS | AJ_CRED_TYPE_GENERIC); } status = AJ_BusAuthenticatePeer(&bus, g_peerServiceName, AuthCallback, &authStatus); if (status != AJ_OK) { AJ_AlwaysPrintf(("AJ_BusAuthenticatePeer returned %d\n", status)); } #else authStatus = AJ_OK; #endif } else { AJ_AlwaysPrintf(("StartClient returned %d\n", status)); break; } } AJ_AlwaysPrintf(("Auth status %d and AllJoyn status %d\n", authStatus, status)); if (status == AJ_ERR_RESOURCES) { AJ_InfoPrintf(("Peer is busy, disconnecting and retrying auth...\n")); AJ_Disconnect(&bus); connected = FALSE; continue; } if (authStatus != AJ_ERR_NULL) { if (authStatus != AJ_OK) { AJ_Disconnect(&bus); break; } authStatus = AJ_ERR_NULL; AJ_BusSetLinkTimeout(&bus, sessionId, 10 * 1000); } status = AJ_UnmarshalMsg(&bus, &msg, UNMARSHAL_TIMEOUT); if (status != AJ_OK) { if (status == AJ_ERR_TIMEOUT) { AppDoWork(&bus, sessionId, g_peerServiceName); continue; } } else { switch (msg.msgId) { case AJ_REPLY_ID(AJ_METHOD_SET_LINK_TIMEOUT): { uint32_t disposition; uint32_t timeout; status = AJ_UnmarshalArgs(&msg, "uu", &disposition, &timeout); if (disposition == AJ_SETLINKTIMEOUT_SUCCESS) { AJ_AlwaysPrintf(("Link timeout set to %d\n", timeout)); } else { AJ_AlwaysPrintf(("SetLinkTimeout failed %d\n", disposition)); } SendPing(&bus, sessionId, g_peerServiceName, 1); } break; case AJ_REPLY_ID(AJ_METHOD_BUS_PING): { uint32_t disposition; status = AJ_UnmarshalArgs(&msg, "u", &disposition); if (disposition == AJ_PING_SUCCESS) { AJ_AlwaysPrintf(("Bus Ping reply received\n")); } else { AJ_AlwaysPrintf(("Bus Ping failed, disconnecting: %d\n", disposition)); status = AJ_ERR_LINK_DEAD; } } break; case AJ_REPLY_ID(PRX_MY_PING): { AJ_Arg arg; AJ_UnmarshalArg(&msg, &arg); AJ_AlwaysPrintf(("Got ping reply\n")); AJ_InfoPrintf(("INFO Got ping reply\n")); status = SendGetProp(&bus, sessionId, g_peerServiceName); } break; case AJ_REPLY_ID(PRX_GET_PROP): { const char* sig; status = AJ_UnmarshalVariant(&msg, &sig); if (status == AJ_OK) { status = AJ_UnmarshalArgs(&msg, sig, &g_iterCount); AJ_AlwaysPrintf(("Get prop reply %d\n", g_iterCount)); if (status == AJ_OK) { g_iterCount = g_iterCount + 1; status = SendSetProp(&bus, sessionId, g_peerServiceName, g_iterCount); } } } break; case AJ_REPLY_ID(PRX_SET_PROP): AJ_AlwaysPrintf(("Set prop reply\n")); break; case AJ_SIGNAL_SESSION_LOST_WITH_REASON: /* * Force a disconnect */ { uint32_t id, reason; AJ_UnmarshalArgs(&msg, "uu", &id, &reason); AJ_AlwaysPrintf(("Session lost. ID = %u, reason = %u\n", id, reason)); } status = AJ_ERR_SESSION_LOST; break; default: /* * Pass to the built-in handlers */ status = AJ_BusHandleBusMessage(&msg); break; } } /* * Messages must be closed to free resources */ AJ_CloseMsg(&msg); if ((status == AJ_ERR_SESSION_LOST) || (status == AJ_ERR_READ) || (status == AJ_ERR_WRITE) || (status == AJ_ERR_LINK_DEAD)) { AJ_AlwaysPrintf(("AllJoyn disconnect\n")); AJ_AlwaysPrintf(("Disconnected from Daemon:%s\n", AJ_GetUniqueName(&bus))); AJ_Disconnect(&bus); break; } } AJ_AlwaysPrintf(("clientlite EXIT %d\n", status)); return status; }
int AJ_Main() #endif { AJ_Status status = AJ_OK; AJ_BusAttachment bus; uint8_t connected = FALSE; uint32_t sessionId = 0; AJ_Status authStatus = AJ_ERR_NULL; /* * Buffer to hold the peer's full service name or unique name. */ #if defined (NGNS) || defined (ANNOUNCE_BASED_DISCOVERY) char peerServiceName[AJ_MAX_NAME_SIZE + 1]; #else char peerServiceName[AJ_MAX_SERVICE_NAME_SIZE]; #endif #ifdef SECURE_INTERFACE uint32_t suites[16]; size_t numsuites = 0; uint8_t clearkeys = FALSE; uint8_t enablepwd = FALSE; X509CertificateChain* node; #endif #ifdef MAIN_ALLOWS_ARGS #ifdef SECURE_INTERFACE ac--; av++; /* * Enable authentication mechanism by command line */ if (ac) { if (0 == strncmp(*av, "-ek", 3)) { clearkeys = TRUE; ac--; av++; } else if (0 == strncmp(*av, "-e", 2)) { ac--; av++; } if (!ac) { AJ_AlwaysPrintf(("-e(k) requires an auth mechanism.\n")); return 1; } while (ac) { if (0 == strncmp(*av, "ECDHE_ECDSA", 11)) { suites[numsuites++] = AUTH_SUITE_ECDHE_ECDSA; } else if (0 == strncmp(*av, "ECDHE_PSK", 9)) { suites[numsuites++] = AUTH_SUITE_ECDHE_PSK; } else if (0 == strncmp(*av, "ECDHE_NULL", 10)) { suites[numsuites++] = AUTH_SUITE_ECDHE_NULL; } else if (0 == strncmp(*av, "PIN", 3)) { enablepwd = TRUE; } ac--; av++; } } #endif #endif /* * One time initialization before calling any other AllJoyn APIs */ AJ_Initialize(); AJ_PrintXML(ProxyObjects); AJ_RegisterObjects(NULL, ProxyObjects); while (TRUE) { AJ_Message msg; if (!connected) { #if defined (NGNS) || defined (ANNOUNCE_BASED_DISCOVERY) status = AJ_StartClientByInterface(&bus, NULL, CONNECT_TIMEOUT, FALSE, testInterfaceNames, &sessionId, peerServiceName, NULL); #else status = AJ_StartClientByName(&bus, NULL, CONNECT_TIMEOUT, FALSE, testServiceName, testServicePort, &sessionId, NULL, peerServiceName); #endif if (status == AJ_OK) { AJ_AlwaysPrintf(("StartClient returned %d, sessionId=%u, serviceName=%s\n", status, sessionId, peerServiceName)); AJ_AlwaysPrintf(("Connected to Daemon:%s\n", AJ_GetUniqueName(&bus))); connected = TRUE; #ifdef SECURE_INTERFACE if (enablepwd) { AJ_BusSetPasswordCallback(&bus, PasswordCallback); } AJ_BusEnableSecurity(&bus, suites, numsuites); AJ_BusSetAuthListenerCallback(&bus, AuthListenerCallback); if (clearkeys) { status = AJ_ClearCredentials(); AJ_ASSERT(AJ_OK == status); } status = AJ_BusAuthenticatePeer(&bus, peerServiceName, AuthCallback, &authStatus); if (status != AJ_OK) { AJ_AlwaysPrintf(("AJ_BusAuthenticatePeer returned %d\n", status)); } #else authStatus = AJ_OK; #endif AJ_BusAddSignalRule(&bus, "my_signal", testInterfaceName, AJ_BUS_SIGNAL_ALLOW); } else { AJ_AlwaysPrintf(("StartClient returned %d\n", status)); break; } } if (authStatus != AJ_ERR_NULL) { if (authStatus != AJ_OK) { AJ_Disconnect(&bus); break; } authStatus = AJ_ERR_NULL; } status = AJ_UnmarshalMsg(&bus, &msg, UNMARSHAL_TIMEOUT); if (status == AJ_ERR_TIMEOUT) { status = AppDoWork(&bus, sessionId, peerServiceName); continue; } if (status == AJ_OK) { switch (msg.msgId) { case PRX_MY_SIGNAL: AJ_AlwaysPrintf(("Received my_signal\n")); status = AJ_OK; break; case AJ_SIGNAL_SESSION_LOST_WITH_REASON: /* * Force a disconnect */ { uint32_t id, reason; AJ_UnmarshalArgs(&msg, "uu", &id, &reason); AJ_AlwaysPrintf(("Session lost. ID = %u, reason = %u", id, reason)); } status = AJ_ERR_SESSION_LOST; break; default: /* * Pass to the built-in handlers */ status = AJ_BusHandleBusMessage(&msg); break; } } /* * Messages must be closed to free resources */ AJ_CloseMsg(&msg); if ((status == AJ_ERR_SESSION_LOST) || (status == AJ_ERR_READ) || (status == AJ_ERR_LINK_DEAD)) { AJ_AlwaysPrintf(("AllJoyn disconnect\n")); AJ_AlwaysPrintf(("Disconnected from Daemon:%s\n", AJ_GetUniqueName(&bus))); AJ_Disconnect(&bus); connected = FALSE; } } AJ_AlwaysPrintf(("clientlite EXIT %d\n", status)); // Clean up certificate chain while (chain) { node = chain; chain = chain->next; AJ_Free(node->certificate.der.data); AJ_Free(node); } return status; }
AJ_Status TestCreds() { AJ_Status status = AJ_OK; AJ_GUID localGuid; AJ_GUID remoteGuid; char str[33]; AJ_PeerCred*peerCredRead; int i = 0; AJ_GUID peerGuid; uint8_t secretLen = 24; uint8_t secret[24]; uint32_t expiration = 50898; char hex[100]; AJ_AlwaysPrintf(("Start TestCreds\n")); status = AJ_GetLocalGUID(&localGuid); if (AJ_OK != status) { return status; } AJ_GUID_FromString(&localGuid, str); AJ_InfoPrintf(("TestCreds() Layout Print\n")); AJ_NVRAM_Layout_Print(); memset(&peerGuid, 1, sizeof(AJ_GUID)); for (i = 0; i < secretLen; i++) { secret[i] = i; } AJ_GUID_ToString(&peerGuid, hex, 100); AJ_AlwaysPrintf(("AJ_StorePeerSecret guid %s\n", hex)); status = AJ_StorePeerSecret(&peerGuid, secret, secretLen, expiration); memcpy(&remoteGuid, &peerGuid, sizeof(AJ_GUID)); // backup the GUID if (AJ_OK != status) { AJ_AlwaysPrintf(("AJ_StorePeerSecret failed = %d\n", status)); return status; } AJ_NVRAM_Layout_Print(); AJ_InfoPrintf(("TestCreds() StoreCred() Layout Print\n")); AJ_NVRAM_Layout_Print(); AJ_GUID_ToString(&remoteGuid, hex, 100); AJ_AlwaysPrintf(("AJ_GetPeerCredential guid %s\n", hex)); status = AJ_GetPeerCredential(&remoteGuid, &peerCredRead); if (AJ_OK != status) { AJ_AlwaysPrintf(("AJ_GetPeerCredential failed = %d\n", status)); return status; } if (0 != memcmp(peerCredRead->id, &peerGuid, peerCredRead->idLen)) { AJ_AlwaysPrintf(("The retrieved credential does not match\n")); AJ_FreeCredential(peerCredRead); return AJ_ERR_FAILURE; } if (peerCredRead->dataLen != secretLen) { AJ_AlwaysPrintf(("no match for secretLen got %d expected %d\n", peerCredRead->dataLen, secretLen)); AJ_FreeCredential(peerCredRead); return AJ_ERR_FAILURE; } if (secretLen > 0) { if (0 != memcmp(peerCredRead->data, secret, secretLen)) { AJ_AlwaysPrintf(("no match for secret\n")); AJ_FreeCredential(peerCredRead); return AJ_ERR_FAILURE; } } if (peerCredRead->expiration != expiration) { AJ_AlwaysPrintf(("no match for expiration got %d expected %d\n", peerCredRead->expiration, expiration)); AJ_FreeCredential(peerCredRead); return AJ_ERR_FAILURE; } status = AJ_DeletePeerCredential(&remoteGuid); if (AJ_OK != status) { AJ_AlwaysPrintf(("AJ_DeleteCredential failed = %d\n", status)); AJ_FreeCredential(peerCredRead); return status; } AJ_FreeCredential(peerCredRead); if (AJ_ERR_FAILURE == AJ_GetPeerCredential(&remoteGuid, NULL)) { status = AJ_OK; } else { return AJ_ERR_FAILURE; } AJ_InfoPrintf(("TestCreds() Layout Print\n")); AJ_NVRAM_Layout_Print(); AJ_ClearCredentials(); if (AJ_ERR_FAILURE == AJ_GetPeerCredential(&remoteGuid, NULL)) { status = AJ_OK; } else { return AJ_ERR_FAILURE; } AJ_InfoPrintf(("TestCreds() Layout Print\n")); AJ_NVRAM_Layout_Print(); AJ_AlwaysPrintf(("TestCreds done.\n")); return status; }
AJ_Status TestCreds() { AJ_Status status = AJ_OK; AJ_GUID localGuid; AJ_GUID remoteGuid; char str[33]; AJ_PeerCred peerCred; AJ_PeerCred peerCredRead; int i = 0; status = AJ_GetLocalGUID(&localGuid); if (AJ_OK != status) { goto TEST_CREDS_EXIT; } AJ_GUID_FromString(&localGuid, str); AJ_NVRAM_Layout_Print(); memset(&peerCred.guid, 1, sizeof(AJ_GUID)); memcpy(&remoteGuid, &peerCred.guid, sizeof(AJ_GUID)); // backup the GUID for (i = 0; i < 24; i++) { peerCred.secret[i] = i; } status = AJ_StoreCredential(&peerCred); if (AJ_OK != status) { AJ_Printf("AJ_StoreCredential failed = %d\n", status); goto TEST_CREDS_EXIT; } status = AJ_GetRemoteCredential(&remoteGuid, &peerCredRead); if (AJ_OK != status) { AJ_Printf("AJ_StoreCredential failed = %d\n", status); goto TEST_CREDS_EXIT; } if (0 != memcmp(&peerCredRead, &peerCred, sizeof(AJ_PeerCred))) { AJ_Printf("The retrieved credential does not match\n"); status = AJ_ERR_FAILURE; goto TEST_CREDS_EXIT; } status = AJ_DeleteCredential(&remoteGuid); if (AJ_OK != status) { AJ_Printf("AJ_DeleteCredential failed = %d\n", status); goto TEST_CREDS_EXIT; } if (AJ_ERR_FAILURE == AJ_GetRemoteCredential(&remoteGuid, &peerCredRead)) { status = AJ_OK; } else { status = AJ_ERR_FAILURE; goto TEST_CREDS_EXIT; } AJ_NVRAM_Layout_Print(); status = AJ_StoreCredential(&peerCred); if (AJ_OK != status) { AJ_Printf("AJ_StoreCredential failed = %d\n", status); goto TEST_CREDS_EXIT; } AJ_ClearCredentials(); if (AJ_ERR_FAILURE == AJ_GetRemoteCredential(&remoteGuid, &peerCredRead)) { status = AJ_OK; } else { status = AJ_ERR_FAILURE; goto TEST_CREDS_EXIT; } AJ_NVRAM_Layout_Print(); TEST_CREDS_EXIT: return status; }