# Remove MD2, MD4: some functions need to be stubbed
# Deprecate DES, RC2, RC4, and MD5
# Patch developed in-house. Solaris-specific; not suitable for upstream.
--- openssl-1.x/crypto/des/des.h	Thu Feb 25 07:42:06 2016
+++ openssl-1.x/crypto/des/des.h.new	Thu Feb 25 08:37:40 2016
@@ -132,24 +132,38 @@
 void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
                       DES_key_schedule *ks1, DES_key_schedule *ks2,
                       DES_key_schedule *ks3, int enc);
+
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+/* Mark DES functions deprecated */
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
 DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output,
                        long length, DES_key_schedule *schedule,
                        const_DES_cblock *ivec);
 /* DES_cbc_encrypt does not update the IV!  Use DES_ncbc_encrypt instead. */
-void DES_cbc_encrypt(const unsigned char *input, unsigned char *output,
+DEPRECATED void DES_cbc_encrypt(const unsigned char *input, unsigned char *output,
                      long length, DES_key_schedule *schedule,
                      DES_cblock *ivec, int enc);
-void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output,
+DEPRECATED void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output,
                       long length, DES_key_schedule *schedule,
                       DES_cblock *ivec, int enc);
-void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output,
+DEPRECATED void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output,
                       long length, DES_key_schedule *schedule,
                       DES_cblock *ivec, const_DES_cblock *inw,
                       const_DES_cblock *outw, int enc);
-void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits,
+DEPRECATED void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits,
                      long length, DES_key_schedule *schedule,
                      DES_cblock *ivec, int enc);
-void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output,
+DEPRECATED void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output,
                      DES_key_schedule *ks, int enc);
 
 /*
@@ -204,19 +218,19 @@
                        DES_cblock *out_white);
 # endif
 
-int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched,
+DEPRECATED int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched,
                  DES_cblock *iv);
-int DES_enc_write(int fd, const void *buf, int len, DES_key_schedule *sched,
+DEPRECATED int DES_enc_write(int fd, const void *buf, int len, DES_key_schedule *sched,
                   DES_cblock *iv);
-char *DES_fcrypt(const char *buf, const char *salt, char *ret);
-char *DES_crypt(const char *buf, const char *salt);
-void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits,
+DEPRECATED char *DES_fcrypt(const char *buf, const char *salt, char *ret);
+DEPRECATED char *DES_crypt(const char *buf, const char *salt);
+DEPRECATED void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits,
                      long length, DES_key_schedule *schedule,
                      DES_cblock *ivec);
-void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output,
+DEPRECATED void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output,
                       long length, DES_key_schedule *schedule,
                       DES_cblock *ivec, int enc);
-DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[],
+DEPRECATED DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[],
                         long length, int out_count, DES_cblock *seed);
 int DES_random_key(DES_cblock *ret);
 void DES_set_odd_parity(DES_cblock *key);
@@ -237,10 +251,10 @@
 # endif
 void DES_string_to_key(const char *str, DES_cblock *key);
 void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2);
-void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out,
+DEPRECATED void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out,
                        long length, DES_key_schedule *schedule,
                        DES_cblock *ivec, int *num, int enc);
-void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out,
+DEPRECATED void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out,
                        long length, DES_key_schedule *schedule,
                        DES_cblock *ivec, int *num);
 
--- openssl-1.x/crypto/md5/md5.h	Thu Feb 25 07:42:06 2016
+++ openssl-1.x/crypto/md5/md5.h.new	Thu Feb 25 08:39:36 2016
@@ -104,14 +104,28 @@
     unsigned int num;
 } MD5_CTX;
 
+
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+/* Mark MD5 functions deprecated */
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
 # ifdef OPENSSL_FIPS
 int private_MD5_Init(MD5_CTX *c);
 # endif
-int MD5_Init(MD5_CTX *c);
-int MD5_Update(MD5_CTX *c, const void *data, size_t len);
-int MD5_Final(unsigned char *md, MD5_CTX *c);
-unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
-void MD5_Transform(MD5_CTX *c, const unsigned char *b);
+DEPRECATED int MD5_Init(MD5_CTX *c);
+DEPRECATED int MD5_Update(MD5_CTX *c, const void *data, size_t len);
+DEPRECATED int MD5_Final(unsigned char *md, MD5_CTX *c);
+DEPRECATED unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
+DEPRECATED void MD5_Transform(MD5_CTX *c, const unsigned char *b);
 #ifdef  __cplusplus
 }
 #endif
