|
135 |
|
135 |
|
136 |
PyObject* asn1_decode_key(PyObject *unused, PyObject* args) |
136 |
PyObject* asn1_decode_key(PyObject *unused, PyObject* args) |
137 |
{ |
137 |
{ |
|
|
138 |
krb5ContextObject *context; |
138 |
uint8_t *key_buf; |
139 |
uint8_t *key_buf; |
139 |
size_t key_len; |
140 |
size_t key_len; |
140 |
krb5KeyblockObject *keyblock; |
141 |
krb5KeyblockObject *keyblock; |
|
144 |
size_t len; |
145 |
size_t len; |
145 |
PyObject *self; |
146 |
PyObject *self; |
146 |
int error = 0; |
147 |
int error = 0; |
|
|
148 |
char *error_msg; |
147 |
|
149 |
|
148 |
if (!PyArg_ParseTuple(args, "s#", &key_buf, &key_len)) |
150 |
if (!PyArg_ParseTuple(args, "Os#", &context, &key_buf, &key_len)) |
149 |
return NULL; |
151 |
return NULL; |
150 |
|
152 |
|
151 |
ret = decode_Key(key_buf, key_len, &asn1_key, &len); |
153 |
ret = decode_Key(key_buf, key_len, &asn1_key, &len); |
152 |
if (ret) { |
154 |
if (ret) { |
153 |
error = 1; |
155 |
error = 1; |
154 |
krb5_exception(NULL, ret); |
156 |
error_msg = krb5_get_error_message(context->context, ret); |
|
|
157 |
krb5_exception(context->context, ret, error_msg); |
155 |
goto out; |
158 |
goto out; |
156 |
} |
159 |
} |
157 |
|
160 |
|
158 |
keyblock = (krb5KeyblockObject *) PyObject_NEW(krb5KeyblockObject, &krb5KeyblockType); |
161 |
keyblock = (krb5KeyblockObject *) PyObject_NEW(krb5KeyblockObject, &krb5KeyblockType); |
|
|
162 |
keyblock->context = context->context; |
159 |
keyblock->keyblock.keytype = asn1_key.key.keytype; |
163 |
keyblock->keyblock.keytype = asn1_key.key.keytype; |
160 |
|
164 |
|
161 |
keyblock->keyblock.keyvalue.data = malloc(asn1_key.key.keyvalue.length); |
165 |
keyblock->keyblock.keyvalue.data = malloc(asn1_key.key.keyvalue.length); |
162 |
if (keyblock->keyblock.keyvalue.data == NULL) { |
166 |
if (keyblock->keyblock.keyvalue.data == NULL) { |
163 |
error = 1; |
167 |
error = 1; |
164 |
krb5_exception(NULL, -1, "malloc for keyvalue.data failed"); |
168 |
krb5_exception(context->context, -1, "malloc for keyvalue.data failed"); |
165 |
goto out; |
169 |
goto out; |
166 |
} |
170 |
} |
167 |
memcpy(keyblock->keyblock.keyvalue.data, asn1_key.key.keyvalue.data, asn1_key.key.keyvalue.length); |
171 |
memcpy(keyblock->keyblock.keyvalue.data, asn1_key.key.keyvalue.data, asn1_key.key.keyvalue.length); |
|
173 |
salt->salt.saltvalue.data = malloc(asn1_key.salt->salt.length); |
177 |
salt->salt.saltvalue.data = malloc(asn1_key.salt->salt.length); |
174 |
if (salt->salt.saltvalue.data == NULL) { |
178 |
if (salt->salt.saltvalue.data == NULL) { |
175 |
error = 1; |
179 |
error = 1; |
176 |
krb5_exception(NULL, -1, "malloc for saltvalue.data failed"); |
180 |
krb5_exception(context->context, -1, "malloc for saltvalue.data failed"); |
177 |
goto out; |
181 |
goto out; |
178 |
} |
182 |
} |
179 |
memcpy(salt->salt.saltvalue.data, asn1_key.salt->salt.data, asn1_key.salt->salt.length); |
183 |
memcpy(salt->salt.saltvalue.data, asn1_key.salt->salt.data, asn1_key.salt->salt.length); |