--- ext/openssl/ossl_config.c	2007-07-20 02:22:54.000000000 -0400
+++ ext/openssl/ossl_config.c	2009-10-28 15:35:50.688043000 -0400
@@ -422,5 +422,5 @@
 {
     VALUE str, ary = ossl_config_get_sections(self);
-    char *cname = rb_class2name(rb_obj_class(self));
+    const char *cname = rb_class2name(rb_obj_class(self));
 
     str = rb_str_new2("#<");
--- ext/openssl/ossl_x509name.c	2007-07-15 09:24:51.000000000 -0400
+++ ext/openssl/ossl_x509name.c	2009-10-22 17:18:48.000000000 -0400
@@ -136,8 +136,8 @@
 	}
 	else{
-	    unsigned char *p;
+	    const unsigned char *p;
 	    VALUE str = ossl_to_der_if_possible(arg);
 	    StringValue(str);
-	    p = RSTRING_PTR(str);
+	    p = (const unsigned char *)RSTRING_PTR(str);
 	    if(!d2i_X509_NAME((X509_NAME**)&DATA_PTR(self), &p, RSTRING_LEN(str))){
 		ossl_raise(eX509NameError, NULL);
@@ -165,5 +165,5 @@
     GetX509Name(self, name);
     if (!X509_NAME_add_entry_by_txt(name, RSTRING_PTR(oid), NUM2INT(type),
-		RSTRING_PTR(value), RSTRING_LEN(value), -1, 0)) {
+		(unsigned char *)RSTRING_PTR(value), RSTRING_LEN(value), -1, 0)) {
 	ossl_raise(eX509NameError, NULL);
     }
@@ -246,5 +246,5 @@
 	short_name = OBJ_nid2sn(OBJ_ln2nid(long_name));
 	ary = rb_ary_new3(3, rb_str_new2(short_name),
-        		  rb_str_new(entry->value->data, entry->value->length),
+        		  rb_str_new((const char *)entry->value->data, entry->value->length),
         		  INT2FIX(entry->value->type));
 	rb_ary_push(ret, ary);
@@ -320,5 +320,5 @@
 	ossl_raise(eX509NameError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_X509_NAME(name, &p) <= 0)
 	ossl_raise(eX509NameError, NULL);
--- ext/openssl/ossl_pkey_dsa.c	2008-05-29 13:45:47.000000000 -0400
+++ ext/openssl/ossl_pkey_dsa.c	2009-10-28 15:10:09.365560000 -0400
@@ -290,5 +290,5 @@
 	ossl_raise(eDSAError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_func(pkey->pkey.dsa, &p) < 0)
 	ossl_raise(eDSAError, NULL);
@@ -388,5 +388,5 @@
 {
     EVP_PKEY *pkey;
-    int buf_len;
+    unsigned int buf_len;
     VALUE str;
 
@@ -397,5 +397,6 @@
     }
     str = rb_str_new(0, ossl_dsa_buf_size(pkey));
-    if (!DSA_sign(0, RSTRING_PTR(data), RSTRING_LEN(data), RSTRING_PTR(str),
+    if (!DSA_sign(0, (unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data),
+		  (unsigned char *)RSTRING_PTR(str),
 		  &buf_len, pkey->pkey.dsa)) { /* type is ignored (0) */
 	ossl_raise(eDSAError, NULL);
@@ -421,6 +422,8 @@
     StringValue(sig);
     /* type is ignored (0) */
-    ret = DSA_verify(0, RSTRING_PTR(digest), RSTRING_LEN(digest),
-		     RSTRING_PTR(sig), RSTRING_LEN(sig), pkey->pkey.dsa);
+    ret = DSA_verify(0,
+		     (unsigned char *)RSTRING_PTR(digest), RSTRING_LEN(digest),
+		     (unsigned char *)RSTRING_PTR(sig), RSTRING_LEN(sig),
+		     pkey->pkey.dsa);
     if (ret < 0) {
 	ossl_raise(eDSAError, NULL);
--- ext/openssl/ossl_pkey_rsa.c	2008-02-26 02:11:23.000000000 -0500
+++ ext/openssl/ossl_pkey_rsa.c	2009-10-28 15:14:06.041120000 -0400
@@ -289,5 +289,5 @@
 	ossl_raise(eRSAError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_func(pkey->pkey.rsa, &p) < 0)
 	ossl_raise(eRSAError, NULL);
@@ -316,7 +316,8 @@
     StringValue(buffer);
     str = rb_str_new(0, ossl_rsa_buf_size(pkey));
-    buf_len = RSA_public_encrypt(RSTRING_LEN(buffer), RSTRING_PTR(buffer),
-				 RSTRING_PTR(str), pkey->pkey.rsa,
-				 pad);
+    buf_len = RSA_public_encrypt(RSTRING_LEN(buffer),
+				 (unsigned char *)RSTRING_PTR(buffer),
+				 (unsigned char *)RSTRING_PTR(str),
+				 pkey->pkey.rsa, pad);
     if (buf_len < 0) ossl_raise(eRSAError, NULL);
     rb_str_set_len(str, buf_len);
@@ -342,7 +343,8 @@
     StringValue(buffer);
     str = rb_str_new(0, ossl_rsa_buf_size(pkey));
-    buf_len = RSA_public_decrypt(RSTRING_LEN(buffer), RSTRING_PTR(buffer),
-				 RSTRING_PTR(str), pkey->pkey.rsa,
-				 pad);
+    buf_len = RSA_public_decrypt(RSTRING_LEN(buffer),
+				 (unsigned char *)RSTRING_PTR(buffer),
+				 (unsigned char *)RSTRING_PTR(str),
+				 pkey->pkey.rsa, pad);
     if (buf_len < 0) ossl_raise(eRSAError, NULL);
     rb_str_set_len(str, buf_len);
@@ -371,7 +373,8 @@
     StringValue(buffer);
     str = rb_str_new(0, ossl_rsa_buf_size(pkey));
-    buf_len = RSA_private_encrypt(RSTRING_LEN(buffer), RSTRING_PTR(buffer),
-				  RSTRING_PTR(str), pkey->pkey.rsa,
-				  pad);
+    buf_len = RSA_private_encrypt(RSTRING_LEN(buffer),
+				  (unsigned char *)RSTRING_PTR(buffer),
+				  (unsigned char *)RSTRING_PTR(str),
+				  pkey->pkey.rsa, pad);
     if (buf_len < 0) ossl_raise(eRSAError, NULL);
     rb_str_set_len(str, buf_len);
@@ -401,7 +404,8 @@
     StringValue(buffer);
     str = rb_str_new(0, ossl_rsa_buf_size(pkey));
-    buf_len = RSA_private_decrypt(RSTRING_LEN(buffer), RSTRING_PTR(buffer),
-				  RSTRING_PTR(str), pkey->pkey.rsa,
-				  pad);
+    buf_len = RSA_private_decrypt(RSTRING_LEN(buffer),
+				  (unsigned char *)RSTRING_PTR(buffer),
+				  (unsigned char *)RSTRING_PTR(str),
+				  pkey->pkey.rsa, pad);
     if (buf_len < 0) ossl_raise(eRSAError, NULL);
     rb_str_set_len(str, buf_len);
--- ext/openssl/ossl_engine.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_engine.c	2009-10-28 15:17:24.226563000 -0400
@@ -327,5 +327,5 @@
 {
     VALUE str;
-    char *cname = rb_class2name(rb_obj_class(self));
+    const char *cname = rb_class2name(rb_obj_class(self));
     
     str = rb_str_new2("#<");
--- ext/openssl/openssl_missing.h	2008-08-04 00:44:17.000000000 -0400
+++ ext/openssl/openssl_missing.h	2009-10-28 15:40:22.110416000 -0400
@@ -26,5 +26,5 @@
 #if !defined(PEM_read_bio_DSAPublicKey)
 # define PEM_read_bio_DSAPublicKey(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \
-        (char *(*)())d2i_DSAPublicKey,PEM_STRING_DSA_PUBLIC,bp,(char **)x,cb,u)
+        (void * (*)())d2i_DSAPublicKey,PEM_STRING_DSA_PUBLIC,bp,x,cb,u)
 #endif
 
@@ -43,20 +43,20 @@
 #if !defined(DSAPublicKey_dup)
 # define DSAPublicKey_dup(dsa) (DSA *)ASN1_dup((int (*)())i2d_DSAPublicKey, \
-	(char *(*)())d2i_DSAPublicKey,(char *)dsa)
+	(void *(*)())d2i_DSAPublicKey,(char *)dsa)
 #endif
 
 #if !defined(X509_REVOKED_dup)
 # define X509_REVOKED_dup(rev) (X509_REVOKED *)ASN1_dup((int (*)())i2d_X509_REVOKED, \
-	(char *(*)())d2i_X509_REVOKED, (char *)rev)
+	(void *(*)())d2i_X509_REVOKED, (char *)rev)
 #endif
 
 #if !defined(PKCS7_SIGNER_INFO_dup)
 #  define PKCS7_SIGNER_INFO_dup(si) (PKCS7_SIGNER_INFO *)ASN1_dup((int (*)())i2d_PKCS7_SIGNER_INFO, \
