diff --git a/Makefile.am b/Makefile.am
index dadce55..6c63974 100644
--- Makefile.am
+++ Makefile.am
@@ -21,11 +21,11 @@ libstrophe_la_LDFLAGS = $(SSL_LIBS) $(PARSER_LIBS)
 libstrophe_la_LDFLAGS += -export-symbols-regex '^xmpp_'
 libstrophe_la_SOURCES = src/auth.c src/conn.c src/ctx.c \
 	src/event.c src/handler.c src/hash.c \
-	src/jid.c src/md5.c src/sasl.c src/scram.c src/sha1.c \
+	src/jid.c src/md5.c src/sasl.c src/scram.c \
 	src/snprintf.c src/sock.c src/stanza.c src/thread.c \
 	src/tls_openssl.c src/util.c \
 	src/common.h src/hash.h src/md5.h src/ostypes.h src/parser.h \
-	src/sasl.h src/scram.h src/sha1.h src/sock.h src/thread.h src/tls.h \
+	src/sasl.h src/scram.h src/sock.h src/thread.h src/tls.h \
 	src/util.h
 
 if PARSER_EXPAT
diff --git a/src/sasl.c b/src/sasl.c
index 3d83fd0..9e1b40b 100644
--- src/sasl.c
+++ src/sasl.c
@@ -21,7 +21,7 @@
 #include "ostypes.h"
 #include "sasl.h"
 #include "md5.h"
-#include "sha1.h"
+#include <openssl/sha.h>
 #include "scram.h"
 
 #ifdef _WIN32
