Пример #1
0
void search(struct list * a)
{
	int x;
	printf("1、按姓名查找\n");
	printf("2、按地址查找\n");
	printf("3、按电话查找\n");
	scanf("%d",&x);
	if(x==1)
		search_n(a);
	if(x==2)
		search_a(a);
	if(x==3)
		search_t(a);
	system("pause");
}
Пример #2
0
void MainWindow::on_search_clicked()
{
    sd=ui->lineEdit->text();
       search_t(sd);

}
Пример #3
0
int tfel_decrypt_cp(char *inputfile, char *keyfile, char *output) {
    int i;
    FILE *fp;
    //pubkey input //共通
    tfel_pubkey *pubkey = NULL;
    pubkey = (tfel_pubkey*)malloc(sizeof(tfel_pubkey));
    if (pubkey == NULL) return -1;
    tfel_param_G *param_G;
    param_G = (tfel_param_G*)malloc(sizeof(tfel_param_G));
    if (param_G == NULL) {
        tfel_clear_pk(pubkey->num_att, pubkey);
        free(pubkey);
        return -1;
    }
    memset(param_G, 0, sizeof(tfel_param_G));
    pairing_init(param_G->p, CURVE);
    importpub(pubkey, *param_G);
    //pubkey input
    
    
    //sk_Gamma input //CP
    secretkey sk_Gamma;
    sk_Gamma.sk_Delta = (attribute_set*)malloc(sizeof(attribute_set));
    sk_Gamma.sk_AS = NULL;
    sk_Gamma.sk_kStar = (basis*)malloc(sizeof(basis));
    import_sk(sk_Gamma.sk_Delta, sk_Gamma.sk_kStar, *param_G, keyfile);
    //sk_Gamma input

    
    //ciphertext input //共通
    char *input_buf = NULL;//,*keyfile_buf = NULL;
    char *aes_blob64 = NULL, *abe_blob64 = NULL, *iv_blob64 = NULL;
    ssize_t input_len;
    size_t key_len;
    
    fp = fopen(inputfile, "r");
    if(fp != NULL) {
        if((input_len = read_file(fp, &input_buf)) > 0) {
            tokenize_inputfile(input_buf, &abe_blob64, &aes_blob64, &iv_blob64);
            if(aes_blob64 == NULL || abe_blob64 == NULL || iv_blob64 == NULL) {
                fprintf(stderr, "Input file either not well-formed or not encrypted.\n");
                
                fclose(fp);
                return -1;
            }
            
            free(input_buf);
        }
    }
    else {
        fprintf(stderr, "Could not load input file: %s\n", inputfile);
        return FALSE;
    }
    fclose(fp);
    //ciphertext input
    
    //decode ciphertext //共通
    tfel_ciphertext ct;
    memset(&ct, 0, sizeof(tfel_ciphertext));
    size_t abeLength;
    unsigned char *data = NewBase64Decode((const char *) abe_blob64, strlen(abe_blob64), &abeLength);
    ct.data = data;
    ct.data_len = abeLength;
    ct.max_len = abeLength;
    //decode ciphertext
    
    //deserialize ciphertext
    /*printf("abe_blob64 = %zd\n", strlen(abe_blob64));
     printf("abeLength = %zd\n", abeLength);
     printf("ct.data = %s\n", ct.data);
     printf("ct.data_len = %zd\n", ct.data_len);
     printf("ct.max_len = %zd\n", ct.max_len);*/
    
    basis *c_i = NULL;
    c_i = (basis*)malloc(sizeof(basis));
    if (c_i == NULL){
        //error処理
    }

    AccessStructure *AS = NULL;
    AS = (AccessStructure*)malloc(sizeof(AccessStructure));
    tfel_deserialize_ciphertext_cp(AS, c_i, ct.data, ct.max_len, param_G->p);
    
    //deserialize ciphertext
    
    
    
    //decode iv
    size_t ivLength;
    char *ivec = NewBase64Decode((const char *) iv_blob64, strlen(iv_blob64), &ivLength);
    //debug("IV: ");
    //print_buffer_as_hex((uint8 *) ivec, AES_BLOCK_SIZE);
    //decode iv
    
    //decode aes
    /* decode the aesblob64 */
    size_t aesLength;
    char *aesblob = NewBase64Decode((const char *) aes_blob64, strlen(aes_blob64), &aesLength);
    //printf("sizeof(aesblob) = %zd\n", aesLength);
    //decode aes
    
    
    
    //拡大係数行列のチェック
    printf("check\n");
    AccessStructure *aAS;

    aAS = check_attribute_to_matrix(sk_Gamma.sk_Delta, AS); //errorならNULLを返す
    
    
    //alpha_iを生成
    mpz_t order;
    mpz_init(order);
    mpz_set(order, *pairing_get_order(param_G->p));
    mpz_t *alpha_i;
    mpz_t temp;
    mpz_init(temp);
    Element *K;
    Element *temp_E;
    Element temp_0;
    element_init(temp_0, param_G->p->g3);

    alpha_i = calc_alpha_i(aAS, order);
    
    
    
    rho_i *r_ptr;
    r_ptr = aAS->rho;
    
    int t; //search_tで使用
    
    for (i = 0; i < aAS->num_policy+1; i++) { //generate K
        if (i == 0) {
            K = pairing_c_k(param_G->p, NULL, c_i->M[0], sk_Gamma.sk_kStar->M[0], NULL);
        }
        else {
            t = search_t(r_ptr, sk_Gamma.sk_Delta); //r_ptrからtを持ってくる関数
            temp_E = pairing_c_k(param_G->p, r_ptr, c_i->M[i], sk_Gamma.sk_kStar->M[t], &alpha_i[i-1]);
            //temp_E = pairing_c_k(param_G->p, r_ptr, c_i->M[t], sk_Gamma.sk_kStar->M[i], &alpha_i[i-1]);
            
            element_mul(temp_0, *temp_E, *K);
            element_set(*K, temp_0);
            element_clear(*temp_E);
            free(temp_E);
            r_ptr = r_ptr->next;
        }
    }
    //printf("K generate\n");
    
    
    //Kのバイト列を16ビットのハッシュに
    key_len = element_get_oct_length(*K); // size of K
    unsigned char *K_oct;
    K_oct = (unsigned char*)malloc(sizeof(unsigned char)*key_len);
    element_to_oct(K_oct, &key_len, *K); // bytes of K
    
    unsigned char *session_key;
    session_key = (unsigned char *)malloc(sizeof(unsigned char)*16);
    //int d_len;
    
    hash_to_bytes(K_oct, key_len, SESSION_KEY_LEN, session_key, 2);
    //Kのバイト列を16ビットのハッシュに
    
    //復号
    AES_KEY sk;
    //char aes_result[aesLength+1];
    char *aes_result;
    aes_result = (char*)malloc(sizeof(char)*aesLength+1);
    AES_set_decrypt_key((uint8 *) session_key, 8*SESSION_KEY_LEN, &sk);
    memset(aes_result, 0, aesLength+1);
    AES_cbc_encrypt((uint8 *) aesblob, (uint8 *) aes_result, aesLength, &sk, (uint8 *) ivec, AES_DECRYPT);
    char magic[strlen(MAGIC)+1];
    memset(magic, 0, strlen(MAGIC)+1);
    strncpy(magic, aes_result, strlen(MAGIC));
    
    
    if(strcmp(magic, MAGIC) == 0) {
        //printf("Recovered magic: '%s'\n", magic);
        //printf("Plaintext: %s\n", (char *) (aes_result + strlen(MAGIC)));
        if ((fp = fopen(output, "w")) == NULL) {
            fprintf(stderr, "output open error\n");
        }
        else {
            fprintf(fp, "%s\n", (char*)(aes_result + strlen(MAGIC)));
            fclose(fp);
        }
        //magic_failed = FALSE;
    }
    else {
        printf("error decryption\n");
        //printf(stderr, "ERROR: ABE decryption unsuccessful!!\n");
        //magic_failed = TRUE;
    }
    //復号
    
    free(aesblob);
    free(aes_blob64);
    free(ivec);
    free(iv_blob64);
    free(data);
    free(abe_blob64);
    free(aes_result);
    //free(&input_buf);
    free(session_key);
    free(K_oct);
    element_clear(*K);
    free(K);
    if (aAS != NULL) {
        for (i = 0; i < aAS->S->row; i++) {
            mpz_clear(alpha_i[i]);
        }
        free(alpha_i);
        AccessStructure_clear(aAS);//error
    }
    element_clear(temp_0);
    mpz_clear(order);
    mpz_clear(temp);
    
    for (i = 0; i < c_i->dim; i++) { //memsetとか追加?
        free(c_i->M[i]);
    }
    free(c_i->M);
    free(c_i);
    
    Spanprogram_clear(AS->S);
    free(AS);
    
    //AccessStructure_clear(AS);//すでにAS->rhoがAccessStructure_clear(aAS)により解放されているため
    
    return 0;
}
Пример #4
0
 std::vector<Search::TetrisNodeWithTSpinType> const *Search::search(TetrisMap const &map, TetrisNode const *node)
 {
     land_point_cache_.clear();
     if(!node->check(map))
     {
         return &land_point_cache_;
     }
     bool allow_180 = config_->allow_180;
     node_mark_.clear();
     node_mark_filtered_.clear();
     node_search_.clear();
     if(node->status.t == 'T')
     {
         return search_t(map, node);
     }
     if(node->land_point != nullptr && node->low >= map.roof)
     {
         for(auto cit = node->land_point->begin(); cit != node->land_point->end(); ++cit)
         {
             TetrisNode const *drop_node = (*cit)->drop(map);
             if(node_mark_filtered_.mark(drop_node))
             {
                 land_point_cache_.push_back(drop_node);
             }
             node_search_.push_back(drop_node);
         }
         TetrisNode const *last_node = nullptr;
         size_t cache_index = node_search_.size();
         for(size_t i = 0; i != cache_index; ++i)
         {
             node = node_search_[i];
             if(last_node != nullptr)
             {
                 if(last_node->status.r == node->status.r && std::abs(last_node->status.x - node->status.x) == 1 && std::abs(last_node->status.y - node->status.y) > 1)
                 {
                     if(last_node->status.y > node->status.y)
                     {
                         TetrisNode const *check_node = (last_node->*(last_node->status.x > node->status.x ? &TetrisNode::move_left : &TetrisNode::move_right))->move_down->move_down;
                         if(node_mark_.mark(check_node))
                         {
                             node_search_.push_back(check_node);
                         }
                     }
                     else
                     {
                         TetrisNode const *check_node = (node->*(node->status.x > last_node->status.x ? &TetrisNode::move_left : &TetrisNode::move_right))->move_down->move_down;
                         if(node_mark_.mark(check_node))
                         {
                             node_search_.push_back(check_node);
                         }
                     }
                 }
             }
             last_node = node;
         }
         do
         {
             for(size_t max_index = node_search_.size(); cache_index < max_index; ++cache_index)
             {
                 node = node_search_[cache_index];
                 if(!node->open(map) && (!node->move_down || !node->move_down->check(map)))
                 {
                     if(node_mark_filtered_.mark(node))
                     {
                         land_point_cache_.push_back(node);
                     }
                 }
                 if(allow_180)
                 {
                     //x
                     for(TetrisNode const *wall_kick_node : node->wall_kick_opposite)
                     {
                         if(wall_kick_node)
                         {
                             if(wall_kick_node->check(map))
                             {
                                 if(node_mark_.mark(wall_kick_node) && !wall_kick_node->open(map))
                                 {
                                     node_search_.push_back(wall_kick_node);
                                 }
                                 break;
                             }
                         }
                         else
                         {
                             break;
                         }
                     }
                 }
                 //z
                 for(TetrisNode const *wall_kick_node : node->wall_kick_counterclockwise)
                 {
                     if(wall_kick_node)
                     {
                         if(wall_kick_node->check(map))
                         {
                             if(node_mark_.mark(wall_kick_node) && !wall_kick_node->open(map))
                             {
                                 node_search_.push_back(wall_kick_node);
                             }
                             break;
                         }
                     }
                     else
                     {
                         break;
                     }
                 }
                 //c
                 for(TetrisNode const *wall_kick_node : node->wall_kick_clockwise)
                 {
                     if(wall_kick_node)
                     {
                         if(wall_kick_node->check(map))
                         {
                             if(node_mark_.mark(wall_kick_node) && !wall_kick_node->open(map))
                             {
                                 node_search_.push_back(wall_kick_node);
                             }
                             break;
                         }
                     }
                     else
                     {
                         break;
                     }
                 }
                 //l
                 if(node->move_left && node_mark_.mark(node->move_left) && !node->move_left->open(map) && node->move_left->check(map))
                 {
                     node_search_.push_back(node->move_left);
                 }
                 //r
                 if(node->move_right && node_mark_.mark(node->move_right) && !node->move_right->open(map) && node->move_right->check(map))
                 {
                     node_search_.push_back(node->move_right);
                 }
                 //d
                 if(node->move_down && node_mark_.mark(node->move_down) && node->move_down->check(map))
                 {
                     node_search_.push_back(node->move_down);
                 }
             }
         }
         while(node_search_.size() > cache_index);
     }
     else
     {
         node_search_.push_back(node);
         node_mark_.mark(node);
         size_t cache_index = 0;
         do
         {
             for(size_t max_index = node_search_.size(); cache_index < max_index; ++cache_index)
             {
                 node = node_search_[cache_index];
                 if(!node->move_down || !node->move_down->check(map))
                 {
                     if(node_mark_filtered_.mark(node))
                     {
                         land_point_cache_.push_back(node);
                     }
                 }
                 if(allow_180)
                 {
                     //x
                     for(TetrisNode const *wall_kick_node : node->wall_kick_opposite)
                     {
                         if(wall_kick_node)
                         {
                             if(wall_kick_node->check(map))
                             {
                                 if(node_mark_.mark(wall_kick_node))
                                 {
                                     node_search_.push_back(wall_kick_node);
                                 }
                                 break;
                             }
                         }
                         else
                         {
                             break;
                         }
                     }
                 }
                 //z
                 for(TetrisNode const *wall_kick_node : node->wall_kick_counterclockwise)
                 {
                     if(wall_kick_node)
                     {
                         if(wall_kick_node->check(map))
                         {
                             if(node_mark_.mark(wall_kick_node))
                             {
                                 node_search_.push_back(wall_kick_node);
                             }
                             break;
                         }
                     }
                     else
                     {
                         break;
                     }
                 }
                 //c
                 for(TetrisNode const *wall_kick_node : node->wall_kick_clockwise)
                 {
                     if(wall_kick_node)
                     {
                         if(wall_kick_node->check(map))
                         {
                             if(node_mark_.mark(wall_kick_node))
                             {
                                 node_search_.push_back(wall_kick_node);
                             }
                             break;
                         }
                     }
                     else
                     {
                         break;
                     }
                 }
                 //l
                 if(node->move_left && node_mark_.mark(node->move_left) && node->move_left->check(map))
                 {
                     node_search_.push_back(node->move_left);
                 }
                 //r
                 if(node->move_right && node_mark_.mark(node->move_right) && node->move_right->check(map))
                 {
                     node_search_.push_back(node->move_right);
                 }
                 //d
                 if(node->move_down && node_mark_.mark(node->move_down) && node->move_down->check(map))
                 {
                     node_search_.push_back(node->move_down);
                 }
             }
         }
         while(node_search_.size() > cache_index);
     }
     return &land_point_cache_;
 }