1 package org.iotivity.base.examples.provisioningclient;
3 import android.app.Activity;
4 import android.app.AlertDialog;
5 import android.content.DialogInterface;
6 import android.content.BroadcastReceiver;
7 import android.content.Context;
8 import android.content.Intent;
9 import android.content.SharedPreferences;
10 import android.os.AsyncTask;
11 import android.os.Bundle;
12 import android.os.Message;
13 import android.preference.PreferenceManager;
14 import android.text.method.ScrollingMovementMethod;
15 import android.util.Log;
16 import android.view.Gravity;
17 import android.widget.LinearLayout;
18 import android.widget.TextView;
19 import android.view.Menu;
20 import android.view.MenuItem;
21 import android.os.Environment;
22 import android.widget.Toast;
24 import org.iotivity.base.CredType;
25 import org.iotivity.base.EncodingType;
26 import org.iotivity.base.DeviceStatus;
27 import org.iotivity.base.KeySize;
28 import org.iotivity.base.ModeType;
29 import org.iotivity.base.OcException;
30 import org.iotivity.base.OcPlatform;
31 import org.iotivity.base.OcProvisioning;
32 import org.iotivity.base.MVJustWorksOptionMask;
33 import org.iotivity.base.OcSecureResource;
34 import org.iotivity.base.OicSecAcl;
35 import org.iotivity.base.OicSecAce;
36 import org.iotivity.base.OicSecResr;
37 import org.iotivity.base.OicSecValidity;
38 import org.iotivity.base.OicSecPdAcl;
39 import org.iotivity.base.OcPrmType;
40 import org.iotivity.base.OxmType;
41 import org.iotivity.base.PlatformConfig;
42 import org.iotivity.base.ProvisionResult;
43 import org.iotivity.base.QualityOfService;
44 import org.iotivity.base.ServiceType;
47 import java.io.FileNotFoundException;
48 import java.io.FileInputStream;
49 import java.io.FileOutputStream;
50 import java.io.IOException;
51 import java.io.InputStream;
52 import java.io.OutputStream;
53 import java.util.ArrayList;
54 import java.util.EnumSet;
55 import java.util.List;
56 import java.nio.channels.FileChannel;
58 import org.iotivity.ca.OicCipher;
59 import org.iotivity.base.OcConnectivityType;
60 import org.iotivity.ca.CaInterface;
63 public class ProvisioningClient extends Activity implements
64 OcSecureResource.DoOwnershipTransferListener, OcSecureResource.ProvisionPairwiseDevicesListener {
66 private static final String TAG = "Provisioning Client: ";
67 private static final int BUFFER_SIZE = 1024;
69 private int verifyVal=1;
70 private String verifyNumber;
71 int unownedDevCount = StringConstants.NUMBER_ZERO;
72 OcProvisioning.PinCallbackListener pinCallbackListener =
73 new OcProvisioning.PinCallbackListener() {
75 public String pinCallbackListener() {
76 Log.d(TAG, "Inside Pin Callback ");
80 private String filePath = "";
81 private OcSecureResource newSecureResource;
82 private List<OcSecureResource> deviceList;
83 private List<OcSecureResource> ownedDeviceList;
84 private TextView mEventsTextView;
86 OcSecureResource.ProvisionDirectPairingListener provisionDPListener =
87 new OcSecureResource.ProvisionDirectPairingListener() {
89 public void provisionDirectPairingListener(List<ProvisionResult> provisionResults,
91 Log.d(TAG, "Inside provisionDPListener");
92 ProvisionResult pResult = provisionResults.get(0);
93 if (hasError == StringConstants.ERROR_CODE) {
94 logMessage(TAG + "Provision direct pairing Failed for " + pResult.getDevId());
96 logMessage(TAG + "Provision direct pairing Successful for " + pResult.getDevId());
97 if (ownedDeviceList.size() == 1) {
98 new ProvisionACLAsyncTask().execute();
100 if (ownedDeviceList.size() > 1) {
101 new GetLinkedDevicesAsyncTask().execute();
107 OcProvisioning.DisplayNumListener displayNumListener = new OcProvisioning.DisplayNumListener() {
109 public int displayNumListener(String verifyNum) {
110 Log.d(TAG, "Inside verifySecretListener ");
111 logMessage(TAG + "DisplayMutualVerifyNumListener verify Number = " + verifyNum);
112 verifyNumber = verifyNum;
117 OcProvisioning.ConfirmNumListener confirmNumListener = new OcProvisioning.ConfirmNumListener() {
119 public int confirmNumListener() {
120 Log.d(TAG, "Inside confirmMutualVerifyNumListener ");
121 final String message = "Is number matches with " + verifyNumber;
122 final Object lock = new Object();
123 runOnUiThread(new Runnable() {
127 AlertDialog.Builder alertDialog = new AlertDialog.Builder(ProvisioningClient.this);
128 alertDialog.setTitle("Confirm Number");
129 alertDialog.setMessage(message);
130 alertDialog.setCancelable(false);
131 alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
133 public void onClick(DialogInterface dialog, int which) {
136 synchronized (lock) {
140 } catch (Exception e) {
145 alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
147 public void onClick(DialogInterface dialog, int which) {
150 synchronized (lock) {
153 } catch (Exception e) {
160 synchronized (lock) {
163 } catch (InterruptedException e) {
167 Log.d(TAG, "VerifyVal after submit =" + verifyVal);
168 logMessage(TAG + " confirmMutualVerifyNumListener " + verifyVal);
173 OcSecureResource.ProvisionAclListener provisionAclListener =
174 new OcSecureResource.ProvisionAclListener() {
176 public void provisionAclListener(List<ProvisionResult> provisionResults,
178 Log.d(TAG, "Inside ProvisionAclListener ");
179 if (hasError == StringConstants.ERROR_CODE) {
180 logMessage("Error: ACL Provision failed !!");
182 logMessage("ACL Provision Done !!");
183 provisionCertChain();
187 OcSecureResource.ProvisionCredentialsListener provisionCredentialsListener =
188 new OcSecureResource.ProvisionCredentialsListener() {
190 public void provisionCredentialsListener(List<ProvisionResult> provisionResults,
192 Log.d(TAG, "Inside ProvisionCredentialsListener ");
193 if (hasError == StringConstants.ERROR_CODE) {
194 logMessage("Error: Provision Credentials failed !!");
196 logMessage("Provision Credentials Done !!");
197 new ProvisionACLAsyncTask().execute();
202 OcSecureResource.ProvisionTrustCertChainListener provisionTrustCertListener =
203 new OcSecureResource.ProvisionTrustCertChainListener() {
205 public void provisionTrustCertChainListener(List<ProvisionResult> provisionResults,
207 Log.d(TAG, "Inside provisionTrustCertChainListener ");
208 if (hasError == StringConstants.ERROR_CODE) {
209 logMessage("Error: Provision TrustCertChain failed !!");
211 logMessage("Provision TrustCertChain Done !!");
212 new DeviceRevocationAsyncTask().execute();
217 OcSecureResource.UnlinkDevicesListener unlinkDevicesListener =
218 new OcSecureResource.UnlinkDevicesListener() {
220 public void unlinkDevicesListener(List<ProvisionResult> provisionResults,
222 Log.d(TAG, "Inside unlinkDevicesListener ");
223 if (hasError == StringConstants.ERROR_CODE) {
224 logMessage("Error: UnLinking device !!");
226 logMessage("Unlink Done !!");
227 new ProvisionCredentialAsyncTask().execute();
231 OcSecureResource.RemoveDeviceListener removeDeviceListener =
232 new OcSecureResource.RemoveDeviceListener() {
234 public void removeDeviceListener(List<ProvisionResult> provisionResults,
236 if (hasError == StringConstants.ERROR_CODE) {
237 logMessage("Error: Remove Fail !!");
239 logMessage("Remove Device done !!");
245 protected void onCreate(Bundle savedInstanceState) {
246 super.onCreate(savedInstanceState);
247 setContentView(R.layout.activity_secure_provision_client);
248 mEventsTextView = new TextView(this);
249 mEventsTextView.setGravity(Gravity.BOTTOM);
250 mEventsTextView.setMovementMethod(new ScrollingMovementMethod());
251 LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);
252 layout.addView(mEventsTextView, new LinearLayout.LayoutParams(
253 LinearLayout.LayoutParams.MATCH_PARENT, 0, 1f)
255 filePath = getFilesDir().getPath() + "/"; // data/data/<package>/files/
256 //copy CBOR file when application runs first time
257 SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this);
258 boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
260 copyCborFromAsset(StringConstants.OIC_CLIENT_CBOR_DB_FILE_PLAIN);
261 copyCborFromAsset(StringConstants.OIC_CLIENT_CBOR_DB_FILE_ENC);
262 copyCborFromAsset(StringConstants.OIC_CLIENT_CBOR_DB_FILE_RESCUE);
263 SharedPreferences.Editor editor = wmbPreference.edit();
264 editor.putBoolean("FIRSTRUN", false);
269 int ret = CaInterface.setCipherSuite(OicCipher.TLS_ECDH_anon_WITH_AES_128_CBC_SHA,
270 OcConnectivityType.CT_ADAPTER_IP);
271 Log.e(TAG,"CaInterface.setCipherSuite returned = "+ret);
275 * configure OIC platform and call findResource
277 private void initOICStack() {
278 byte [] key = {(byte)0xa5, (byte)0x84, (byte)0x99, (byte)0x8d, (byte)0x0d, (byte)0xbd, (byte)0xb1, (byte)0x54,
279 (byte)0xbb, (byte)0xc5, (byte)0x4f, (byte)0xed, (byte)0x86, (byte)0x9a, (byte)0x66, (byte)0x11,
280 (byte)0xa5, (byte)0x84, (byte)0x99, (byte)0x8d, (byte)0x0d, (byte)0xbd, (byte)0xb1, (byte)0x54,
281 (byte)0xbb, (byte)0xc5, (byte)0x4f, (byte)0xed, (byte)0x86, (byte)0x9a, (byte)0x66, (byte)0x11
283 //create platform config
284 PlatformConfig cfg = new PlatformConfig(
287 ModeType.CLIENT_SERVER,
288 "0.0.0.0", // bind to all available interfaces
290 QualityOfService.LOW, filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE_PLAIN,
291 filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE_ENC,
292 filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE_RESCUE, 256, key);
293 OcPlatform.Configure(cfg);
296 /*byte [] deviceIdBytes= OcPlatform.getDeviceId();
297 String devId = new String(deviceIdBytes);
298 Log.d(TAG, "Get Device Id "+devId);
301 String setId = "adminDeviceUuid1";
302 OcPlatform.setDeviceId(setId.getBytes());
303 Log.d(TAG, "Set Device Id done");
304 setId = "adminDeviceUuid0";
305 OcPlatform.setDeviceId(setId.getBytes());
306 Log.d(TAG, "Set Device Id Reverted");
308 catch (OcException e) {
309 Log.d(TAG, e.getMessage());
314 * Initialize DataBase
316 String sqlDbPath = getFilesDir().getAbsolutePath().replace("files", "databases") +
318 File file = new File(sqlDbPath);
319 //check files directory exists
320 if (!(file.isDirectory())) {
322 Log.d(TAG, "Sql db directory created at " + sqlDbPath);
324 Log.d(TAG, "Sql db directory exists at " + sqlDbPath);
325 OcProvisioning.provisionInit(sqlDbPath + StringConstants.OIC_SQL_DB_FILE);
328 OcProvisioning.setMVJustWorksOptions(EnumSet.of(MVJustWorksOptionMask.DISPLAY_MUTUAL_VERIF_NUM,
329 MVJustWorksOptionMask.CONFIRM_MUTUAL_VERIF_NUM));
330 OcProvisioning.setDisplayNumListener(displayNumListener);
331 OcProvisioning.setConfirmNumListener(confirmNumListener);
332 } catch (OcException e) {
335 } catch (OcException e) {
336 logMessage(TAG + "provisionInit error: " + e.getMessage());
337 Log.e(TAG, e.getMessage());
339 new DiscoveryOTTransferAsyncTask().execute();
343 synchronized public void doOwnershipTransferListener(List<ProvisionResult> ProvisionResultList,
345 ProvisionResult pResult = ProvisionResultList.get(0);
346 if (hasError == StringConstants.ERROR_CODE) {
347 logMessage(TAG + "Ownership Transfer Failed for " + pResult.getDevId());
349 logMessage(TAG + "Ownership Transfer Successful for "
350 + pResult.getDevId());
353 if (unownedDevCount == 0) { //When done with Ownership Transfer
354 new OwnedDiscoveryAsyncTask().execute();
359 private void doDPProvisioning() {
361 logMessage(TAG + "Provision direct pairing for " + ownedDeviceList.get(0).getDeviceID());
362 newSecureResource = ownedDeviceList.get(0);
363 String pin = "00000000";
364 List<OcPrmType> prmTypes = new ArrayList<OcPrmType>();
365 prmTypes.add(OcPrmType.DP_PRE_CONFIGURED);
367 List<String> resources = new ArrayList<String>();
368 List<String> periods = new ArrayList<String>();
369 List<String> recurrences = new ArrayList<String>();
370 resources.add(StringConstants.DEFAULT_RESOURCES);
371 OicSecPdAcl pdAcl = new OicSecPdAcl(recurrences, periods,
372 StringConstants.DEFAULT_PERMISSION, resources);
373 OicSecPdAcl[] oicSecPdAcls = new OicSecPdAcl[1];
374 oicSecPdAcls[0] = pdAcl;
375 newSecureResource.doProvisionDirectPairing(pin, oicSecPdAcls, prmTypes, edp,
376 provisionDPListener);
377 } catch (Exception e) {
378 logMessage(TAG + "Direct Pairing Provisioning error: " + e.getMessage());
379 Log.e(TAG, e.getMessage());
384 private void doPairwiseProvisioning() {
386 logMessage(TAG + "Pairwise Provisioning b/w " + ownedDeviceList.get(0).getDeviceID()
387 + " and " + ownedDeviceList.get(1).getDeviceID());
388 newSecureResource = ownedDeviceList.get(0);
390 List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
391 List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
392 List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
394 List<String> types1 = new ArrayList<String>();
395 types1.add(StringConstants.RESOURCE_TYPE_1A);
396 types1.add(StringConstants.RESOURCE_TYPE_1B);
397 List<String> types2 = new ArrayList<String>();
398 types2.add(StringConstants.RESOURCE_TYPE_2A);
399 types2.add(StringConstants.RESOURCE_TYPE_2B);
400 List<String> interfaces = new ArrayList<String>();
401 interfaces.add(StringConstants.RESOURCE_INTERFACE_1);
402 interfaces.add(StringConstants.RESOURCE_INTERFACE_2);
404 OicSecResr oicSecResr1a = new OicSecResr(StringConstants.HREF_RESOURCES_1A, "", types1, 2, interfaces, 2);
405 OicSecResr oicSecResr1b = new OicSecResr(StringConstants.HREF_RESOURCES_1B, "", types1, 2, interfaces, 2);
406 resources1.add(oicSecResr1a);
407 resources1.add(oicSecResr1b);
409 OicSecResr oicSecResr2a = new OicSecResr(StringConstants.HREF_RESOURCES_2A, "", types2, 2, interfaces, 2);
410 OicSecResr oicSecResr2b = new OicSecResr(StringConstants.HREF_RESOURCES_2B, "", types2, 2, interfaces, 2);
411 resources2.add(oicSecResr2a);
412 resources2.add(oicSecResr2b);
414 List<String> recurrences = new ArrayList<String>();
415 recurrences.add(StringConstants.DEFAULT_RECURRENCES_1);
416 recurrences.add(StringConstants.DEFAULT_RECURRENCES_2);
417 OicSecValidity oicSecValidity = new OicSecValidity(StringConstants.DEFAULT_PERIOD,
419 validities.add(oicSecValidity);
421 OicSecAce oicsecace1 = new OicSecAce(newSecureResource.getDeviceID(),
422 StringConstants.DEFAULT_PERMISSION, resources1, validities);
423 OcSecureResource newSecureResource2 = ownedDeviceList.get(1);
424 OicSecAce oicsecace2 = new OicSecAce(newSecureResource2.getDeviceID(),
425 StringConstants.DEFAULT_PERMISSION, resources2, validities);
427 List<OicSecAce> oicSecAces1=new ArrayList<OicSecAce>();
428 oicSecAces1.add(oicsecace1);
429 List<OicSecAce> oicSecAces2=new ArrayList<OicSecAce>();
430 oicSecAces2.add(oicsecace2);
431 OicSecAcl acl1 = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID,oicSecAces1);
432 OicSecAcl acl2 = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID,oicSecAces2);
434 newSecureResource.provisionPairwiseDevices(EnumSet.of(CredType.SYMMETRIC_PAIR_WISE_KEY),
435 KeySize.OWNER_PSK_LENGTH_128, acl1, newSecureResource2, acl2, this);
436 } catch (Exception e) {
437 logMessage(TAG + "Pairwise Provisioning error: " + e.getMessage());
438 Log.e(TAG, e.getMessage());
443 public void provisionPairwiseDevicesListener(List<ProvisionResult> ProvisionResultList,
445 if (hasError == StringConstants.ERROR_CODE) {
446 logMessage(TAG + "provisionPairwiseDevices Failed");
448 for (int i = 0; i < ProvisionResultList.size(); i++) {
449 ProvisionResult pResult = ProvisionResultList.get(i);
450 logMessage(TAG + "provisionPairwiseDevices Result for "
451 + pResult.getDevId() + "is " + pResult.getResult());
457 * get cert from asset folder & save trusted cert chain
459 private void saveCertChain() {
460 InputStream inputStream = null;
463 inputStream = getAssets().open(StringConstants.CRT_FILE);
464 byte[] fileBytes = new byte[inputStream.available()+1];
465 inputStream.read(fileBytes);
466 fileBytes[inputStream.available()]=0x00;
467 credId = OcProvisioning.saveTrustCertChain(fileBytes,
468 EncodingType.OIC_ENCODING_PEM);
469 logMessage(TAG + "saveTrustCertChain return credId = " + credId);
470 } catch (IOException e) {
471 logMessage(TAG + "Cert file not exist in Assets" + e.getMessage());
472 Log.e(TAG, e.getMessage());
473 } catch (OcException e) {
474 logMessage(TAG + "saveTrustCertChain failed " + e.getMessage());
475 Log.e(TAG, e.getMessage());
477 if (inputStream != null) {
480 } catch (IOException e) {
481 Log.e(TAG, e.getMessage());
489 * Provision cert chain
491 private void provisionCertChain() {
493 if (ownedDeviceList.size() > 0) {
495 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
496 logMessage(TAG + "Initiate provision cert chain credId = "
498 ocSecureResource.provisionTrustCertChain(
499 EnumSet.of(CredType.SIGNED_ASYMMETRIC_KEY), credId,
500 provisionTrustCertListener);
501 } catch (OcException e) {
502 logMessage(TAG + "Provision cert chain error: "
504 Log.e(TAG, e.getMessage());
511 * Copy svr db CBOR dat file from assets folder to app data files dir
513 private void copyCborFromAsset(String filep) {
514 InputStream inputStream = null;
515 OutputStream outputStream = null;
517 byte[] buffer = new byte[BUFFER_SIZE];
519 inputStream = getAssets().open(filep);
520 File file = new File(filePath);
521 //check files directory exists
522 if (!(file.exists() && file.isDirectory())) {
525 outputStream = new FileOutputStream(filePath + filep);
526 while ((length = inputStream.read(buffer)) != -1) {
527 outputStream.write(buffer, 0, length);
529 } catch (NullPointerException e) {
530 logMessage(TAG + "Null pointer exception " + e.getMessage());
531 Log.e(TAG, e.getMessage());
532 } catch (FileNotFoundException e) {
533 logMessage(TAG + "CBOR svr db file not found " + e.getMessage());
534 Log.e(TAG, e.getMessage());
535 } catch (IOException e) {
536 logMessage(TAG + filep + " file copy failed");
537 Log.e(TAG, e.getMessage());
539 if (inputStream != null) {
542 } catch (IOException e) {
543 Log.e(TAG, e.getMessage());
546 if (outputStream != null) {
548 outputStream.close();
549 } catch (IOException e) {
550 Log.e(TAG, e.getMessage());
556 public void logMessage(String text) {
560 public void logMsg(final String text) {
561 runOnUiThread(new Runnable() {
563 Message msg = new Message();
565 mEventsTextView.append(text);
566 mEventsTextView.append("\n\n");
570 Intent intent = new Intent(getPackageName());
571 intent.putExtra(StringConstants.MESSAGE, text);
572 sendBroadcast(intent);
575 private class DiscoveryOTTransferAsyncTask extends AsyncTask<Void, String, String> {
578 protected void onPreExecute() {
579 super.onPreExecute();
583 protected String doInBackground(Void... params) {
586 * Discover Un-owned devices
588 publishProgress(TAG + "Discovering Unowned Devices");
589 deviceList = new ArrayList<OcSecureResource>(OcProvisioning.discoverUnownedDevices
590 (StringConstants.DISCOVERY_TIMEOUT_10));
591 if (deviceList.size() > 0) {
592 unownedDevCount = deviceList.size();
593 for (int i = 0; i < deviceList.size(); i++) {
594 publishProgress(TAG + "Un-owned Discovered Device " + (i + 1) + "= " +
595 deviceList.get(i).getDeviceID());
598 OcProvisioning.SetownershipTransferCBdata(OxmType.OIC_JUST_WORKS,
599 pinCallbackListener);
600 for (int i = 0; i < deviceList.size(); i++) {
601 publishProgress(TAG + "Doing Ownership Transfer for " +
602 deviceList.get(i).getDeviceID());
603 deviceList.get(i).doOwnershipTransfer(ProvisioningClient.this);
605 } catch (OcException e) {
606 publishProgress(TAG + "Ownership Transfer error: " + e.getMessage());
607 return "Ownership Transfer error: " + e.getMessage();
611 publishProgress(TAG + "No un-owned devices present");
612 new OwnedDiscoveryAsyncTask().execute();
614 } catch (OcException e) {
615 publishProgress(TAG + "Un-owned discovery error: " + e.getMessage());
616 return "Un-owned discovery error: " + e.getMessage();
622 protected void onProgressUpdate(String... values) {
623 logMessage(values[0]);
627 protected void onPostExecute(String s) {
628 super.onPostExecute(s);
632 private class ProvisionACLAsyncTask extends AsyncTask<Void, String, Void> {
635 protected void onPreExecute() {
636 super.onPreExecute();
640 protected Void doInBackground(Void... params) {
642 if (ownedDeviceList.size() > 0) {
643 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
645 publishProgress(TAG + "ACL Provision for " + ocSecureResource.getDeviceID());
646 List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
647 List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
648 List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
650 List<String> types1 = new ArrayList<String>();
651 types1.add(StringConstants.RESOURCE_TYPE_1A);
652 types1.add(StringConstants.RESOURCE_TYPE_1B);
653 List<String> types2 = new ArrayList<String>();
654 types2.add(StringConstants.RESOURCE_TYPE_2A);
655 types2.add(StringConstants.RESOURCE_TYPE_2B);
656 List<String> interfaces = new ArrayList<String>();
657 interfaces.add(StringConstants.RESOURCE_INTERFACE_1);
658 interfaces.add(StringConstants.RESOURCE_INTERFACE_2);
660 OicSecResr oicSecResr1a = new OicSecResr(StringConstants.HREF_RESOURCES_1A, "", types1, 2, interfaces, 2);
661 OicSecResr oicSecResr1b = new OicSecResr(StringConstants.HREF_RESOURCES_1B, "", types1, 2, interfaces, 2);
662 resources1.add(oicSecResr1a);
663 resources1.add(oicSecResr1b);
665 OicSecResr oicSecResr2a = new OicSecResr(StringConstants.HREF_RESOURCES_2A, "", types2, 2, interfaces, 2);
666 OicSecResr oicSecResr2b = new OicSecResr(StringConstants.HREF_RESOURCES_2B, "", types2, 2, interfaces, 2);
667 resources2.add(oicSecResr2a);
668 resources2.add(oicSecResr2b);
670 List<String> recurrences = new ArrayList<String>();
671 recurrences.add(StringConstants.DEFAULT_RECURRENCES_1);
672 recurrences.add(StringConstants.DEFAULT_RECURRENCES_2);
673 OicSecValidity oicSecValidity = new OicSecValidity(StringConstants.DEFAULT_PERIOD,
675 validities.add(oicSecValidity);
677 OicSecAce oicsecace1 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID1,
678 StringConstants.DEFAULT_PERMISSION, resources1, validities);
680 OicSecAce oicsecace2 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID2,
681 StringConstants.DEFAULT_PERMISSION, resources2, validities);
683 List<OicSecAce> oicSecAces=new ArrayList<OicSecAce>();
684 oicSecAces.add(oicsecace1);
685 oicSecAces.add(oicsecace2);
687 OicSecAcl aclObject = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID, oicSecAces);
689 ocSecureResource.provisionACL(aclObject, provisionAclListener);
691 publishProgress(TAG + "No Owned devices present");
693 } catch (Exception e) {
694 publishProgress(TAG + "ProvisionACL error: " + e.getMessage());
700 protected void onProgressUpdate(String... values) {
701 logMessage(values[0]);
705 private class ProvisionCredentialAsyncTask extends AsyncTask<Void, String, Void> {
708 protected void onPreExecute() {
709 super.onPreExecute();
713 protected Void doInBackground(Void... params) {
715 if (ownedDeviceList.size() > 1) {
716 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
717 OcSecureResource ocSecureResourceDest = ownedDeviceList.get(1);
718 publishProgress(TAG + "ProvisionCredential for " +
719 ocSecureResource.getDeviceID() + " with " +
720 ocSecureResourceDest.getDeviceID());
721 ocSecureResource.provisionCredentials(EnumSet.of(CredType.SYMMETRIC_PAIR_WISE_KEY),
722 KeySize.OWNER_PSK_LENGTH_128,
723 ocSecureResourceDest, provisionCredentialsListener);
725 publishProgress(TAG + "Cannot perform credentials between devices");
727 } catch (Exception e) {
728 publishProgress(TAG + "Provision credentials error: " + e.getMessage());
734 protected void onProgressUpdate(String... values) {
735 logMessage(values[0]);
739 private class GetLinkedDevicesAsyncTask extends AsyncTask<Void, String, String> {
742 protected void onPreExecute() {
743 super.onPreExecute();
747 protected String doInBackground(Void... params) {
749 if (ownedDeviceList.size() > 1) {
750 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
751 publishProgress(TAG + "Get linked devices of " + ocSecureResource.getDeviceID());
752 List<String> linkedDevices = ocSecureResource.getLinkedDevices();
753 if (linkedDevices.size() > 0) {
754 for (int i = 0; i < linkedDevices.size(); i++) {
755 publishProgress(TAG + "Linked Devices " +
756 (i + 1) + "= " + linkedDevices.get(i));
759 publishProgress(TAG + "No linked Devices found");
762 publishProgress(TAG + "Cannot perform linked devices");
764 } catch (Exception e) {
765 publishProgress(TAG + "getLinked device error: " + e.getMessage());
772 protected void onProgressUpdate(String... values) {
773 logMessage(values[0]);
777 protected void onPostExecute(String s) {
778 if ("success".equals(s)) {
779 new ProvisionUnlinkAsyncTask().execute();
784 private class ProvisionUnlinkAsyncTask extends AsyncTask<Void, String, Void> {
787 protected void onPreExecute() {
788 super.onPreExecute();
792 protected Void doInBackground(Void... params) {
794 if (ownedDeviceList.size() > 1) {
795 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
796 OcSecureResource ocSecureResourceDest = ownedDeviceList.get(1);
797 publishProgress(TAG + "Un linking " + ocSecureResource.getDeviceID() +
798 " with " + ocSecureResourceDest.getDeviceID());
799 ocSecureResource.unlinkDevices(ocSecureResourceDest, unlinkDevicesListener);
801 publishProgress(TAG + "Cannot perform unlink devices");
803 } catch (Exception e) {
804 publishProgress(TAG + "Unlink error: " + e.getMessage());
810 protected void onProgressUpdate(String... values) {
811 logMessage(values[0]);
815 private class DeviceRevocationAsyncTask extends AsyncTask<Void, String, Void> {
818 protected void onPreExecute() {
819 super.onPreExecute();
823 protected Void doInBackground(Void... params) {
825 if (ownedDeviceList.size() > 0) {
826 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
827 publishProgress(TAG + "Removing " + ocSecureResource.getDeviceID());
828 ocSecureResource.removeDevice(StringConstants.DISCOVERY_TIMEOUT_20,
829 removeDeviceListener);
831 publishProgress(TAG + "Cannot remove");
833 } catch (Exception e) {
834 publishProgress(TAG + "Remove Device error: " + e.getMessage());
840 protected void onProgressUpdate(String... values) {
841 logMessage(values[0]);
845 private class OwnedDiscoveryAsyncTask extends AsyncTask<Void, String, String> {
848 protected void onPreExecute() {
849 super.onPreExecute();
853 protected String doInBackground(Void... params) {
855 publishProgress(TAG + "Initiate Owned device Discovery");
856 ownedDeviceList = OcProvisioning.discoverOwnedDevices
857 (StringConstants.DISCOVERY_TIMEOUT_10);
858 if (ownedDeviceList.size() > 0) {
859 for (int i = 0; i < ownedDeviceList.size(); i++) {
860 publishProgress(TAG + "Owned Discovered Device " + (i + 1) + "= " +
861 ownedDeviceList.get(i).getDeviceID()
862 + "\nIP Address= " + ownedDeviceList.get(i).getIpAddr()
863 + "\nOwned Status= " + ownedDeviceList.get(i).getOwnedStatus()
864 + "\nDevice Status= " + ((ownedDeviceList.get(i).
865 getDeviceStatus() == DeviceStatus.ON) ? "ON" : "OFF")
869 publishProgress(TAG + "No Owned devices present");
871 } catch (OcException e) {
872 publishProgress(TAG + "Owned device Discovery error: " + e.getMessage());
873 return "Owned device Discovery error: " + e.getMessage();
879 protected void onProgressUpdate(String... values) {
880 logMessage(values[0]);
884 protected void onPostExecute(String s) {
887 if (ownedDeviceList.size() == 1 && "success".equals(s)) {
890 if (ownedDeviceList.size() > 1 && "success".equals(s)) {
891 doPairwiseProvisioning();
898 public boolean onCreateOptionsMenu(Menu menu) {
899 // Inflate the menu; this adds items to the action bar if it is present.
900 getMenuInflater().inflate(R.menu.menu_secure_provision_client, menu);
905 public boolean onOptionsItemSelected(MenuItem item) {
906 int id = item.getItemId();
909 if (id == R.id.export_dat) {
911 File sd = Environment.getExternalStorageDirectory();
912 File data = Environment.getDataDirectory();
914 String currentDBPath = "/data/data/" + getPackageName() + "/files/" + StringConstants.OIC_CLIENT_CBOR_DB_FILE_ENC;
916 File currentDB = new File(currentDBPath);
917 File backupDB = new File(sd, StringConstants.OIC_CLIENT_CBOR_DB_FILE_ENC);
918 if (currentDB.exists()) {
919 FileChannel src = new FileInputStream(currentDB).getChannel();
920 FileChannel dst = new FileOutputStream(backupDB).getChannel();
921 dst.transferFrom(src, 0, src.size());
926 } catch (Exception e) {
927 Toast.makeText(ProvisioningClient.this, e.getMessage(), Toast.LENGTH_SHORT).show();
930 Toast.makeText(ProvisioningClient.this, StringConstants.OIC_CLIENT_CBOR_DB_FILE_ENC + " File export to sdcard", Toast.LENGTH_SHORT).show();
933 return super.onOptionsItemSelected(item);
937 * to display on Server Message on Client screen
939 public class MessageReceiver extends BroadcastReceiver {
941 public void onReceive(Context context, Intent intent) {
942 final String message = intent.getStringExtra(StringConstants.MESSAGE);