@@ -355,8 +355,8 @@ char *sasl_scram_sha1(xmpp_ctx_t *ctx, const char *challenge,
                       const char *first_bare, const char *jid,
                       const char *password)
 {
-    uint8_t key[SHA1_DIGEST_SIZE];
-    uint8_t sign[SHA1_DIGEST_SIZE];
+    uint8_t key[SHA_DIGEST_LENGTH];
+    uint8_t sign[SHA_DIGEST_LENGTH];
     char *r = NULL;
     char *s = NULL;
     char *i = NULL;
@@ -422,7 +422,7 @@ char *sasl_scram_sha1(xmpp_ctx_t *ctx, const char *challenge,
     SCRAM_SHA1_ClientKey((uint8_t *)password, strlen(password),
                          (uint8_t *)sval, sval_len, (uint32_t)ival, key);
     SCRAM_SHA1_ClientSignature(key, (uint8_t *)auth, strlen(auth), sign);
-    for (j = 0; j < SHA1_DIGEST_SIZE; j++) {
+    for (j = 0; j < SHA_DIGEST_LENGTH; j++) {
         sign[j] ^= key[j];
     }
 
diff --git a/src/scram.c b/src/scram.c
index 5cce168..688028f 100644
--- src/scram.c
+++ src/scram.c
@@ -19,46 +19,46 @@
 #include <assert.h>
 #include <string.h>
 
-#include "sha1.h"
+#include <openssl/sha.h>
 #include "ostypes.h"
 
 #include "scram.h"
 
 /* block size for HMAC */
 #define BLOCK_SIZE 64
-#if BLOCK_SIZE < SHA1_DIGEST_SIZE
-#error BLOCK_SIZE must not be less than SHA1_DIGEST_SIZE
+#if BLOCK_SIZE < SHA_DIGEST_LENGTH
+#error BLOCK_SIZE must not be less than SHA_DIGEST_LENGTH
 #endif
 
 static const uint8_t ipad = 0x36;
 static const uint8_t opad = 0x5C;
 
-static void SHA1(const uint8_t* data, size_t len,
-                 uint8_t digest[SHA1_DIGEST_SIZE])
+static void _SHA1(const uint8_t* data, size_t len,
+                 uint8_t digest[SHA_DIGEST_LENGTH])
 {
-    SHA1_CTX ctx;
+    SHA_CTX ctx;
     SHA1_Init(&ctx);
-    SHA1_Update(&ctx, data, len);
-    SHA1_Final(&ctx, digest);
+    SHA1_Update(&ctx, (const void*) data, len);
+    SHA1_Final(digest, &ctx);
 }
 
 static void HMAC_SHA1(const uint8_t *key, size_t key_len,
                       const uint8_t *text, size_t len,
-                      uint8_t digest[SHA1_DIGEST_SIZE])
+                      uint8_t digest[SHA_DIGEST_LENGTH])
 {
     uint8_t key_pad[BLOCK_SIZE];
     uint8_t key_ipad[BLOCK_SIZE];
     uint8_t key_opad[BLOCK_SIZE];
-    uint8_t sha_digest[SHA1_DIGEST_SIZE];
+    uint8_t sha_digest[SHA_DIGEST_LENGTH];
     int i;
-    SHA1_CTX ctx;
+    SHA_CTX ctx;
 
     memset(key_pad, 0, sizeof(key_pad));
     if (key_len <= BLOCK_SIZE) {
         memcpy(key_pad, key, key_len);
     } else {
         /* according to RFC2104 */
-        SHA1(key, key_len, key_pad);
+        _SHA1(key, key_len, key_pad);
     }
 
     for (i = 0; i < BLOCK_SIZE; i++) {
@@ -67,19 +67,19 @@ static void HMAC_SHA1(const uint8_t *key, size_t key_len,
     }
 
     SHA1_Init(&ctx);
-    SHA1_Update(&ctx, key_ipad, BLOCK_SIZE);
-    SHA1_Update(&ctx, text, len);
-    SHA1_Final(&ctx, sha_digest);
+    SHA1_Update(&ctx, (const void*) key_ipad, BLOCK_SIZE);
+    SHA1_Update(&ctx, (const void*) text, len);
+    SHA1_Final(sha_digest, &ctx);
 
     SHA1_Init(&ctx);
-    SHA1_Update(&ctx, key_opad, BLOCK_SIZE);
-    SHA1_Update(&ctx, sha_digest, SHA1_DIGEST_SIZE);
-    SHA1_Final(&ctx, digest);
+    SHA1_Update(&ctx, (const void*) key_opad, BLOCK_SIZE);
+    SHA1_Update(&ctx, (const void*) sha_digest, SHA_DIGEST_LENGTH);
+    SHA1_Final(digest, &ctx);
 }
 
 static void SCRAM_SHA1_Hi(const uint8_t *text, size_t len,
                           const uint8_t *salt, size_t salt_len, uint32_t i,
-                          uint8_t digest[SHA1_DIGEST_SIZE])
+                          uint8_t digest[SHA_DIGEST_LENGTH])
 {
     int j, k;
     uint8_t tmp[128];
@@ -89,7 +89,7 @@ static void SCRAM_SHA1_Hi(const uint8_t *text, size_t len,
     /* assume salt + INT(1) isn't longer than sizeof(tmp) */
     assert(salt_len <= sizeof(tmp) - sizeof(int1));
 
-    memset(digest, 0, SHA1_DIGEST_SIZE);
+    memset(digest, 0, SHA_DIGEST_LENGTH);
     if (i == 0) {
         return;
     }
@@ -99,11 +99,11 @@ static void SCRAM_SHA1_Hi(const uint8_t *text, size_t len,
 
     /* 'text' for Hi is a 'key' for HMAC */
     HMAC_SHA1(text, len, tmp, salt_len + sizeof(int1), digest);
-    memcpy(tmp, digest, SHA1_DIGEST_SIZE);
+    memcpy(tmp, digest, SHA_DIGEST_LENGTH);
 
     for (j = 1; j < i; j++) {
-        HMAC_SHA1(text, len, tmp, SHA1_DIGEST_SIZE, tmp);
-        for (k = 0; k < SHA1_DIGEST_SIZE; k++) {
+        HMAC_SHA1(text, len, tmp, SHA_DIGEST_LENGTH, tmp);
+        for (k = 0; k < SHA_DIGEST_LENGTH; k++) {
             digest[k] ^= tmp[k];
         }
     }
@@ -111,33 +111,33 @@ static void SCRAM_SHA1_Hi(const uint8_t *text, size_t len,
 
 void SCRAM_SHA1_ClientKey(const uint8_t *password, size_t len,
                           const uint8_t *salt, size_t salt_len, uint32_t i,
-                          uint8_t key[SHA1_DIGEST_SIZE])
+                          uint8_t key[SHA_DIGEST_LENGTH])
 {
-    uint8_t salted[SHA1_DIGEST_SIZE];
+    uint8_t salted[SHA_DIGEST_LENGTH];
 
     /* XXX: Normalize(password) is omitted */
 
     SCRAM_SHA1_Hi(password, len, salt, salt_len, i, salted);
-    HMAC_SHA1(salted, SHA1_DIGEST_SIZE, (uint8_t *)"Client Key",
+    HMAC_SHA1(salted, SHA_DIGEST_LENGTH, (uint8_t *)"Client Key",
               strlen("Client Key"), key);
 }
 
-void SCRAM_SHA1_ClientSignature(const uint8_t ClientKey[SHA1_DIGEST_SIZE],
+void SCRAM_SHA1_ClientSignature(const uint8_t ClientKey[SHA_DIGEST_LENGTH],
                                 const uint8_t *AuthMessage, size_t len,
-                                uint8_t sign[SHA1_DIGEST_SIZE])
+                                uint8_t sign[SHA_DIGEST_LENGTH])
 {
-    uint8_t stored[SHA1_DIGEST_SIZE];
+    uint8_t stored[SHA_DIGEST_LENGTH];
 
-    SHA1(ClientKey, SHA1_DIGEST_SIZE, stored);
-    HMAC_SHA1(stored, SHA1_DIGEST_SIZE, AuthMessage, len, sign);
+    SHA1(ClientKey, SHA_DIGEST_LENGTH, stored);
+    HMAC_SHA1(stored, SHA_DIGEST_LENGTH, AuthMessage, len, sign);
 }
 
-void SCRAM_SHA1_ClientProof(const uint8_t ClientKey[SHA1_DIGEST_SIZE],
-                            const uint8_t ClientSignature[SHA1_DIGEST_SIZE],
-                            uint8_t proof[SHA1_DIGEST_SIZE])
+void SCRAM_SHA1_ClientProof(const uint8_t ClientKey[SHA_DIGEST_LENGTH],
+                            const uint8_t ClientSignature[SHA_DIGEST_LENGTH],
+                            uint8_t proof[SHA_DIGEST_LENGTH])
 {
     int i;
-    for (i = 0; i < SHA1_DIGEST_SIZE; i++) {
+    for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
         proof[i] = ClientKey[i] ^ ClientSignature[i];
     }
 }
diff --git a/src/scram.h b/src/scram.h
index a0b996b..f81a5b6 100644
--- src/scram.h
+++ src/scram.h
@@ -19,18 +19,18 @@
 /* make sure the stdint.h types are available */
 #include "ostypes.h"
 
-#include "sha1.h"
+#include<openssl/sha.h>
 
 void SCRAM_SHA1_ClientKey(const uint8_t *password, size_t len,
                           const uint8_t *salt, size_t salt_len, uint32_t i,
-                          uint8_t key[SHA1_DIGEST_SIZE]);
+                          uint8_t key[SHA_DIGEST_LENGTH]);
 
-void SCRAM_SHA1_ClientSignature(const uint8_t ClientKey[SHA1_DIGEST_SIZE],
+void SCRAM_SHA1_ClientSignature(const uint8_t ClientKey[SHA_DIGEST_LENGTH],
                                 const uint8_t *AuthMessage, size_t len,
-                                uint8_t sign[SHA1_DIGEST_SIZE]);
+                                uint8_t sign[SHA_DIGEST_LENGTH]);
 
-void SCRAM_SHA1_ClientProof(const uint8_t ClientKey[SHA1_DIGEST_SIZE],
-                            const uint8_t ClientSignature[SHA1_DIGEST_SIZE],
-                            uint8_t proof[SHA1_DIGEST_SIZE]);
+void SCRAM_SHA1_ClientProof(const uint8_t ClientKey[SHA_DIGEST_LENGTH],
+                            const uint8_t ClientSignature[SHA_DIGEST_LENGTH],
+                            uint8_t proof[SHA_DIGEST_LENGTH]);
 
 #endif /* __LIBSTROPHE_SCRAM_H__ */