--- openssl-1.x/crypto/rc4/rc4.h	Thu Feb 25 07:42:06 2016
+++ openssl-1.x/crypto/rc4/rc4.h.new	Thu Feb 25 08:38:33 2016
@@ -75,10 +75,23 @@
     RC4_INT data[256];
 } RC4_KEY;
 
-const char *RC4_options(void);
-void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
-void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
-void RC4(RC4_KEY *key, size_t len, const unsigned char *indata,
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+/* Mark RC4 functions deprecated */
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
+DEPRECATED const char *RC4_options(void);
+DEPRECATED void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
+DEPRECATED void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
+DEPRECATED void RC4(RC4_KEY *key, size_t len, const unsigned char *indata,
          unsigned char *outdata);
 
 #ifdef  __cplusplus
--- openssl-1.x/crypto/pem/pem.h	Fri Sep 11 00:42:09 2015
+++ openssl-1.x/crypto/pem/pem.h.new	Thu Feb 25 08:47:04 2016
@@ -520,9 +520,24 @@
 EVP_PKEY *b2i_PublicKey_bio(BIO *in);
 int i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk);
 int i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk);
+
+
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+/* Mark RC4 functions deprecated */
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
 # ifndef OPENSSL_NO_RC4
-EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u);
-int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel,
+DEPRECATED EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u);
+DEPRECATED int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel,
                 pem_password_cb *cb, void *u);
 # endif
 
--- openssl-1.x/crypto/rsa/rsa.h	Fri Sep 11 00:42:09 2015
+++ openssl-1.x/crypto/rsa/rsa.h.new	Thu Feb 25 08:47:08 2016
@@ -387,18 +387,31 @@
 int RSA_print(BIO *bp, const RSA *r, int offset);
 # endif
 
+
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+/* Mark RC4 functions deprecated */
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
 # ifndef OPENSSL_NO_RC4
-int i2d_RSA_NET(const RSA *a, unsigned char **pp,
+DEPRECATED int i2d_RSA_NET(const RSA *a, unsigned char **pp,
                 int (*cb) (char *buf, int len, const char *prompt,
                            int verify), int sgckey);
-RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length,
+DEPRECATED RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length,
                  int (*cb) (char *buf, int len, const char *prompt,
                             int verify), int sgckey);
-
-int i2d_Netscape_RSA(const RSA *a, unsigned char **pp,
+DEPRECATED int i2d_Netscape_RSA(const RSA *a, unsigned char **pp,
                      int (*cb) (char *buf, int len, const char *prompt,
                                 int verify));
-RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length,
+DEPRECATED RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length,
                       int (*cb) (char *buf, int len, const char *prompt,
                                  int verify));
 # endif
--- openssl-1.x/crypto/x509/x509.h	Fri Sep 11 00:42:09 2015
+++ openssl-1.x/crypto/x509/x509.h.new	Thu Feb 25 08:47:12 2016
@@ -970,9 +970,22 @@
 int X509_subject_name_cmp(const X509 *a, const X509 *b);
 unsigned long X509_subject_name_hash(X509 *x);
 
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+/* Mark MD5 functions deprecated */
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
 # ifndef OPENSSL_NO_MD5
-unsigned long X509_issuer_name_hash_old(X509 *a);
-unsigned long X509_subject_name_hash_old(X509 *x);
+DEPRECATED unsigned long X509_issuer_name_hash_old(X509 *a);
+DEPRECATED unsigned long X509_subject_name_hash_old(X509 *x);
 # endif
 
 int X509_cmp(const X509 *a, const X509 *b);
$ diff -ru e_rc2.c e_rc2.c.new 
--- a/crypto/rc2/rc2.h.orig	Thu Apr 14 12:23:50 2016
+++ b/crypto/rc2/rc2.h	Thu Apr 14 12:27:16 2016
@@ -82,17 +82,32 @@
 void private_RC2_set_key(RC2_KEY *key, int len, const unsigned char *data,
                          int bits);
 # endif
