Changeset 388 for python/vendor/current/Modules/md5module.c
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Modules/md5module.c
r2 r388 15 15 16 16 typedef struct { 17 18 md5_state_t md5;/* the context holder */17 PyObject_HEAD 18 md5_state_t md5; /* the context holder */ 19 19 } md5object; 20 20 21 21 static PyTypeObject MD5type; 22 22 23 #define is_md5object(v) 23 #define is_md5object(v) ((v)->ob_type == &MD5type) 24 24 25 25 static md5object * 26 26 newmd5object(void) 27 27 { 28 29 30 31 32 33 34 md5_init(&md5p->md5);/* actual initialisation */35 28 md5object *md5p; 29 30 md5p = PyObject_New(md5object, &MD5type); 31 if (md5p == NULL) 32 return NULL; 33 34 md5_init(&md5p->md5); /* actual initialisation */ 35 return md5p; 36 36 } 37 37 … … 42 42 md5_dealloc(md5object *md5p) 43 43 { 44 44 PyObject_Del(md5p); 45 45 } 46 46 … … 51 51 md5_update(md5object *self, PyObject *args) 52 52 { 53 unsigned char *cp; 54 int len; 55 56 if (!PyArg_ParseTuple(args, "s#:update", &cp, &len)) 57 return NULL; 58 59 md5_append(&self->md5, cp, len); 60 61 Py_INCREF(Py_None); 62 return Py_None; 53 Py_buffer view; 54 Py_ssize_t n; 55 unsigned char *buf; 56 57 if (!PyArg_ParseTuple(args, "s*:update", &view)) 58 return NULL; 59 60 n = view.len; 61 buf = (unsigned char *) view.buf; 62 while (n > 0) { 63 Py_ssize_t nbytes; 64 if (n > INT_MAX) 65 nbytes = INT_MAX; 66 else 67 nbytes = n; 68 md5_append(&self->md5, buf, 69 Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int)); 70 buf += nbytes; 71 n -= nbytes; 72 } 73 74 PyBuffer_Release(&view); 75 Py_RETURN_NONE; 63 76 } 64 77 … … 74 87 md5_digest(md5object *self) 75 88 { 76 77 78 79 80 81 82 83 89 md5_state_t mdContext; 90 unsigned char aDigest[16]; 91 92 /* make a temporary copy, and perform the final */ 93 mdContext = self->md5; 94 md5_finish(&mdContext, aDigest); 95 96 return PyString_FromStringAndSize((char *)aDigest, 16); 84 97 } 85 98 … … 95 108 md5_hexdigest(md5object *self) 96 109 { 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 110 md5_state_t mdContext; 111 unsigned char digest[16]; 112 unsigned char hexdigest[32]; 113 int i, j; 114 115 /* make a temporary copy, and perform the final */ 116 mdContext = self->md5; 117 md5_finish(&mdContext, digest); 118 119 /* Make hex version of the digest */ 120 for(i=j=0; i<16; i++) { 121 char c; 122 c = (digest[i] >> 4) & 0xf; 123 c = (c>9) ? c+'a'-10 : c + '0'; 124 hexdigest[j++] = c; 125 c = (digest[i] & 0xf); 126 c = (c>9) ? c+'a'-10 : c + '0'; 127 hexdigest[j++] = c; 128 } 129 return PyString_FromStringAndSize((char*)hexdigest, 32); 117 130 } 118 131 … … 127 140 md5_copy(md5object *self) 128 141 { 129 130 131 132 133 134 135 136 142 md5object *md5p; 143 144 if ((md5p = newmd5object()) == NULL) 145 return NULL; 146 147 md5p->md5 = self->md5; 148 149 return (PyObject *)md5p; 137 150 } 138 151 … … 144 157 145 158 static PyMethodDef md5_methods[] = { 146 147 148 149 150 {NULL, NULL}/* sentinel */159 {"update", (PyCFunction)md5_update, METH_VARARGS, update_doc}, 160 {"digest", (PyCFunction)md5_digest, METH_NOARGS, digest_doc}, 161 {"hexdigest", (PyCFunction)md5_hexdigest, METH_NOARGS, hexdigest_doc}, 162 {"copy", (PyCFunction)md5_copy, METH_NOARGS, copy_doc}, 163 {NULL, NULL} /* sentinel */ 151 164 }; 152 165 … … 222 235 223 236 static PyTypeObject MD5type = { 224 225 "_md5.md5",/*tp_name*/226 sizeof(md5object),/*tp_size*/227 0,/*tp_itemsize*/228 229 230 0,/*tp_print*/231 232 0,/*tp_setattr*/233 0,/*tp_compare*/234 0,/*tp_repr*/235 0,/*tp_as_number*/236 237 0,/*tp_as_mapping*/238 0,/*tp_hash*/239 0,/*tp_call*/240 0,/*tp_str*/241 0,/*tp_getattro*/242 0,/*tp_setattro*/243 0,/*tp_as_buffer*/244 Py_TPFLAGS_DEFAULT,/*tp_flags*/245 md5type_doc,/*tp_doc*/246 247 0,/*tp_clear*/248 0,/*tp_richcompare*/249 0,/*tp_weaklistoffset*/250 0,/*tp_iter*/251 0,/*tp_iternext*/252 md5_methods,/*tp_methods*/253 0,/*tp_members*/254 237 PyVarObject_HEAD_INIT(NULL, 0) 238 "_md5.md5", /*tp_name*/ 239 sizeof(md5object), /*tp_size*/ 240 0, /*tp_itemsize*/ 241 /* methods */ 242 (destructor)md5_dealloc, /*tp_dealloc*/ 243 0, /*tp_print*/ 244 0, /*tp_getattr*/ 245 0, /*tp_setattr*/ 246 0, /*tp_compare*/ 247 0, /*tp_repr*/ 248 0, /*tp_as_number*/ 249 0, /*tp_as_sequence*/ 250 0, /*tp_as_mapping*/ 251 0, /*tp_hash*/ 252 0, /*tp_call*/ 253 0, /*tp_str*/ 254 0, /*tp_getattro*/ 255 0, /*tp_setattro*/ 256 0, /*tp_as_buffer*/ 257 Py_TPFLAGS_DEFAULT, /*tp_flags*/ 258 md5type_doc, /*tp_doc*/ 259 0, /*tp_traverse*/ 260 0, /*tp_clear*/ 261 0, /*tp_richcompare*/ 262 0, /*tp_weaklistoffset*/ 263 0, /*tp_iter*/ 264 0, /*tp_iternext*/ 265 md5_methods, /*tp_methods*/ 266 0, /*tp_members*/ 267 md5_getseters, /*tp_getset*/ 255 268 }; 256 269 … … 261 274 MD5_new(PyObject *self, PyObject *args) 262 275 { 263 md5object *md5p; 264 unsigned char *cp = NULL; 265 int len = 0; 266 267 if (!PyArg_ParseTuple(args, "|s#:new", &cp, &len)) 268 return NULL; 269 270 if ((md5p = newmd5object()) == NULL) 271 return NULL; 272 273 if (cp) 274 md5_append(&md5p->md5, cp, len); 275 276 return (PyObject *)md5p; 276 md5object *md5p; 277 Py_buffer view = { 0 }; 278 Py_ssize_t n; 279 unsigned char *buf; 280 281 if (!PyArg_ParseTuple(args, "|s*:new", &view)) 282 return NULL; 283 284 if ((md5p = newmd5object()) == NULL) { 285 PyBuffer_Release(&view); 286 return NULL; 287 } 288 289 n = view.len; 290 buf = (unsigned char *) view.buf; 291 while (n > 0) { 292 Py_ssize_t nbytes; 293 if (n > INT_MAX) 294 nbytes = INT_MAX; 295 else 296 nbytes = n; 297 md5_append(&md5p->md5, buf, 298 Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int)); 299 buf += nbytes; 300 n -= nbytes; 301 } 302 PyBuffer_Release(&view); 303 304 return (PyObject *)md5p; 277 305 } 278 306 … … 287 315 288 316 static PyMethodDef md5_functions[] = { 289 {"new",(PyCFunction)MD5_new, METH_VARARGS, new_doc},290 {NULL, NULL}/* Sentinel */317 {"new", (PyCFunction)MD5_new, METH_VARARGS, new_doc}, 318 {NULL, NULL} /* Sentinel */ 291 319 }; 292 320 … … 297 325 init_md5(void) 298 326 { 299 300 301 302 303 304 305 306 307 308 309 310 311 } 327 PyObject *m, *d; 328 329 Py_TYPE(&MD5type) = &PyType_Type; 330 if (PyType_Ready(&MD5type) < 0) 331 return; 332 m = Py_InitModule3("_md5", md5_functions, module_doc); 333 if (m == NULL) 334 return; 335 d = PyModule_GetDict(m); 336 PyDict_SetItemString(d, "MD5Type", (PyObject *)&MD5type); 337 PyModule_AddIntConstant(m, "digest_size", 16); 338 /* No need to check the error here, the caller will do that */ 339 }
Note:
See TracChangeset
for help on using the changeset viewer.