9017cb967aa18f61ab8b97f82cf4b19cfa26ce4a
[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-2014 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 int ipc_sec_pin_status_setup(struct ipc_sec_pin_status_request_data *data,
27     unsigned char type, const char *pin1, const char *pin2)
28 {
29     size_t pin1_length;
30     size_t pin2_length;
31
32     if (data == NULL)
33         return -1;
34
35     memset(data, 0, sizeof(struct ipc_sec_pin_status_request_data));
36     data->type = type;
37
38     if (pin1 != NULL) {
39         pin1_length = strlen(pin1);
40         if (pin1_length > sizeof(data->pin1))
41             pin1_length = sizeof(data->pin1);
42
43         strncpy((char *) data->pin1, pin1, pin1_length);
44     }
45
46     if (pin2 != NULL) {
47         pin2_length = strlen(pin2);
48         if (pin2_length > sizeof(data->pin2))
49             pin2_length = sizeof(data->pin2);
50
51         strncpy((char *) data->pin2, pin2, pin2_length);
52     }
53
54     return 0;
55 }
56
57 int ipc_sec_phone_lock_request_set_setup(struct ipc_sec_phone_lock_request_set_data *data,
58     unsigned char facility_type, unsigned char active, const char *password)
59 {
60     size_t password_length;
61
62     if (data == NULL)
63         return -1;
64
65     memset(data, 0, sizeof(struct ipc_sec_phone_lock_request_set_data));
66     data->facility_type = facility_type;
67     data->active = active;
68
69     if (password != NULL) {
70         password_length = strlen(password);
71         if (password_length > sizeof(data->password))
72             password_length = sizeof(data->password);
73
74         data->password_length = (unsigned char) password_length;
75         strncpy((char *) data->password, password, password_length);
76     } else {
77         data->password_length = 0;
78     }
79
80     return 0;
81 }
82
83 int ipc_sec_change_locking_pw_setup(struct ipc_sec_change_locking_pw_data *data,
84     unsigned char facility_type, const char *password_old,
85     const char *password_new)
86 {
87     size_t password_old_length;
88     size_t password_new_length;
89
90     if (data == NULL)
91         return -1;
92
93     data->facility_type = facility_type;
94
95     if (password_old != NULL) {
96         password_old_length = strlen(password_old);
97         if (password_old_length > sizeof(data->password_old_length))
98             password_old_length = sizeof(data->password_old_length);
99
100         data->password_old_length = (unsigned char) password_old_length;
101         strncpy((char *) data->password_old, password_old, password_old_length);
102     } else {
103         data->password_old_length = 0;
104     }
105
106     if (password_new != NULL) {
107         password_new_length = strlen(password_new);
108         if (password_new_length > sizeof(data->password_new_length))
109             password_new_length = sizeof(data->password_new_length);
110
111         data->password_new_length = (unsigned char) password_new_length;
112         strncpy((char *) data->password_new, password_new, password_new_length);
113     } else {
114         data->password_new_length = 0;
115     }
116
117     return 0;
118 }
119
120 void *ipc_sec_rsim_access_get_file_data(const void *data, size_t size)
121 {
122     struct ipc_sec_rsim_access_response_header *header;
123     void *file_data;
124
125     if (data == NULL || size < sizeof(struct ipc_sec_rsim_access_response_header))
126         return NULL;
127
128     header = (struct ipc_sec_rsim_access_response_header *) data;
129
130     file_data = calloc(1, header->length);
131
132     memcpy(file_data, (void *) ((unsigned char *) data + sizeof(struct ipc_sec_rsim_access_response_header)), header->length);
133
134     return file_data;
135 }
136
137 int ipc_sec_lock_infomation_setup(struct ipc_sec_lock_infomation_request_data *data,
138     unsigned char type)
139 {
140     if (data == NULL)
141         return -1;
142
143     memset(data, 0, sizeof(struct ipc_sec_lock_infomation_request_data));
144     data->magic = 0x01;
145     data->type = type;
146
147     return 0;
148 }
149
150 // vim:ts=4:sw=4:expandtab