Hi all,
I am trying to use below code (from Github) for device attestation. Everything was run as expected but I do not know how to pass the ClearText variable value back to B4A for further verify process in server side. Now I just can print to Log for checking purpose only.
Many thanks for any help.
Jonh,
I am trying to use below code (from Github) for device attestation. Everything was run as expected but I do not know how to pass the ClearText variable value back to B4A for further verify process in server side. Now I just can print to Log for checking purpose only.
Many thanks for any help.
Jonh,
B4X:
public OnSuccessListener<SafetyNetApi.AttestationResponse> mSuccessListener =
new OnSuccessListener<SafetyNetApi.AttestationResponse>() {
[USER=69643]@override[/USER]
public void onSuccess(SafetyNetApi.AttestationResponse attestationResponse) {
mResult = attestationResponse.getJwsResult();
byte[] kq=extractJwsData(mResult);
[B]String ClearText=new String(kq);
BA.Log(ClearText);[/B]
}
};
Java inline code for Device Attestation:
#If java
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.safetynet.SafetyNetClient;
import com.google.android.gms.safetynet.SafetyNet;
import com.google.android.gms.safetynet.SafetyNetApi;
import com.google.android.gms.common.api.GoogleApi;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import java.util.Enumeration;
import java.util.List;
import java.util.Base64;
public String mResult;
public final Random mRandom = new SecureRandom();
public void callSafetyNetAttentationApi(String param) {
String nonceData = "Safety Net Sample: " + System.currentTimeMillis();
byte[] nonce = getRequestNonce(nonceData);
Context context = BA.applicationContext;
SafetyNetClient client = SafetyNet.getClient(context);
Task<SafetyNetApi.AttestationResponse> task = client.attest(nonce,"API_KEY");
task.addOnSuccessListener(this, mSuccessListener).addOnFailureListener(this, mFailureListener);
}
public OnSuccessListener<SafetyNetApi.AttestationResponse> mSuccessListener =
new OnSuccessListener<SafetyNetApi.AttestationResponse>() {
[USER=69643]@override[/USER]
public void onSuccess(SafetyNetApi.AttestationResponse attestationResponse) {
mResult = attestationResponse.getJwsResult();
byte[] kq=extractJwsData(mResult);
String ClearText=new String(kq);
BA.Log(ClearText);
}
};
public OnFailureListener mFailureListener = new OnFailureListener() {
[USER=69643]@override[/USER]
public void onFailure(@NonNull Exception e) {
mResult = null;
if (e instanceof ApiException) {
ApiException apiException = (ApiException) e;
BA.Log(apiException.getStatusMessage());
} else {
//System.exit(0);
}
}
};
private static byte[] extractJwsData(String jws) {
String[] parts = jws.split("[.]");
if (parts.length != 3) {
return null;
}
//return BA.decodeBase64(parts[1]);
return Base64.getDecoder().decode(parts[1]);
}
private byte[] getRequestNonce(String data) {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] bytes = new byte[24];
mRandom.nextBytes(bytes);
try {
byteStream.write(bytes);
byteStream.write(data.getBytes());
} catch (IOException e) {
return null;
}
return byteStream.toByteArray();
}
#End If