Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex.  Add some more functionality to the memoryview object.
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
index ad38cfd..252a2ae 100644
--- a/Modules/_hashopenssl.c
+++ b/Modules/_hashopenssl.c
@@ -176,7 +176,7 @@
 EVP_update(EVPobject *self, PyObject *args)
 {
     PyObject *obj;
-    PyBuffer view;
+    Py_buffer view;
 
     if (!PyArg_ParseTuple(args, "O:update", &obj))
         return NULL;
@@ -252,7 +252,7 @@
     static char *kwlist[] = {"name", "string", NULL};
     PyObject *name_obj = NULL;
     PyObject *data_obj = NULL;
-    PyBuffer view;
+    Py_buffer view;
     char *nameStr;
     const EVP_MD *digest;
 
@@ -397,7 +397,7 @@
     static char *kwlist[] = {"name", "string", NULL};
     PyObject *name_obj = NULL;
     PyObject *data_obj = NULL;
-    PyBuffer view = { 0 };
+    Py_buffer view = { 0 };
     PyObject *ret_obj;
     char *name;
     const EVP_MD *digest;
@@ -437,7 +437,7 @@
     EVP_new_ ## NAME (PyObject *self, PyObject *args) \
     { \
         PyObject *data_obj = NULL; \
-        PyBuffer view = { 0 }; \
+        Py_buffer view = { 0 }; \
         PyObject *ret_obj; \
      \
         if (!PyArg_ParseTuple(args, "|O:" #NAME , &data_obj)) { \