diff --git a/otgc/build.gradle b/otgc/build.gradle index d655110..944f983 100644 --- a/otgc/build.gradle +++ b/otgc/build.gradle @@ -30,7 +30,7 @@ android { minSdkVersion 21 targetSdkVersion 28 versionCode 13 - versionName "2.0.2" + versionName "2.0.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" compileOptions { diff --git a/otgc/src/main/java/org/openconnectivity/otgc/data/entity/DeviceEntity.java b/otgc/src/main/java/org/openconnectivity/otgc/data/entity/DeviceEntity.java index e8137fc..806685b 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/data/entity/DeviceEntity.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/data/entity/DeviceEntity.java @@ -63,9 +63,8 @@ public DeviceEntity(@NonNull String id, String name, OCEndpoint endpoints, @Null mHosts = new ArrayList<>(); while(endpoints != null) { - String[] endpointStr = new String[1]; - OCEndpointUtil.toString(endpoints, endpointStr); - mHosts.add(endpointStr[0]); + String endpointStr = OCEndpointUtil.toString(endpoints); + mHosts.add(endpointStr); endpoints = endpoints.getNext(); } diff --git a/otgc/src/main/java/org/openconnectivity/otgc/data/repository/DoxsRepository.java b/otgc/src/main/java/org/openconnectivity/otgc/data/repository/DoxsRepository.java index 361ce9b..98f650b 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/data/repository/DoxsRepository.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/data/repository/DoxsRepository.java @@ -91,6 +91,8 @@ public Completable doOwnershipTransfer(String deviceId, OcfOxmType oxm) { emitter.onError(new Exception(error)); } }); + } else if (oxm == OcfOxmType.OC_OXMTYPE_MFG_CERT) { + ret = OCObt.performCertOtm(uuid, handler); } if (ret >= 0) { diff --git a/otgc/src/main/java/org/openconnectivity/otgc/data/repository/IotivityRepository.java b/otgc/src/main/java/org/openconnectivity/otgc/data/repository/IotivityRepository.java index 154ceef..7ac82bf 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/data/repository/IotivityRepository.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/data/repository/IotivityRepository.java @@ -144,7 +144,7 @@ public Completable initOICStack() { public int initialize() { Timber.d("In OCMainInitHandler.initilize()"); int ret = OCMain.initPlatform("OCF"); - ret |= OCMain.addDevice("/oic/d", "oic.d.phone", "OTGC", "ocf.1.0.0", "ocf.res.1.3.0"); + ret |= OCMain.addDevice("/oic/d", "oic.d.phone", "OTGC", "ocf.2.4.0", "ocf.res.1.3.0"); return ret; } diff --git a/otgc/src/main/java/org/openconnectivity/otgc/domain/model/devicelist/Device.java b/otgc/src/main/java/org/openconnectivity/otgc/domain/model/devicelist/Device.java index 61cd35b..22326be 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/domain/model/devicelist/Device.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/domain/model/devicelist/Device.java @@ -59,17 +59,16 @@ public Device(DeviceType type, String deviceId, OcDeviceInfo deviceInfo, OCEndpo this.permits = permits; while(endpoints != null) { - String[] endpointStr = new String[1]; - OCEndpointUtil.toString(endpoints, endpointStr); - - if (endpointStr[0].startsWith("coaps://") && endpointStr[0].contains(".")) { - ipv4SecureHost = endpointStr[0]; - } else if (endpointStr[0].startsWith("coaps://")) { - ipv6SecureHost = endpointStr[0]; - } else if (endpointStr[0].startsWith("coap://") && endpointStr[0].contains(".")) { - ipv4Host = endpointStr[0]; - } else if (endpointStr[0].startsWith("coap://")){ - ipv6Host = endpointStr[0]; + String endpointStr = OCEndpointUtil.toString(endpoints); + + if (endpointStr.startsWith("coaps://") && endpointStr.contains(".")) { + ipv4SecureHost = endpointStr; + } else if (endpointStr.startsWith("coaps://")) { + ipv6SecureHost = endpointStr; + } else if (endpointStr.startsWith("coap://") && endpointStr.contains(".")) { + ipv4Host = endpointStr; + } else if (endpointStr.startsWith("coap://")){ + ipv6Host = endpointStr; } endpoints = endpoints.getNext(); @@ -206,13 +205,38 @@ public boolean hasCREDpermit() { @Override public int compareTo(Device device) { - if (this.getDeviceInfo().getName().compareTo(device.getDeviceInfo().getName()) == 0) { - return this.getDeviceId().compareTo(device.getDeviceId()); - } else if (this.getDeviceInfo().getName().isEmpty()) { - return "Unnamed".compareTo(device.getDeviceInfo().getName()); - } else if (device.getDeviceInfo().getName().isEmpty()) { - return this.getDeviceInfo().getName().compareTo("Unnamed"); + int res; + + if (this.getDeviceType() == device.getDeviceType()) { // Same types + int nameComparision; + if (this.getDeviceInfo().getName() == null && device.getDeviceInfo().getName() == null) { + nameComparision = 0; + } else if (this.getDeviceInfo().getName() == null) { + nameComparision = -1; + } else if (device.getDeviceInfo().getName() == null) { + nameComparision = 1; + } else { + nameComparision = this.getDeviceInfo().getName().compareTo(device.getDeviceInfo().getName()); + } + + int uuidComparision = this.getDeviceId().compareTo(device.getDeviceId()); + + // order by name or order by UUID if the names are equals + res = (nameComparision == 0) ? uuidComparision : nameComparision; + + } else { // Different types + + if (this.getDeviceType() == DeviceType.UNOWNED) { // Is device1 unowned? + res = -1; + } else if (device.getDeviceType() == DeviceType.UNOWNED) { // Is device2 unowned? + res = 1; + } else { + int permissionComparision = this.getPermits() - device.getPermits(); + res = -1 * permissionComparision; + } + } - return this.getDeviceInfo().getName().compareTo(device.getDeviceInfo().getName()); + + return res; } } diff --git a/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/LinkRolesForClientUseCase.java b/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/LinkRolesForClientUseCase.java index 0c0456e..91e14c5 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/LinkRolesForClientUseCase.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/LinkRolesForClientUseCase.java @@ -83,8 +83,8 @@ public Completable execute(Device device, String roleId, String roleAuthority) { String rootCert = certRepository.x509CertificateToPemString(rootCa).blockingGet(); // Generate the identity certificate in PEM format - X509Certificate idCert = certRepository.generateIdentityCertificate("*", publicKey, caPrivateKey).blockingGet(); - //X509Certificate idCert = certRepository.generateIdentityCertificate(device.getDeviceId(), publicKey, caPrivateKey).blockingGet(); + //X509Certificate idCert = certRepository.generateIdentityCertificate("*", publicKey, caPrivateKey).blockingGet(); + X509Certificate idCert = certRepository.generateIdentityCertificate(device.getDeviceId(), publicKey, caPrivateKey).blockingGet(); String identityCert = certRepository.x509CertificateToPemString(idCert).blockingGet(); // Generate the role certificate in PEM format diff --git a/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/LinkRolesForServerUseCase.java b/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/LinkRolesForServerUseCase.java index bb84963..f7285ba 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/LinkRolesForServerUseCase.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/LinkRolesForServerUseCase.java @@ -88,8 +88,8 @@ public Completable execute(Device device, String roleId, String roleAuthority) { String rootCert = certRepository.x509CertificateToPemString(rootCa).blockingGet(); // Generate the certificate in PEM format - X509Certificate cert = certRepository.generateIdentityCertificate("*", publicKey, caPrivateKey).blockingGet(); - //X509Certificate cert = certRepository.generateIdentityCertificate(device.getDeviceId(), publicKey, caPrivateKey).blockingGet(); + //X509Certificate cert = certRepository.generateIdentityCertificate("*", publicKey, caPrivateKey).blockingGet(); + X509Certificate cert = certRepository.generateIdentityCertificate(device.getDeviceId(), publicKey, caPrivateKey).blockingGet(); String identityCert = certRepository.x509CertificateToPemString(cert).blockingGet(); return cmsRepository.provisionIdentityCertificate(endpoint, device.getDeviceId(), rootCert, identityCert); diff --git a/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/PairwiseDevicesUseCase.java b/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/PairwiseDevicesUseCase.java index 5cc5055..c2df298 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/PairwiseDevicesUseCase.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/domain/usecase/link/PairwiseDevicesUseCase.java @@ -109,8 +109,8 @@ public Completable execute(Device client, Device server) String rootCert = certRepository.x509CertificateToPemString(rootCa).blockingGet(); // Generate the identity certificate in PEM format - X509Certificate idCert = certRepository.generateIdentityCertificate("*", publicKey, caPrivateKey).blockingGet(); - //X509Certificate idCert = certRepository.generateIdentityCertificate(device.getDeviceId(), publicKey, caPrivateKey).blockingGet(); + //X509Certificate idCert = certRepository.generateIdentityCertificate("*", publicKey, caPrivateKey).blockingGet(); + X509Certificate idCert = certRepository.generateIdentityCertificate(client.getDeviceId(), publicKey, caPrivateKey).blockingGet(); String identityCert = certRepository.x509CertificateToPemString(idCert).blockingGet(); return cmsRepository.provisionIdentityCertificate(endpoint, client.getDeviceId(), rootCert, identityCert); @@ -136,8 +136,8 @@ public Completable execute(Device client, Device server) String rootCert = certRepository.x509CertificateToPemString(rootCa).blockingGet(); // Generate the certificate in PEM format - X509Certificate cert = certRepository.generateIdentityCertificate("*", publicKey, caPrivateKey).blockingGet(); - //X509Certificate cert = certRepository.generateIdentityCertificate(device.getDeviceId(), publicKey, caPrivateKey).blockingGet(); + //X509Certificate cert = certRepository.generateIdentityCertificate("*", publicKey, caPrivateKey).blockingGet(); + X509Certificate cert = certRepository.generateIdentityCertificate(server.getDeviceId(), publicKey, caPrivateKey).blockingGet(); String identityCert = certRepository.x509CertificateToPemString(cert).blockingGet(); return cmsRepository.provisionIdentityCertificate(endpoint, server.getDeviceId(), rootCert, identityCert); diff --git a/otgc/src/main/java/org/openconnectivity/otgc/view/trustanchor/TrustAnchorActivity.java b/otgc/src/main/java/org/openconnectivity/otgc/view/trustanchor/TrustAnchorActivity.java index 30fa499..ecc3f00 100644 --- a/otgc/src/main/java/org/openconnectivity/otgc/view/trustanchor/TrustAnchorActivity.java +++ b/otgc/src/main/java/org/openconnectivity/otgc/view/trustanchor/TrustAnchorActivity.java @@ -47,6 +47,7 @@ import org.openconnectivity.otgc.utils.viewmodel.ViewModelError; import org.openconnectivity.otgc.viewmodel.TrustAnchorViewModel; import org.spongycastle.jce.provider.BouncyCastleProvider; +import org.spongycastle.util.encoders.Base64; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -166,9 +167,22 @@ public void onInfoClick(int position, View v) { // set title alertDialogBuilder.setTitle("Trust Anchor - Information"); // set dialog message - alertDialogBuilder - .setMessage(showX509CertificateInformation(mAdapter.mDataset.get(position).getPublicData().getDerData())) - .setCancelable(false) + + if (mAdapter.mDataset.get(position).getPublicData().getDerData() != null) { + alertDialogBuilder + .setMessage(showX509CertificateInformation(mAdapter.mDataset.get(position).getPublicData().getDerData())); + } else if (mAdapter.mDataset.get(position).getPublicData().getPemData() != null) { + String pem = mAdapter.mDataset.get(position).getPublicData().getPemData(); + String base64 = pem.replaceAll("\\s", "") + .replaceAll("\\r\\n", "") + .replace("-----BEGINCERTIFICATE-----", "") + .replace("-----ENDCERTIFICATE-----", ""); + byte[] der = Base64.decode(base64.getBytes()); + alertDialogBuilder + .setMessage(showX509CertificateInformation(der)); + } + + alertDialogBuilder.setCancelable(false) .setPositiveButton("OK", (dialog, id) -> dialog.dismiss()); // create alert dialog