Пример #1
0
		inline buffer rsa_key::public_encrypt(const buffer& buf, int padding) const
		{
			buffer result(size());

			result.data().resize(public_encrypt(buffer_cast<uint8_t>(result), buffer_size(result), buffer_cast<uint8_t>(buf), buffer_size(buf), padding));

			return result;
		}
Пример #2
0
void		ftp_rsauser(t_client *client, char *str)
{
  char		*arg;
  char		filename[4096];
  char		trame[4096];
  unsigned char	encrypted[4096];
  unsigned char	*randstr;
  int		len;

  arg = get_cmd(str, 7);
  if (atoi(client->server->conf->ssl_enabled) == 0 ||
      atoi(client->server->conf->ssl_fconnect) == 0)
    return (ssl_not_actived(client));
  sprintf(filename, "/etc/bertomzilla/.rsa/%s.pub", arg);
  if (!fill_publicKeyFromScratch(client, filename))
    return (show_error("Error while filling RSA File"));
  randstr = randstring(16);
  len = public_encrypt(randstr, 16, client->publicKeyRSA, encrypted);
  post(trame, len, client, encrypted);
  if (!strncmp(trame, (const char*) randstr, 16))
    process_ok(client, arg);
  else
    write(client->fd, "KO\r\n", 4);
}
Пример #3
0
static void init_loop_cb(struct uloop_timeout *timeout)
{
	uint32_t id;
	// replace *d
    char key_iv[32] = {0};

    char repeater_pubkey[] = "-----BEGIN PUBLIC KEY-----\n"\
            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyUF9+Td53E0lEqP8eRyM\n"\
            "DoREPIety4BJscApuPwcGxiVA+75mYw8AFKlTaWlLL7w/qyuxnOiNm6TTFCxJGI1\n"\
            "C9GnABm8myC5hnDSC6qE+E1Al6wZgyI4rkC+Qr7GFI9B8r9bM+RdKyMxD9JuXUcx\n"\
            "+rx/TPnJttUfAkCloYStd5LiCel6c/bfWiR5hyxLjXC5Cz5cdpzXwvyvgEBvZHxX\n"\
            "A5jqPVfWcJ3P3s88ogPxx52iM4dzLtzWB6BOmZA/3SbvZle2Efy7mVAl/9gkwvgf\n"\
            "Dm/TSnMbnUBim3H5CIlECsvs2RuvI5og0S3oEO4B8TQQjujSqbA6h+EcZc9Djmh2\n"\
            "vQIDAQAB\n"\
            "-----END PUBLIC KEY-----\n";

    unsigned char  *encrypted=malloc(MAX_ALLOC_LEN);
    unsigned char  *base64=malloc(MAX_ALLOC_LEN);
    RAND_seed(rnd_seed, sizeof rnd_seed);       /* or RSA_PKCS1_PADDING/OAEP may fail */

    random_uuid(repeater_key);
    random_uuid(repeater_iv);

    memcpy(key_iv, repeater_key, 16);
    memcpy(key_iv+16, repeater_iv, 16);

    int encrypted_length= public_encrypt(key_iv,
                                         32,
                                         repeater_pubkey,
                                         encrypted);
    if(encrypted_length == -1)
    {
        printLastError("Public Encrypt failed ");
        exit(0);
    }
    printf("Encrypted length =%d\n",encrypted_length);
    printf("Try to init_loop_cb...\n");

    int base64_length = base64Encode(base64, encrypted, encrypted_length);
    // printf("base64 len: %d\n", base64_length);
    // printf("base64: %s\n", base64);

	if(ubus_lookup_id(sys->tbus_ctx, "netapi", &id)){
		dlog("can't lookup netapi\n");
		goto fail;
	}

	blob_buf_init(&traffic_b, 0);
	blobmsg_add_field(&traffic_b, BLOBMSG_TYPE_UNSPEC,
			"data", base64, base64_length);
	ubus_invoke(sys->tbus_ctx, id, "init", traffic_b.head,
			receive_call_result_data, NULL, TRAFFICD_INIT_TIMEOUT);

    free(encrypted);
    free(base64);
	return;

fail:
    free(encrypted);
    free(base64);
	uloop_timeout_set(&sd->timeout_init, TRAFFICD_INIT_LOOP_TIME);
}
Пример #4
0
int main(int argc, char *argv[]){
    int listenfd = 0, connfd = 0;
    struct sockaddr_in serv_addr; 

    char sendBuff[1025];
    //time_t ticks; 
    long randomID=0;
    long randomPC=0;
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff)); 

    serv_addr.sin_family = AF_INET;
    //serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    //serv_addr.sin_addr.s_addr = inet_addr("192.168.7.2");
    serv_addr.sin_port = htons(5000); 

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    listen(listenfd, 10); 
    
    char canRead = 0;
    unsigned char ContinueFSMDoWhile = TRUE;
    int bytesReceived = 0;
    while(1){
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
        ContinueFSMDoWhile = TRUE;
        printf("conexion aceptada :)\n");
        *tempBufferRx = 0;
        // Identifier server FSM
        do{
            if(canRead){
                printf("Before read server\n");
                bytesReceived = read(connfd,bufferRx,255); // <== read
                printf("server after read\n"); fflush(stdout);
                //printf("After read server:[%s]\n",bufferRx);
            }else{
                canRead = TRUE;
            }
            switch(statusSwServer){
                case ENVIO_RANDOM_ID:{ // 1.
                    printf("1. CASE 1\n"); fflush(stdout);
                    srand( time(NULL) );
                    randomID = rand() % 16777215;
                    printf("1. randomID from server:[%li]\n",randomID);
                        // char conversion to encrypt
                    sprintf(dataBuffer,"%li",randomID); 
                    int encrypted_length = public_encrypt((unsigned char *)dataBuffer,strlen(dataBuffer),(unsigned char *)(PATH_PUBLIC_KEY_CLIENT) ,encryptedServer);
                    if(encrypted_length == -1){
                        printLastError("Public Encrypt failed\n");
                        exit(0);
                    }
                    printf("1. Encrypted length = [%d]\n",encrypted_length);
                    contWrite = 0;
                    tempContWrite = 0;
                    do{
                        if( (tempContWrite = write(connfd,encryptedServer,encrypted_length)) > 0 ){
                            contWrite += tempContWrite;
                            printf("1. written:[%d]\n",contWrite);
                       }else{
                            printf("1. Error writting\n");
                        }
                    }while(contWrite < encrypted_length);

                    statusSwServer = RECEIVE_PC_CODE;
                    break;
                }
                case RECEIVE_PC_CODE:{ // 3.
                    char * pch;
                    char cont = 0;
                    long randomIDTemp = 0;
                    printf("3. CASE 3\n"); fflush(stdout);
                        // Buffering
                    printf("bytesReceived:[%d]\n",bytesReceived);
                    if( strlen(tempBufferRx) == 0 ){
                        strcpy(tempBufferRx,bufferRx);
                    }else{
                        strcat(tempBufferRx, bufferRx);
                        strcpy(bufferRx, tempBufferRx);
                    }

                    // Decrypt info
                    decrypted_length = private_decrypt((unsigned char *)(bufferRx),/*strlen(bufferRx)*/128,(unsigned char *)(PATH_PRIVATE_KEY_SERVER),decryptedClient);
                    if(decrypted_length == -1){
                        printLastError("Private Decrypt failed\n");
                        //exit(0);
                        break;
                    }
                    decryptedClient[decrypted_length] = '\0';
                    printf("3. Decrypted Length = [%d]\n",decrypted_length);
                    printf("3. Decrypted Text = [%s]\n",decryptedClient);
                    strcpy(bufferRx,(char *)(decryptedClient));

                    printf ("3. Splitting string \"%s\" into tokens:\n",bufferRx);
                    pch = strtok (bufferRx,"$");
                    while (pch != NULL){
                        printf ("%s\n",pch);
                        switch(cont){
                            case 0:{
                                strcpy(ClientCode,pch);
                                break;
                            }
                            case 1:{
                                randomIDTemp = atol(pch);
                                break;
                            }
                            case 2:{
                                randomPC = atol(pch);
                                break;
                            }
                            default:{
                                printf("RECEIVE_PC_CODE SWITCH: It shouldn't be here\n");
                            }
                        }
                        cont++;
                        pch = strtok (NULL,"$");
                    }
                    // Validacion de la información llegada.                        
                    if( strstr(CLIENT_CODE,ClientCode) != NULL ){
                        printf("3. Ok server client code\n");
                    }else{
                        printf("3. ClientCode no OK :(\n");
                    }
                    if( randomIDTemp == randomID ){
                        printf("3. Ok server randomID\n");
                    }else{
                        printf("3. randomID no OK :(\n");
                    }                   
                    sprintf(bufferRx,"%s$%li$%li",SERVER_CODE,randomID,randomPC);
                    
                    encrypted_length = public_encrypt((unsigned char *)bufferRx,strlen(bufferRx),(unsigned char *)(PATH_PUBLIC_KEY_CLIENT) ,encryptedServer);
                    if(encrypted_length == -1){
                        printLastError("Public Encrypt failed ");
                        exit(0);
                    }
                    contWrite = 0;
                    tempContWrite = 0;
                    do{
                        if( (tempContWrite = write(connfd,encryptedServer,encrypted_length)) > 0 ){
                            contWrite += tempContWrite;
                            printf("3. written:[%d]\n",contWrite);
                        }else{                          
                            printf("3. Error writting\n");
                        }
                    }while(contWrite < encrypted_length);

                    ContinueFSMDoWhile = FALSE;
                    break;
                }
                default:{
                    printf("Default server fsm: It shouldn't be here\n");
                }
            }
        }while(ContinueFSMDoWhile);
        printf("End FSM, waiting new connection.\n");
        ContinueFSMDoWhile = TRUE;
        canRead = FALSE;
        statusSwServer = ENVIO_RANDOM_ID;
        // Identifier server FSM
        sleep(1);
     }
}