diff --git a/android/project/jni/fwknop/fwknop_client.c b/android/project/jni/fwknop/fwknop_client.c index 19adba56..ed835dad 100644 --- a/android/project/jni/fwknop/fwknop_client.c +++ b/android/project/jni/fwknop/fwknop_client.c @@ -45,7 +45,7 @@ jstring Java_com_max2idea_android_fwknop_Fwknop_sendSPAPacket(JNIEnv* env, fko_ctx_t ctx; fwknop_options_t opts; - int res; + int res, hmac_str_len = 0; char res_msg[MSG_BUFSIZE+1] = {0}; char spa_msg[MSG_BUFSIZE+1] = {0}; @@ -72,6 +72,10 @@ jstring Java_com_max2idea_android_fwknop_Fwknop_sendSPAPacket(JNIEnv* env, jstring jpasswd = (*env)->GetObjectField(env, thiz, fid); const char *passwd_str = (*env)->GetStringUTFChars(env, jpasswd, 0); + fid = (*env)->GetFieldID(env, c, "hmac_str", "Ljava/lang/String;"); + jstring jhmac = (*env)->GetObjectField(env, thiz, fid); + const char *hmac_str = (*env)->GetStringUTFChars(env, jhmac, 0); + fid = (*env)->GetFieldID(env, c, "fw_timeout_str", "Ljava/lang/String;"); jstring jfwtimeout = (*env)->GetObjectField(env, thiz, fid); const char *fw_timeout_str = (*env)->GetStringUTFChars(env, jfwtimeout, 0); @@ -99,6 +103,12 @@ jstring Java_com_max2idea_android_fwknop_Fwknop_sendSPAPacket(JNIEnv* env, goto cleanup2; } + /* Using an HMAC is optional (currently) + */ + if(hmac_str != NULL) { + hmac_str_len = (int)strlen(hmac_str); + } + /* Set our spa server info */ opts.spa_server_str = (char*)destip_str; @@ -130,9 +140,20 @@ jstring Java_com_max2idea_android_fwknop_Fwknop_sendSPAPacket(JNIEnv* env, goto cleanup; } + /* Set the HMAC mode if necessary + */ + if (hmac_str_len > 0) { + res = fko_set_spa_hmac_type(ctx, FKO_DEFAULT_HMAC_MODE); + if (res != FKO_SUCCESS) { + strcpy(res_msg, fko_errmsg("Error setting SPA HMAC type", res)); + goto cleanup; + } + } + /* Finalize the context data (Encrypt and encode). */ - res = fko_spa_data_final(ctx, (char*)passwd_str); + res = fko_spa_data_final(ctx, (char*)passwd_str, + (int)strlen(passwd_str), (char *)hmac_str, hmac_str_len); if (res != FKO_SUCCESS) { strcpy(res_msg, fko_errmsg("Error generating SPA data", res)); goto cleanup; @@ -173,6 +194,7 @@ cleanup2: (*env)->ReleaseStringUTFChars(env, jallowip, allowip_str); (*env)->ReleaseStringUTFChars(env, jdestip, destip_str); (*env)->ReleaseStringUTFChars(env, jpasswd, passwd_str); + (*env)->ReleaseStringUTFChars(env, jhmac, hmac_str); (*env)->ReleaseStringUTFChars(env, jfwtimeout, fw_timeout_str); /* Log and return a string of success or error message. diff --git a/android/project/res/layout/main.xml b/android/project/res/layout/main.xml index e98a0efc..e53650a0 100644 --- a/android/project/res/layout/main.xml +++ b/android/project/res/layout/main.xml @@ -133,6 +133,28 @@ android:textSize="20dip" /> + + + +