Android Question Device attestation by inline java

quansofts

Member
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,

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
 
Top