hmac.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 FILE_LICENCE ( GPL2_OR_LATER );
00020
00021
00022
00023
00024
00025
00026
00027 #include <string.h>
00028 #include <assert.h>
00029 #include <gpxe/crypto.h>
00030 #include <gpxe/hmac.h>
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 static void hmac_reduce_key ( struct digest_algorithm *digest,
00041 void *key, size_t *key_len ) {
00042 uint8_t digest_ctx[digest->ctxsize];
00043
00044 digest_init ( digest, digest_ctx );
00045 digest_update ( digest, digest_ctx, key, *key_len );
00046 digest_final ( digest, digest_ctx, key );
00047 *key_len = digest->digestsize;
00048 }
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 void hmac_init ( struct digest_algorithm *digest, void *digest_ctx,
00064 void *key, size_t *key_len ) {
00065 unsigned char k_ipad[digest->blocksize];
00066 unsigned int i;
00067
00068
00069 if ( *key_len > sizeof ( k_ipad ) )
00070 hmac_reduce_key ( digest, key, key_len );
00071
00072
00073 memset ( k_ipad, 0, sizeof ( k_ipad ) );
00074 memcpy ( k_ipad, key, *key_len );
00075 for ( i = 0 ; i < sizeof ( k_ipad ) ; i++ ) {
00076 k_ipad[i] ^= 0x36;
00077 }
00078
00079
00080 digest_init ( digest, digest_ctx );
00081 digest_update ( digest, digest_ctx, k_ipad, sizeof ( k_ipad ) );
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 void hmac_final ( struct digest_algorithm *digest, void *digest_ctx,
00099 void *key, size_t *key_len, void *hmac ) {
00100 unsigned char k_opad[digest->blocksize];
00101 unsigned int i;
00102
00103
00104 if ( *key_len > sizeof ( k_opad ) )
00105 hmac_reduce_key ( digest, key, key_len );
00106
00107
00108 memset ( k_opad, 0, sizeof ( k_opad ) );
00109 memcpy ( k_opad, key, *key_len );
00110 for ( i = 0 ; i < sizeof ( k_opad ) ; i++ ) {
00111 k_opad[i] ^= 0x5c;
00112 }
00113
00114
00115 digest_final ( digest, digest_ctx, hmac );
00116
00117
00118 digest_init ( digest, digest_ctx );
00119 digest_update ( digest, digest_ctx, k_opad, sizeof ( k_opad ) );
00120 digest_update ( digest, digest_ctx, hmac, digest->digestsize );
00121 digest_final ( digest, digest_ctx, hmac );
00122 }