replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / android / examples / provisioningclient / src / main / java / org / iotivity / base / examples / provisioningclient / ProvisioningClient.java
1 package org.iotivity.base.examples.provisioningclient;
2
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;
23
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;
45
46 import java.io.File;
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;
57
58 import org.iotivity.ca.OicCipher;
59 import org.iotivity.base.OcConnectivityType;
60 import org.iotivity.ca.CaInterface;
61
62
63 public class ProvisioningClient extends Activity implements
64 OcSecureResource.DoOwnershipTransferListener, OcSecureResource.ProvisionPairwiseDevicesListener {
65
66     private static final String TAG = "Provisioning Client: ";
67     private static final int BUFFER_SIZE = 1024;
68     private int credId=0;
69     private int verifyVal=1;
70     private String verifyNumber;
71     int unownedDevCount = StringConstants.NUMBER_ZERO;
72     OcProvisioning.PinCallbackListener pinCallbackListener =
73         new OcProvisioning.PinCallbackListener() {
74             @Override
75                 public String pinCallbackListener() {
76                     Log.d(TAG, "Inside Pin Callback ");
77                     return "";
78                 }
79         };
80     private String filePath = "";
81     private OcSecureResource newSecureResource;
82     private List<OcSecureResource> deviceList;
83     private List<OcSecureResource> ownedDeviceList;
84     private TextView mEventsTextView;
85
86     OcSecureResource.ProvisionDirectPairingListener provisionDPListener =
87         new OcSecureResource.ProvisionDirectPairingListener() {
88             @Override
89                 public void provisionDirectPairingListener(List<ProvisionResult> provisionResults,
90                         int hasError) {
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());
95                     } else {
96                         logMessage(TAG + "Provision direct pairing Successful for " + pResult.getDevId());
97                         if (ownedDeviceList.size() == 1) {
98                             new ProvisionACLAsyncTask().execute();
99                         }
100                         if (ownedDeviceList.size() > 1) {
101                             new GetLinkedDevicesAsyncTask().execute();
102                         }
103                     }
104                 }
105         };
106
107     OcProvisioning.DisplayNumListener displayNumListener = new OcProvisioning.DisplayNumListener() {
108         @Override
109             public int displayNumListener(String verifyNum) {
110                 Log.d(TAG, "Inside verifySecretListener ");
111                 logMessage(TAG + "DisplayMutualVerifyNumListener verify Number = " + verifyNum);
112                 verifyNumber = verifyNum;
113                 return 0;
114             }
115     };
116
117     OcProvisioning.ConfirmNumListener confirmNumListener = new OcProvisioning.ConfirmNumListener() {
118         @Override
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() {
124                 @Override
125                 public void run() {
126
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() {
132                         @Override
133                         public void onClick(DialogInterface dialog, int which) {
134                             dialog.dismiss();
135                             try {
136                                 synchronized (lock) {
137                                     verifyVal = 0;
138                                     lock.notifyAll();
139                                 }
140                             } catch (Exception e) {
141                                 Log.d(TAG, e + "");
142                             }
143                         }
144                     });
145                     alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
146                         @Override
147                         public void onClick(DialogInterface dialog, int which) {
148                             dialog.dismiss();
149                             try {
150                                 synchronized (lock) {
151                                     lock.notifyAll();
152                                 }
153                             } catch (Exception e) {
154                                 Log.d(TAG, e + "");
155                             }
156                         }
157                     }).show();
158                 }
159             });
160             synchronized (lock) {
161                 try {
162                     lock.wait();
163                 } catch (InterruptedException e) {
164                     Log.d(TAG, e + "");
165                 }
166             }
167             Log.d(TAG, "VerifyVal after submit =" + verifyVal);
168             logMessage(TAG + " confirmMutualVerifyNumListener " + verifyVal);
169             return verifyVal;
170         }
171     };
172
173     OcSecureResource.ProvisionAclListener provisionAclListener =
174         new OcSecureResource.ProvisionAclListener() {
175             @Override
176                 public void provisionAclListener(List<ProvisionResult> provisionResults,
177                         int hasError) {
178                     Log.d(TAG, "Inside ProvisionAclListener ");
179                     if (hasError == StringConstants.ERROR_CODE) {
180                         logMessage("Error: ACL Provision failed !!");
181                     } else {
182                         logMessage("ACL Provision Done !!");
183                         provisionCertChain();
184                     }
185                 }
186         };
187     OcSecureResource.ProvisionCredentialsListener provisionCredentialsListener =
188         new OcSecureResource.ProvisionCredentialsListener() {
189             @Override
190                 public void provisionCredentialsListener(List<ProvisionResult> provisionResults,
191                         int hasError) {
192                     Log.d(TAG, "Inside ProvisionCredentialsListener ");
193                     if (hasError == StringConstants.ERROR_CODE) {
194                         logMessage("Error: Provision Credentials failed !!");
195                     } else {
196                         logMessage("Provision Credentials Done !!");
197                         new ProvisionACLAsyncTask().execute();
198                     }
199                 }
200         };
201
202     OcSecureResource.ProvisionTrustCertChainListener provisionTrustCertListener =
203         new OcSecureResource.ProvisionTrustCertChainListener() {
204             @Override
205                 public void provisionTrustCertChainListener(List<ProvisionResult> provisionResults,
206                         int hasError) {
207                     Log.d(TAG, "Inside provisionTrustCertChainListener ");
208                     if (hasError == StringConstants.ERROR_CODE) {
209                         logMessage("Error: Provision TrustCertChain failed !!");
210                     } else {
211                         logMessage("Provision TrustCertChain Done !!");
212                         new DeviceRevocationAsyncTask().execute();
213                     }
214                 }
215         };
216
217     OcSecureResource.UnlinkDevicesListener unlinkDevicesListener =
218         new OcSecureResource.UnlinkDevicesListener() {
219             @Override
220                 public void unlinkDevicesListener(List<ProvisionResult> provisionResults,
221                         int hasError) {
222                     Log.d(TAG, "Inside unlinkDevicesListener ");
223                     if (hasError == StringConstants.ERROR_CODE) {
224                         logMessage("Error: UnLinking device !!");
225                     } else {
226                         logMessage("Unlink Done !!");
227                         new ProvisionCredentialAsyncTask().execute();
228                     }
229                 }
230         };
231     OcSecureResource.RemoveDeviceListener removeDeviceListener =
232         new OcSecureResource.RemoveDeviceListener() {
233             @Override
234                 public void removeDeviceListener(List<ProvisionResult> provisionResults,
235                         int hasError) {
236                     if (hasError == StringConstants.ERROR_CODE) {
237                         logMessage("Error: Remove Fail !!");
238                     } else {
239                         logMessage("Remove Device done !!");
240                     }
241                 }
242         };
243
244     @Override
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)
254                     );
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);
259             if (isFirstRun) {
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);
265                 editor.commit();
266             }
267             initOICStack();
268             saveCertChain();
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);
272         }
273
274     /**
275      * configure OIC platform and call findResource
276      */
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
282         };
283         //create platform config
284         PlatformConfig cfg = new PlatformConfig(
285                 this,
286                 ServiceType.IN_PROC,
287                 ModeType.CLIENT_SERVER,
288                 "0.0.0.0", // bind to all available interfaces
289                 0,
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);
294
295         //Get deviceId
296         /*byte [] deviceIdBytes= OcPlatform.getDeviceId();
297           String devId = new String(deviceIdBytes);
298           Log.d(TAG, "Get Device Id "+devId);
299         //Set deviceId
300         try {
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");
307         }
308         catch (OcException e) {
309         Log.d(TAG, e.getMessage());
310         }*/
311
312         try {
313             /*
314              * Initialize DataBase
315              */
316             String sqlDbPath = getFilesDir().getAbsolutePath().replace("files", "databases") +
317                 File.separator;
318             File file = new File(sqlDbPath);
319             //check files directory exists
320             if (!(file.isDirectory())) {
321                 file.mkdirs();
322                 Log.d(TAG, "Sql db directory created at " + sqlDbPath);
323             }
324             Log.d(TAG, "Sql db directory exists at " + sqlDbPath);
325             OcProvisioning.provisionInit(sqlDbPath + StringConstants.OIC_SQL_DB_FILE);
326
327             try {
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) {
333                 e.printStackTrace();
334             }
335         } catch (OcException e) {
336             logMessage(TAG + "provisionInit error: " + e.getMessage());
337             Log.e(TAG, e.getMessage());
338         }
339         new DiscoveryOTTransferAsyncTask().execute();
340     }
341
342     @Override
343         synchronized public void doOwnershipTransferListener(List<ProvisionResult> ProvisionResultList,
344                 int hasError) {
345             ProvisionResult pResult = ProvisionResultList.get(0);
346             if (hasError == StringConstants.ERROR_CODE) {
347                 logMessage(TAG + "Ownership Transfer Failed for " + pResult.getDevId());
348             } else {
349                 logMessage(TAG + "Ownership Transfer Successful for "
350                         + pResult.getDevId());
351                 unownedDevCount--;
352             }
353             if (unownedDevCount == 0) { //When done with Ownership Transfer
354                 new OwnedDiscoveryAsyncTask().execute();
355             }
356         }
357
358
359     private void doDPProvisioning() {
360         try {
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);
366             boolean edp = true;
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());
380         }
381     }
382
383
384     private void doPairwiseProvisioning() {
385         try {
386             logMessage(TAG + "Pairwise Provisioning b/w " + ownedDeviceList.get(0).getDeviceID()
387                     + " and " + ownedDeviceList.get(1).getDeviceID());
388             newSecureResource = ownedDeviceList.get(0);
389
390             List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
391             List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
392             List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
393
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);
403
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);
408
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);
413
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,
418                     recurrences, 2);
419             validities.add(oicSecValidity);
420
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);
426
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);
433
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());
439         }
440     }
441
442     @Override
443         public void provisionPairwiseDevicesListener(List<ProvisionResult> ProvisionResultList,
444                 int hasError) {
445             if (hasError == StringConstants.ERROR_CODE) {
446                 logMessage(TAG + "provisionPairwiseDevices Failed");
447             } else {
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());
452                 }
453                 doDPProvisioning();
454             }
455         }
456     /**
457      * get cert from asset folder & save trusted cert chain
458      */
459     private void saveCertChain() {
460         InputStream inputStream = null;
461         try {
462
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());
476         } finally {
477             if (inputStream != null) {
478                 try {
479                     inputStream.close();
480                 } catch (IOException e) {
481                     Log.e(TAG, e.getMessage());
482                 }
483             }
484
485         }
486     }
487
488     /**
489      * Provision cert chain
490      */
491     private void provisionCertChain() {
492
493         if (ownedDeviceList.size() > 0) {
494             try {
495                 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
496                 logMessage(TAG + "Initiate provision cert chain credId = "
497                         + 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: "
503                         + e.getMessage());
504                 Log.e(TAG, e.getMessage());
505             }
506         }
507
508     }
509
510     /**
511      * Copy svr db CBOR dat file from assets folder to app data files dir
512      */
513     private void copyCborFromAsset(String filep) {
514         InputStream inputStream = null;
515         OutputStream outputStream = null;
516         int length;
517         byte[] buffer = new byte[BUFFER_SIZE];
518         try {
519             inputStream = getAssets().open(filep);
520             File file = new File(filePath);
521             //check files directory exists
522             if (!(file.exists() && file.isDirectory())) {
523                 file.mkdirs();
524             }
525             outputStream = new FileOutputStream(filePath + filep);
526             while ((length = inputStream.read(buffer)) != -1) {
527                 outputStream.write(buffer, 0, length);
528             }
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());
538         } finally {
539             if (inputStream != null) {
540                 try {
541                     inputStream.close();
542                 } catch (IOException e) {
543                     Log.e(TAG, e.getMessage());
544                 }
545             }
546             if (outputStream != null) {
547                 try {
548                     outputStream.close();
549                 } catch (IOException e) {
550                     Log.e(TAG, e.getMessage());
551                 }
552             }
553         }
554     }
555
556     public void logMessage(String text) {
557         logMsg(text);
558     }
559
560     public void logMsg(final String text) {
561         runOnUiThread(new Runnable() {
562                 public void run() {
563                 Message msg = new Message();
564                 msg.obj = text;
565                 mEventsTextView.append(text);
566                 mEventsTextView.append("\n\n");
567                 }
568                 });
569         Log.i(TAG, text);
570         Intent intent = new Intent(getPackageName());
571         intent.putExtra(StringConstants.MESSAGE, text);
572         sendBroadcast(intent);
573     }
574
575     private class DiscoveryOTTransferAsyncTask extends AsyncTask<Void, String, String> {
576
577         @Override
578             protected void onPreExecute() {
579                 super.onPreExecute();
580             }
581
582         @Override
583             protected String doInBackground(Void... params) {
584                 try {
585                     /**
586                      * Discover Un-owned devices
587                      */
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());
596                         }
597                         try {
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);
604                             }
605                         } catch (OcException e) {
606                             publishProgress(TAG + "Ownership Transfer error: " + e.getMessage());
607                             return "Ownership Transfer error: " + e.getMessage();
608
609                         }
610                     } else {
611                         publishProgress(TAG + "No un-owned devices present");
612                         new OwnedDiscoveryAsyncTask().execute();
613                     }
614                 } catch (OcException e) {
615                     publishProgress(TAG + "Un-owned discovery error: " + e.getMessage());
616                     return "Un-owned discovery error:  " + e.getMessage();
617                 }
618                 return "success";
619             }
620
621         @Override
622             protected void onProgressUpdate(String... values) {
623                 logMessage(values[0]);
624             }
625
626         @Override
627             protected void onPostExecute(String s) {
628                 super.onPostExecute(s);
629             }
630     }
631
632     private class ProvisionACLAsyncTask extends AsyncTask<Void, String, Void> {
633
634         @Override
635             protected void onPreExecute() {
636                 super.onPreExecute();
637             }
638
639         @Override
640             protected Void doInBackground(Void... params) {
641                 try {
642                     if (ownedDeviceList.size() > 0) {
643                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
644
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>();
649
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);
659
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);
664
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);
669
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,
674                                 recurrences, 2);
675                         validities.add(oicSecValidity);
676
677                         OicSecAce oicsecace1 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID1,
678                                 StringConstants.DEFAULT_PERMISSION, resources1, validities);
679
680                         OicSecAce oicsecace2 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID2,
681                                 StringConstants.DEFAULT_PERMISSION, resources2, validities);
682
683                         List<OicSecAce> oicSecAces=new ArrayList<OicSecAce>();
684                         oicSecAces.add(oicsecace1);
685                         oicSecAces.add(oicsecace2);
686
687                         OicSecAcl aclObject = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID, oicSecAces);
688
689                         ocSecureResource.provisionACL(aclObject, provisionAclListener);
690                     } else {
691                         publishProgress(TAG + "No Owned devices present");
692                     }
693                 } catch (Exception e) {
694                     publishProgress(TAG + "ProvisionACL error: " + e.getMessage());
695                 }
696                 return null;
697             }
698
699         @Override
700             protected void onProgressUpdate(String... values) {
701                 logMessage(values[0]);
702             }
703     }
704
705     private class ProvisionCredentialAsyncTask extends AsyncTask<Void, String, Void> {
706
707         @Override
708             protected void onPreExecute() {
709                 super.onPreExecute();
710             }
711
712         @Override
713             protected Void doInBackground(Void... params) {
714                 try {
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);
724                     } else {
725                         publishProgress(TAG + "Cannot perform credentials between devices");
726                     }
727                 } catch (Exception e) {
728                     publishProgress(TAG + "Provision credentials error: " + e.getMessage());
729                 }
730                 return null;
731             }
732
733         @Override
734             protected void onProgressUpdate(String... values) {
735                 logMessage(values[0]);
736             }
737     }
738
739     private class GetLinkedDevicesAsyncTask extends AsyncTask<Void, String, String> {
740
741         @Override
742             protected void onPreExecute() {
743                 super.onPreExecute();
744             }
745
746         @Override
747             protected String doInBackground(Void... params) {
748                 try {
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));
757                             }
758                         } else {
759                             publishProgress(TAG + "No linked Devices found");
760                         }
761                     } else {
762                         publishProgress(TAG + "Cannot perform linked devices");
763                     }
764                 } catch (Exception e) {
765                     publishProgress(TAG + "getLinked device error: " + e.getMessage());
766                     return "failed";
767                 }
768                 return "success";
769             }
770
771         @Override
772             protected void onProgressUpdate(String... values) {
773                 logMessage(values[0]);
774             }
775
776         @Override
777             protected void onPostExecute(String s) {
778                 if ("success".equals(s)) {
779                     new ProvisionUnlinkAsyncTask().execute();
780                 }
781             }
782     }
783
784     private class ProvisionUnlinkAsyncTask extends AsyncTask<Void, String, Void> {
785
786         @Override
787             protected void onPreExecute() {
788                 super.onPreExecute();
789             }
790
791         @Override
792             protected Void doInBackground(Void... params) {
793                 try {
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);
800                     } else {
801                         publishProgress(TAG + "Cannot perform unlink devices");
802                     }
803                 } catch (Exception e) {
804                     publishProgress(TAG + "Unlink error: " + e.getMessage());
805                 }
806                 return null;
807             }
808
809         @Override
810             protected void onProgressUpdate(String... values) {
811                 logMessage(values[0]);
812             }
813     }
814
815     private class DeviceRevocationAsyncTask extends AsyncTask<Void, String, Void> {
816
817         @Override
818             protected void onPreExecute() {
819                 super.onPreExecute();
820             }
821
822         @Override
823             protected Void doInBackground(Void... params) {
824                 try {
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);
830                     } else {
831                         publishProgress(TAG + "Cannot remove");
832                     }
833                 } catch (Exception e) {
834                     publishProgress(TAG + "Remove Device error: " + e.getMessage());
835                 }
836                 return null;
837             }
838
839         @Override
840             protected void onProgressUpdate(String... values) {
841                 logMessage(values[0]);
842             }
843     }
844
845     private class OwnedDiscoveryAsyncTask extends AsyncTask<Void, String, String> {
846
847         @Override
848             protected void onPreExecute() {
849                 super.onPreExecute();
850             }
851
852         @Override
853             protected String doInBackground(Void... params) {
854                 try {
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")
866                                     );
867                         }
868                     } else {
869                         publishProgress(TAG + "No Owned devices present");
870                     }
871                 } catch (OcException e) {
872                     publishProgress(TAG + "Owned device Discovery error: " + e.getMessage());
873                     return "Owned device Discovery error: " + e.getMessage();
874                 }
875                 return "success";
876             }
877
878         @Override
879             protected void onProgressUpdate(String... values) {
880                 logMessage(values[0]);
881             }
882
883         @Override
884             protected void onPostExecute(String s) {
885
886
887                 if (ownedDeviceList.size() == 1 && "success".equals(s)) {
888                     doDPProvisioning();
889                 }
890                 if (ownedDeviceList.size() > 1 && "success".equals(s)) {
891                     doPairwiseProvisioning();
892                 }
893
894             }
895     }
896
897     @Override
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);
901             return true;
902         }
903
904     @Override
905     public boolean onOptionsItemSelected(MenuItem item) {
906         int id = item.getItemId();
907
908
909         if (id == R.id.export_dat) {
910             try {
911                 File sd = Environment.getExternalStorageDirectory();
912                 File data = Environment.getDataDirectory();
913                 if (sd.canWrite()) {
914                     String currentDBPath = "/data/data/" + getPackageName() + "/files/" + StringConstants.OIC_CLIENT_CBOR_DB_FILE_ENC;
915
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());
922                         src.close();
923                         dst.close();
924                     }
925                 }
926             } catch (Exception e) {
927                 Toast.makeText(ProvisioningClient.this, e.getMessage(), Toast.LENGTH_SHORT).show();
928             }
929
930             Toast.makeText(ProvisioningClient.this, StringConstants.OIC_CLIENT_CBOR_DB_FILE_ENC + " File export to sdcard", Toast.LENGTH_SHORT).show();
931             return true;
932         }
933         return super.onOptionsItemSelected(item);
934     }
935
936     /**
937      * to display on Server Message on Client screen
938      */
939     public class MessageReceiver extends BroadcastReceiver {
940         @Override
941             public void onReceive(Context context, Intent intent) {
942                 final String message = intent.getStringExtra(StringConstants.MESSAGE);
943                 logMessage(message);
944             }
945     }
946 }