blob: a07480078db497118dfaeb2bd4542588b82f6fc9 [file] [log] [blame]
Jean-Paul Calderone897bc252008-02-18 20:50:23 -05001/*
2 * pkcs7.c
3 *
Jean-Paul Calderone59057dc2011-03-02 19:31:06 -05004 * Copyright (C) AB Strakt
Jean-Paul Calderone8671c852011-03-02 19:26:20 -05005 * See LICENSE for details.
Jean-Paul Calderone897bc252008-02-18 20:50:23 -05006 *
7 * PKCS7 handling code, mostly thin wrappers around OpenSSL.
8 * See the file RATIONALE for a short explanation of why this module was written.
9 *
10 */
11#include <Python.h>
12#define crypto_MODULE
13#include "crypto.h"
14
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050015static char crypto_PKCS7_type_is_signed_doc[] = "\n\
16Check if this NID_pkcs7_signed object\n\
17\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040018@return: True if the PKCS7 is of type signed\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050019";
20
21static PyObject *
22crypto_PKCS7_type_is_signed(crypto_PKCS7Obj *self, PyObject *args)
23{
24 if (!PyArg_ParseTuple(args, ":type_is_signed"))
25 return NULL;
26
27 if (PKCS7_type_is_signed(self->pkcs7))
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040028 return PyLong_FromLong(1L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050029 else
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040030 return PyLong_FromLong(0L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050031}
32
33static char crypto_PKCS7_type_is_enveloped_doc[] = "\n\
34Check if this NID_pkcs7_enveloped object\n\
35\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040036@returns: True if the PKCS7 is of type enveloped\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050037";
38
39static PyObject *
40crypto_PKCS7_type_is_enveloped(crypto_PKCS7Obj *self, PyObject *args)
41{
42 if (!PyArg_ParseTuple(args, ":type_is_enveloped"))
43 return NULL;
44
45 if (PKCS7_type_is_enveloped(self->pkcs7))
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040046 return PyLong_FromLong(1L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050047 else
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040048 return PyLong_FromLong(0L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050049}
50
51static char crypto_PKCS7_type_is_signedAndEnveloped_doc[] = "\n\
52Check if this NID_pkcs7_signedAndEnveloped object\n\
53\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040054@returns: True if the PKCS7 is of type signedAndEnveloped\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050055";
56
57static PyObject *
58crypto_PKCS7_type_is_signedAndEnveloped(crypto_PKCS7Obj *self, PyObject *args)
59{
60 if (!PyArg_ParseTuple(args, ":type_is_signedAndEnveloped"))
61 return NULL;
62
63 if (PKCS7_type_is_signedAndEnveloped(self->pkcs7))
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040064 return PyLong_FromLong(1L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050065 else
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040066 return PyLong_FromLong(0L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050067}
68
69static char crypto_PKCS7_type_is_data_doc[] = "\n\
70Check if this NID_pkcs7_data object\n\
71\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040072@return: True if the PKCS7 is of type data\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050073";
74
75static PyObject *
76crypto_PKCS7_type_is_data(crypto_PKCS7Obj *self, PyObject *args)
77{
78 if (!PyArg_ParseTuple(args, ":type_is_data"))
79 return NULL;
80
81 if (PKCS7_type_is_data(self->pkcs7))
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040082 return PyLong_FromLong(1L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050083 else
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -040084 return PyLong_FromLong(0L);
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050085}
86
87static char crypto_PKCS7_get_type_name_doc[] = "\n\
88Returns the type name of the PKCS7 structure\n\
89\n\
Jean-Paul Calderone54bcc832009-05-27 14:06:48 -040090@return: A string with the typename\n\
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050091";
92
93static PyObject *
94crypto_PKCS7_get_type_name(crypto_PKCS7Obj *self, PyObject *args)
95{
96 if (!PyArg_ParseTuple(args, ":get_type_name"))
97 return NULL;
98
99 /*
100 * return a string with the typename
101 */
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -0400102 return PyBytes_FromString(OBJ_nid2sn(OBJ_obj2nid(self->pkcs7->type)));
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500103}
104
105/*
106 * ADD_METHOD(name) expands to a correct PyMethodDef declaration
107 * { 'name', (PyCFunction)crypto_PKCS7_name, METH_VARARGS }
108 * for convenience
109 */
110#define ADD_METHOD(name) \
111 { #name, (PyCFunction)crypto_PKCS7_##name, METH_VARARGS, crypto_PKCS7_##name##_doc }
112static PyMethodDef crypto_PKCS7_methods[] =
113{
114 ADD_METHOD(type_is_signed),
115 ADD_METHOD(type_is_enveloped),
116 ADD_METHOD(type_is_signedAndEnveloped),
117 ADD_METHOD(type_is_data),
118 ADD_METHOD(get_type_name),
119 { NULL, NULL }
120};
121#undef ADD_METHOD
122
123
124/*
125 * Constructor for PKCS7 objects, never called by Python code directly
126 *
127 * Arguments: pkcs7 - A "real" pkcs7 certificate object
128 * dealloc - Boolean value to specify whether the destructor should
129 * free the "real" pkcs7 object
130 * Returns: The newly created pkcs7 object
131 */
132crypto_PKCS7Obj *
133crypto_PKCS7_New(PKCS7 *pkcs7, int dealloc)
134{
135 crypto_PKCS7Obj *self;
136
137 self = PyObject_New(crypto_PKCS7Obj, &crypto_PKCS7_Type);
138
139 if (self == NULL)
140 return NULL;
141
142 self->pkcs7 = pkcs7;
143 self->dealloc = dealloc;
144
145 return self;
146}
147
148/*
149 * Deallocate the memory used by the PKCS7 object
150 *
151 * Arguments: self - The PKCS7 object
152 * Returns: None
153 */
154static void
155crypto_PKCS7_dealloc(crypto_PKCS7Obj *self)
156{
157 /* Sometimes we don't have to dealloc the "real" PKCS7 pointer ourselves */
158 if (self->dealloc)
159 PKCS7_free(self->pkcs7);
160
161 PyObject_Del(self);
162}
163
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500164PyTypeObject crypto_PKCS7_Type = {
Jean-Paul Calderone3fe7f672010-08-11 23:55:10 -0400165 PyOpenSSL_HEAD_INIT(&PyType_Type, 0)
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500166 "PKCS7",
167 sizeof(crypto_PKCS7Obj),
168 0,
169 (destructor)crypto_PKCS7_dealloc,
170 NULL, /* print */
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -0400171 NULL, /* getattr */
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500172 NULL, /* setattr */
173 NULL, /* compare */
174 NULL, /* repr */
175 NULL, /* as_number */
176 NULL, /* as_sequence */
177 NULL, /* as_mapping */
178 NULL, /* hash */
179 NULL, /* call */
Jean-Paul Calderone2f6c66f2010-08-11 19:53:43 -0400180 NULL, /* str */
181 NULL, /* getattro */
182 NULL, /* setattro */
183 NULL, /* as_buffer */
184 Py_TPFLAGS_DEFAULT,
185 NULL, /* doc */
186 NULL, /* traverse */
187 NULL, /* clear */
188 NULL, /* tp_richcompare */
189 0, /* tp_weaklistoffset */
190 NULL, /* tp_iter */
191 NULL, /* tp_iternext */
192 crypto_PKCS7_methods, /* tp_methods */
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500193};
194
195/*
196 * Initialize the PKCS7 part of the crypto sub module
197 *
Jean-Paul Calderonedc138fa2009-06-27 14:32:07 -0400198 * Arguments: module - The crypto module
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500199 * Returns: None
200 */
201int
Jean-Paul Calderonedc138fa2009-06-27 14:32:07 -0400202init_crypto_pkcs7(PyObject *module) {
203 if (PyType_Ready(&crypto_PKCS7_Type) < 0) {
204 return 0;
205 }
206
207 if (PyModule_AddObject(module, "PKCS7Type", (PyObject *)&crypto_PKCS7_Type) != 0) {
208 return 0;
209 }
210
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500211 return 1;
212}
213