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