123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- .\" $OpenBSD: sha2.3,v 1.15 2008/09/06 12:00:19 djm Exp $
- .\"
- .\" Copyright (c) 2003, 2004 Todd C. Miller <[email protected]>
- .\"
- .\" Permission to use, copy, modify, and distribute this software for any
- .\" purpose with or without fee is hereby granted, provided that the above
- .\" copyright notice and this permission notice appear in all copies.
- .\"
- .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- .\"
- .\" Sponsored in part by the Defense Advanced Research Projects
- .\" Agency (DARPA) and Air Force Research Laboratory, Air Force
- .\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
- .\"
- .\" See http://www.nist.gov/sha/ for the detailed standard
- .\"
- .Dd $Mdocdate: September 12 2008 $
- .Dt SHA2 3
- .Os
- .Sh NAME
- .Nm SHA256Init ,
- .Nm SHA256Update ,
- .Nm SHA256Pad ,
- .Nm SHA256Final ,
- .Nm SHA256Transform ,
- .Nm SHA256End ,
- .Nm SHA256File ,
- .Nm SHA256FileChunk ,
- .Nm SHA256Data
- .Nd calculate the NIST Secure Hash Standard (version 2)
- .Sh LIBRARY
- .Lb libmd
- .Sh SYNOPSIS
- .Fd #include <sys/types.h>
- .Fd #include <sha2.h>
- .Ft void
- .Fn SHA256Init "SHA2_CTX *context"
- .Ft void
- .Fn SHA256Update "SHA2_CTX *context" "const uint8_t *data" "size_t len"
- .Ft void
- .Fn SHA256Pad "SHA2_CTX *context"
- .Ft void
- .Fn SHA256Final "uint8_t digest[SHA256_DIGEST_LENGTH]" "SHA2_CTX *context"
- .Ft void
- .Fn SHA256Transform "uint32_t state[8]" "const uint8_t buffer[SHA256_BLOCK_LENGTH]"
- .Ft "char *"
- .Fn SHA256End "SHA2_CTX *context" "char *buf"
- .Ft "char *"
- .Fn SHA256File "const char *filename" "char *buf"
- .Ft "char *"
- .Fn SHA256FileChunk "const char *filename" "char *buf" "off_t offset" "off_t length"
- .Ft "char *"
- .Fn SHA256Data "uint8_t *data" "size_t len" "char *buf"
- .Ft void
- .Fn SHA384Init "SHA2_CTX *context"
- .Ft void
- .Fn SHA384Update "SHA2_CTX *context" "const uint8_t *data" "size_t len"
- .Ft void
- .Fn SHA384Pad "SHA2_CTX *context"
- .Ft void
- .Fn SHA384Final "uint8_t digest[SHA384_DIGEST_LENGTH]" "SHA2_CTX *context"
- .Ft void
- .Fn SHA384Transform "uint64_t state[8]" "const uint8_t buffer[SHA384_BLOCK_LENGTH]"
- .Ft "char *"
- .Fn SHA384End "SHA2_CTX *context" "char *buf"
- .Ft "char *"
- .Fn SHA384File "char *filename" "char *buf"
- .Ft "char *"
- .Fn SHA384FileChunk "char *filename" "char *buf" "off_t offset" "off_t length"
- .Ft "char *"
- .Fn SHA384Data "uint8_t *data" "size_t len" "char *buf"
- .Ft void
- .Fn SHA512Init "SHA2_CTX *context"
- .Ft void
- .Fn SHA512Update "SHA2_CTX *context" "const uint8_t *data" "size_t len"
- .Ft void
- .Fn SHA512Pad "SHA2_CTX *context"
- .Ft void
- .Fn SHA512Final "uint8_t digest[SHA512_DIGEST_LENGTH]" "SHA2_CTX *context"
- .Ft void
- .Fn SHA512Transform "uint64_t state[8]" "const uint8_t buffer[SHA512_BLOCK_LENGTH]"
- .Ft "char *"
- .Fn SHA512End "SHA2_CTX *context" "char *buf"
- .Ft "char *"
- .Fn SHA512File "char *filename" "char *buf"
- .Ft "char *"
- .Fn SHA512FileChunk "char *filename" "char *buf" "off_t offset" "off_t length"
- .Ft "char *"
- .Fn SHA512Data "uint8_t *data" "size_t len" "char *buf"
- .Sh DESCRIPTION
- The SHA2 functions implement the NIST Secure Hash Standard,
- FIPS PUB 180-2.
- The SHA2 functions are used to generate a condensed representation of a
- message called a message digest, suitable for use as a digital signature.
- There are three families of functions, with names corresponding to
- the number of bits in the resulting message digest.
- The SHA-256 functions are limited to processing a message of less
- than 2^64 bits as input.
- The SHA-384 and SHA-512 functions can process a message of at most 2^128 - 1
- bits as input.
- .Pp
- The SHA2 functions are considered to be more secure than the
- .Xr sha1 3
- functions with which they share a similar interface.
- The 256, 384, and 512-bit versions of SHA2 share the same interface.
- For brevity, only the 256-bit variants are described below.
- .Pp
- The
- .Fn SHA256Init
- function initializes a SHA2_CTX
- .Ar context
- for use with
- .Fn SHA256Update
- and
- .Fn SHA256Final .
- The
- .Fn SHA256Update
- function adds
- .Ar data
- of length
- .Ar len
- to the SHA2_CTX specified by
- .Ar context .
- .Fn SHA256Final
- is called when all data has been added via
- .Fn SHA256Update
- and stores a message digest in the
- .Ar digest
- parameter.
- .Pp
- The
- .Fn SHA256Pad
- function can be used to apply padding to the message digest as in
- .Fn SHA256Final ,
- but the current context can still be used with
- .Fn SHA256Update .
- .Pp
- The
- .Fn SHA256Transform
- function is used by
- .Fn SHA256Update
- to hash 512-bit blocks and forms the core of the algorithm.
- Most programs should use the interface provided by
- .Fn SHA256Init ,
- .Fn SHA256Update ,
- and
- .Fn SHA256Final
- instead of calling
- .Fn SHA256Transform
- directly.
- .Pp
- The
- .Fn SHA256End
- function is a front end for
- .Fn SHA256Final
- which converts the digest into an
- .Tn ASCII
- representation of the digest in hexadecimal.
- .Pp
- The
- .Fn SHA256File
- function calculates the digest for a file and returns the result via
- .Fn SHA256End .
- If
- .Fn SHA256File
- is unable to open the file, a
- .Dv NULL
- pointer is returned.
- .Pp
- .Fn SHA256FileChunk
- behaves like
- .Fn SHA256File
- but calculates the digest only for that portion of the file starting at
- .Fa offset
- and continuing for
- .Fa length
- bytes or until end of file is reached, whichever comes first.
- A zero
- .Fa length
- can be specified to read until end of file.
- A negative
- .Fa length
- or
- .Fa offset
- will be ignored.
- .Pp
- The
- .Fn SHA256Data
- function
- calculates the digest of an arbitrary string and returns the result via
- .Fn SHA256End .
- .Pp
- For each of the
- .Fn SHA256End ,
- .Fn SHA256File ,
- .Fn SHA256FileChunk ,
- and
- .Fn SHA256Data
- functions the
- .Ar buf
- parameter should either be a string large enough to hold the resulting digest
- (e.g.\&
- .Ev SHA256_DIGEST_STRING_LENGTH ,
- .Ev SHA384_DIGEST_STRING_LENGTH ,
- or
- .Ev SHA512_DIGEST_STRING_LENGTH ,
- depending on the function being used)
- or a
- .Dv NULL
- pointer.
- In the latter case, space will be dynamically allocated via
- .Xr malloc 3
- and should be freed using
- .Xr free 3
- when it is no longer needed.
- .Sh EXAMPLES
- The following code fragment will calculate the SHA-256 digest for the string
- .Qq abc ,
- which is
- .Dq 0xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad .
- .Bd -literal -offset indent
- SHA2_CTX ctx;
- uint8_t results[SHA256_DIGEST_LENGTH];
- char *buf;
- int n;
- buf = "abc";
- n = strlen(buf);
- SHA256Init(&ctx);
- SHA256Update(&ctx, (uint8_t *)buf, n);
- SHA256Final(results, &ctx);
- /* Print the digest as one long hex value */
- printf("0x");
- for (n = 0; n \*(Lt SHA256_DIGEST_LENGTH; n++)
- printf("%02x", results[n]);
- putchar('\en');
- .Ed
- .Pp
- Alternately, the helper functions could be used in the following way:
- .Bd -literal -offset indent
- uint8_t output[SHA256_DIGEST_STRING_LENGTH];
- char *buf = "abc";
- printf("0x%s\en", SHA256Data(buf, strlen(buf), output));
- .Ed
- .Sh SEE ALSO
- .Xr cksum 1 ,
- .Xr md4 3 ,
- .Xr md5 3 ,
- .Xr rmd160 3 ,
- .Xr sha1 3
- .Rs
- .%T Secure Hash Standard
- .%O FIPS PUB 180-2
- .Re
- .Sh HISTORY
- The SHA2 functions appeared in
- .Ox 3.4 .
- .Sh AUTHORS
- This implementation of the SHA functions was written by Aaron D. Gifford.
- .Pp
- The
- .Fn SHA256End ,
- .Fn SHA256File ,
- .Fn SHA256FileChunk ,
- and
- .Fn SHA256Data
- helper functions are derived from code written by Poul-Henning Kamp.
- .Sh CAVEATS
- This implementation of the Secure Hash Standard has not been validated by
- NIST and as such is not in official compliance with the standard.
- .Pp
- If a message digest is to be copied to a multi-byte type (i.e.\&
- an array of 32-bit integers) it will be necessary to
- perform byte swapping on little endian machines such as the i386, alpha,
- and vax.
|