Add get_master from RFC 3079 3.4 for MS-CHAP-V2
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@20140 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		
							
								
								
									
										43
									
								
								kdc/digest.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								kdc/digest.c
									
									
									
									
									
								
							@@ -151,8 +151,11 @@ static const unsigned char ms_chap_v1_magic2[41] = {
 | 
				
			|||||||
    0x6E
 | 
					    0x6E
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const unsigned char ms_rfc3079_magic1[27] = {
 | 
				
			||||||
 | 
					    0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74,
 | 
				
			||||||
 | 
					    0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d,
 | 
				
			||||||
 | 
					    0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -875,7 +878,6 @@ _kdc_do_digest(krb5_context context,
 | 
				
			|||||||
	    SHA1_Update(&ctx, answer.data, answer.length);
 | 
						    SHA1_Update(&ctx, answer.data, answer.length);
 | 
				
			||||||
	    SHA1_Update(&ctx, ms_chap_v1_magic1, sizeof(ms_chap_v1_magic1));
 | 
						    SHA1_Update(&ctx, ms_chap_v1_magic1, sizeof(ms_chap_v1_magic1));
 | 
				
			||||||
	    SHA1_Final(md, &ctx);
 | 
						    SHA1_Final(md, &ctx);
 | 
				
			||||||
	    free(answer.data);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	    SHA1_Init(&ctx);
 | 
						    SHA1_Init(&ctx);
 | 
				
			||||||
	    SHA1_Update(&ctx, md, sizeof(md));
 | 
						    SHA1_Update(&ctx, md, sizeof(md));
 | 
				
			||||||
@@ -885,6 +887,7 @@ _kdc_do_digest(krb5_context context,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	    r.u.response.rsp = calloc(1, sizeof(*r.u.response.rsp));
 | 
						    r.u.response.rsp = calloc(1, sizeof(*r.u.response.rsp));
 | 
				
			||||||
	    if (r.u.response.rsp == NULL) {
 | 
						    if (r.u.response.rsp == NULL) {
 | 
				
			||||||
 | 
							free(answer.data);
 | 
				
			||||||
		krb5_clear_error_string(context);
 | 
							krb5_clear_error_string(context);
 | 
				
			||||||
		ret = ENOMEM;
 | 
							ret = ENOMEM;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
@@ -892,11 +895,45 @@ _kdc_do_digest(krb5_context context,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	    hex_encode(md, sizeof(md), r.u.response.rsp);
 | 
						    hex_encode(md, sizeof(md), r.u.response.rsp);
 | 
				
			||||||
	    if (r.u.response.rsp == NULL) {
 | 
						    if (r.u.response.rsp == NULL) {
 | 
				
			||||||
 | 
							free(answer.data);
 | 
				
			||||||
		krb5_clear_error_string(context);
 | 
							krb5_clear_error_string(context);
 | 
				
			||||||
		ret = ENOMEM;
 | 
							ret = ENOMEM;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	    }
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    /* hash hash */
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
							MD4_CTX hctx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							MD4_Init(&hctx);
 | 
				
			||||||
 | 
							MD4_Update(&hctx, key->key.keyvalue.data, 
 | 
				
			||||||
 | 
								   key->key.keyvalue.length);
 | 
				
			||||||
 | 
							MD4_Final(md, &hctx);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    /* get_master, rfc 3079 3.4 */
 | 
				
			||||||
 | 
						    SHA1_Init(&ctx);
 | 
				
			||||||
 | 
						    SHA1_Update(&ctx, md, 16); /* md4(hash) */
 | 
				
			||||||
 | 
						    SHA1_Update(&ctx, answer.data, answer.length);
 | 
				
			||||||
 | 
						    SHA1_Update(&ctx, ms_rfc3079_magic1, sizeof(ms_rfc3079_magic1));
 | 
				
			||||||
 | 
						    SHA1_Final(md, &ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    free(answer.data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    r.u.response.session_key = 
 | 
				
			||||||
 | 
							calloc(1, sizeof(*r.u.response.session_key));
 | 
				
			||||||
 | 
						    if (r.u.response.session_key == NULL) {
 | 
				
			||||||
 | 
							krb5_clear_error_string(context);
 | 
				
			||||||
 | 
							ret = ENOMEM;
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    ret = krb5_data_copy(r.u.response.session_key, md, sizeof(md));
 | 
				
			||||||
 | 
						    if (ret) {
 | 
				
			||||||
 | 
							krb5_clear_error_string(context);
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
	    r.element = choice_DigestRepInner_error;
 | 
						    r.element = choice_DigestRepInner_error;
 | 
				
			||||||
	    asprintf(&r.u.error.reason, "Unsupported digest type %s", 
 | 
						    asprintf(&r.u.error.reason, "Unsupported digest type %s", 
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user