76584e8b22bc6099867348c679696e701f16ea3f
[libsamsung-ipc.git] / samsung-ipc / sec.c
1 /*
2  * This file is part of libsamsung-ipc.
3  *
4  * Copyright (C) 2011 Simon Busch <morphis@gravedo.de>
5  * Copyright (C) 2011 Paul Kocialkowski <contact@paulk.fr>
6  *
7  * libsamsung-ipc is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * libsamsung-ipc is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with libsamsung-ipc.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <stdlib.h>
22 #include <string.h>
23
24 #include <samsung-ipc.h>
25
26 void ipc_sec_sim_status_setup(struct ipc_sec_sim_status_request_data *message,
27     unsigned char pin_type, char *pin1, char *pin2)
28 {
29     if (message == NULL)
30         return;
31
32     memset(message, 0, sizeof(struct ipc_sec_sim_status_request_data));
33
34     message->type = pin_type;
35
36     if (pin1 != NULL)
37     {
38         strncpy((char *) message->pin1, pin1, 8);
39         message->pin1_length = strlen(pin1);
40     }
41
42     if (pin2 != NULL)
43     {
44         strncpy((char *) message->pin2, pin2, 8);
45         message->pin2_length = strlen(pin2);
46     }
47 }
48
49 void ipc_sec_lock_info_setup(struct ipc_sec_lock_info_request_data *message,
50     unsigned char pin_type)
51 {
52     if (message == NULL)
53         return;
54
55     message->magic = 1;
56     message->type = pin_type;
57 }
58
59 char *ipc_sec_rsim_access_response_get_file_data(struct ipc_message_info *response)
60 {
61     int n = 0;
62     int offset = (int) sizeof(struct ipc_sec_rsim_access_response_header);
63     int size = 0;
64
65     if (response == NULL)
66         return NULL;
67
68     struct ipc_sec_rsim_access_response_header *rsimresp = (struct ipc_sec_rsim_access_response_header*) response->data;
69     char *file_data = (char *) malloc(sizeof(char) * rsimresp->length);
70
71     for (n = 0; n < rsimresp->length; n++)
72     {
73         if (response->data[offset + n] == 0x0)
74             continue;
75         else if (response->data[offset + n] == 0xff)
76             break;
77         else {
78             file_data[size] = response->data[offset + n];
79             size++;
80         }
81     }
82
83     if (size < rsimresp->length)
84         file_data = (char *) realloc(file_data, sizeof(char) * size);
85
86     return file_data;
87 }
88
89 void ipc_sec_phone_lock_request_set_setup(struct ipc_sec_phone_lock_request_set_data *message,
90     int pin_type, int enable, char *passwd)
91 {
92     message->facility_type = pin_type;
93     message->active = enable ? 1 : 0;
94
95     if (passwd != NULL)
96     {
97         strncpy((char *) message->password, passwd, 39);
98         message->password_length = strlen(passwd);
99     }
100 }
101
102 void ipc_sec_change_locking_pw_setup(struct ipc_sec_change_locking_pw_data *message,
103     int type, char *passwd_old, char *passwd_new)
104 {
105     message->facility_type = type;
106
107     if (passwd_old != NULL)
108     {
109         strncpy((char *) message->password_old, passwd_old, 39);
110         message->password_old_length = strlen(passwd_old);
111     }
112
113     if (passwd_new != NULL)
114     {
115         strncpy((char *) message->password_new, passwd_new, 39);
116         message->password_new_length = strlen(passwd_new);
117     }
118 }
119
120 // vim:ts=4:sw=4:expandtab