Revision: ae85891a71
Author: Nightgunner5
Date: Sat Nov 14 08:55:29 2009
Log: Full asymmetric.
http://code.google.com/p/shacrypt/source/detail?r=ae85891a71
Revision: 6f0b3583cf
Author: Nightgunner5
Date: Sun Nov 15 07:08:28 2009
Log: Close GTK branch
http://code.google.com/p/shacrypt/source/detail?r=6f0b3583cf
==============================================================================
Revision: ae85891a71
Author: Nightgunner5
Date: Sat Nov 14 08:55:29 2009
Log: Full asymmetric.
http://code.google.com/p/shacrypt/source/detail?r=ae85891a71
Modified:
/glade.c
/shacrypt.glade
=======================================
--- /glade.c Sat Nov 14 08:05:57 2009
+++ /glade.c Sat Nov 14 08:55:29 2009
@@ -731,8 +731,352 @@
g_free( pass );
}
+/* Asymmetric */
G_MODULE_EXPORT void button_pressed_asymmetric( GtkWidget* button,
gpointer data ) {
- // TODO: Asymmetric encryption
+ GtkWidget* step1;
+ step1 = GTK_WIDGET( gtk_builder_get_object(
builder, "asymmetric_step1" ) );
+
+ gtk_widget_show( step1 );
+
+ g_free( step1 );
+}
+
+G_MODULE_EXPORT void asymmetric_step1_cancel( GtkWidget* button, gpointer
data ) {
+ GtkWidget* step1;
+ step1 = GTK_WIDGET( gtk_builder_get_object(
builder, "asymmetric_step1" ) );
+
+ gtk_widget_hide( step1 );
+
+ g_free( step1 );
+}
+
+G_MODULE_EXPORT void asymmetric_step1_ok( GtkWidget* button, gpointer data
) {
+ GtkFileChooser* file;
+
+ file = GTK_FILE_CHOOSER( gtk_builder_get_object(
builder, "file_a1_select" ) );
+
+ // Make sure there's actually a file selected.
+ if ( gtk_file_chooser_get_filename( file ) == NULL ) {
+ g_free( file );
+ return;
+ }
+
+ // Make sure it's an SHACrypt file.
+ FILE* f;
+ char fbuf[5];
+
+ f = fopen( gtk_file_chooser_get_filename( file ), "rb" );
+ g_free( file );
+
+ if ( f == NULL || fread( fbuf, 1, 5, f ) != 5 )
+ strcpy( fbuf, "fail." ); // Make sure we have all 5 bytes set.
+
+ if ( f != NULL ) {
+ fclose( f );
+
+ g_free( f );
+ }
+
+ if ( strncmp( fbuf, identifier, 3 ) != 0 || fbuf[3] < '\1' || fbuf[3]
> '\2' || fbuf[4] != '\0' ) {
+ g_free( fbuf );
+
+ GtkWidget* invalid_file;
+
+ invalid_file = GTK_WIDGET( gtk_builder_get_object(
builder, "asymmetric_step1_error_notshacrypt" ) );
+
+ gtk_widget_show( invalid_file );
+
+ g_free( invalid_file );
+
+ return;
+ }
+
+ // Now on to the actual displaying part.
+ GtkWidget* step1;
+ GtkWidget* step2;
+
+ step1 = GTK_WIDGET( gtk_builder_get_object(
builder, "asymmetric_step1" ) );
+ step2 = GTK_WIDGET( gtk_builder_get_object(
builder, "asymmetric_step2" ) );
+
+ gtk_widget_show( step2 );
+ gtk_widget_hide( step1 );
+
+ g_free( step1 );
+ g_free( step2 );
+}
+
+/* Password scoring method adapted from
+ * http://www.geekwisdom.com/js/passwordmeter.js
+ */
+G_MODULE_EXPORT void asymmetric_step2_passchange( GtkEntry* button,
gpointer data ) {
+ GtkProgressBar* meter;
+
+ meter = GTK_PROGRESS_BAR( gtk_builder_get_object(
builder, "progressbar_a2_pass_strength" ) );
+
+ int len = gtk_entry_get_text_length( button );
+ const char* pass = gtk_entry_get_text( button );
+
+ if ( len == 0 ) {
+ gtk_progress_bar_set_fraction( meter, 0.0 );
+ gtk_progress_bar_set_text( meter, "Enter a password." );
+
+ g_free( meter );
+
+ return;
+ }
+
+ int score, i,
+ lower = 0,
+ upper = 0,
+ num = 0,
+ symb = 0;
+
+ // Total length
+ if ( len > 15 ) {
+ score = 18;
+ } else if ( len > 7 ) {
+ score = 12;
+ } else if ( len > 4 ) {
+ score = 6;
+ } else {
+ score = 3;
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ if ( pass[i] >= 'a' && pass[i] <= 'z' )
+ lower++;
+ else if ( pass[i] >= 'A' && pass[i] <= 'Z' )
+ upper++;
+ else if ( pass[i] >= '0' && pass[i] <= '9' )
+ num++;
+ else
+ symb++;
+ }
+
+ // Letters
+ if ( lower || upper )
+ score += 1;
+ if ( lower && upper )
+ score += 2;
+ if ( lower + upper > 1 )
+ score += 2;
+ if ( lower > 1 && upper > 1 )
+ score += 2;
+
+ // Numbers
+ if ( num == 1 )
+ score += 5;
+ if ( num > 1 )
+ score += 7;
+
+ // Symbols
+ if ( symb == 1 )
+ score += 5;
+ if ( symb > 1 )
+ score += 7;
+
+ // Combinations
+ if ( ( upper || lower ) && num )
+ score++;
+ if ( upper && lower )
+ score++;
+ if ( ( upper || lower ) && num && symb )
+ score += 2;
+ if ( upper && lower && num && symb )
+ score += 2;
+
+ gtk_progress_bar_set_fraction( meter, score / 45.0 );
+ if ( score == 45 )
+ gtk_progress_bar_set_text( meter, "Excellent" );
+ else if ( score > 39 )
+ gtk_progress_bar_set_text( meter, "Secure" );
+ else if ( score > 24 )
+ gtk_progress_bar_set_text( meter, "Good" );
+ else if ( score > 9 )
+ gtk_progress_bar_set_text( meter, "Ok" );
+ else
+ gtk_progress_bar_set_text( meter, "Bad" );
+
+ g_free( meter );
+}
+
+G_MODULE_EXPORT void asymmetric_step3() {
+ GtkWindow* step3;
+ GtkEntry* pass;
+ GtkFileChooser* file;
+ GtkProgressBar* progress;
+
+ step3 = GTK_WINDOW( gtk_builder_get_object(
builder, "asymmetric_step3" ) );
+ pass = GTK_ENTRY( gtk_builder_get_object(
builder, "field_a2_password1" ) );
+ file = GTK_FILE_CHOOSER( gtk_builder_get_object(
builder, "file_a1_select" ) );
+ progress = GTK_PROGRESS_BAR( gtk_builder_get_object(
builder, "progressbar_a3_progress" ) );
+
+ gtk_progress_bar_set_text( progress, NULL );
+ gtk_window_set_deletable( step3, FALSE );
+
+ FILE* f;
+ FILE* o;
+ unsigned long i, size, n;
+ SHACrypt_Context s;
+ unsigned char algos = '\0',
+ randlen = '\0';
+ static char fbuf[256] = {0},
+ obuf[256] = {0};
+ char* filename = gtk_file_chooser_get_filename( file );
+ char* tmp;
+
+ g_free( file );
+
+ f = fopen( filename, "rb" );
+
+ filename = g_strndup( filename, strlen( filename ) - 9 );
+
+ tmp = g_strdup_printf( "%s_1.shacrypt", filename );
+
+ i = 1;
+ while ( fopen( tmp, "rb" ) != NULL ) {
+ g_free( tmp );
+ i++;
+ tmp = g_strdup_printf( "%s_%lu.shacrypt", filename, i );
+ }
+
+ o = fopen( tmp, "wb" );
+
+ g_free( tmp );
+ g_free( filename );
+
+ fread( fbuf, 1, 5, f );
+
+ if ( fbuf[3] == '\1' ) {
+ randlen = '\x13';
+ fread( fbuf, 1, 20, f );
+ algos = '\x01';
+ }
+ if ( fbuf[3] == '\2' ) {
+ randlen = fgetc( f );
+ fread( fbuf, 1, (int)randlen + 1, f );
+ algos = fgetc( f );
+ }
+
+ fwrite( identifier, 1, 3, o );
+ fwrite( "\2\0", 1, 2, o );
+ fputc( randlen, o );
+ fwrite( fbuf, 1, (int)randlen + 1, o );
+ fputc( algos, o );
+
+ SHACrypt_Init( &s, g_strdup( gtk_entry_get_text( pass ) ),
gtk_entry_get_text_length( pass ), algos, fbuf, (int)randlen + 1 );
+
+ gtk_entry_set_text( pass, "" );
+
+ g_free( pass );
+
+ i = ftell( f );
+ fseek( f, 0, SEEK_END );
+ size = ftell( f ) - i;
+ fseek( f, i, SEEK_SET );
+
+ i = 0;
+ /* Do the actual encryption */
+ while ( ( n = fread( fbuf, 1, 256, f ) ) > 0 ) {
+ i += n;
+
+ gtk_progress_bar_set_fraction( progress, (double)i / size );
+
+ SHACrypt_Process( &s, fbuf, obuf, n );
+
+ fwrite( obuf, 1, n, o );
+ }
+
+ fclose( f );
+ fclose( o );
+
+ g_free( f );
+ g_free( o );
+ g_free( fbuf );
+ g_free( obuf );
+
+ gtk_progress_bar_set_text( progress, "Done!" );
+ gtk_window_set_deletable( step3, TRUE );
+
+ g_free( progress );
+ g_free( step3 );
+}
+
+G_MODULE_EXPORT void asymmetric_step2_ok( GtkWidget* button, gpointer data
) {
+ GtkEntry* pass1;
+ GtkEntry* pass2;
+
+ pass1 = GTK_ENTRY( gtk_builder_get_object(
builder, "field_a2_password1" ) );
+ pass2 = GTK_ENTRY( gtk_builder_get_object(
builder, "field_a2_password2" ) );
+
+ if ( !gtk_entry_get_text_length( pass1 ) ) {
+ gtk_widget_grab_focus( GTK_WIDGET( pass1 ) );
+
+ g_free( pass1 );
+ g_free( pass2 );
+
+ return;
+ }
+
+ if ( !gtk_entry_get_text_length( pass2 ) ) {
+ gtk_widget_grab_focus( GTK_WIDGET( pass2 ) );
+
+ g_free( pass1 );
+ g_free( pass2 );
+
+ return;
+ }
+
+ if ( strcmp( gtk_entry_get_text( pass1 ), gtk_entry_get_text( pass2 )
) == 0 ) {
+ GtkWidget* step2;
+ GtkWidget* step3;
+
+ step2 = GTK_WIDGET( gtk_builder_get_object(
builder, "asymmetric_step2" ) );
+ step3 = GTK_WIDGET( gtk_builder_get_object(
builder, "asymmetric_step3" ) );
+
+ gtk_widget_show( step3 );
+ gtk_widget_hide( step2 );
+
+ g_free( step2 );
+ g_free( step3 );
+
+ g_thread_create( (GThreadFunc)asymmetric_step3, NULL, FALSE, NULL
);
+ } else {
+ GtkProgressBar* meter;
+
+ meter = GTK_PROGRESS_BAR( gtk_builder_get_object(
builder, "progressbar_a2_pass_strength" ) );
+
+ gtk_progress_bar_set_text( meter, "Passwords do not match!" );
+
+ g_free( meter );
+ }
+
+ g_free( pass1 );
+ g_free( pass2 );
+}
+
+G_MODULE_EXPORT void asymmetric_step2_cancel( GtkWidget* button, gpointer
data ) {
+ GtkWidget* step2;
+ GtkEntry* pass1;
+ GtkEntry* pass2;
+ GtkProgressBar* meter;
+
+ step2 = GTK_WIDGET( gtk_builder_get_object(
builder, "asymmetric_step2" ) );
+ pass1 = GTK_ENTRY( gtk_builder_get_object(
builder, "field_a2_password1" ) );
+ pass2 = GTK_ENTRY( gtk_builder_get_object(
builder, "field_a2_password2" ) );
+ meter = GTK_PROGRESS_BAR( gtk_builder_get_object(
builder, "progressbar_a2_pass_strength" ) );
+
+ gtk_widget_hide( step2 );
+
+ gtk_entry_set_text( pass1, "" );
+ gtk_entry_set_text( pass2, "" );
+ gtk_progress_bar_set_text( meter, "Enter a password" );
+ gtk_progress_bar_set_fraction( meter, 0.0 );
+
+ g_free( step2 );
+ g_free( pass1 );
+ g_free( pass2 );
+ g_free( meter );
}
int main( int argc, char** argv ) {
=======================================
--- /shacrypt.glade Sat Nov 14 08:05:57 2009
+++ /shacrypt.glade Sat Nov 14 08:55:29 2009
@@ -971,6 +971,7 @@
<property name="preview_widget_active">False</property>
<property name="filter">filter_shacrypt_ext</property>
<property name="use_preview_label">False</property>
+ <signal name="file_activated" handler="asymmetric_step1_ok"/>
</object>
<packing>
<property name="position">1</property>
==============================================================================
Revision: 6f0b3583cf
Author: Nightgunner5
Date: Sun Nov 15 07:08:28 2009
Log: Close GTK branch
http://code.google.com/p/shacrypt/source/detail?r=6f0b3583cf