7 Network Working Group G. Zorn
8 Request for Comments: 3079 cisco Systems
9 Category: Informational March 2001
12 Deriving Keys for use with Microsoft Point-to-Point Encryption (MPPE)
16 This memo provides information for the Internet community. It does
17 not specify an Internet standard of any kind. Distribution of this
22 Copyright (C) The Internet Society (2001). All Rights Reserved.
26 The Point-to-Point Protocol (PPP) provides a standard method for
27 transporting multi-protocol datagrams over point-to-point links.
29 The PPP Compression Control Protocol provides a method to negotiate
30 and utilize compression protocols over PPP encapsulated links.
32 Microsoft Point to Point Encryption (MPPE) is a means of representing
33 PPP packets in an encrypted form. MPPE uses the RSA RC4 algorithm to
34 provide data confidentiality. The length of the session key to be
35 used for initializing encryption tables can be negotiated. MPPE
36 currently supports 40-bit, 56-bit and 128-bit session keys. MPPE
37 session keys are changed frequently; the exact frequency depends upon
38 the options negotiated, but may be every packet. MPPE is negotiated
39 within option 18 in the Compression Control Protocol.
41 This document describes the method used to derive initial MPPE
42 session keys from a variety of credential types. It is expected that
43 this memo will be updated whenever Microsoft defines a new key
44 derivation method for MPPE, since its primary purpose is to provide
45 an open, easily accessible reference for third-parties wishing to
46 interoperate with Microsoft products.
48 MPPE itself (including the protocol used to negotiate its use, the
49 details of the encryption method used and the algorithm used to
50 change session keys during a session) is described in RFC 3078.
58 Zorn Informational [Page 1]
60 RFC 3079 MPPE Key Derivation March 2001
65 1. Specification of Requirements ............................... 2
66 2. Deriving Session Keys from MS-CHAP Credentials .............. 2
67 2.1. Generating 40-bit Session Keys ............................ 3
68 2.2. Generating 56-bit Session Keys ............................ 3
69 2.3. Generating 128-bit Session Keys ........................... 4
70 2.4. Key Derivation Functions .................................. 5
71 2.5. Sample Key Derivations .................................... 6
72 2.5.1. Sample 40-bit Key Derivation ............................ 6
73 2.5.2. Sample 56-bit Key Derivation ............................ 6
74 2.5.3. Sample 128-bit Key Derivation ........................... 7
75 3. Deriving Session Keys from MS-CHAP-2 Credentials ............ 7
76 3.1. Generating 40-bit Session Keys ............................ 8
77 3.2. Generating 56-bit Session Keys ............................ 9
78 3.3. Generating 128-bit Session Keys ...........................10
79 3.4. Key Derivation Functions ..................................11
80 3.5. Sample Key Derivations ....................................13
81 3.5.1. Sample 40-bit Key Derivation ............................13
82 3.5.2. Sample 56-bit Key Derivation ............................14
83 3.5.3. Sample 128-bit Key Derivation ...........................15
84 4. Deriving MPPE Session Keys from TLS Session Keys ............16
85 4.1. Generating 40-bit Session Keys ............................16
86 4.2. Generating 56-bit Session Keys ............................17
87 4.3. Generating 128-bit Session Keys ...........................17
88 5. Security Considerations .....................................18
89 5.1. MS-CHAP Credentials .......................................18
90 5.2. EAP-TLS Credentials .......................................19
91 6. References ..................................................19
92 7. Acknowledgements ............................................20
93 8. Author's Address ............................................20
94 9. Full Copyright Statement ....................................21
96 1. Specification of Requirements
98 In this document, the key words "MAY", "MUST, "MUST NOT", "optional",
99 "recommended", "SHOULD", and "SHOULD NOT" are to be interpreted as
102 2. Deriving Session Keys from MS-CHAP Credentials
104 The Microsoft Challenge-Handshake Authentication Protocol (MS-CHAP-1)
105 [2] is a Microsoft-proprietary PPP [1] authentication protocol,
106 providing the functionality to which LAN-based users are accustomed
107 while integrating the encryption and hashing algorithms used on
114 Zorn Informational [Page 2]
116 RFC 3079 MPPE Key Derivation March 2001
119 The following sections detail the methods used to derive initial
120 session keys (40-, 56- and 128-bit) from MS-CHAP-1 credentials.
124 The initial session key in both directions is derived from the
125 credentials of the peer that initiated the call and the challenge
126 used (if any) is the challenge from the first authentication.
127 This is true for both unilateral and bilateral authentication, as
128 well as for each link in a multilink bundle. In the multi-chassis
129 multilink case, implementations are responsible for ensuring that
130 the correct keys are generated on all participating machines.
132 2.1. Generating 40-bit Session Keys
134 MPPE uses a derivative of the peer's LAN Manager password as the 40-
135 bit session key used for initializing the RC4 encryption tables.
137 The first step is to obfuscate the peer's password using the
138 LmPasswordHash() function (described in [2]). The first 8 octets of
139 the result are used as the basis for the session key generated in the
143 * PasswordHash is the basis for the session key
144 * SessionKey is a copy of PasswordHash and is the generative session key
145 * 8 is the length (in octets) of the key to be generated.
148 Get_Key(PasswordHash, SessionKey, 8)
151 * The effective length of the key is reduced to 40 bits by
152 * replacing the first three bytes as follows:
154 SessionKey[0] = 0xd1 ;
155 SessionKey[1] = 0x26 ;
156 SessionKey[2] = 0x9e ;
158 2.2. Generating 56-bit Session Keys
160 MPPE uses a derivative of the peer's LAN Manager password as the 56-
161 bit session key used for initializing the RC4 encryption tables.
163 The first step is to obfuscate the peer's password using the
164 LmPasswordHash() function (described in [2]). The first 8 octets of
165 the result are used as the basis for the session key generated in the
170 Zorn Informational [Page 3]
172 RFC 3079 MPPE Key Derivation March 2001
176 * PasswordHash is the basis for the session key
177 * SessionKey is a copy of PasswordHash and is the generative session key
178 * 8 is the length (in octets) of the key to be generated.
181 Get_Key(PasswordHash, SessionKey, 8)
184 * The effective length of the key is reduced to 56 bits by
185 * replacing the first byte as follows:
187 SessionKey[0] = 0xd1 ;
189 2.3. Generating 128-bit Session Keys
191 MPPE uses a derivative of the peer's Windows NT password as the 128-
192 bit session key used for initializing encryption tables.
194 The first step is to obfuscate the peer's password using
195 NtPasswordHash() function as described in [2]. The first 16 octets
196 of the result are then hashed again using the MD4 algorithm. The
197 first 16 octets of the second hash are used as the basis for the
198 session key generated in the following way:
201 * Challenge (as described in [9]) is sent by the PPP authenticator
202 * during authentication and is 8 octets long.
203 * NtPasswordHashHash is the basis for the session key.
204 * On return, InitialSessionKey contains the initial session
207 Get_Start_Key(Challenge, NtPasswordHashHash, InitialSessionKey)
210 * CurrentSessionKey is a copy of InitialSessionKey
211 * and is the generative session key.
212 * Length (in octets) of the key to generate is 16.
215 Get_Key(InitialSessionKey, CurrentSessionKey, 16)
226 Zorn Informational [Page 4]
228 RFC 3079 MPPE Key Derivation March 2001
231 2.4. Key Derivation Functions
233 The following procedures are used to derive the session key.
236 * Pads used in key derivation
240 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
246 {0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
247 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
248 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
249 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2};
252 * SHAInit(), SHAUpdate() and SHAFinal() functions are an
253 * implementation of Secure Hash Algorithm (SHA-1) [7]. These are
254 * available in public domain or can be licensed from
255 * RSA Data Security, Inc.
257 * 1) InitialSessionKey is 8 octets long for 56- and 40-bit
258 * session keys, 16 octets long for 128 bit session keys.
259 * 2) CurrentSessionKey is same as InitialSessionKey when this
260 * routine is called for the first time for the session.
264 IN InitialSessionKey,
265 IN/OUT CurrentSessionKey
266 IN LengthOfDesiredKey )
269 SHAUpdate(Context, InitialSessionKey, LengthOfDesiredKey)
270 SHAUpdate(Context, SHAPad1, 40)
271 SHAUpdate(Context, CurrentSessionKey, LengthOfDesiredKey)
272 SHAUpdate(Context, SHAPad2, 40)
273 SHAFinal(Context, Digest)
274 memcpy(CurrentSessionKey, Digest, LengthOfDesiredKey)
282 Zorn Informational [Page 5]
284 RFC 3079 MPPE Key Derivation March 2001
287 IN NtPasswordHashHash,
288 OUT InitialSessionKey)
291 SHAUpdate(Context, NtPasswordHashHash, 16)
292 SHAUpdate(Context, NtPasswordHashHash, 16)
293 SHAUpdate(Context, Challenge, 8)
294 SHAFinal(Context, Digest)
295 memcpy(InitialSessionKey, Digest, 16)
298 2.5. Sample Key Derivations
300 The following sections illustrate 40-, 56- and 128-bit key
301 derivations. All intermediate values are in hexadecimal.
303 2.5.1. Sample 40-bit Key Derivation
307 Password = "clientPass"
309 Step 1: LmPasswordHash(Password, PasswordHash)
310 PasswordHash = 76 a1 52 93 60 96 d7 83 0e 23 90 22 74 04 af d2
312 Step 2: Copy PasswordHash to SessionKey
313 SessionKey = 76 a1 52 93 60 96 d7 83 0e 23 90 22 74 04 af d2
315 Step 3: GetKey(PasswordHash, SessionKey, 8)
316 SessionKey = d8 08 01 53 8c ec 4a 08
318 Step 4: Reduce the effective key length to 40 bits
319 SessionKey = d1 26 9e 53 8c ec 4a 08
321 2.5.2. Sample 56-bit Key Derivation
324 Password = "clientPass"
326 Step 1: LmPasswordHash(Password, PasswordHash)
327 PasswordHash = 76 a1 52 93 60 96 d7 83 0e 23 90 22 74 04 af d2
329 Step 2: Copy PasswordHash to SessionKey
330 SessionKey = 76 a1 52 93 60 96 d7 83 0e 23 90 22 74 04 af d2
332 Step 3: GetKey(PasswordHash, SessionKey, 8)
333 SessionKey = d8 08 01 53 8c ec 4a 08
338 Zorn Informational [Page 6]
340 RFC 3079 MPPE Key Derivation March 2001
343 Step 4: Reduce the effective key length to 56 bits
344 SessionKey = d1 08 01 53 8c ec 4a 08
346 2.5.3. Sample 128-bit Key Derivation
349 Password = "clientPass"
350 Challenge = 10 2d b5 df 08 5d 30 41
352 Step 1: NtPasswordHash(Password, PasswordHash)
353 PasswordHash = 44 eb ba 8d 53 12 b8 d6 11 47 44 11 f5 69 89 ae
355 Step 2: PasswordHashHash = MD4(PasswordHash)
356 PasswordHashHash = 41 c0 0c 58 4b d2 d9 1c 40 17 a2 a1 2f a5 9f 3f
358 Step 3: GetStartKey(Challenge, PasswordHashHash, InitialSessionKey)
359 InitialSessionKey = a8 94 78 50 cf c0 ac ca d1 78 9f b6 2d dc dd b0
361 Step 4: Copy InitialSessionKey to CurrentSessionKey
362 CurrentSessionKey = a8 94 78 50 cf c0 ac c1 d1 78 9f b6 2d dc dd b0
364 Step 5: GetKey(InitialSessionKey, CurrentSessionKey, 16)
365 CurrentSessionKey = 59 d1 59 bc 09 f7 6f 1d a2 a8 6a 28 ff ec 0b 1e
367 3. Deriving Session Keys from MS-CHAP-2 Credentials
369 Version 2 of the Microsoft Challenge-Handshake Authentication
370 Protocol (MS-CHAP-2) [8] is a Microsoft-proprietary PPP
371 authentication protocol, providing the functionality to which LAN-
372 based users are accustomed while integrating the encryption and
373 hashing algorithms used on Windows networks.
375 The following sections detail the methods used to derive initial
376 session keys from MS-CHAP-2 credentials. 40-, 56- and 128-bit keys
377 are all derived using the same algorithm from the authenticating
378 peer's Windows NT password. The only difference is in the length of
379 the keys and their effective strength: 40- and 56-bit keys are 8
380 octets in length, while 128-bit keys are 16 octets long. Separate
381 keys are derived for the send and receive directions of the session.
385 The initial session keys in both directions are derived from the
386 credentials of the peer that initiated the call and the challenges
387 used are those from the first authentication. This is true as
388 well for each link in a multilink bundle. In the multi-chassis
389 multilink case, implementations are responsible for ensuring that
390 the correct keys are generated on all participating machines.
394 Zorn Informational [Page 7]
396 RFC 3079 MPPE Key Derivation March 2001
399 3.1. Generating 40-bit Session Keys
401 When used in conjunction with MS-CHAP-2 authentication, the initial
402 MPPE session keys are derived from the peer's Windows NT password.
404 The first step is to obfuscate the peer's password using
405 NtPasswordHash() function as described in [8].
407 NtPasswordHash(Password, PasswordHash)
409 The first 16 octets of the result are then hashed again using the MD4
412 PasswordHashHash = md4(PasswordHash)
414 The first 16 octets of this second hash are used together with the
415 NT- Response field from the MS-CHAP-2 Response packet [8] as the
416 basis for the master session key:
418 GetMasterKey(PasswordHashHash, NtResponse, MasterKey)
420 Once the master key has been generated, it is used to derive two 40-
421 bit session keys, one for sending and one for receiving:
423 GetAsymmetricStartKey(MasterKey, MasterSendKey, 8, TRUE, TRUE)
424 GetAsymmetricStartKey(MasterKey, MasterReceiveKey, 8, FALSE, TRUE)
426 The master session keys are never used to encrypt or decrypt data;
427 they are only used in the derivation of transient session keys. The
428 initial transient session keys are obtained by calling the function
429 GetNewKeyFromSHA() (described in [3]):
431 GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 8, SendSessionKey)
432 GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 8,
435 Next, the effective strength of both keys is reduced by setting the
436 first three octets to known constants:
438 SendSessionKey[0] = ReceiveSessionKey[0] = 0xd1
439 SendSessionKey[1] = ReceiveSessionKey[1] = 0x26
440 SendSessionKey[2] = ReceiveSessionKey[2] = 0x9e
442 Finally, the RC4 tables are initialized using the new session keys:
444 rc4_key(SendRC4key, 8, SendSessionKey)
445 rc4_key(ReceiveRC4key, 8, ReceiveSessionKey)
450 Zorn Informational [Page 8]
452 RFC 3079 MPPE Key Derivation March 2001
455 3.2. Generating 56-bit Session Keys
457 When used in conjunction with MS-CHAP-2 authentication, the initial
458 MPPE session keys are derived from the peer's Windows NT password.
460 The first step is to obfuscate the peer's password using
461 NtPasswordHash() function as described in [8].
463 NtPasswordHash(Password, PasswordHash)
465 The first 16 octets of the result are then hashed again using the MD4
468 PasswordHashHash = md4(PasswordHash)
470 The first 16 octets of this second hash are used together with the
471 NT-Response field from the MS-CHAP-2 Response packet [8] as the basis
472 for the master session key:
474 GetMasterKey(PasswordHashHash, NtResponse, MasterKey)
476 Once the master key has been generated, it is used to derive two
477 56-bit session keys, one for sending and one for receiving:
479 GetAsymmetricStartKey(MasterKey, MasterSendKey, 8, TRUE, TRUE)
480 GetAsymmetricStartKey(MasterKey, MasterReceiveKey, 8, FALSE, TRUE)
482 The master session keys are never used to encrypt or decrypt data;
483 they are only used in the derivation of transient session keys. The
484 initial transient session keys are obtained by calling the function
485 GetNewKeyFromSHA() (described in [3]):
487 GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 8, SendSessionKey)
488 GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 8,
491 Next, the effective strength of both keys is reduced by setting the
492 first octet to a known constant:
494 SendSessionKey[0] = ReceiveSessionKey[0] = 0xd1
496 Finally, the RC4 tables are initialized using the new session keys:
498 rc4_key(SendRC4key, 8, SendSessionKey)
499 rc4_key(ReceiveRC4key, 8, ReceiveSessionKey)
506 Zorn Informational [Page 9]
508 RFC 3079 MPPE Key Derivation March 2001
511 3.3. Generating 128-bit Session Keys
513 When used in conjunction with MS-CHAP-2 authentication, the initial
514 MPPE session keys are derived from the peer's Windows NT password.
516 The first step is to obfuscate the peer's password using
517 NtPasswordHash() function as described in [8].
519 NtPasswordHash(Password, PasswordHash)
521 The first 16 octets of the result are then hashed again using the MD4
524 PasswordHashHash = md4(PasswordHash)
526 The first 16 octets of this second hash are used together with the
527 NT-Response field from the MS-CHAP-2 Response packet [8] as the basis
528 for the master session key:
530 GetMasterKey(PasswordHashHash, NtResponse, MasterKey)
532 Once the master key has been generated, it is used to derive two
533 128-bit master session keys, one for sending and one for receiving:
535 GetAsymmetricStartKey(MasterKey, MasterSendKey, 16, TRUE, TRUE)
536 GetAsymmetricStartKey(MasterKey, MasterReceiveKey, 16, FALSE, TRUE)
538 The master session keys are never used to encrypt or decrypt data;
539 they are only used in the derivation of transient session keys. The
540 initial transient session keys are obtained by calling the function
541 GetNewKeyFromSHA() (described in [3]):
543 GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 16, SendSessionKey)
544 GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 16,
547 Finally, the RC4 tables are initialized using the new session keys:
549 rc4_key(SendRC4key, 16, SendSessionKey)
550 rc4_key(ReceiveRC4key, 16, ReceiveSessionKey)
562 Zorn Informational [Page 10]
564 RFC 3079 MPPE Key Derivation March 2001
567 3.4. Key Derivation Functions
569 The following procedures are used to derive the session key.
572 * Pads used in key derivation
576 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
577 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
579 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
582 {0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
583 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
584 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
585 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2};
588 * "Magic" constants used in key derivations
592 {0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74,
593 0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d,
594 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79};
597 {0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
598 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
599 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
600 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79,
601 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
602 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65,
603 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
604 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
605 0x6b, 0x65, 0x79, 0x2e};
608 {0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
609 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
610 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
611 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
612 0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
613 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73,
614 0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,
618 Zorn Informational [Page 11]
620 RFC 3079 MPPE Key Derivation March 2001
623 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20,
624 0x6b, 0x65, 0x79, 0x2e};
628 IN 16-octet PasswordHashHash,
629 IN 24-octet NTResponse,
630 OUT 16-octet MasterKey )
634 ZeroMemory(Digest, sizeof(Digest));
637 * SHSInit(), SHSUpdate() and SHSFinal()
638 * are an implementation of the Secure Hash Standard [7].
642 SHSUpdate(Context, PasswordHashHash, 16);
643 SHSUpdate(Context, NTResponse, 24);
644 SHSUpdate(Context, Magic1, 27);
645 SHSFinal(Context, Digest);
647 MoveMemory(MasterKey, Digest, 16);
651 GetAsymetricStartKey(
652 IN 16-octet MasterKey,
653 OUT 8-to-16 octet SessionKey,
654 IN INTEGER SessionKeyLength,
656 IN BOOLEAN IsServer )
661 ZeroMemory(Digest, 20);
674 Zorn Informational [Page 12]
676 RFC 3079 MPPE Key Derivation March 2001
686 * SHSInit(), SHSUpdate() and SHSFinal()
687 * are an implementation of the Secure Hash Standard [7].
691 SHSUpdate(Context, MasterKey, 16);
692 SHSUpdate(Context, SHSpad1, 40);
693 SHSUpdate(Context, s, 84);
694 SHSUpdate(Context, SHSpad2, 40);
695 SHSFinal(Context, Digest);
697 MoveMemory(SessionKey, Digest, SessionKeyLength);
700 3.5. Sample Key Derivations
702 The following sections illustrate 40-, 56- and 128-bit key
703 derivations. All intermediate values are in hexadecimal.
705 3.5.1. Sample 40-bit Key Derivation
711 Password = "clientPass"
712 = 63 00 6C 00 69 00 65 00 6E 00
713 74 00 50 00 61 00 73 00 73 00
715 AuthenticatorChallenge = 5B 5D 7C 7D 7B 3F 2F 3E 3C 2C
717 PeerChallenge = 21 40 23 24 25 5E 26 2A 28 29 5F 2B 3A 33 7C 7E
719 Challenge = D0 2E 43 86 BC E9 12 26
722 82 30 9E CD 8D 70 8B 5E A0 8F AA 39 81 CD 83 54 42 33
725 Step 1: NtPasswordHash(Password, PasswordHash)
726 PasswordHash = 44 EB BA 8D 53 12 B8 D6 11 47 44 11 F5 69 89 AE
730 Zorn Informational [Page 13]
732 RFC 3079 MPPE Key Derivation March 2001
735 Step 2: PasswordHashHash = MD4(PasswordHash)
736 PasswordHashHash = 41 C0 0C 58 4B D2 D9 1C 40 17 A2 A1 2F A5 9F 3F
738 Step 3: Derive the master key (GetMasterKey())
739 MasterKey = FD EC E3 71 7A 8C 83 8C B3 88 E5 27 AE 3C DD 31
741 Step 4: Derive the master send session key (GetAsymmetricStartKey())
742 SendStartKey40 = 8B 7C DC 14 9B 99 3A 1B
744 Step 5: Derive the initial send session key (GetNewKeyFromSHA())
745 SendSessionKey40 = D1 26 9E C4 9F A6 2E 3E
747 Sample Encrypted Message
748 rc4(SendSessionKey40, "test message") = 92 91 37 91 7E 58 03 D6
751 3.5.2. Sample 56-bit Key Derivation
757 Password = "clientPass"
758 = 63 00 6C 00 69 00 65 00 6E 00 74 00 50
761 AuthenticatorChallenge = 5B 5D 7C 7D 7B 3F 2F 3E 3C 2C
763 PeerChallenge = 21 40 23 24 25 5E 26 2A 28 29 5F 2B 3A 33 7C 7E
765 Challenge = D0 2E 43 86 BC E9 12 26
768 82 30 9E CD 8D 70 8B 5E A0 8F AA 39 81 CD 83 54 42 33
771 Step 1: NtPasswordHash(Password, PasswordHash)
772 PasswordHash = 44 EB BA 8D 53 12 B8 D6 11 47 44 11 F5 69 89 AE
774 Step 2: PasswordHashHash = MD4(PasswordHash)
775 PasswordHashHash = 41 C0 0C 58 4B D2 D9 1C 40 17 A2 A1 2F A5 9F 3F
777 Step 3: Derive the master key (GetMasterKey())
778 MasterKey = FD EC E3 71 7A 8C 83 8C B3 88 E5 27 AE 3C DD 31
780 Step 4: Derive the master send session key (GetAsymmetricStartKey())
781 SendStartKey56 = 8B 7C DC 14 9B 99 3A 1B
786 Zorn Informational [Page 14]
788 RFC 3079 MPPE Key Derivation March 2001
791 Step 5: Derive the initial send session key (GetNewKeyFromSHA())
792 SendSessionKey56 = D1 5C 00 C4 9F A6 2E 3E
794 Sample Encrypted Message
795 rc4(SendSessionKey40, "test message") = 3F 10 68 33 FA 44 8D
798 3.5.3. Sample 128-bit Key Derivation
804 Password = "clientPass"
805 = 63 00 6C 00 69 00 65 00 6E 00
806 74 00 50 00 61 00 73 00 73 00
808 AuthenticatorChallenge = 5B 5D 7C 7D 7B 3F 2F 3E 3C 2C
811 PeerChallenge = 21 40 23 24 25 5E 26 2A 28 29 5F 2B 3A 33 7C 7E
813 Challenge = D0 2E 43 86 BC E9 12 26
816 82 30 9E CD 8D 70 8B 5E A0 8F AA 39 81 CD 83 54 42 33
819 Step 1: NtPasswordHash(Password, PasswordHash)
820 PasswordHash = 44 EB BA 8D 53 12 B8 D6 11 47 44 11 F5 69 89 AE
822 Step 2: PasswordHashHash = MD4(PasswordHash)
823 PasswordHashHash = 41 C0 0C 58 4B D2 D9 1C 40 17 A2 A1 2F A5 9F 3F
825 Step 2: Derive the master key (GetMasterKey())
826 MasterKey = FD EC E3 71 7A 8C 83 8C B3 88 E5 27 AE 3C DD 31
828 Step 3: Derive the send master session key (GetAsymmetricStartKey())
830 SendStartKey128 = 8B 7C DC 14 9B 99 3A 1B A1 18 CB 15 3F 56 DC CB
832 Step 4: Derive the initial send session key (GetNewKeyFromSHA())
833 SendSessionKey128 = 40 5C B2 24 7A 79 56 E6 E2 11 00 7A E2 7B 22 D4
835 Sample Encrypted Message
836 rc4(SendSessionKey128, "test message") = 81 84 83 17 DF 68
842 Zorn Informational [Page 15]
844 RFC 3079 MPPE Key Derivation March 2001
847 4. Deriving MPPE Session Keys from TLS Session Keys
849 The Extensible Authentication Protocol (EAP) [10] is a PPP extension
850 that provides support for additional authentication methods within
851 PPP. Transport Level Security (TLS) [11] provides for mutual
852 authentication, integrity-protected ciphersuite negotiation and key
853 exchange between two endpoints. EAP-TLS [12] is an EAP
854 authentication type which allows the use of TLS within the PPP
855 authentication framework. The following sections describe the
856 methods used to derive initial session keys from TLS session keys.
857 56-, 40- and 128-bit keys are derived using the same algorithm. The
858 only difference is in the length of the keys and their effective
859 strength: 56- and 40-bit keys are 8 octets in length, while 128-bit
860 keys are 16 octets long. Separate keys are derived for the send and
861 receive directions of the session.
863 4.1. Generating 40-bit Session Keys
865 When MPPE is used in conjunction with EAP-TLS authentication, the TLS
866 master secret is used as the master session key.
868 The algorithm used to derive asymmetrical master session keys from
869 the TLS master secret is described in [12]. The master session keys
870 are never used to encrypt or decrypt data; they are only used in the
871 derivation of transient session keys.
875 If the asymmetrical master keys are less than 8 octets in length,
876 they MUST be padded on the left with zeroes before being used to
877 derive the initial transient session keys. Conversely, if the
878 asymmetrical master keys are more than 8 octets in length, they
879 must be truncated to 8 octets before being used to derive the
880 initial transient session keys.
882 The initial transient session keys are obtained by calling the
883 function GetNewKeyFromSHA() (described in [3]):
885 GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 8, SendSessionKey)
886 GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 8,
889 Next, the effective strength of both keys is reduced by setting the
890 first three octets to known constants:
892 SendSessionKey[0] = ReceiveSessionKey[0] = 0xD1
893 SendSessionKey[1] = ReceiveSessionKey[1] = 0x26
894 SendSessionKey[2] = ReceiveSessionKey[2] = 0x9E
898 Zorn Informational [Page 16]
900 RFC 3079 MPPE Key Derivation March 2001
903 Finally, the RC4 tables are initialized using the new session keys:
905 rc4_key(SendRC4key, 8, SendSessionKey)
906 rc4_key(ReceiveRC4key, 8, ReceiveSessionKey)
908 4.2. Generating 56-bit Session Keys
910 When MPPE is used in conjunction with EAP-TLS authentication, the TLS
911 master secret is used as the master session key.
913 The algorithm used to derive asymmetrical master session keys from
914 the TLS master secret is described in [12]. The master session keys
915 are never used to encrypt or decrypt data; they are only used in the
916 derivation of transient session keys.
920 If the asymmetrical master keys are less than 8 octets in length,
921 they MUST be padded on the left with zeroes before being used to
922 derive the initial transient session keys. Conversely, if the
923 asymmetrical master keys are more than 8 octets in length, they
924 must be truncated to 8 octets before being used to derive the
925 initial transient session keys.
927 The initial transient session keys are obtained by calling the
928 function GetNewKeyFromSHA() (described in [3]):
930 GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 8, SendSessionKey)
931 GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 8,
934 Next, the effective strength of both keys is reduced by setting the
935 initial octet to a known constant:
937 SendSessionKey[0] = ReceiveSessionKey[0] = 0xD1
939 Finally, the RC4 tables are initialized using the new session keys:
941 rc4_key(SendRC4key, 8, SendSessionKey)
942 rc4_key(ReceiveRC4key, 8, ReceiveSessionKey)
944 4.3. Generating 128-bit Session Keys
946 When MPPE is used in conjunction with EAP-TLS authentication, the TLS
947 master secret is used as the master session key.
954 Zorn Informational [Page 17]
956 RFC 3079 MPPE Key Derivation March 2001
959 The algorithm used to derive asymmetrical master session keys from
960 the TLS master secret is described in [12]. Note that the send key
961 on one side is the receive key on the other.
963 The master session keys are never used to encrypt or decrypt data;
964 they are only used in the derivation of transient session keys.
968 If the asymmetrical master keys are less than 16 octets in length,
969 they MUST be padded on the left with zeroes before being used to
970 derive the initial transient session keys. Conversely, if the
971 asymmetrical master keys are more than 16 octets in length, they
972 must be truncated to 16 octets before being used to derive the
973 initial transient session keys.
975 The initial transient session keys are obtained by calling the
976 function GetNewKeyFromSHA() (described in [3]):
978 GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 16, SendSessionKey)
979 GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 16,
982 Finally, the RC4 tables are initialized using the new session keys:
984 rc4_key(SendRC4key, 16, SendSessionKey)
985 rc4_key(ReceiveRC4key, 16, ReceiveSessionKey)
987 5. Security Considerations
989 5.1. MS-CHAP Credentials
991 Because of the way in which 40-bit keys are derived from MS-CHAP-1
992 credentials, the initial 40-bit session key will be identical in all
993 sessions established under the same peer credentials. For this
994 reason, and because RC4 with a 40-bit key length is believed to be a
995 relatively weak cipher, peers SHOULD NOT use 40-bit keys derived from
996 the LAN Manager password hash (as described above) if it can be
999 Since the MPPE session keys are derived from user passwords (in the
1000 MS- CHAP-1 and MS-CHAP-2 cases), care should be taken to ensure the
1001 selection of strong passwords and passwords should be changed
1010 Zorn Informational [Page 18]
1012 RFC 3079 MPPE Key Derivation March 2001
1015 5.2. EAP-TLS Credentials
1017 The strength of the session keys is dependent upon the security of
1020 The EAP server may be on a separate machine from the PPP
1021 authenticator; if this is the case, adequate care must be taken in
1022 the transmission of the EAP-TLS master keys to the authenticator.
1026 [1] Simpson, W., "The Point-to-Point Protocol (PPP)", STD 51, RFC
1029 [2] Zorn, G. and S. Cobb, "Microsoft PPP CHAP Extensions", RFC 2433,
1032 [3] Pall, G. and G. Zorn, "Microsoft Point-to-Point Encryption
1033 (MPPE) RFC 3078, March 2001.
1035 [4] RC4 is a proprietary encryption algorithm available under
1036 license from RSA Data Security Inc. For licensing information,
1038 RSA Data Security, Inc.
1040 Redwood City, CA 94065-1031
1042 [5] Pall, G., "Microsoft Point-to-Point Compression (MPPC)
1043 Protocol", RFC 2118, March 1997.
1045 [6] Bradner, S., "Key words for use in RFCs to Indicate Requirement
1046 Levels", BCP 14, RFC 2119, March 1997.
1048 [7] "Secure Hash Standard", Federal Information Processing Standards
1049 Publication 180-1, National Institute of Standards and
1050 Technology, April 1995.
1052 [8] Zorn, G., "Microsoft PPP CHAP Extensions, Version 2", RFC 2759,
1055 [9] Simpson, W., "PPP Challenge Handshake Authentication Protocol
1056 (CHAP)", RFC 1994, August 1996.
1058 [10] Blunk, L. and J. Vollbrecht, "PPP Extensible Authentication
1059 Protocol (EAP)", RFC 2284, March 1998.
1066 Zorn Informational [Page 19]
1068 RFC 3079 MPPE Key Derivation March 2001
1071 [11] Dierks, T. and C. Allen, "The TLS Protocol Version 1.0", RFC
1074 [12] Aboba, B. and D. Simon, "PPP EAP TLS Authentication Protocol",
1075 RFC 2716, October 1999.
1079 Anthony Bell, Richard B. Ward, Terence Spies and Thomas Dimitri, all
1080 of Microsoft Corporation, significantly contributed to the design and
1081 development of MPPE.
1083 Additional thanks to Robert Friend, Joe Davies, Jody Terrill, Archie
1084 Cobbs, Mark Deuser, Vijay Baliga, Brad Robel-Forrest and Jeff Haag
1085 for useful feedback.
1087 The technical portions of this memo were completed while the author
1088 was employed by Microsoft Corporation.
1092 Questions about this memo can also be directed to:
1096 500 108th Avenue N.E.
1098 Bellevue, Washington 98004
1101 Phone: +1 425 438 8218
1102 FAX: +1 425 438 1848
1103 EMail: gwz@cisco.com
1122 Zorn Informational [Page 20]
1124 RFC 3079 MPPE Key Derivation March 2001
1127 9. Full Copyright Statement
1129 Copyright (C) The Internet Society (2001). All Rights Reserved.
1131 This document and translations of it may be copied and furnished to
1132 others, and derivative works that comment on or otherwise explain it
1133 or assist in its implementation may be prepared, copied, published
1134 and distributed, in whole or in part, without restriction of any
1135 kind, provided that the above copyright notice and this paragraph are
1136 included on all such copies and derivative works. However, this
1137 document itself may not be modified in any way, such as by removing
1138 the copyright notice or references to the Internet Society or other
1139 Internet organizations, except as needed for the purpose of
1140 developing Internet standards in which case the procedures for
1141 copyrights defined in the Internet Standards process must be
1142 followed, or as required to translate it into languages other than
1145 The limited permissions granted above are perpetual and will not be
1146 revoked by the Internet Society or its successors or assigns.
1148 This document and the information contained herein is provided on an
1149 "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
1150 TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
1151 BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
1152 HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
1153 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1157 Funding for the RFC Editor function is currently provided by the
1178 Zorn Informational [Page 21]