Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

SUNRPC: Update the spkm3 code to use the make_checksum interface

Also update the tokenlen calculations to accomodate g_token_size().

Signed-off-by: Andy Adamson <andros@citi.umich.edu>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

authored by

J. Bruce Fields and committed by
Trond Myklebust
9eed129b 26c78e15

+9 -9
+1 -1
include/linux/sunrpc/gss_spkm3.h
··· 48 48 #define CKSUMTYPE_RSA_MD5 0x0007 49 49 50 50 s32 make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body, 51 - struct xdr_netobj *cksum); 51 + int body_offset, struct xdr_netobj *cksum); 52 52 void asn1_bitstring_len(struct xdr_netobj *in, int *enclen, int *zerobits); 53 53 int decode_asn1_bitstring(struct xdr_netobj *out, char *in, int enclen, 54 54 int explen);
+5 -6
net/sunrpc/auth_gss/gss_spkm3_seal.c
··· 59 59 char tokhdrbuf[25]; 60 60 struct xdr_netobj md5cksum = {.len = 0, .data = NULL}; 61 61 struct xdr_netobj mic_hdr = {.len = 0, .data = tokhdrbuf}; 62 - int tmsglen, tokenlen = 0; 62 + int tokenlen = 0; 63 63 unsigned char *ptr; 64 64 s32 now; 65 65 int ctxelen = 0, ctxzbit = 0; ··· 92 92 } 93 93 94 94 if (toktype == SPKM_MIC_TOK) { 95 - tmsglen = 0; 96 95 /* Calculate checksum over the mic-header */ 97 96 asn1_bitstring_len(&ctx->ctx_id, &ctxelen, &ctxzbit); 98 97 spkm3_mic_header(&mic_hdr.data, &mic_hdr.len, ctx->ctx_id.data, 99 98 ctxelen, ctxzbit); 100 99 101 100 if (make_checksum(checksum_type, mic_hdr.data, mic_hdr.len, 102 - text, &md5cksum)) 101 + text, 0, &md5cksum)) 103 102 goto out_err; 104 103 105 104 asn1_bitstring_len(&md5cksum, &md5elen, &md5zbit); 106 - tokenlen = 10 + ctxelen + 1 + 2 + md5elen + 1; 105 + tokenlen = 10 + ctxelen + 1 + md5elen + 1; 107 106 108 107 /* Create token header using generic routines */ 109 - token->len = g_token_size(&ctx->mech_used, tokenlen + tmsglen); 108 + token->len = g_token_size(&ctx->mech_used, tokenlen); 110 109 111 110 ptr = token->data; 112 - g_make_token_header(&ctx->mech_used, tokenlen + tmsglen, &ptr); 111 + g_make_token_header(&ctx->mech_used, tokenlen, &ptr); 113 112 114 113 spkm3_make_mic_token(&ptr, tokenlen, &mic_hdr, &md5cksum, md5elen, md5zbit); 115 114 } else if (toktype == SPKM_WRAP_TOK) { /* Not Supported */
+2 -1
net/sunrpc/auth_gss/gss_spkm3_token.c
··· 182 182 * *tokp points to the beginning of the SPKM_MIC token described 183 183 * in rfc 2025, section 3.2.1: 184 184 * 185 + * toklen is the inner token length 185 186 */ 186 187 void 187 188 spkm3_make_mic_token(unsigned char **tokp, int toklen, struct xdr_netobj *mic_hdr, struct xdr_netobj *md5cksum, int md5elen, int md5zbit) ··· 190 189 unsigned char *ict = *tokp; 191 190 192 191 *(u8 *)ict++ = 0xa4; 193 - *(u8 *)ict++ = toklen - 2; 192 + *(u8 *)ict++ = toklen; 194 193 memcpy(ict, mic_hdr->data, mic_hdr->len); 195 194 ict += mic_hdr->len; 196 195
+1 -1
net/sunrpc/auth_gss/gss_spkm3_unseal.c
··· 95 95 ret = GSS_S_DEFECTIVE_TOKEN; 96 96 code = make_checksum(CKSUMTYPE_RSA_MD5, ptr + 2, 97 97 mic_hdrlen + 2, 98 - message_buffer, &md5cksum); 98 + message_buffer, 0, &md5cksum); 99 99 100 100 if (code) 101 101 goto out;