Module: kamailio
Branch: master
Commit: 3c6f8369c898a85b6b3dd7223e4729f277c02b5e
URL: 
https://github.com/kamailio/kamailio/commit/3c6f8369c898a85b6b3dd7223e4729f277c02b5e

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2025-10-07T10:38:28+02:00

core: crypto - implementation of SH512-256 functions

---

Modified: src/core/crypto/sha256.c
Modified: src/core/crypto/sha256.h

---

Diff:  
https://github.com/kamailio/kamailio/commit/3c6f8369c898a85b6b3dd7223e4729f277c02b5e.diff
Patch: 
https://github.com/kamailio/kamailio/commit/3c6f8369c898a85b6b3dd7223e4729f277c02b5e.patch

---

diff --git a/src/core/crypto/sha256.c b/src/core/crypto/sha256.c
index c41a31a97c3..035046a9366 100644
--- a/src/core/crypto/sha256.c
+++ b/src/core/crypto/sha256.c
@@ -861,6 +861,12 @@ void sr_SHA512_Update(SHA512_CTX *context, const sha2_byte 
*data, size_t len)
        usedspace = freespace = 0;
 }
 
+void sr_SHA512_256_Update(
+               SHA512_CTX *context, const sha2_byte *data, size_t len)
+{
+       sr_SHA512_Update(context, data, len);
+}
+
 void SHA512_Last(SHA512_CTX *context)
 {
        unsigned int usedspace;
@@ -907,6 +913,11 @@ void SHA512_Last(SHA512_CTX *context)
        SHA512_Transform(context, (sha2_word64 *)context->buffer);
 }
 
+void SHA512_256_Last(SHA512_CTX *context)
+{
+       SHA512_Last(context);
+}
+
 void sr_SHA512_Final(
                sha2_byte digest[SHA512_DIGEST_LENGTH], SHA512_CTX *context)
 {
@@ -938,6 +949,15 @@ void sr_SHA512_Final(
        MEMSET_BZERO(context, sizeof(*context));
 }
 
+void sr_SHA512_256_Final(
+               sha2_byte digest[SHA512_256_DIGEST_LENGTH], SHA512_CTX *context)
+{
+       sha2_byte temp[SHA512_DIGEST_LENGTH];
+
+       sr_SHA512_Final(temp, context);
+       memcpy(digest, temp, SHA512_256_DIGEST_LENGTH);
+}
+
 char *sr_SHA512_End(
                SHA512_CTX *context, char buffer[SHA512_DIGEST_STRING_LENGTH])
 {
@@ -963,6 +983,31 @@ char *sr_SHA512_End(
        return buffer;
 }
 
+char *sr_SHA512_256_End(
+               SHA512_CTX *context, char 
buffer[SHA512_256_DIGEST_STRING_LENGTH])
+{
+       sha2_byte digest[SHA512_256_DIGEST_LENGTH], *d = digest;
+       int i;
+
+       /* Sanity check: */
+       assert(context != (SHA512_CTX *)0);
+
+       if(buffer != (char *)0) {
+               sr_SHA512_256_Final(digest, context);
+
+               for(i = 0; i < SHA512_256_DIGEST_LENGTH; i++) {
+                       *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+                       *buffer++ = sha2_hex_digits[*d & 0x0f];
+                       d++;
+               }
+               *buffer = (char)0;
+       } else {
+               MEMSET_BZERO(context, sizeof(*context));
+       }
+       MEMSET_BZERO(digest, SHA512_256_DIGEST_LENGTH);
+       return buffer;
+}
+
 char *sr_SHA512_Data(const sha2_byte *data, size_t len,
                char digest[SHA512_DIGEST_STRING_LENGTH])
 {
@@ -973,6 +1018,15 @@ char *sr_SHA512_Data(const sha2_byte *data, size_t len,
        return sr_SHA512_End(&context, digest);
 }
 
+char *sr_SHA512_256_Data(const sha2_byte *data, size_t len,
+               char digest[SHA512_256_DIGEST_STRING_LENGTH])
+{
+       SHA512_CTX context;
+
+       sr_SHA512_256_Init(&context);
+       sr_SHA512_256_Update(&context, data, len);
+       return sr_SHA512_256_End(&context, digest);
+}
 
 /*** SHA-384: *********************************************************/
 void sr_SHA384_Init(SHA384_CTX *context)
diff --git a/src/core/crypto/sha256.h b/src/core/crypto/sha256.h
index 6a76e956074..cf7c3f7b554 100644
--- a/src/core/crypto/sha256.h
+++ b/src/core/crypto/sha256.h
@@ -55,6 +55,9 @@ extern "C"
 #define SHA512_BLOCK_LENGTH 128
 #define SHA512_DIGEST_LENGTH 64
 #define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
+#define SHA512_256_BLOCK_LENGTH 128
+#define SHA512_256_DIGEST_LENGTH 32
+#define SHA512_256_DIGEST_STRING_LENGTH (SHA512_256_DIGEST_LENGTH * 2 + 1)
 
 
 /*** SHA-1/256/384/512 Context Structures *******************************/
@@ -123,10 +126,16 @@ typedef unsigned long long u_int64_t;     /* 8-bytes 
(64-bits) */
        void sr_SHA512_Init(SHA512_CTX *);
        void sr_SHA512_256_Init(SHA512_CTX *);
        void sr_SHA512_Update(SHA512_CTX *, const uint8_t *, size_t);
+       void sr_SHA512_256_Update(SHA512_CTX *, const uint8_t *, size_t);
        void sr_SHA512_Final(sha2_byte[SHA512_DIGEST_LENGTH], SHA512_CTX *);
+       void sr_SHA512_256_Final(sha2_byte[SHA512_256_DIGEST_LENGTH], 
SHA512_CTX *);
        char *sr_SHA512_End(SHA512_CTX *, char[SHA512_DIGEST_STRING_LENGTH]);
+       char *sr_SHA512_256_End(
+                       SHA512_CTX *, char[SHA512_256_DIGEST_STRING_LENGTH]);
        char *sr_SHA512_Data(
                        const uint8_t *, size_t, 
char[SHA512_DIGEST_STRING_LENGTH]);
+       char *sr_SHA512_256_Data(
+                       const uint8_t *, size_t, 
char[SHA512_256_DIGEST_STRING_LENGTH]);
 
 #else /* NOPROTO */
 

_______________________________________________
Kamailio - Development Mailing List -- [email protected]
To unsubscribe send an email to [email protected]
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to