-	(char *(*)())d2i_PKCS7_SIGNER_INFO, (char *)si)
+	(void *(*)())d2i_PKCS7_SIGNER_INFO, (char *)si)
 #endif
 
 #if !defined(PKCS7_RECIP_INFO_dup)
 #  define PKCS7_RECIP_INFO_dup(ri) (PKCS7_RECIP_INFO *)ASN1_dup((int (*)())i2d_PKCS7_RECIP_INFO, \
-	(char *(*)())d2i_PKCS7_RECIP_INFO, (char *)ri)
+	(void *(*)())d2i_PKCS7_RECIP_INFO, (char *)ri)
 #endif
 
--- ext/openssl/ossl_pkcs5.c	2008-05-19 05:30:25.000000000 -0400
+++ ext/openssl/ossl_pkcs5.c	2009-10-28 15:38:28.742604000 -0400
@@ -73,5 +73,8 @@
     str = rb_str_new(0, len);
 
-    if (PKCS5_PBKDF2_HMAC_SHA1(RSTRING_PTR(pass), RSTRING_LEN(pass), RSTRING_PTR(salt), RSTRING_LEN(salt), NUM2INT(iter), len, RSTRING_PTR(str)) != 1)
+    if (PKCS5_PBKDF2_HMAC_SHA1(RSTRING_PTR(pass), RSTRING_LEN(pass),
+			       (unsigned char *)RSTRING_PTR(salt), RSTRING_LEN(salt),
+			       NUM2INT(iter), len,
+			       (unsigned char *)RSTRING_PTR(str)) != 1)
         ossl_raise(ePKCS5, "PKCS5_PBKDF2_HMAC_SHA1");
 