-void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits);
-void RC2_ecb_encrypt(const unsigned char *in, unsigned char *out,
+
+
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+/* Mark RC2 functions deprecated */
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
+DEPRECATED void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits);
+DEPRECATED void RC2_ecb_encrypt(const unsigned char *in, unsigned char *out,
                      RC2_KEY *key, int enc);
-void RC2_encrypt(unsigned long *data, RC2_KEY *key);
-void RC2_decrypt(unsigned long *data, RC2_KEY *key);
-void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
+DEPRECATED void RC2_encrypt(unsigned long *data, RC2_KEY *key);
+DEPRECATED void RC2_decrypt(unsigned long *data, RC2_KEY *key);
+DEPRECATED void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
                      RC2_KEY *ks, unsigned char *iv, int enc);
-void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out,
+DEPRECATED void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out,
                        long length, RC2_KEY *schedule, unsigned char *ivec,
                        int *num, int enc);
-void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out,
+DEPRECATED void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out,
                        long length, RC2_KEY *schedule, unsigned char *ivec,
                        int *num);
 
--- old/crypto/md4/md4.h	Thu Apr 21 09:34:15 2016
+++ new/crypto/md4/md4.h	Thu Apr 21 09:36:51 2016
@@ -104,14 +104,30 @@
     unsigned int num;
 } MD4_CTX;
 
+/*
+ * Deprecate MD4
+ */
+#ifndef	__has_attribute
+# define __has_attribute(x)	0
+#endif
+
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
+
 # ifdef OPENSSL_FIPS
-int private_MD4_Init(MD4_CTX *c);
+DEPRECATED int private_MD4_Init(MD4_CTX *c);
 # endif
-int MD4_Init(MD4_CTX *c);
-int MD4_Update(MD4_CTX *c, const void *data, size_t len);
-int MD4_Final(unsigned char *md, MD4_CTX *c);
-unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md);
-void MD4_Transform(MD4_CTX *c, const unsigned char *b);
+DEPRECATED int MD4_Init(MD4_CTX *c);
+DEPRECATED int MD4_Update(MD4_CTX *c, const void *data, size_t len);
+DEPRECATED int MD4_Final(unsigned char *md, MD4_CTX *c);
+DEPRECATED unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md);
+DEPRECATED void MD4_Transform(MD4_CTX *c, const unsigned char *b);
 #ifdef  __cplusplus
 }
 #endif
--- old/crypto/evp/evp.h	Tue Mar  1 05:35:53 2016
+++ new/crypto/evp/evp.h	Thu Apr 21 09:35:07 2016
@@ -705,15 +705,31 @@
                     const unsigned char *i, int enc);
 # endif
 
+
+/*
+ * Deprecate MD4, MD5, RC2, RC4, and DES
+ */
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+#if __has_attribute(deprecated) \
+    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
+    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
+# define DEPRECATED __attribute__((deprecated))
+#else
+# define DEPRECATED
+#endif
+
 const EVP_MD *EVP_md_null(void);
 # ifndef OPENSSL_NO_MD2
 const EVP_MD *EVP_md2(void);
 # endif
 # ifndef OPENSSL_NO_MD4
-const EVP_MD *EVP_md4(void);
+DEPRECATED const EVP_MD *EVP_md4(void);
 # endif
 # ifndef OPENSSL_NO_MD5
-const EVP_MD *EVP_md5(void);
+DEPRECATED const EVP_MD *EVP_md5(void);
 # endif
 # ifndef OPENSSL_NO_SHA
 const EVP_MD *EVP_sha(void);
@@ -741,16 +757,16 @@
 # endif
 const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */
 # ifndef OPENSSL_NO_DES
-const EVP_CIPHER *EVP_des_ecb(void);
-const EVP_CIPHER *EVP_des_ede(void);
+DEPRECATED const EVP_CIPHER *EVP_des_ecb(void);
+DEPRECATED const EVP_CIPHER *EVP_des_ede(void);
 const EVP_CIPHER *EVP_des_ede3(void);
-const EVP_CIPHER *EVP_des_ede_ecb(void);
+DEPRECATED const EVP_CIPHER *EVP_des_ede_ecb(void);
 const EVP_CIPHER *EVP_des_ede3_ecb(void);
