int GenerateKey( unsigned int key_bit_length, std::vector<unsigned char>& key ) { if( m_ctx == NULL ) LOG_PRINT_ERROR( "m_ctx == NULL." ); // OAES_RET ret = oaes_key_gen_256(m_ctx); int r = GenerateXbitKey(key_bit_length); // if( ret != OAES_RET_SUCCESS ) if( r != 0 ) { // LOG_PRINTF_ERROR(( "oaes_key_gen_256() failed: %d", (int)ret )); return -1; } size_t key_data_size = 0; OAES_RET ret = oaes_key_export(m_ctx, NULL, &key_data_size); if( ret != OAES_RET_SUCCESS ) { LOG_PRINTF_ERROR(( "Failed to retrieve key length: %d", (int)ret )); return -1; } key.resize( 0 ); key.resize( key_data_size, 0 ); ret = oaes_key_export(m_ctx, &key[0], &key_data_size); if( ret != OAES_RET_SUCCESS ) { LOG_PRINTF_ERROR(( "Failed to export key: %d", (int)ret )); return -1; } return 0; }
int main(int argc, char** argv) { size_t _i = 0, _j = 0; size_t _read_len = 0; char *_file_in = NULL, *_file_out = NULL, *_file_k = NULL; int _op = 0; FILE *_f_in = stdin, *_f_out = stdout, *_f_k = NULL; do_block _b[OAES_THREADS]; fprintf( stderr, "\n" "*******************************************************************************\n" "* OpenAES %-10s *\n" "* Copyright (c) 2013, Nabil S. Al Ramli, www.nalramli.com *\n" "*******************************************************************************\n\n", OAES_VERSION ); // pad the key for( _j = 0; _j < 32; _j++ ) _key_data[_j] = _j + 1; if( argc < 2 ) { usage( argv[0] ); return EXIT_FAILURE; } if( 0 == strcmp( argv[1], "gen-key" ) ) { OAES_CTX *_oaes = NULL; uint8_t _buf[16384]; size_t _buf_len = sizeof(_buf); OAES_RET _rc = OAES_RET_SUCCESS; _i++; _i++; // key_length _i++; // key_file if( _i >= argc ) { fprintf( stderr, "Error: No value specified for '%s'.\n", argv[1] ); usage( argv[0] ); return EXIT_FAILURE; } _key_data_len = atoi( argv[_i - 1] ); _file_k = argv[_i]; _oaes = oaes_alloc(); if( NULL == _oaes ) { fprintf(stderr, "Error: Failed to initialize OAES.\n"); return OAES_RET_MEM; } switch( _key_data_len ) { case 128: _rc = oaes_key_gen_128(_oaes); break; case 192: _rc = oaes_key_gen_192(_oaes); break; case 256: _rc = oaes_key_gen_256(_oaes); break; default: fprintf( stderr, "Error: Invalid value [%s] specified for '%s'.\n", argv[_i - 1], argv[_i - 2] ); oaes_free(&_oaes); return EXIT_FAILURE; } if( OAES_RET_SUCCESS != _rc ) { fprintf( stderr, "Error: Failed to generate OAES %lu bit key.\n", _key_data_len ); oaes_free(&_oaes); return EXIT_FAILURE; } if( OAES_RET_SUCCESS != oaes_key_export(_oaes, _buf, &_buf_len) ) { fprintf( stderr, "Error: Failed to retrieve key length %lu.\n", _key_data_len ); oaes_free(&_oaes); return EXIT_FAILURE; } oaes_free(&_oaes); if( 0 == access(_file_k, 00) ) { fprintf(stderr, "Error: '%s' already exists.\n", _file_k); return EXIT_FAILURE; } _f_k = fopen(_file_k, "wb"); if( NULL == _f_k ) { fprintf(stderr, "Error: Failed to open '%s' for writing.\n", _file_k); return EXIT_FAILURE; } fwrite(_buf, sizeof(uint8_t), _buf_len, _f_k); fclose(_f_k); return EXIT_SUCCESS; } else if( 0 == strcmp( argv[1], "base64-enc" ) ) { _op = 0; _read_len = OAES_BASE64_LEN_ENC; } else if( 0 == strcmp( argv[1], "base64-dec" ) ) { _op = 1; _read_len = OAES_BASE64_LEN_DEC; } else if( 0 == strcmp( argv[1], "aes-enc" ) ) { _op = 2; _read_len = OAES_AES_LEN_ENC; } else if( 0 == strcmp( argv[1], "aes-dec" ) ) { _op = 3; _read_len = OAES_AES_LEN_DEC; } else { fprintf(stderr, "Error: Unknown command '%s'.", argv[1]); usage( argv[0] ); return EXIT_FAILURE; } for( _i = 2; _i < argc; _i++ ) { int _found = 0; if( 0 == strcmp( argv[_i], "--ecb" ) ) { _found = 1; _is_ecb = 1; } if( 0 == strcmp( argv[_i], "--key" ) ) { uint8_t *_buf = NULL; size_t _buf_len = 0; _found = 1; _i++; // base64_encoded_key_data if( _i >= argc ) { fprintf(stderr, "Error: No value specified for '%s'.\n", argv[_i - 1]); usage( argv[0] ); return EXIT_FAILURE; } if( oaes_base64_decode(argv[_i], strlen(argv[_i]), NULL, &_buf_len) ) { fprintf(stderr, "Error: Invalid value for '%s'.\n", argv[_i - 1]); usage( argv[0] ); return EXIT_FAILURE; } _buf = (uint8_t *) calloc(_buf_len, sizeof(uint8_t)); if( NULL == _buf ) { fprintf(stderr, "Error: Failed to allocate memory.\n"); return EXIT_FAILURE; } if( oaes_base64_decode(argv[_i], strlen(argv[_i]), _buf, &_buf_len) ) { free(_buf); fprintf(stderr, "Error: Invalid value for '%s'.\n", argv[_i - 1]); usage( argv[0] ); return EXIT_FAILURE; } _key_data_len = _buf_len; if( 16 >= _key_data_len ) _key_data_len = 16; else if( 24 >= _key_data_len ) _key_data_len = 24; else _key_data_len = 32; memcpy(_key_data, _buf, __min(32, _buf_len)); for( _j = 0; _j < _buf_len; _j++ ) { _key_data[_j % 32] ^= _buf[_j]; } free(_buf); } if( 0 == strcmp( argv[_i], "--key-file" ) ) { OAES_CTX *_ctx = NULL; uint8_t _buf[16384]; size_t _read = 0; _found = 1; _i++; // key_file if( _i >= argc ) { fprintf(stderr, "Error: No value specified for '%s'.\n", argv[_i - 1]); usage( argv[0] ); return EXIT_FAILURE; } _file_k = argv[_i]; _ctx = oaes_alloc(); if( NULL == _ctx ) { fprintf(stderr, "Error: Failed to initialize OAES.\n"); return OAES_RET_MEM; } _f_k = fopen(_file_k, "rb"); if( NULL == _f_k ) { fprintf(stderr, "Error: Failed to open '%s' for reading.\n", _file_k); oaes_free(&_ctx); return EXIT_FAILURE; } _read = fread(_buf, sizeof(uint8_t), sizeof(_buf), _f_k); fclose(_f_k); if( OAES_RET_SUCCESS != oaes_key_import(_ctx, _buf, _read) ) { fprintf(stderr, "Error: Failed to import '%s'.\n", _file_k); oaes_free(&_ctx); return EXIT_FAILURE; } _key_data_len = sizeof(_key_data); if( OAES_RET_SUCCESS != oaes_key_export_data(_ctx, _key_data, &_key_data_len) ) { fprintf(stderr, "Error: Failed to export '%s' data.\n", _file_k); oaes_free(&_ctx); return EXIT_FAILURE; } oaes_free(&_ctx); } if( 0 == strcmp( argv[_i], "--in" ) ) { _found = 1; _i++; // path_in if( _i >= argc ) { fprintf(stderr, "Error: No value specified for '%s'.\n", argv[_i - 1]); usage( argv[0] ); return EXIT_FAILURE; } _file_in = argv[_i]; } if( 0 == strcmp( argv[_i], "--out" ) ) { _found = 1; _i++; // path_out if( _i >= argc ) { fprintf(stderr, "Error: No value specified for '%s'.\n", argv[_i - 1]); usage( argv[0] ); return EXIT_FAILURE; } _file_out = argv[_i]; } if( 0 == _found ) { fprintf(stderr, "Error: Invalid option '%s'.\n", argv[_i]); usage( argv[0] ); return EXIT_FAILURE; } } switch(_op) { case 0: case 1: break; case 2: case 3: if( 0 == _key_data_len ) { char _key_data_ent[8193] = ""; uint8_t *_buf = NULL; size_t _buf_len = 0; fprintf(stderr, "Enter base64-encoded key: "); scanf("%8192s", _key_data_ent); if( oaes_base64_decode( _key_data_ent, strlen(_key_data_ent), NULL, &_buf_len ) ) { fprintf(stderr, "Error: Invalid value for '%s'.\n", argv[_i - 1]); usage( argv[0] ); return EXIT_FAILURE; } _buf = (uint8_t *) calloc(_buf_len, sizeof(uint8_t)); if( NULL == _buf ) { fprintf(stderr, "Error: Failed to allocate memory.\n"); return EXIT_FAILURE; } if( oaes_base64_decode( _key_data_ent, strlen(_key_data_ent), _buf, &_buf_len ) ) { free(_buf); fprintf(stderr, "Error: Invalid value for '%s'.\n", argv[_i - 1]); usage( argv[0] ); return EXIT_FAILURE; } _key_data_len = _buf_len; if( 16 >= _key_data_len ) _key_data_len = 16; else if( 24 >= _key_data_len ) _key_data_len = 24; else _key_data_len = 32; memcpy(_key_data, _buf, __min(32, _buf_len)); for( _j = 0; _j < _buf_len; _j++ ) { _key_data[_j % 32] ^= _buf[_j]; } free(_buf); } break; default: break; } if( _file_in ) { _f_in = fopen(_file_in, "rb"); if( NULL == _f_in ) { fprintf(stderr, "Error: Failed to open '%s' for reading.\n", _file_in); return EXIT_FAILURE; } } else { if( setmode(fileno(stdin), 0x8000) < 0 ) fprintf(stderr,"Error: Failed in setmode().\n"); _f_in = stdin; } if( _file_out ) { if( 0 == access(_file_out, 00) ) { fprintf(stderr, "Error: '%s' already exists.\n", _file_out); return EXIT_FAILURE; } _f_out = fopen(_file_out, "wb"); if( NULL == _f_out ) { fprintf(stderr, "Error: Failed to open '%s' for writing.\n", _file_out); if( _file_in ) fclose(_f_in); return EXIT_FAILURE; } } else { if( setmode(fileno(stdout), 0x8000) < 0 ) fprintf(stderr, "Error: Failed in setmode().\n"); _f_out = stdout; } _i = 0; while( _b[_i].in_len = fread(_b[_i].in, sizeof(uint8_t), _read_len, _f_in) ) { switch(_op) { case 0: _b[_i].id = start_thread(_do_base64_encode, &(_b[_i])); if( NULL == _b[_i].id ) fprintf(stderr, "Error: Failed to start encryption.\n"); break; case 1: _b[_i].id = start_thread(_do_base64_decode, &(_b[_i])); if( NULL == _b[_i].id ) fprintf(stderr, "Error: Failed to start decryption.\n"); break; case 2: _b[_i].id = start_thread(_do_aes_encrypt, &(_b[_i])); if( NULL == _b[_i].id ) fprintf(stderr, "Error: Failed to start encryption.\n"); break; case 3: _b[_i].id = start_thread(_do_aes_decrypt, &(_b[_i])); if( NULL == _b[_i].id ) fprintf(stderr, "Error: Failed to start decryption.\n"); break; default: break; } if( OAES_THREADS == _i + 1 ) { for( _j = 0; _j < OAES_THREADS; _j++ ) { if( _b[_j].id ) { join_thread(_b[_j].id); _b[_j].id = 0; if( _b[_j].out ) { fwrite(_b[_j].out, sizeof(uint8_t), _b[_j].out_len, _f_out); free(_b[_j].out); _b[_j].out = NULL; } } } } _i = (_i + 1) % OAES_THREADS; } for( _j = 0; _j < _i; _j++ ) { if( _b[_j].id ) { join_thread(_b[_j].id); _b[_j].id = 0; if( _b[_j].out ) { fwrite(_b[_j].out, sizeof(uint8_t), _b[_j].out_len, _f_out); free(_b[_j].out); _b[_j].out = NULL; } } } if( _file_in ) fclose(_f_in); if( _file_out ) fclose(_f_out); fprintf(stderr, "done.\n"); return (EXIT_SUCCESS); }