--- ext/openssl/ossl_pkey_dh.c	2008-05-29 13:45:47.000000000 -0400
+++ ext/openssl/ossl_pkey_dh.c	2009-10-28 15:32:13.649500000 -0400
@@ -255,5 +255,5 @@
 	ossl_raise(eDHError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_DHparams(pkey->pkey.dh, &p) < 0)
 	ossl_raise(eDHError, NULL);
@@ -408,5 +408,5 @@
     len = DH_size(dh);
     str = rb_str_new(0, len);
-    if ((len = DH_compute_key(RSTRING_PTR(str), pub_key, dh)) < 0) {
+    if ((len = DH_compute_key((unsigned char *)RSTRING_PTR(str), pub_key, dh)) < 0) {
 	ossl_raise(eDHError, NULL);
     }
--- ext/openssl/ossl_pkcs7.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_pkcs7.c	2009-10-28 15:40:37.007223000 -0400
@@ -779,5 +779,5 @@
 	ossl_raise(ePKCS7Error, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_PKCS7(pkcs7, &p) <= 0)
 	ossl_raise(ePKCS7Error, NULL);
--- ext/openssl/ossl_bn.c	2008-05-29 13:45:47.000000000 -0400
+++ ext/openssl/ossl_bn.c	2009-10-28 15:42:48.430512000 -0400
@@ -132,10 +132,10 @@
     switch (base) {
     case 0:
-	if (!BN_mpi2bn(RSTRING_PTR(str), RSTRING_LEN(str), bn)) {
+	if (!BN_mpi2bn((unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str), bn)) {
 	    ossl_raise(eBNError, NULL);
 	}
 	break;
     case 2:
-	if (!BN_bin2bn(RSTRING_PTR(str), RSTRING_LEN(str), bn)) {
+	if (!BN_bin2bn((unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str), bn)) {
 	    ossl_raise(eBNError, NULL);
 	}
@@ -186,5 +186,5 @@
 	len = BN_bn2mpi(bn, NULL);
         str = rb_str_new(0, len);
-	if (BN_bn2mpi(bn, RSTRING_PTR(str)) != len)
+	if (BN_bn2mpi(bn, (unsigned char *)RSTRING_PTR(str)) != len)
 	    ossl_raise(eBNError, NULL);
 	break;
@@ -192,5 +192,5 @@
 	len = BN_num_bytes(bn);
         str = rb_str_new(0, len);
-	if (BN_bn2bin(bn, RSTRING_PTR(str)) != len)
+	if (BN_bn2bin(bn, (unsigned char *)RSTRING_PTR(str)) != len)
 	    ossl_raise(eBNError, NULL);
 	break;
--- ext/openssl/ossl_pkcs12.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_pkcs12.c	2009-10-28 15:47:19.120495000 -0400
@@ -182,5 +182,5 @@
 	ossl_raise(ePKCS12Error, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_PKCS12(p12, &p) <= 0)
 	ossl_raise(ePKCS12Error, NULL);
--- ext/openssl/ossl_cipher.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_cipher.c	2009-10-28 15:55:45.249467000 -0400
@@ -187,5 +187,5 @@
 	 * keeping this behaviour for backward compatibility.
 	 */
-	char *cname  = rb_class2name(rb_obj_class(self));
+	const char *cname  = rb_class2name(rb_obj_class(self));
 	rb_warn("argumtents for %s#encrypt and %s#decrypt were deprecated; "
                 "use %s#pkcs5_keyivgen to derive key and IV",
@@ -203,5 +203,6 @@
 	}
 	EVP_BytesToKey(EVP_CIPHER_CTX_cipher(ctx), EVP_md5(), iv,
-		       RSTRING_PTR(pass), RSTRING_LEN(pass), 1, key, NULL);
+		       (unsigned char *)RSTRING_PTR(pass), RSTRING_LEN(pass),
+		       1, key, NULL);
 	p_key = key;
 	p_iv = iv;
@@ -280,5 +281,5 @@
 	if(RSTRING_LEN(vsalt) != PKCS5_SALT_LEN)
 	    rb_raise(eCipherError, "salt must be an 8-octet string");
-	salt = RSTRING_PTR(vsalt);
+	salt = (unsigned char *)RSTRING_PTR(vsalt);
     }
     iter = NIL_P(viter) ? 2048 : NUM2INT(viter);
@@ -286,5 +287,6 @@
     GetCipher(self, ctx);
     EVP_BytesToKey(EVP_CIPHER_CTX_cipher(ctx), digest, salt,
-		   RSTRING_PTR(vpass), RSTRING_LEN(vpass), iter, key, iv); 
+		   (unsigned char *)RSTRING_PTR(vpass), RSTRING_LEN(vpass),
+		   iter, key, iv); 
     if (EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, -1) != 1)
 	ossl_raise(eCipherError, NULL);