-const EVP_CIPHER *EVP_des_cfb64(void);
+DEPRECATED const EVP_CIPHER *EVP_des_cfb64(void);
 #  define EVP_des_cfb EVP_des_cfb64
-const EVP_CIPHER *EVP_des_cfb1(void);
-const EVP_CIPHER *EVP_des_cfb8(void);
-const EVP_CIPHER *EVP_des_ede_cfb64(void);
+DEPRECATED const EVP_CIPHER *EVP_des_cfb1(void);
+DEPRECATED const EVP_CIPHER *EVP_des_cfb8(void);
+DEPRECATED const EVP_CIPHER *EVP_des_ede_cfb64(void);
 #  define EVP_des_ede_cfb EVP_des_ede_cfb64
 #  if 0
 const EVP_CIPHER *EVP_des_ede_cfb1(void);
@@ -760,13 +776,13 @@
 #  define EVP_des_ede3_cfb EVP_des_ede3_cfb64
 const EVP_CIPHER *EVP_des_ede3_cfb1(void);
 const EVP_CIPHER *EVP_des_ede3_cfb8(void);
-const EVP_CIPHER *EVP_des_ofb(void);
-const EVP_CIPHER *EVP_des_ede_ofb(void);
+DEPRECATED const EVP_CIPHER *EVP_des_ofb(void);
+DEPRECATED const EVP_CIPHER *EVP_des_ede_ofb(void);
 const EVP_CIPHER *EVP_des_ede3_ofb(void);
-const EVP_CIPHER *EVP_des_cbc(void);
-const EVP_CIPHER *EVP_des_ede_cbc(void);
+DEPRECATED const EVP_CIPHER *EVP_des_cbc(void);
+DEPRECATED const EVP_CIPHER *EVP_des_ede_cbc(void);
 const EVP_CIPHER *EVP_des_ede3_cbc(void);
-const EVP_CIPHER *EVP_desx_cbc(void);
+DEPRECATED const EVP_CIPHER *EVP_desx_cbc(void);
 const EVP_CIPHER *EVP_des_ede3_wrap(void);
 /*
  * This should now be supported through the dev_crypto ENGINE. But also, why
@@ -782,10 +798,10 @@
 #  endif
 # endif
 # ifndef OPENSSL_NO_RC4
-const EVP_CIPHER *EVP_rc4(void);
-const EVP_CIPHER *EVP_rc4_40(void);
+DEPRECATED const EVP_CIPHER *EVP_rc4(void);
+DEPRECATED const EVP_CIPHER *EVP_rc4_40(void);
 #  ifndef OPENSSL_NO_MD5
-const EVP_CIPHER *EVP_rc4_hmac_md5(void);
+DEPRECATED const EVP_CIPHER *EVP_rc4_hmac_md5(void);
 #  endif
 # endif
 # ifndef OPENSSL_NO_IDEA
@@ -796,13 +812,13 @@
 const EVP_CIPHER *EVP_idea_cbc(void);
 # endif
 # ifndef OPENSSL_NO_RC2
-const EVP_CIPHER *EVP_rc2_ecb(void);
-const EVP_CIPHER *EVP_rc2_cbc(void);
-const EVP_CIPHER *EVP_rc2_40_cbc(void);
-const EVP_CIPHER *EVP_rc2_64_cbc(void);
-const EVP_CIPHER *EVP_rc2_cfb64(void);
+DEPRECATED const EVP_CIPHER *EVP_rc2_ecb(void);
+DEPRECATED const EVP_CIPHER *EVP_rc2_cbc(void);
+DEPRECATED const EVP_CIPHER *EVP_rc2_40_cbc(void);
+DEPRECATED const EVP_CIPHER *EVP_rc2_64_cbc(void);
+DEPRECATED const EVP_CIPHER *EVP_rc2_cfb64(void);
 #  define EVP_rc2_cfb EVP_rc2_cfb64
-const EVP_CIPHER *EVP_rc2_ofb(void);
+DEPRECATED const EVP_CIPHER *EVP_rc2_ofb(void);
 # endif
 # ifndef OPENSSL_NO_BF
 const EVP_CIPHER *EVP_bf_ecb(void);
