[UP]


Manual Reference Pages  - sha256 (3)

NAME

sha256(3f) - [M_hashkeys] generate a SHA-256 hashing

CONTENTS

Synopsis
Description
Options
Returns
Compile Notes
Author
Example
Unit Test

SYNOPSIS

function sha256(str)

   character(len=64)            :: sha256
   character(len=*), intent(in) :: str

DESCRIPTION

A Fortran module for SHA-256 hashing.

Note that this code will not produce the same results on big-endian machines and the module was only tested on a little-endian Ubuntu LTS 12.04 system using gfortran 4.6.3.

OPTIONS

str The message to digest.

RETURNS

sha256 The SHA-256 digest as a string of length 64.

COMPILE NOTES

The ’-fno-range-check’ flag is required on gfortran(1) since the Fortran standard otherwise doesn’t currently allow us to work with all bits in the integers (as if they were unsigned).

AUTHOR

This routine is heavily based on the SHA-256 routines by Mikael Leetmaa <leetmaa@kth.se>, 2014-01-05. changes have been made to incorporate it into the GPF (General Purpose Fortran) framework.

If you found this useful, please let Mikael Leetmaa know.

EXAMPLE

Sample program:

   program demo_sha256
   use M_hashkeys, only : sha256, dirty_sha256
   implicit none
   character(len=:),allocatable :: str
   character(len=64)            :: ref

! Test the sha256 function with a set of reference strings.

str="" ref="E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855" call unit_check(’sha256’,sha256(str)==ref,’test sha256 1’)

str="abc" ref="BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD" call unit_check(’sha256’,sha256(str)==ref,’test sha256 2’)

str="abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ref="248D6A61D20638B8E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1" call unit_check(’sha256’,sha256(str)==ref,’test sha256 3’)

str="abcdefghbcdefghicdefghijdefghijkefghijklfghi& &jklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" ref="CF5B16A778AF8380036CE59E7B0492370B249B11E8F07A51AFAC45037AFEE9D1" call unit_check(’sha256’,sha256(str)==ref,’test sha256 4’)

str=repeat("a",1000000) ref="CDC76E5C9914FB9281A1C7E284D73E67F1809A48A497200E046D39CCC7112CD0" call unit_check(’sha256’,sha256(str)==ref,’test sha256 5’)

str="message digest" ref="F7846F55CF23E14EEBEAB5B4E1550CAD5B509E3348FBC4EFA3A1413D393CB650" call unit_check(’sha256’,sha256(str)==ref,’test sha256 6’)

str="secure hash algorithm" ref="F30CEB2BB2829E79E4CA9753D35A8ECC00262D164CC077080295381CBD643F0D" call unit_check(’sha256’,sha256(str)==ref,’test sha256 7’)

str="SHA256 is considered to be safe" ref="6819D915C73F4D1E77E4E1B52D1FA0F9CF9BEAEAD3939F15874BD988E2A23630" call unit_check(’sha256’,sha256(str)==ref,’test sha256 8’)

str="For this sample, this 63-byte string will be used as input data" ref="F08A78CBBAEE082B052AE0708F32FA1E50C5C421AA772BA5DBB406A2EA6BE342" call unit_check(’sha256’,sha256(str)==ref,’test sha256 9’)

str="This is exactly 64 bytes long, not counting the terminating byte" ref="AB64EFF7E88E2E46165E29F2BCE41826BD4C7B3552F6B382A9E7D3AF47C245F8" call unit_check(’sha256’,sha256(str)==ref,’test sha256 10’)

! Check the quick and dirty implementation as well. ref="69E3FACD5F08321F78117BD53476E5321845433356F106E7013E68EC367F3017" call unit_check(’sha256’,dirty_sha256(str)==ref,’test dirtysha256 1’)

!!str=repeat("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno",16777216) !!ref="50E72A0E26442FE2552DC3938AC58658228C0CBFB1D2CA872AE435266FCD055E" !!call unit_check(’sha256’,sha256(str)==ref,’test sha256 11 -- long test’)

contains subroutine unit_check(name,test,message) character(len=*),intent(in) :: name logical,intent(in) :: test character(len=*),intent(in) :: message write(*,’(a)’) repeat("=",64) write(*,’(a)’) sha256(str) write(*,’(a)’) ref if(test)then write(*,*)trim(name)," PASSED: ",trim(message) else write(*,*)trim(name)," FAILED: ",trim(message) endif end subroutine unit_check ! end program demo_sha256

UNIT TEST

When porting to a new programming environment use the built-in unit test ...

   program test_sha256
   use M_hashkeys, only : test_suite_sha256
      call test_suite_sha256()
   end program test_sha256


sha256 (3) March 11, 2021
Generated by manServer 1.08 from d1d9b183-ad0f-426e-a404-349b481f05f2 using man macros.