@@ -308,5 +310,5 @@
 ossl_cipher_update_deprecated(VALUE self, VALUE data)
 {
-    char *cname;
+    const char *cname;
 
     cname = rb_class2name(rb_obj_class(self));
@@ -328,5 +330,5 @@
 {
     EVP_CIPHER_CTX *ctx;
-    char *in;
+    unsigned char *in;
     int in_len, out_len;
     VALUE data, str;
@@ -335,5 +337,5 @@
 
     StringValue(data);
-    in = RSTRING_PTR(data);
+    in = (unsigned char *)RSTRING_PTR(data);
     if ((in_len = RSTRING_LEN(data)) == 0)
         rb_raise(rb_eArgError, "data must not be empty");
@@ -348,5 +350,6 @@
     }
 
-    if (!EVP_CipherUpdate(ctx, RSTRING_PTR(str), &out_len, in, in_len))
+    if (!EVP_CipherUpdate(ctx, (unsigned char *)RSTRING_PTR(str), &out_len,
+			  in, in_len))
 	ossl_raise(eCipherError, NULL);
     assert(out_len < RSTRING_LEN(str));
@@ -373,5 +376,5 @@
     GetCipher(self, ctx);
     str = rb_str_new(0, EVP_CIPHER_CTX_block_size(ctx));
-    if (!EVP_CipherFinal_ex(ctx, RSTRING_PTR(str), &out_len))
+    if (!EVP_CipherFinal_ex(ctx, (unsigned char *)RSTRING_PTR(str), &out_len))
 	ossl_raise(eCipherError, NULL);
     assert(out_len <= RSTRING_LEN(str));
@@ -416,5 +419,6 @@
         ossl_raise(eCipherError, "key length too short");
 
-    if (EVP_CipherInit_ex(ctx, NULL, NULL, RSTRING_PTR(key), NULL, -1) != 1)
+    if (EVP_CipherInit_ex(ctx, NULL, NULL, (unsigned char *)RSTRING_PTR(key),
+			  NULL, -1) != 1)
         ossl_raise(eCipherError, NULL);
 
@@ -441,5 +445,6 @@
         ossl_raise(eCipherError, "iv length too short");
 
-    if (EVP_CipherInit_ex(ctx, NULL, NULL, NULL, RSTRING_PTR(iv), -1) != 1)
+    if (EVP_CipherInit_ex(ctx, NULL, NULL, NULL,
+			  (unsigned char *)RSTRING_PTR(iv), -1) != 1)
 	ossl_raise(eCipherError, NULL);
 
--- ext/openssl/ossl_asn1.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_asn1.c	2009-10-28 16:17:54.309258000 -0400
@@ -10,4 +10,5 @@
  */
 #include "ossl.h"
+#include <inttypes.h>
 
 #if defined(HAVE_SYS_TIME_H)
@@ -24,5 +25,5 @@
  */
 VALUE
-asn1time_to_time(ASN1_TIME *time)
+asn1time_to_time(const ASN1_TIME *time)
 {
     struct tm tm;
@@ -34,5 +35,5 @@
     switch (time->type) {
     case V_ASN1_UTCTIME:
-	if (sscanf(time->data, "%2d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon,
+	if (sscanf((char *)time->data, "%2d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon,
     		&tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
 	    ossl_raise(rb_eTypeError, "bad UTCTIME format");
@@ -45,5 +46,5 @@
 	break;
     case V_ASN1_GENERALIZEDTIME:
-	if (sscanf(time->data, "%4d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon,
+	if (sscanf((char *)time->data, "%4d%2d%2d%2d%2d%2dZ", &tm.tm_year, &tm.tm_mon,
     		&tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
 	    ossl_raise(rb_eTypeError, "bad GENERALIZEDTIME format" );
@@ -79,7 +80,7 @@
  */
 VALUE
-asn1str_to_str(ASN1_STRING *str)
+asn1str_to_str(const ASN1_STRING *str)
 {
-    return rb_str_new(str->data, str->length);
+    return rb_str_new((const char *)str->data, str->length);
 }
 
@@ -215,5 +216,5 @@
     if(!(bstr = ASN1_BIT_STRING_new()))
 	ossl_raise(eASN1Error, NULL);
-    ASN1_BIT_STRING_set(bstr, RSTRING_PTR(obj), RSTRING_LEN(obj));
+    ASN1_BIT_STRING_set(bstr, (unsigned char *)RSTRING_PTR(obj), RSTRING_LEN(obj));
     bstr->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); /* clear */
     bstr->flags |= ASN1_STRING_FLAG_BITS_LEFT|(unused_bits&0x07);
@@ -305,11 +306,9 @@
  */
 static VALUE
-decode_bool(unsigned char* der, int length)
+decode_bool(const unsigned char* der, int length)
 {
     int bool;
-    unsigned char *p;
 
-    p = der;
-    if((bool = d2i_ASN1_BOOLEAN(NULL, &p, length)) < 0)
+    if((bool = d2i_ASN1_BOOLEAN(NULL, &der, length)) < 0)
 	ossl_raise(eASN1Error, NULL);
 
@@ -318,13 +317,11 @@
 
 static VALUE
-decode_int(unsigned char* der, int length)
+decode_int(const unsigned char* der, int length)
 {
     ASN1_INTEGER *ai;
-    unsigned char *p;
     VALUE ret; 
     int status = 0;
 
-    p = der;
-    if(!(ai = d2i_ASN1_INTEGER(NULL, &p, length)))
+    if(!(ai = d2i_ASN1_INTEGER(NULL, &der, length)))
 	ossl_raise(eASN1Error, NULL);
     ret = rb_protect((VALUE(*)_((VALUE)))asn1integer_to_num,
@@ -337,13 +334,12 @@
 
 static VALUE
-decode_bstr(unsigned char* der, int length, long *unused_bits)
+decode_bstr(const unsigned char* der, int length, long *unused_bits)
 {
     ASN1_BIT_STRING *bstr;
-    unsigned char *p, *buf;
+    char *buf;
     long len;
     VALUE ret;
 
-    p = der;
-    if(!(bstr = d2i_ASN1_BIT_STRING(NULL, &p, length)))
+    if(!(bstr = d2i_ASN1_BIT_STRING(NULL, &der, length)))
 	ossl_raise(eASN1Error, NULL);
     len = bstr->length;
@@ -363,13 +359,11 @@
 
 static VALUE
-decode_enum(unsigned char* der, int length)
+decode_enum(const unsigned char* der, int length)
 {
     ASN1_ENUMERATED *ai;
-    unsigned char *p;
     VALUE ret; 
     int status = 0;
 
-    p = der;
-    if(!(ai = d2i_ASN1_ENUMERATED(NULL, &p, length)))
+    if(!(ai = d2i_ASN1_ENUMERATED(NULL, &der, length)))
 	ossl_raise(eASN1Error, NULL);
     ret = rb_protect((VALUE(*)_((VALUE)))asn1integer_to_num,
@@ -382,11 +376,9 @@
 
 static VALUE
-decode_null(unsigned char* der, int length)
+decode_null(const unsigned char* der, int length)
 {
     ASN1_NULL *null;
-    unsigned char *p;
 
-    p = der;
-    if(!(null = d2i_ASN1_NULL(NULL, &p, length)))
+    if(!(null = d2i_ASN1_NULL(NULL, &der, length)))
 	ossl_raise(eASN1Error, NULL);
     ASN1_NULL_free(null);
@@ -396,14 +388,12 @@
 
 static VALUE
-decode_obj(unsigned char* der, int length)
+decode_obj(const unsigned char* der, int length)
 {
     ASN1_OBJECT *obj;
-    unsigned char *p;
     VALUE ret;
     int nid;
     BIO *bio;
 
-    p = der;
-    if(!(obj = d2i_ASN1_OBJECT(NULL, &p, length)))
+    if(!(obj = d2i_ASN1_OBJECT(NULL, &der, length)))
 	ossl_raise(eASN1Error, NULL);
     if((nid = OBJ_obj2nid(obj)) != NID_undef){
@@ -425,5 +415,5 @@
 
 static VALUE
-decode_time(unsigned char* der, int length)
+decode_time(const unsigned char* der, int length)
 {
     ASN1_TIME *time;
@@ -432,6 +422,5 @@
     int status = 0;
 
-    p = der;
-    if(!(time = d2i_ASN1_TIME(NULL, &p, length)))
+    if(!(time = d2i_ASN1_TIME(NULL, &der, length)))
 	ossl_raise(eASN1Error, NULL);
     ret = rb_protect((VALUE(*)_((VALUE)))asn1time_to_time,
@@ -501,5 +490,5 @@
     switch(tag){
     case V_ASN1_BOOLEAN:
-	ptr = (void*)obj_to_asn1bool(value);
+	ptr = (void*)(intptr_t)obj_to_asn1bool(value);
 	free_func = NULL;
 	break;
@@ -703,5 +692,5 @@
 	ossl_raise(eASN1Error, NULL);
     der = rb_str_new(0, length);
-    p = RSTRING_PTR(der);
+    p = (unsigned char *)RSTRING_PTR(der);
     ASN1_put_object(&p, is_cons, RSTRING_LEN(value), tag, tag_class);
     memcpy(p, RSTRING_PTR(value), RSTRING_LEN(value));
@@ -713,8 +702,8 @@
 
 static VALUE
-ossl_asn1_decode0(unsigned char **pp, long length, long *offset, long depth,
+ossl_asn1_decode0(const unsigned char **pp, long length, long *offset, long depth,
 		  int once, int yield)
 {
-    unsigned char *start, *p;
+    const unsigned char *start, *p;
     long len, off = *offset;
     int hlen, tag, tc, j;
@@ -760,5 +749,5 @@
 	}
 	else{
-	    value = rb_str_new(p, len);
+	    value = rb_str_new((const char *)p, len);
 	    p += len;
 	    off += len;
@@ -819,5 +808,5 @@
 ossl_asn1_traverse(VALUE self, VALUE obj)
 {
-    unsigned char *p;
+    const unsigned char *p;
     long offset = 0;
     volatile VALUE tmp;
@@ -825,5 +814,5 @@
     obj = ossl_to_der_if_possible(obj);
     tmp = rb_str_new4(StringValue(obj));
-    p = RSTRING_PTR(tmp);
+    p = (const unsigned char *)RSTRING_PTR(tmp);
     ossl_asn1_decode0(&p, RSTRING_LEN(tmp), &offset, 0, 0, 1);
 
@@ -835,5 +824,5 @@
 {
     VALUE ret, ary;
-    unsigned char *p;
+    const unsigned char *p;
     long offset = 0;
     volatile VALUE tmp;
@@ -841,5 +830,5 @@
     obj = ossl_to_der_if_possible(obj);
     tmp = rb_str_new4(StringValue(obj));
-    p = RSTRING_PTR(tmp);
+    p = (const unsigned char *)RSTRING_PTR(tmp);
     ary = ossl_asn1_decode0(&p, RSTRING_LEN(tmp), &offset, 0, 1, 0);
     ret = rb_ary_entry(ary, 0);
@@ -852,5 +841,5 @@
 {
     VALUE ret;
-    unsigned char *p;
+    const unsigned char *p;
     long offset = 0;
     volatile VALUE tmp;
@@ -858,5 +847,5 @@
     obj = ossl_to_der_if_possible(obj);
     tmp = rb_str_new4(StringValue(obj));
-    p = RSTRING_PTR(tmp);
+    p = (const unsigned char *)RSTRING_PTR(tmp);
     ret = ossl_asn1_decode0(&p, RSTRING_LEN(tmp), &offset, 0, 0, 0);
 
@@ -955,5 +944,5 @@
     reallen = p - buf;
     assert(reallen <= length);
-    str = ossl_buf2str(buf, reallen); /* buf will be free in ossl_buf2str */
+    str = ossl_buf2str((char *)buf, reallen); /* buf will be free in ossl_buf2str */
 
     return str;
@@ -977,5 +966,5 @@
     length = ASN1_object_size(1, seq_len, tn);
     str = rb_str_new(0, length);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(tc == V_ASN1_UNIVERSAL)
 	ASN1_put_object(&p, 1, RSTRING_LEN(value), tn, tc);
--- ext/openssl/ossl_asn1.h	2007-02-12 18:01:19.000000000 -0500
+++ ext/openssl/ossl_asn1.h	2009-10-28 16:03:56.531709000 -0400
@@ -15,5 +15,5 @@
  * ASN1_DATE conversions
  */
-VALUE asn1time_to_time(ASN1_TIME *);
+VALUE asn1time_to_time(const ASN1_TIME *);
 time_t time_to_time_t(VALUE);
 
@@ -21,5 +21,5 @@
  * ASN1_STRING conversions
  */
-VALUE asn1str_to_str(ASN1_STRING *);
+VALUE asn1str_to_str(const ASN1_STRING *);
 
 /*
--- ext/openssl/ossl_ssl.c	2008-06-06 04:05:24.000000000 -0400
+++ ext/openssl/ossl_ssl.c	2009-10-28 16:25:56.740972000 -0400
@@ -326,5 +326,5 @@
     ary = rb_ary_new2(2);
     rb_ary_push(ary, ssl_obj);
-    rb_ary_push(ary, rb_str_new(buf, len));
+    rb_ary_push(ary, rb_str_new((char *)buf, len));
 
     ret_obj = rb_protect((VALUE(*)_((VALUE)))ossl_call_session_get_cb, ary, &state);
@@ -564,5 +564,5 @@
     if (!NIL_P(val)){
 	StringValue(val);
-	if (!SSL_CTX_set_session_id_context(ctx, RSTRING_PTR(val),
+	if (!SSL_CTX_set_session_id_context(ctx, (const unsigned char *)RSTRING_PTR(val),
 					    RSTRING_LEN(val))){
 	    ossl_raise(eSSLError, "SSL_CTX_set_session_id_context:");
--- ext/openssl/ossl_hmac.c	2008-05-18 23:00:52.000000000 -0400
+++ ext/openssl/ossl_hmac.c	2009-10-28 16:35:59.801314000 -0400
@@ -104,5 +104,5 @@
     StringValue(data);
     GetHMAC(self, ctx);
-    HMAC_Update(ctx, RSTRING_PTR(data), RSTRING_LEN(data));
+    HMAC_Update(ctx, (unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data));
 
     return self;
@@ -110,5 +110,5 @@
 
 static void
-hmac_final(HMAC_CTX *ctx, char **buf, int *buf_len)
+hmac_final(HMAC_CTX *ctx, unsigned char **buf, unsigned int *buf_len)
 {
     HMAC_CTX final;
@@ -133,11 +133,11 @@
 {
     HMAC_CTX *ctx;
-    char *buf;
-    int buf_len;
+    unsigned char *buf;
+    unsigned int buf_len;
     VALUE digest;
 	
     GetHMAC(self, ctx);
     hmac_final(ctx, &buf, &buf_len);
-    digest = ossl_buf2str(buf, buf_len);
+    digest = ossl_buf2str((char *)buf, buf_len);
     
     return digest;
@@ -153,6 +153,7 @@
 {
     HMAC_CTX *ctx;
-    char *buf, *hexbuf;
-    int buf_len;
+    unsigned char *buf;
+    char *hexbuf;
+    unsigned int buf_len;
     VALUE hexdigest;
 	
@@ -193,13 +194,14 @@
 ossl_hmac_s_digest(VALUE klass, VALUE digest, VALUE key, VALUE data)
 {
-    char *buf;
-    int buf_len;
+    unsigned char *buf;
+    unsigned int buf_len;
 	
     StringValue(key);
     StringValue(data);
     buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
-	       RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
+	       (unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data), NULL,
+	       &buf_len);
 
-    return rb_str_new(buf, buf_len);
+    return rb_str_new((char *)buf, buf_len);
 }
 
@@ -212,6 +214,7 @@
 ossl_hmac_s_hexdigest(VALUE klass, VALUE digest, VALUE key, VALUE data)
 {
-    char *buf, *hexbuf;
-    int buf_len;
+    unsigned char *buf;
+    char *hexbuf;
+    unsigned int buf_len;
     VALUE hexdigest;
 
@@ -220,5 +223,6 @@
 	
     buf = HMAC(GetDigestPtr(digest), RSTRING_PTR(key), RSTRING_LEN(key),
-	       RSTRING_PTR(data), RSTRING_LEN(data), NULL, &buf_len);
+	       (unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data),
+	       NULL, &buf_len);
     if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
 	ossl_raise(eHMACError, "Cannot convert buf to hexbuf");
--- ext/openssl/ossl_ns_spki.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_ns_spki.c	2009-10-28 16:51:14.851960000 -0400
@@ -57,5 +57,5 @@
     NETSCAPE_SPKI *spki;
     VALUE buffer;
-    unsigned char *p;
+    const unsigned char *p;
 	
     if (rb_scan_args(argc, argv, "01", &buffer) == 0) {
@@ -64,5 +64,5 @@
     StringValue(buffer);
     if (!(spki = NETSCAPE_SPKI_b64_decode(RSTRING_PTR(buffer), -1))) {
-	p = RSTRING_PTR(buffer);
+	p = (const unsigned char *)RSTRING_PTR(buffer);
 	if (!(spki = d2i_NETSCAPE_SPKI(NULL, &p, RSTRING_LEN(buffer)))) {
 	    ossl_raise(eSPKIError, NULL);
@@ -88,5 +88,5 @@
         ossl_raise(eX509CertError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if (i2d_NETSCAPE_SPKI(spki, &p) <= 0)
         ossl_raise(eX509CertError, NULL);
@@ -173,5 +173,5 @@
     }
 
-    return rb_str_new(spki->spkac->challenge->data,
+    return rb_str_new((char *)spki->spkac->challenge->data,
 		      spki->spkac->challenge->length);
 }
--- ext/openssl/ossl.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl.c	2009-10-28 16:33:38.987711000 -0400
@@ -16,5 +16,5 @@
  */
 int
-string2hex(char *buf, int buf_len, char **hexbuf, int *hexbuf_len)
+string2hex(const unsigned char *buf, int buf_len, char **hexbuf, int *hexbuf_len)
 {
     static const char hex[]="0123456789abcdef";
--- ext/openssl/ossl.h	2008-06-29 04:16:02.000000000 -0400
+++ ext/openssl/ossl.h	2009-10-28 16:33:22.832492000 -0400
@@ -111,5 +111,5 @@
  * String to HEXString conversion
  */
-int string2hex(char *, int, char **, int *);
+int string2hex(const unsigned char *, int, char **, int *);
 
 /*
--- ext/openssl/ossl_x509ext.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_x509ext.c	2009-10-28 16:37:33.480853000 -0400
@@ -274,5 +274,5 @@
 {
     VALUE oid, value, critical;
-    unsigned char *p;
+    const unsigned char *p;
     X509_EXTENSION *ext;
 
@@ -281,5 +281,5 @@
 	oid = ossl_to_der_if_possible(oid);
 	StringValue(oid);
-	p  = RSTRING_PTR(oid);
+	p  = (const unsigned char *)RSTRING_PTR(oid);
 	if(!d2i_X509_EXTENSION((X509_EXTENSION**)&DATA_PTR(self),
 			       &p, RSTRING_LEN(oid)))
@@ -410,5 +410,5 @@
 	ossl_raise(eX509ExtError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_X509_EXTENSION(ext, &p) < 0)
 	ossl_raise(eX509ExtError, NULL);
--- ext/openssl/ossl_x509req.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_x509req.c	2009-10-28 16:38:14.039696000 -0400
@@ -172,5 +172,5 @@
 	ossl_raise(eX509CertError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if (i2d_X509_REQ(req, &p) <= 0)
 	ossl_raise(eX509ReqError, NULL);
--- ext/openssl/ossl_ocsp.c	2009-03-09 07:59:27.000000000 -0400
+++ ext/openssl/ossl_ocsp.c	2009-10-28 16:43:22.015316000 -0400
@@ -104,5 +104,5 @@
 {
     VALUE arg;
-    unsigned char *p;
+    const unsigned char *p;
 
     rb_scan_args(argc, argv, "01", &arg);
@@ -110,5 +110,5 @@
 	arg = ossl_to_der_if_possible(arg);
 	StringValue(arg);
-	p = (unsigned char*)RSTRING_PTR(arg);
+	p = (const unsigned char*)RSTRING_PTR(arg);
 	if(!d2i_OCSP_REQUEST((OCSP_REQUEST**)&DATA_PTR(self), &p,
 			     RSTRING_LEN(arg))){
@@ -135,5 +135,6 @@
 	StringValue(val);
 	GetOCSPReq(self, req);
-	ret = OCSP_request_add1_nonce(req, RSTRING_PTR(val), RSTRING_LEN(val));
+	ret = OCSP_request_add1_nonce(req, (unsigned char *)RSTRING_PTR(val),
+				      RSTRING_LEN(val));
     }
     if(!ret) ossl_raise(eOCSPError, NULL);
@@ -266,5 +267,5 @@
 	ossl_raise(eOCSPError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_OCSP_REQUEST(req, &p) <= 0)
 	ossl_raise(eOCSPError, NULL);
@@ -311,5 +312,5 @@
 {
     VALUE arg;
-    unsigned char *p;
+    const unsigned char *p;
 
     rb_scan_args(argc, argv, "01", &arg);
@@ -317,5 +318,5 @@
 	arg = ossl_to_der_if_possible(arg);
 	StringValue(arg);
-	p = RSTRING_PTR(arg);
+	p = (const unsigned char *)RSTRING_PTR(arg);
 	if(!d2i_OCSP_RESPONSE((OCSP_RESPONSE**)&DATA_PTR(self), &p,
 			      RSTRING_LEN(arg))){
@@ -378,5 +379,5 @@
 	ossl_raise(eOCSPError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_OCSP_RESPONSE(res, NULL) <= 0)
 	ossl_raise(eOCSPError, NULL);
@@ -437,5 +438,6 @@
 	StringValue(val);
 	GetOCSPBasicRes(self, bs);
-	ret = OCSP_basic_add1_nonce(bs, RSTRING_PTR(val), RSTRING_LEN(val));
+	ret = OCSP_basic_add1_nonce(bs, (unsigned char *)RSTRING_PTR(val),
+				    RSTRING_LEN(val));
     }
     if(!ret) ossl_raise(eOCSPError, NULL);
--- ext/openssl/ossl_pkey.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_pkey.c	2009-10-28 16:46:05.822088000 -0400
@@ -165,5 +165,5 @@
     EVP_PKEY *pkey;
     EVP_MD_CTX ctx;
-    int buf_len;
+    unsigned int buf_len;
     VALUE str;
 
@@ -176,5 +176,5 @@
     EVP_SignUpdate(&ctx, RSTRING_PTR(data), RSTRING_LEN(data));
     str = rb_str_new(0, EVP_PKEY_size(pkey)+16);
-    if (!EVP_SignFinal(&ctx, RSTRING_PTR(str), &buf_len, pkey))
+    if (!EVP_SignFinal(&ctx, (unsigned char *)RSTRING_PTR(str), &buf_len, pkey))
 	ossl_raise(ePKeyError, NULL);
     assert(buf_len <= RSTRING_LEN(str));
@@ -195,5 +195,6 @@
     StringValue(data);
     EVP_VerifyUpdate(&ctx, RSTRING_PTR(data), RSTRING_LEN(data));
-    switch (EVP_VerifyFinal(&ctx, RSTRING_PTR(sig), RSTRING_LEN(sig), pkey)) {
+    switch (EVP_VerifyFinal(&ctx, (unsigned char *)RSTRING_PTR(sig),
+			    RSTRING_LEN(sig), pkey)) {
     case 0:
 	return Qfalse;
--- ext/openssl/ossl_rand.c	2008-05-29 14:15:50.000000000 -0400
+++ ext/openssl/ossl_rand.c	2009-10-28 16:47:12.526848000 -0400
@@ -100,5 +100,5 @@
 
     str = rb_str_new(0, n);
-    if (!RAND_bytes(RSTRING_PTR(str), n)) {
+    if (!RAND_bytes((unsigned char *)RSTRING_PTR(str), n)) {
 	ossl_raise(eRandomError, NULL);
     }
@@ -119,5 +119,5 @@
 
     str = rb_str_new(0, n);
-    if (!RAND_pseudo_bytes(RSTRING_PTR(str), n)) {
+    if (!RAND_pseudo_bytes((unsigned char *)RSTRING_PTR(str), n)) {
 	ossl_raise(eRandomError, NULL);
     }
--- ext/openssl/ossl_x509attr.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_x509attr.c	2009-10-28 16:48:46.928306000 -0400
@@ -94,5 +94,5 @@
     VALUE oid, value;
     X509_ATTRIBUTE *attr;
-    unsigned char *p;
+    const unsigned char *p;
 
     GetX509Attr(self, attr);
@@ -100,5 +100,5 @@
 	oid = ossl_to_der_if_possible(oid);
 	StringValue(oid);
-	p = RSTRING_PTR(oid);
+	p = (const unsigned char *)RSTRING_PTR(oid);
 	if(!d2i_X509_ATTRIBUTE((X509_ATTRIBUTE**)&DATA_PTR(self),
 			       &p, RSTRING_LEN(oid))){
@@ -213,5 +213,5 @@
 	length = i2d_ASN1_TYPE(attr->value.single, NULL);
 	str = rb_str_new(0, length);
-	p = RSTRING_PTR(str);
+	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_TYPE(attr->value.single, &p);
 	ossl_str_adjust(str, p);
@@ -221,5 +221,5 @@
 			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
 	str = rb_str_new(0, length);
-	p = RSTRING_PTR(str);
+	p = (unsigned char *)RSTRING_PTR(str);
 	i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p,
 			i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);
@@ -247,5 +247,5 @@
 	ossl_raise(eX509AttrError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if(i2d_X509_ATTRIBUTE(attr, &p) <= 0)
 	ossl_raise(eX509AttrError, NULL);
--- ext/openssl/ossl_x509cert.c	2007-06-08 11:02:04.000000000 -0400
+++ ext/openssl/ossl_x509cert.c	2009-10-28 16:49:32.574297000 -0400
@@ -191,5 +191,5 @@
 	ossl_raise(eX509CertError, NULL);
     str = rb_str_new(0, len);
-    p = RSTRING_PTR(str);
+    p = (unsigned char *)RSTRING_PTR(str);
     if (i2d_X509(x509, &p) <= 0)
 	ossl_raise(eX509CertError, NULL);
@@ -691,5 +691,5 @@
 {
     VALUE str;
-    char *cname = rb_class2name(rb_obj_class(self));
+    const char *cname = rb_class2name(rb_obj_class(self));
 
     str = rb_str_new2("#<");
--- ext/openssl/ossl_digest.c	2009-10-22 15:36:29.000000000 -0400
+++ ext/openssl/ossl_digest.c	2009-10-28 16:50:13.935017000 -0400
@@ -183,5 +183,5 @@
     }
 
-    EVP_DigestFinal_ex(ctx, RSTRING_PTR(str), NULL);
+    EVP_DigestFinal_ex(ctx, (unsigned char *)RSTRING_PTR(str), NULL);
 
     return str;
