blob: fff95e2d0e71e1e5af07d0c78b3b29eda0b51ced [file] [log] [blame]
Jean-Paul Calderone897bc252008-02-18 20:50:23 -05001/*
2 * pkcs7.c
3 *
4 * Copyright (C) AB Strakt 2002, All rights reserved
5 *
6 * PKCS7 handling code, mostly thin wrappers around OpenSSL.
7 * See the file RATIONALE for a short explanation of why this module was written.
8 *
9 */
10#include <Python.h>
11#define crypto_MODULE
12#include "crypto.h"
13
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050014static char crypto_PKCS7_type_is_signed_doc[] = "\n\
15Check if this NID_pkcs7_signed object\n\
16\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040017@return: True if the PKCS7 is of type signed\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050018";
19
20static PyObject *
21crypto_PKCS7_type_is_signed(crypto_PKCS7Obj *self, PyObject *args)
22{
23 if (!PyArg_ParseTuple(args, ":type_is_signed"))
24 return NULL;
25
26 if (PKCS7_type_is_signed(self->pkcs7))
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040027 return PyLong_FromLong(1L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050028 else
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040029 return PyLong_FromLong(0L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050030}
31
32static char crypto_PKCS7_type_is_enveloped_doc[] = "\n\
33Check if this NID_pkcs7_enveloped object\n\
34\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040035@returns: True if the PKCS7 is of type enveloped\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050036";
37
38static PyObject *
39crypto_PKCS7_type_is_enveloped(crypto_PKCS7Obj *self, PyObject *args)
40{
41 if (!PyArg_ParseTuple(args, ":type_is_enveloped"))
42 return NULL;
43
44 if (PKCS7_type_is_enveloped(self->pkcs7))
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040045 return PyLong_FromLong(1L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050046 else
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040047 return PyLong_FromLong(0L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050048}
49
50static char crypto_PKCS7_type_is_signedAndEnveloped_doc[] = "\n\
51Check if this NID_pkcs7_signedAndEnveloped object\n\
52\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040053@returns: True if the PKCS7 is of type signedAndEnveloped\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050054";
55
56static PyObject *
57crypto_PKCS7_type_is_signedAndEnveloped(crypto_PKCS7Obj *self, PyObject *args)
58{
59 if (!PyArg_ParseTuple(args, ":type_is_signedAndEnveloped"))
60 return NULL;
61
62 if (PKCS7_type_is_signedAndEnveloped(self->pkcs7))
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040063 return PyLong_FromLong(1L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050064 else
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040065 return PyLong_FromLong(0L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050066}
67
68static char crypto_PKCS7_type_is_data_doc[] = "\n\
69Check if this NID_pkcs7_data object\n\
70\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040071@return: True if the PKCS7 is of type data\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050072";
73
74static PyObject *
75crypto_PKCS7_type_is_data(crypto_PKCS7Obj *self, PyObject *args)
76{
77 if (!PyArg_ParseTuple(args, ":type_is_data"))
78 return NULL;
79
80 if (PKCS7_type_is_data(self->pkcs7))
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040081 return PyLong_FromLong(1L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050082 else
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040083 return PyLong_FromLong(0L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050084}
85
86static char crypto_PKCS7_get_type_name_doc[] = "\n\
87Returns the type name of the PKCS7 structure\n\
88\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040089@return: A string with the typename\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050090";
91
92static PyObject *
93crypto_PKCS7_get_type_name(crypto_PKCS7Obj *self, PyObject *args)
94{
95 if (!PyArg_ParseTuple(args, ":get_type_name"))
96 return NULL;
97
98 /*
99 * return a string with the typename
100 */
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -0400101 return PyBytes_FromString(OBJ_nid2sn(OBJ_obj2nid(self->pkcs7->type)));
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500102}
103
104/*
105 * ADD_METHOD(name) expands to a correct PyMethodDef declaration
106 * { 'name', (PyCFunction)crypto_PKCS7_name, METH_VARARGS }
107 * for convenience
108 */
109#define ADD_METHOD(name) \
110 { #name, (PyCFunction)crypto_PKCS7_##name, METH_VARARGS, crypto_PKCS7_##name##_doc }
111static PyMethodDef crypto_PKCS7_methods[] =
112{
113 ADD_METHOD(type_is_signed),
114 ADD_METHOD(type_is_enveloped),
115 ADD_METHOD(type_is_signedAndEnveloped),
116 ADD_METHOD(type_is_data),
117 ADD_METHOD(get_type_name),
118 { NULL, NULL }
119};
120#undef ADD_METHOD
121
122
123/*
124 * Constructor for PKCS7 objects, never called by Python code directly
125 *
126 * Arguments: pkcs7 - A "real" pkcs7 certificate object
127 * dealloc - Boolean value to specify whether the destructor should
128 * free the "real" pkcs7 object
129 * Returns: The newly created pkcs7 object
130 */
131crypto_PKCS7Obj *
132crypto_PKCS7_New(PKCS7 *pkcs7, int dealloc)
133{
134 crypto_PKCS7Obj *self;
135
136 self = PyObject_New(crypto_PKCS7Obj, &crypto_PKCS7_Type);
137
138 if (self == NULL)
139 return NULL;
140
141 self->pkcs7 = pkcs7;
142 self->dealloc = dealloc;
143
144 return self;
145}
146
147/*
148 * Deallocate the memory used by the PKCS7 object
149 *
150 * Arguments: self - The PKCS7 object
151 * Returns: None
152 */
153static void
154crypto_PKCS7_dealloc(crypto_PKCS7Obj *self)
155{
156 /* Sometimes we don't have to dealloc the "real" PKCS7 pointer ourselves */
157 if (self->dealloc)
158 PKCS7_free(self->pkcs7);
159
160 PyObject_Del(self);
161}
162
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500163PyTypeObject crypto_PKCS7_Type = {
Jean-Paul Calderone3fe7f672010-08-11 23:55:10 -0400164 PyOpenSSL_HEAD_INIT(&PyType_Type, 0)
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500165 "PKCS7",
166 sizeof(crypto_PKCS7Obj),
167 0,
168 (destructor)crypto_PKCS7_dealloc,
169 NULL, /* print */
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -0400170 NULL, /* getattr */
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500171 NULL, /* setattr */
172 NULL, /* compare */
173 NULL, /* repr */
174 NULL, /* as_number */
175 NULL, /* as_sequence */
176 NULL, /* as_mapping */
177 NULL, /* hash */
178 NULL, /* call */
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -0400179 NULL, /* str */
180 NULL, /* getattro */
181 NULL, /* setattro */
182 NULL, /* as_buffer */
183 Py_TPFLAGS_DEFAULT,
184 NULL, /* doc */
185 NULL, /* traverse */
186 NULL, /* clear */
187 NULL, /* tp_richcompare */
188 0, /* tp_weaklistoffset */
189 NULL, /* tp_iter */
190 NULL, /* tp_iternext */
191 crypto_PKCS7_methods, /* tp_methods */
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500192};
193
194/*
195 * Initialize the PKCS7 part of the crypto sub module
196 *
Jean-Paul Calderonedc138fa2009-06-27 14:32:07 -0400197 * Arguments: module - The crypto module
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500198 * Returns: None
199 */
200int
Jean-Paul Calderonedc138fa2009-06-27 14:32:07 -0400201init_crypto_pkcs7(PyObject *module) {
202 if (PyType_Ready(&crypto_PKCS7_Type) < 0) {
203 return 0;
204 }
205
206 if (PyModule_AddObject(module, "PKCS7Type", (PyObject *)&crypto_PKCS7_Type) != 0) {
207 return 0;
208 }
209
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500210 return 1;
211}
212