Compare commits
	
		
			1981 Commits
		
	
	
		
			OpenSSL-fi
			...
			OpenSSL_1_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					94f4166017 | ||
| 
						 | 
					a74c9c9e10 | ||
| 
						 | 
					d2a3c4497f | ||
| 
						 | 
					a129850922 | ||
| 
						 | 
					c3f5d3d93a | ||
| 
						 | 
					c5ea65b157 | ||
| 
						 | 
					58b86e4235 | ||
| 
						 | 
					a466be6243 | ||
| 
						 | 
					60327ce41a | ||
| 
						 | 
					2d4d9623da | ||
| 
						 | 
					6b3b6beaa1 | ||
| 
						 | 
					7743be3aac | ||
| 
						 | 
					b709f8ef54 | ||
| 
						 | 
					c74ce24cd2 | ||
| 
						 | 
					612566e752 | ||
| 
						 | 
					3ecce3dbeb | ||
| 
						 | 
					71eca86c30 | ||
| 
						 | 
					dd1e3bd8d4 | ||
| 
						 | 
					c55fef76f7 | ||
| 
						 | 
					eb70d4407f | ||
| 
						 | 
					b335b5440a | ||
| 
						 | 
					a8eeedb603 | ||
| 
						 | 
					b3d8de7903 | ||
| 
						 | 
					0413ea5801 | ||
| 
						 | 
					2f6fba6772 | ||
| 
						 | 
					d69acceca9 | ||
| 
						 | 
					aff78bb39a | ||
| 
						 | 
					104c032b7b | ||
| 
						 | 
					b347341c75 | ||
| 
						 | 
					c00f8d697a | ||
| 
						 | 
					b07e4f2f46 | ||
| 
						 | 
					ced6dc5cef | ||
| 
						 | 
					bf2d129194 | ||
| 
						 | 
					d59d0b7c21 | ||
| 
						 | 
					dbd512e1b7 | ||
| 
						 | 
					fcc6f699e3 | ||
| 
						 | 
					7078d93307 | ||
| 
						 | 
					a2317c3ffd | ||
| 
						 | 
					75917fac8e | ||
| 
						 | 
					295fd057ce | ||
| 
						 | 
					8c4e09f74f | ||
| 
						 | 
					e32cbae224 | ||
| 
						 | 
					f6fd8db2a4 | ||
| 
						 | 
					d65db21976 | ||
| 
						 | 
					8acf1ff4b4 | ||
| 
						 | 
					8b41df41c2 | ||
| 
						 | 
					c32ebefaa8 | ||
| 
						 | 
					ed0dc93d89 | ||
| 
						 | 
					5a32dd8930 | ||
| 
						 | 
					130ebe34c8 | ||
| 
						 | 
					7612511b3b | ||
| 
						 | 
					19a28a8aa3 | ||
| 
						 | 
					fc213217e8 | ||
| 
						 | 
					7198c5af1f | ||
| 
						 | 
					40632f6b77 | ||
| 
						 | 
					038bec784e | ||
| 
						 | 
					f407eec799 | ||
| 
						 | 
					bd618bebbe | ||
| 
						 | 
					e2884b3e9a | ||
| 
						 | 
					c41e242e5c | ||
| 
						 | 
					9578319394 | ||
| 
						 | 
					16eaca2c79 | ||
| 
						 | 
					3bff195dca | ||
| 
						 | 
					41cf2d2518 | ||
| 
						 | 
					e0d4272a58 | ||
| 
						 | 
					41c373fa3e | ||
| 
						 | 
					7f6e09b531 | ||
| 
						 | 
					e2f06800bc | ||
| 
						 | 
					1180833643 | ||
| 
						 | 
					130eed01cc | ||
| 
						 | 
					2ded87355f | ||
| 
						 | 
					b1ae02e2ff | ||
| 
						 | 
					381417089a | ||
| 
						 | 
					984a30423d | ||
| 
						 | 
					2ad673c611 | ||
| 
						 | 
					0693dd954e | ||
| 
						 | 
					9071b36d9a | ||
| 
						 | 
					eb6af20d2e | ||
| 
						 | 
					8087969c5b | ||
| 
						 | 
					cb437c66d1 | ||
| 
						 | 
					40b0d0765e | ||
| 
						 | 
					41235f30fb | ||
| 
						 | 
					130c15ef5a | ||
| 
						 | 
					2cc5142fb1 | ||
| 
						 | 
					d451ece4e7 | ||
| 
						 | 
					1121ba1b74 | ||
| 
						 | 
					1fb039fde2 | ||
| 
						 | 
					3073927e42 | ||
| 
						 | 
					b6c2029931 | ||
| 
						 | 
					45d010255f | ||
| 
						 | 
					7e569022c5 | ||
| 
						 | 
					50f1b47c7f | ||
| 
						 | 
					5572bc4e2f | ||
| 
						 | 
					729d334106 | ||
| 
						 | 
					cacdfcb247 | ||
| 
						 | 
					519ad9b384 | ||
| 
						 | 
					7b2d785d20 | ||
| 
						 | 
					f2d678e6e8 | ||
| 
						 | 
					448e9b7cf1 | ||
| 
						 | 
					2c4c9867e7 | ||
| 
						 | 
					a99540a6de | ||
| 
						 | 
					9614ed695d | ||
| 
						 | 
					aabfee601e | ||
| 
						 | 
					cee1d9e02f | ||
| 
						 | 
					285f7fb0f9 | ||
| 
						 | 
					ede90b1121 | ||
| 
						 | 
					5e7329d156 | ||
| 
						 | 
					9f1979b94a | ||
| 
						 | 
					3fcf327e26 | ||
| 
						 | 
					3f4742b48c | ||
| 
						 | 
					c4f01c533b | ||
| 
						 | 
					b7a8550988 | ||
| 
						 | 
					e775891708 | ||
| 
						 | 
					ae6fbb5df0 | ||
| 
						 | 
					f9c1f03754 | ||
| 
						 | 
					50701af9d5 | ||
| 
						 | 
					1d6af3d430 | ||
| 
						 | 
					392fd8f89c | ||
| 
						 | 
					802db0fab2 | ||
| 
						 | 
					2f972419a3 | ||
| 
						 | 
					a05a2c67ef | ||
| 
						 | 
					e34140620e | ||
| 
						 | 
					acd9121085 | ||
| 
						 | 
					b17d6b8d1d | ||
| 
						 | 
					b9fa413a08 | ||
| 
						 | 
					4abe148444 | ||
| 
						 | 
					04d6940436 | ||
| 
						 | 
					8511b5f594 | ||
| 
						 | 
					546d6760b9 | ||
| 
						 | 
					ccbb8d5e95 | ||
| 
						 | 
					d7d7e7b038 | ||
| 
						 | 
					80b6d97585 | ||
| 
						 | 
					ff64ab32ae | ||
| 
						 | 
					fc9c9e47f7 | ||
| 
						 | 
					68e6ac4379 | ||
| 
						 | 
					e34b7e99fd | ||
| 
						 | 
					a32ba49352 | ||
| 
						 | 
					3a0c71541b | ||
| 
						 | 
					adc6bd73e3 | ||
| 
						 | 
					8c6d8c2a49 | ||
| 
						 | 
					53a8f8c26d | ||
| 
						 | 
					bf4863b3f5 | ||
| 
						 | 
					8f68678989 | ||
| 
						 | 
					57c4e42d75 | ||
| 
						 | 
					ff672cf8dd | ||
| 
						 | 
					d43b040773 | ||
| 
						 | 
					422c8c36e5 | ||
| 
						 | 
					b76310ba74 | ||
| 
						 | 
					c012f6e576 | ||
| 
						 | 
					cf6d55961c | ||
| 
						 | 
					3aa1b1ccbb | ||
| 
						 | 
					3dcae82fa9 | ||
| 
						 | 
					86b81ecb73 | ||
| 
						 | 
					c43dc3dd77 | ||
| 
						 | 
					e5eab8a199 | ||
| 
						 | 
					7bab6eb6f0 | ||
| 
						 | 
					87d9526d0c | ||
| 
						 | 
					36982f056a | ||
| 
						 | 
					c97ec5631b | ||
| 
						 | 
					fdb0d5dd8f | ||
| 
						 | 
					81b6dfe40d | ||
| 
						 | 
					bc35b8e435 | ||
| 
						 | 
					6859f3fc12 | ||
| 
						 | 
					8b2d5cc4a7 | ||
| 
						 | 
					74184b6f21 | ||
| 
						 | 
					6416aed586 | ||
| 
						 | 
					2a1b7bd380 | ||
| 
						 | 
					4bba0bda61 | ||
| 
						 | 
					27baa8317a | ||
| 
						 | 
					1abfa78a8b | ||
| 
						 | 
					edc687ba0f | ||
| 
						 | 
					ff0bdbed85 | ||
| 
						 | 
					dc4bdf592f | ||
| 
						 | 
					b03d0513d0 | ||
| 
						 | 
					0de70011ad | ||
| 
						 | 
					220d1e5353 | ||
| 
						 | 
					ca44f72938 | ||
| 
						 | 
					18f49508a5 | ||
| 
						 | 
					5c50462e1e | ||
| 
						 | 
					a257865303 | ||
| 
						 | 
					60adefa610 | ||
| 
						 | 
					b5dde6bcc6 | ||
| 
						 | 
					024dbfd44c | ||
| 
						 | 
					233069f8db | ||
| 
						 | 
					c76d6922b1 | ||
| 
						 | 
					3241496144 | ||
| 
						 | 
					63fe69c12e | ||
| 
						 | 
					a4947e4e06 | ||
| 
						 | 
					262f1c524e | ||
| 
						 | 
					bd80d0229c | ||
| 
						 | 
					163d794845 | ||
| 
						 | 
					0b33466b3f | ||
| 
						 | 
					bed27f4db3 | ||
| 
						 | 
					738a224bd0 | ||
| 
						 | 
					044f8ca87d | ||
| 
						 | 
					45ee08d99b | ||
| 
						 | 
					5ff68e8f6d | ||
| 
						 | 
					f14a4a861d | ||
| 
						 | 
					f596e3c491 | ||
| 
						 | 
					9fb523adce | ||
| 
						 | 
					cecf4d98d0 | ||
| 
						 | 
					070e40e2f5 | ||
| 
						 | 
					d757097bbc | ||
| 
						 | 
					7b112c2766 | ||
| 
						 | 
					03ee8c2ed7 | ||
| 
						 | 
					3495842bb0 | ||
| 
						 | 
					face65dab8 | ||
| 
						 | 
					e41a49c625 | ||
| 
						 | 
					3a55a42bff | ||
| 
						 | 
					72550c52ed | ||
| 
						 | 
					a9d0c56de1 | ||
| 
						 | 
					469bcb0c24 | ||
| 
						 | 
					43ce9cdde9 | ||
| 
						 | 
					011f89893c | ||
| 
						 | 
					958608ca1c | ||
| 
						 | 
					1aecb23f5b | ||
| 
						 | 
					9ed6fba2b4 | ||
| 
						 | 
					df5c435c0b | ||
| 
						 | 
					1ebaf97c44 | ||
| 
						 | 
					c8c6914aac | ||
| 
						 | 
					c99028f252 | ||
| 
						 | 
					90d8c5862b | ||
| 
						 | 
					2d5dd00f9e | ||
| 
						 | 
					cb52183836 | ||
| 
						 | 
					ab3b624b0c | ||
| 
						 | 
					7c81de9a91 | ||
| 
						 | 
					4dfac659ff | ||
| 
						 | 
					66e0f9db08 | ||
| 
						 | 
					a2eef41993 | ||
| 
						 | 
					9a8646510b | ||
| 
						 | 
					fa03d0117a | ||
| 
						 | 
					03614034e9 | ||
| 
						 | 
					444b1d416b | ||
| 
						 | 
					4055ca1f9e | ||
| 
						 | 
					7a216dfee5 | ||
| 
						 | 
					a78b21fc67 | ||
| 
						 | 
					a808002bc3 | ||
| 
						 | 
					2fc368c111 | ||
| 
						 | 
					6ed3af7d50 | ||
| 
						 | 
					d037e0d30c | ||
| 
						 | 
					51cb950904 | ||
| 
						 | 
					4bfa88bb4c | ||
| 
						 | 
					9d1e475db6 | ||
| 
						 | 
					3e792793f6 | ||
| 
						 | 
					ac5cb33356 | ||
| 
						 | 
					aaf74259ec | ||
| 
						 | 
					ecf9ceb90d | ||
| 
						 | 
					5c4ff8ad37 | ||
| 
						 | 
					dc427fc8e2 | ||
| 
						 | 
					e1e6c4dae7 | ||
| 
						 | 
					1747fd1cc6 | ||
| 
						 | 
					a119822b90 | ||
| 
						 | 
					8c798690ce | ||
| 
						 | 
					ea6bf26657 | ||
| 
						 | 
					4a26fd6e3b | ||
| 
						 | 
					dddb38834e | ||
| 
						 | 
					af7d6b936b | ||
| 
						 | 
					a64b8786b5 | ||
| 
						 | 
					25f93585a7 | ||
| 
						 | 
					0d5a49e150 | ||
| 
						 | 
					5c49a98c5e | ||
| 
						 | 
					869772ff08 | ||
| 
						 | 
					f2edf3181e | ||
| 
						 | 
					d6dc5c506a | ||
| 
						 | 
					eebd5e5dd7 | ||
| 
						 | 
					868b266451 | ||
| 
						 | 
					3fa23ff0f1 | ||
| 
						 | 
					c275fb091e | ||
| 
						 | 
					90c341c601 | ||
| 
						 | 
					52d0e1ca4e | ||
| 
						 | 
					c6f3386577 | ||
| 
						 | 
					cf65a07256 | ||
| 
						 | 
					051dc9db2b | ||
| 
						 | 
					93a886b45a | ||
| 
						 | 
					ec19082ecc | ||
| 
						 | 
					0eff7c7c88 | ||
| 
						 | 
					6c4b3514d7 | ||
| 
						 | 
					d84cca7447 | ||
| 
						 | 
					3a8b23bfd9 | ||
| 
						 | 
					63fe322160 | ||
| 
						 | 
					c808798013 | ||
| 
						 | 
					379f21ce5c | ||
| 
						 | 
					4f3b1b3eb9 | ||
| 
						 | 
					b49df9502e | ||
| 
						 | 
					4f8a706dc7 | ||
| 
						 | 
					7560f63909 | ||
| 
						 | 
					1dfb1b103c | ||
| 
						 | 
					6e1987ca1d | ||
| 
						 | 
					d307176931 | ||
| 
						 | 
					c391a74266 | ||
| 
						 | 
					65a87d3cc3 | ||
| 
						 | 
					b60b9e7afe | ||
| 
						 | 
					919834dc84 | ||
| 
						 | 
					efc17286f8 | ||
| 
						 | 
					acec5a6244 | ||
| 
						 | 
					68039af3e7 | ||
| 
						 | 
					da1247d653 | ||
| 
						 | 
					052d0358f2 | ||
| 
						 | 
					1b6ab411d3 | ||
| 
						 | 
					d88d98edd3 | ||
| 
						 | 
					741c9959f6 | ||
| 
						 | 
					7c23127fde | ||
| 
						 | 
					8b9722a3c0 | ||
| 
						 | 
					8c149cfd83 | ||
| 
						 | 
					6da498991c | ||
| 
						 | 
					86a66deb7e | ||
| 
						 | 
					9409e18179 | ||
| 
						 | 
					6a0b803fc0 | ||
| 
						 | 
					5fa3b54788 | ||
| 
						 | 
					07df5018be | ||
| 
						 | 
					1b9a59c36a | ||
| 
						 | 
					8f89c33451 | ||
| 
						 | 
					485d7d5904 | ||
| 
						 | 
					e3720888c7 | ||
| 
						 | 
					d75e384ff8 | ||
| 
						 | 
					c340c7a88c | ||
| 
						 | 
					9ecf6e93af | ||
| 
						 | 
					a41735288c | ||
| 
						 | 
					8ae78c6bd9 | ||
| 
						 | 
					cb3cec4adf | ||
| 
						 | 
					b0d6f3c58f | ||
| 
						 | 
					0338648426 | ||
| 
						 | 
					c7dc404188 | ||
| 
						 | 
					08853158b6 | ||
| 
						 | 
					74e0187663 | ||
| 
						 | 
					bb4aa95c81 | ||
| 
						 | 
					5117d50b7e | ||
| 
						 | 
					593605d3ec | ||
| 
						 | 
					c9ea4df8f9 | ||
| 
						 | 
					89ff56faf1 | ||
| 
						 | 
					9855026c43 | ||
| 
						 | 
					904348a492 | ||
| 
						 | 
					aaaa18392d | ||
| 
						 | 
					8c33e40d2e | ||
| 
						 | 
					0d04af1e72 | ||
| 
						 | 
					8f17495800 | ||
| 
						 | 
					95c1a24853 | ||
| 
						 | 
					08374de10f | ||
| 
						 | 
					506e70a216 | ||
| 
						 | 
					0cca92cdd3 | ||
| 
						 | 
					5b430cfc44 | ||
| 
						 | 
					171c4da568 | ||
| 
						 | 
					04611fb0f1 | ||
| 
						 | 
					df430489cf | ||
| 
						 | 
					5085e57fb5 | ||
| 
						 | 
					75b81247a0 | ||
| 
						 | 
					2c1a5c1039 | ||
| 
						 | 
					71c34b7f2d | ||
| 
						 | 
					b0cfaf58ad | ||
| 
						 | 
					9dc07f04c3 | ||
| 
						 | 
					f15c16200b | ||
| 
						 | 
					4e09add6f8 | ||
| 
						 | 
					355a6236be | ||
| 
						 | 
					6d7fa9c25c | ||
| 
						 | 
					82ae22ef4d | ||
| 
						 | 
					b56bae5126 | ||
| 
						 | 
					2d3f31e0a1 | ||
| 
						 | 
					ae74191e38 | ||
| 
						 | 
					ab8233ab81 | ||
| 
						 | 
					d5572bdc64 | ||
| 
						 | 
					e3990db59c | ||
| 
						 | 
					87d90528ac | ||
| 
						 | 
					e27711cfdd | ||
| 
						 | 
					28c08222c0 | ||
| 
						 | 
					8508a80998 | ||
| 
						 | 
					7850a8bc04 | ||
| 
						 | 
					fccec89084 | ||
| 
						 | 
					6c7fa27404 | ||
| 
						 | 
					e7f9c08ab8 | ||
| 
						 | 
					03c8441b14 | ||
| 
						 | 
					e887c4187e | ||
| 
						 | 
					933aee6199 | ||
| 
						 | 
					90e7f983b5 | ||
| 
						 | 
					f00962aaf3 | ||
| 
						 | 
					3eccd2e53a | ||
| 
						 | 
					fcd0e61c24 | ||
| 
						 | 
					e7a02b24c1 | ||
| 
						 | 
					cbe6bb54e6 | ||
| 
						 | 
					23966faca4 | ||
| 
						 | 
					514f1a7835 | ||
| 
						 | 
					af908bc48b | ||
| 
						 | 
					233ebcb543 | ||
| 
						 | 
					da0c007254 | ||
| 
						 | 
					01bc7dcafc | ||
| 
						 | 
					83e2ff8c51 | ||
| 
						 | 
					e3120586fb | ||
| 
						 | 
					3941aa12f1 | ||
| 
						 | 
					0c10cf0ad6 | ||
| 
						 | 
					62874a5a69 | ||
| 
						 | 
					8c1f9c56fd | ||
| 
						 | 
					75063c1527 | ||
| 
						 | 
					5de583aa91 | ||
| 
						 | 
					a0675d8149 | ||
| 
						 | 
					a7e9ed95ec | ||
| 
						 | 
					615d0edf1f | ||
| 
						 | 
					e775755dec | ||
| 
						 | 
					a1bf7de5a7 | ||
| 
						 | 
					047c02e8db | ||
| 
						 | 
					c92989d2b7 | ||
| 
						 | 
					039e7875ff | ||
| 
						 | 
					48b7b96bd0 | ||
| 
						 | 
					747b7a636a | ||
| 
						 | 
					635f56fabd | ||
| 
						 | 
					c617bc0054 | ||
| 
						 | 
					d215724753 | ||
| 
						 | 
					9c1ee1bed5 | ||
| 
						 | 
					14ef63c15e | ||
| 
						 | 
					5a456140c1 | ||
| 
						 | 
					1ff546737b | ||
| 
						 | 
					56f0b25754 | ||
| 
						 | 
					b0f78dc018 | ||
| 
						 | 
					1f2d194acf | ||
| 
						 | 
					aacfb2a2c6 | ||
| 
						 | 
					0ba304dd31 | ||
| 
						 | 
					8eb2da5fbb | ||
| 
						 | 
					d1896e8ccd | ||
| 
						 | 
					0edcb7a556 | ||
| 
						 | 
					ecc2c5d81a | ||
| 
						 | 
					441dec8e9f | ||
| 
						 | 
					4f566c360b | ||
| 
						 | 
					e10cd58090 | ||
| 
						 | 
					5c8ae6d93e | ||
| 
						 | 
					e72f7677bf | ||
| 
						 | 
					e815d72b1f | ||
| 
						 | 
					ddf918673d | ||
| 
						 | 
					8517d0c00d | ||
| 
						 | 
					8659dc73f4 | ||
| 
						 | 
					07464787a8 | ||
| 
						 | 
					e9a3aa9721 | ||
| 
						 | 
					a8cc9f1873 | ||
| 
						 | 
					f25c3c0542 | ||
| 
						 | 
					4e5b9645e8 | ||
| 
						 | 
					04347839ea | ||
| 
						 | 
					e14b8410ca | ||
| 
						 | 
					2a1ab7b438 | ||
| 
						 | 
					dd1e4fbcc0 | ||
| 
						 | 
					3f84d34c37 | ||
| 
						 | 
					d7e429b91d | ||
| 
						 | 
					155ef13c67 | ||
| 
						 | 
					c3466040ec | ||
| 
						 | 
					2d9be79407 | ||
| 
						 | 
					2e4b7eede3 | ||
| 
						 | 
					e1dee801b9 | ||
| 
						 | 
					3c53fd892c | ||
| 
						 | 
					c46990b13b | ||
| 
						 | 
					1510b1f4c2 | ||
| 
						 | 
					f8a69166ed | ||
| 
						 | 
					b9eef98883 | ||
| 
						 | 
					ae5c1ca377 | ||
| 
						 | 
					188ab7df98 | ||
| 
						 | 
					2e3d02fe1a | ||
| 
						 | 
					3a3a1af1da | ||
| 
						 | 
					0ced72c608 | ||
| 
						 | 
					5584a95490 | ||
| 
						 | 
					a3e66779d3 | ||
| 
						 | 
					919eab8a8b | ||
| 
						 | 
					e9baceab5a | ||
| 
						 | 
					b05561c4b7 | ||
| 
						 | 
					b7355af421 | ||
| 
						 | 
					0462eedf5e | ||
| 
						 | 
					82425f2c28 | ||
| 
						 | 
					af010edd55 | ||
| 
						 | 
					5966f4d973 | ||
| 
						 | 
					eeb486a5f4 | ||
| 
						 | 
					d7f55e76f2 | ||
| 
						 | 
					7d9e781a1d | ||
| 
						 | 
					e0c21a0b6b | ||
| 
						 | 
					1dfb4b9400 | ||
| 
						 | 
					e5cb774323 | ||
| 
						 | 
					73390e6ba5 | ||
| 
						 | 
					d91d9acc58 | ||
| 
						 | 
					820988a0c0 | ||
| 
						 | 
					1326a64a33 | ||
| 
						 | 
					e0da2c2ed2 | ||
| 
						 | 
					fb0a59cc58 | ||
| 
						 | 
					f5cd3561ba | ||
| 
						 | 
					115f7fa562 | ||
| 
						 | 
					c867d87180 | ||
| 
						 | 
					2a713eadc3 | ||
| 
						 | 
					2e7900b624 | ||
| 
						 | 
					f8435919a1 | ||
| 
						 | 
					1db4354b53 | ||
| 
						 | 
					3f233a1e77 | ||
| 
						 | 
					25917e972d | ||
| 
						 | 
					8812a81bdd | ||
| 
						 | 
					b17ffba915 | ||
| 
						 | 
					3619e34f50 | ||
| 
						 | 
					6924686b78 | ||
| 
						 | 
					92745f8116 | ||
| 
						 | 
					17cf9864e0 | ||
| 
						 | 
					5cfefd3ce3 | ||
| 
						 | 
					9ccc6f4382 | ||
| 
						 | 
					3c92471723 | ||
| 
						 | 
					1a932ae094 | ||
| 
						 | 
					57912ed329 | ||
| 
						 | 
					e998f8aeb8 | ||
| 
						 | 
					e318431e54 | ||
| 
						 | 
					6a10f38daa | ||
| 
						 | 
					c095078890 | ||
| 
						 | 
					c644b83227 | ||
| 
						 | 
					75f535315a | ||
| 
						 | 
					7c283d9e97 | ||
| 
						 | 
					2aa3ef78b6 | ||
| 
						 | 
					1c0964e87f | ||
| 
						 | 
					5c8d41be85 | ||
| 
						 | 
					b286640360 | ||
| 
						 | 
					75a8ff9263 | ||
| 
						 | 
					50b5966e57 | ||
| 
						 | 
					8eb4456f93 | ||
| 
						 | 
					24c45faba0 | ||
| 
						 | 
					010ac38a98 | ||
| 
						 | 
					1c25ed5dbb | ||
| 
						 | 
					bf1d32e52a | ||
| 
						 | 
					6c86b69729 | ||
| 
						 | 
					72dfff2d5e | ||
| 
						 | 
					3341b820cc | ||
| 
						 | 
					ede5f6cf74 | ||
| 
						 | 
					321a9fea75 | ||
| 
						 | 
					2e00f46b51 | ||
| 
						 | 
					8c3f868983 | ||
| 
						 | 
					d03cc94f47 | ||
| 
						 | 
					5477ff9ba2 | ||
| 
						 | 
					46b11600b0 | ||
| 
						 | 
					15387e4ce0 | ||
| 
						 | 
					49ef33fa34 | ||
| 
						 | 
					1166323530 | ||
| 
						 | 
					29113688a1 | ||
| 
						 | 
					44c970746f | ||
| 
						 | 
					bc200e691c | ||
| 
						 | 
					a08f8d73cc | ||
| 
						 | 
					b52f12b3ba | ||
| 
						 | 
					78b5d89ddf | ||
| 
						 | 
					b79df62eff | ||
| 
						 | 
					e3c76874ad | ||
| 
						 | 
					4347394a27 | ||
| 
						 | 
					53bb723834 | ||
| 
						 | 
					684a2264c5 | ||
| 
						 | 
					fde8dc1798 | ||
| 
						 | 
					3c87a2bdfa | ||
| 
						 | 
					1520e6c084 | ||
| 
						 | 
					2001129f09 | ||
| 
						 | 
					a50ecaee56 | ||
| 
						 | 
					67d9dcf003 | ||
| 
						 | 
					79dcae32ef | ||
| 
						 | 
					ccf6a19e2d | ||
| 
						 | 
					28fbbe3b1b | ||
| 
						 | 
					8d2dbe6ac0 | ||
| 
						 | 
					ba8bdea771 | ||
| 
						 | 
					3d9916298a | ||
| 
						 | 
					87054c4f0e | ||
| 
						 | 
					6660baee66 | ||
| 
						 | 
					25d4c9254c | ||
| 
						 | 
					44adfeb6c0 | ||
| 
						 | 
					5ff2ef79e6 | ||
| 
						 | 
					b762acadeb | ||
| 
						 | 
					7d779eefb4 | ||
| 
						 | 
					35b7757f9b | ||
| 
						 | 
					23195e4dcc | ||
| 
						 | 
					b28fbdfa7d | ||
| 
						 | 
					a897502cd9 | ||
| 
						 | 
					8546add692 | ||
| 
						 | 
					aa5c5eb4c1 | ||
| 
						 | 
					731abd3bd7 | ||
| 
						 | 
					7531dd18dc | ||
| 
						 | 
					04c32cddaa | ||
| 
						 | 
					623a5e24cb | ||
| 
						 | 
					bd9fc1d667 | ||
| 
						 | 
					c550f2e37b | ||
| 
						 | 
					484f876235 | ||
| 
						 | 
					c70a1fee71 | ||
| 
						 | 
					0b362de5f5 | ||
| 
						 | 
					d312f7be37 | ||
| 
						 | 
					2b5e5c3d08 | ||
| 
						 | 
					708454f010 | ||
| 
						 | 
					f1aec4dec3 | ||
| 
						 | 
					1c53a72f17 | ||
| 
						 | 
					9b157602e0 | ||
| 
						 | 
					67e217c84c | ||
| 
						 | 
					e6b650df0a | ||
| 
						 | 
					7b7b667ddc | ||
| 
						 | 
					70cd3c6b95 | ||
| 
						 | 
					db05bc512d | ||
| 
						 | 
					45da1efcdb | ||
| 
						 | 
					54a0076e94 | ||
| 
						 | 
					f8cab37bc1 | ||
| 
						 | 
					2e65277695 | ||
| 
						 | 
					9a1f59cd31 | ||
| 
						 | 
					4e72220fd6 | ||
| 
						 | 
					d65b8b2162 | ||
| 
						 | 
					5dca1e338c | ||
| 
						 | 
					5f4cf08864 | ||
| 
						 | 
					2a2e537983 | ||
| 
						 | 
					d79fc8da02 | ||
| 
						 | 
					e04ccbc5cc | ||
| 
						 | 
					bc946bfb97 | ||
| 
						 | 
					38680fa466 | ||
| 
						 | 
					a902b6bd98 | ||
| 
						 | 
					c5e91a9ae9 | ||
| 
						 | 
					b5f57f455a | ||
| 
						 | 
					ad00a52f2d | ||
| 
						 | 
					e08c7f15b4 | ||
| 
						 | 
					7469af4484 | ||
| 
						 | 
					ec76d850af | ||
| 
						 | 
					cedf19f356 | ||
| 
						 | 
					1d5f3f4640 | ||
| 
						 | 
					a060fc3b8e | ||
| 
						 | 
					bda5153703 | ||
| 
						 | 
					6f539399ef | ||
| 
						 | 
					d90bf2ab21 | ||
| 
						 | 
					02620cfcd5 | ||
| 
						 | 
					74daafaa94 | ||
| 
						 | 
					aa963813ed | ||
| 
						 | 
					9a6aff50ff | ||
| 
						 | 
					c7d16ac8da | ||
| 
						 | 
					b626f0396c | ||
| 
						 | 
					9d2006d8ed | ||
| 
						 | 
					abf1e32f2f | ||
| 
						 | 
					fc1e09bf81 | ||
| 
						 | 
					451cec33df | ||
| 
						 | 
					16c92916c7 | ||
| 
						 | 
					988037fe18 | ||
| 
						 | 
					9a7f80c869 | ||
| 
						 | 
					507e5c3a61 | ||
| 
						 | 
					f8b90b5a5d | ||
| 
						 | 
					dc14441757 | ||
| 
						 | 
					da8512aaff | ||
| 
						 | 
					d46a1a6178 | ||
| 
						 | 
					957c7c0e88 | ||
| 
						 | 
					3ebe87473c | ||
| 
						 | 
					0e05b51fe5 | ||
| 
						 | 
					c759e453bc | ||
| 
						 | 
					40ce8fca73 | ||
| 
						 | 
					8e1c33e160 | ||
| 
						 | 
					13b0cae256 | ||
| 
						 | 
					6d78a93b5b | ||
| 
						 | 
					ae92994645 | ||
| 
						 | 
					c4aa6b041b | ||
| 
						 | 
					80158304f0 | ||
| 
						 | 
					f0a069c1a2 | ||
| 
						 | 
					5b4b9ce976 | ||
| 
						 | 
					7fbcc2f24a | ||
| 
						 | 
					e4be79a383 | ||
| 
						 | 
					658604473f | ||
| 
						 | 
					86bea6455c | ||
| 
						 | 
					1e4a6e7b7f | ||
| 
						 | 
					fd6a72fa1c | ||
| 
						 | 
					ccffdb3fdc | ||
| 
						 | 
					74d89b0d93 | ||
| 
						 | 
					f142a71c3d | ||
| 
						 | 
					5b7af6de43 | ||
| 
						 | 
					ae414a0e42 | ||
| 
						 | 
					a240ea8ab8 | ||
| 
						 | 
					8b654459be | ||
| 
						 | 
					93cf058334 | ||
| 
						 | 
					3e8b4b5055 | ||
| 
						 | 
					3c56d65a41 | ||
| 
						 | 
					e51ec51af9 | ||
| 
						 | 
					ff1c55e983 | ||
| 
						 | 
					835d104f46 | ||
| 
						 | 
					aeba1ef352 | ||
| 
						 | 
					49e9f751a4 | ||
| 
						 | 
					ff46820da6 | ||
| 
						 | 
					6fba65e20d | ||
| 
						 | 
					68d2cf51bc | ||
| 
						 | 
					19eedffcaf | ||
| 
						 | 
					4e14996e8a | ||
| 
						 | 
					8a02a46a5c | ||
| 
						 | 
					0de5a0feee | ||
| 
						 | 
					4d321e0767 | ||
| 
						 | 
					67fda0c12e | ||
| 
						 | 
					1dded7f7e8 | ||
| 
						 | 
					482f238069 | ||
| 
						 | 
					5e145e54cc | ||
| 
						 | 
					df73e68a43 | ||
| 
						 | 
					e7c8483891 | ||
| 
						 | 
					712d523484 | ||
| 
						 | 
					24547c23ca | ||
| 
						 | 
					8baf604a39 | ||
| 
						 | 
					95416ce5b3 | ||
| 
						 | 
					a56f9a612b | ||
| 
						 | 
					0ae89cf32e | ||
| 
						 | 
					7e0c9630a3 | ||
| 
						 | 
					a6df6702c6 | ||
| 
						 | 
					f69abd5321 | ||
| 
						 | 
					fe9ce2b7d6 | ||
| 
						 | 
					8e7ccf6ff7 | ||
| 
						 | 
					51b77c0337 | ||
| 
						 | 
					85d179d4eb | ||
| 
						 | 
					890f5ada82 | ||
| 
						 | 
					1cc8410e36 | ||
| 
						 | 
					6ca7af9ec0 | ||
| 
						 | 
					bc2c8efc80 | ||
| 
						 | 
					00bb875240 | ||
| 
						 | 
					c3cb563d87 | ||
| 
						 | 
					d6ef8165bb | ||
| 
						 | 
					564a503b1b | ||
| 
						 | 
					56eeb1b28c | ||
| 
						 | 
					068fc255ac | ||
| 
						 | 
					cc8f2fb917 | ||
| 
						 | 
					b583ebb7dd | ||
| 
						 | 
					f897fe4146 | ||
| 
						 | 
					bb3add20f3 | ||
| 
						 | 
					48e0f6667b | ||
| 
						 | 
					32213fb25a | ||
| 
						 | 
					f6a1939f0f | ||
| 
						 | 
					94c666479d | ||
| 
						 | 
					09f17419a6 | ||
| 
						 | 
					eb8a65db16 | ||
| 
						 | 
					e6255a7d1e | ||
| 
						 | 
					65a0f68484 | ||
| 
						 | 
					e1a7db8fdd | ||
| 
						 | 
					65331f225a | ||
| 
						 | 
					64e8dc7981 | ||
| 
						 | 
					737fe7ea29 | ||
| 
						 | 
					b344a826ad | ||
| 
						 | 
					bc0f56d6d7 | ||
| 
						 | 
					3a89e9f106 | ||
| 
						 | 
					79e75e04ea | ||
| 
						 | 
					c3cb069108 | ||
| 
						 | 
					cdb41713a4 | ||
| 
						 | 
					491734eb21 | ||
| 
						 | 
					4e891a191d | ||
| 
						 | 
					b73a69a9c2 | ||
| 
						 | 
					e811eff5a9 | ||
| 
						 | 
					1d0c47fd55 | ||
| 
						 | 
					e46c807e4f | ||
| 
						 | 
					c132ca95c0 | ||
| 
						 | 
					6b870763ac | ||
| 
						 | 
					5505818199 | ||
| 
						 | 
					7493bcc659 | ||
| 
						 | 
					a068a1d0e3 | ||
| 
						 | 
					37b16c84bb | ||
| 
						 | 
					0ac89e8f54 | ||
| 
						 | 
					7e65b21a24 | ||
| 
						 | 
					736d69750d | ||
| 
						 | 
					0cb9dbed4e | ||
| 
						 | 
					6cfccfec33 | ||
| 
						 | 
					c523eb98d1 | ||
| 
						 | 
					0ffa49970b | ||
| 
						 | 
					8cd2ea552e | ||
| 
						 | 
					3f0becbf75 | ||
| 
						 | 
					1b0ae81f4a | ||
| 
						 | 
					54543b954c | ||
| 
						 | 
					5e2187f7ee | ||
| 
						 | 
					7b087bf4a9 | ||
| 
						 | 
					9df9c9d102 | ||
| 
						 | 
					7e8b5493a4 | ||
| 
						 | 
					265863c6a4 | ||
| 
						 | 
					2fee1e0666 | ||
| 
						 | 
					b4ff166cbc | ||
| 
						 | 
					861a0722c2 | ||
| 
						 | 
					b1cef8d984 | ||
| 
						 | 
					b911523977 | ||
| 
						 | 
					247c3f6049 | ||
| 
						 | 
					78c5d2a9bb | ||
| 
						 | 
					3bf4e14cc3 | ||
| 
						 | 
					d68d160cb7 | ||
| 
						 | 
					202cb42fbb | ||
| 
						 | 
					49f6cb968f | ||
| 
						 | 
					07e120b7da | ||
| 
						 | 
					f3dcae15ac | ||
| 
						 | 
					25ec498dc7 | ||
| 
						 | 
					9cc42cb091 | ||
| 
						 | 
					bcf9cf89e7 | ||
| 
						 | 
					f0729fc3e0 | ||
| 
						 | 
					8186c00ef3 | ||
| 
						 | 
					c0b31ccb87 | ||
| 
						 | 
					267c950c5f | ||
| 
						 | 
					ce1605b508 | ||
| 
						 | 
					66fdb1c0d4 | ||
| 
						 | 
					25bfdca16a | ||
| 
						 | 
					9c284f9651 | ||
| 
						 | 
					6d78c381f6 | ||
| 
						 | 
					784e2080df | ||
| 
						 | 
					70505bc334 | ||
| 
						 | 
					8e8b247341 | ||
| 
						 | 
					a8595879ec | ||
| 
						 | 
					33a688e806 | ||
| 
						 | 
					5c2bfad9b4 | ||
| 
						 | 
					250f979237 | ||
| 
						 | 
					b527b6e8ff | ||
| 
						 | 
					a54ce007e6 | ||
| 
						 | 
					4ed1f3490e | ||
| 
						 | 
					0a082e9b37 | ||
| 
						 | 
					236a99a409 | ||
| 
						 | 
					04b4363ec8 | ||
| 
						 | 
					37ebc20093 | ||
| 
						 | 
					cef781cc87 | ||
| 
						 | 
					08e4c7a967 | ||
| 
						 | 
					697e4edcad | ||
| 
						 | 
					b26297ca51 | ||
| 
						 | 
					6ca7dba0cf | ||
| 
						 | 
					f1fa05b407 | ||
| 
						 | 
					02e22c35fe | ||
| 
						 | 
					b935714237 | ||
| 
						 | 
					a8314df902 | ||
| 
						 | 
					0cd7a0325f | ||
| 
						 | 
					16b7c81d55 | ||
| 
						 | 
					424ba8b588 | ||
| 
						 | 
					bf493e8d62 | ||
| 
						 | 
					c714e43c8d | ||
| 
						 | 
					cdf9d6f6ed | ||
| 
						 | 
					cc4b48c27c | ||
| 
						 | 
					cac9c92cc0 | ||
| 
						 | 
					d40abf1689 | ||
| 
						 | 
					69e9c69e70 | ||
| 
						 | 
					c489ea7d01 | ||
| 
						 | 
					26c6857a59 | ||
| 
						 | 
					508bd3d1aa | ||
| 
						 | 
					8705846710 | ||
| 
						 | 
					c944a9696e | ||
| 
						 | 
					943cc09d8a | ||
| 
						 | 
					fc6800d19f | ||
| 
						 | 
					d06f047b04 | ||
| 
						 | 
					ddc899bada | ||
| 
						 | 
					bd479e25c7 | ||
| 
						 | 
					eaf5bd168e | ||
| 
						 | 
					d7ecc206ba | ||
| 
						 | 
					11ea212e8c | ||
| 
						 | 
					cb29d8c11f | ||
| 
						 | 
					adcea5a043 | ||
| 
						 | 
					f02f7c2c4a | ||
| 
						 | 
					a1e44cc14f | ||
| 
						 | 
					d2d09bf68c | ||
| 
						 | 
					e2dfb655f7 | ||
| 
						 | 
					463e76b63c | ||
| 
						 | 
					2dc4b0dbe8 | ||
| 
						 | 
					7b23c126e6 | ||
| 
						 | 
					25e3d2225a | ||
| 
						 | 
					c8e0b5d7b6 | ||
| 
						 | 
					4fb7e2b445 | ||
| 
						 | 
					9138e3c061 | ||
| 
						 | 
					9b2a29660b | ||
| 
						 | 
					b7b4a9fa57 | ||
| 
						 | 
					1fb07a7de8 | ||
| 
						 | 
					b9cbcaad58 | ||
| 
						 | 
					c6706a6f6c | ||
| 
						 | 
					958e6a75a1 | ||
| 
						 | 
					397977726c | ||
| 
						 | 
					285d9189c7 | ||
| 
						 | 
					767d3e0054 | ||
| 
						 | 
					409d2a1b71 | ||
| 
						 | 
					e0b9678d7f | ||
| 
						 | 
					166dea6ac8 | ||
| 
						 | 
					52bef4d677 | ||
| 
						 | 
					801e5ef840 | ||
| 
						 | 
					0044739ae5 | ||
| 
						 | 
					4e44bd3650 | ||
| 
						 | 
					0cffb0cd3e | ||
| 
						 | 
					aaa3850ccd | ||
| 
						 | 
					a17b5d5a4f | ||
| 
						 | 
					2f97765bc3 | ||
| 
						 | 
					3205ca8deb | ||
| 
						 | 
					1cb4d65b87 | ||
| 
						 | 
					7b2dd292bc | ||
| 
						 | 
					ab585551c0 | ||
| 
						 | 
					6cf0d7b999 | ||
| 
						 | 
					9d972207f0 | ||
| 
						 | 
					d9834ff24b | ||
| 
						 | 
					d9c3ba05e7 | ||
| 
						 | 
					03467ce6bd | ||
| 
						 | 
					6e750fcb1e | ||
| 
						 | 
					bd6941cfaa | ||
| 
						 | 
					578519edd0 | ||
| 
						 | 
					5c05f69450 | ||
| 
						 | 
					f529dca488 | ||
| 
						 | 
					296aca9dcf | ||
| 
						 | 
					b170703128 | ||
| 
						 | 
					b300fb7734 | ||
| 
						 | 
					f89af47438 | ||
| 
						 | 
					7bb4f8ff12 | ||
| 
						 | 
					7dd6407a4c | ||
| 
						 | 
					53de315b78 | ||
| 
						 | 
					e065e6cda2 | ||
| 
						 | 
					60553cc209 | ||
| 
						 | 
					2d4c9ab518 | ||
| 
						 | 
					50771f7ce3 | ||
| 
						 | 
					242f8d644c | ||
| 
						 | 
					f5575cd167 | ||
| 
						 | 
					dd0ddc3e78 | ||
| 
						 | 
					62308f3f4a | ||
| 
						 | 
					cecafcce94 | ||
| 
						 | 
					ca0efb7594 | ||
| 
						 | 
					1d05ff2779 | ||
| 
						 | 
					941811ccb9 | ||
| 
						 | 
					700384be8e | ||
| 
						 | 
					b8a22c40e0 | ||
| 
						 | 
					3918de9ad1 | ||
| 
						 | 
					96fe35e7d4 | ||
| 
						 | 
					e87afb1518 | ||
| 
						 | 
					7b467c6b81 | ||
| 
						 | 
					eb8ebafe87 | ||
| 
						 | 
					e559febaf1 | ||
| 
						 | 
					6bcc6d38c7 | ||
| 
						 | 
					8173960305 | ||
| 
						 | 
					f2e590942e | ||
| 
						 | 
					6a4b87eb9d | ||
| 
						 | 
					edcba19c23 | ||
| 
						 | 
					b140ae9137 | ||
| 
						 | 
					8ee0591f28 | ||
| 
						 | 
					97d0c596a1 | ||
| 
						 | 
					7454cba4fa | ||
| 
						 | 
					5713411893 | ||
| 
						 | 
					a0cf79e841 | ||
| 
						 | 
					825e1a7c56 | ||
| 
						 | 
					9f2b453338 | ||
| 
						 | 
					a0dce9be76 | ||
| 
						 | 
					cf2b938529 | ||
| 
						 | 
					62f685a9cd | ||
| 
						 | 
					2c7d978c2d | ||
| 
						 | 
					8cd897a42c | ||
| 
						 | 
					1dc44d3130 | ||
| 
						 | 
					2a6e3ef37e | ||
| 
						 | 
					115d528c23 | ||
| 
						 | 
					a310428527 | ||
| 
						 | 
					7e0fd45ce3 | ||
| 
						 | 
					b138ea54ee | ||
| 
						 | 
					d7125d8d85 | ||
| 
						 | 
					9c115a4acc | ||
| 
						 | 
					43716567f5 | ||
| 
						 | 
					0a8f00af34 | ||
| 
						 | 
					b1d7429186 | ||
| 
						 | 
					060a38a2c0 | ||
| 
						 | 
					58402976b4 | ||
| 
						 | 
					cd7b854bbb | ||
| 
						 | 
					aecc0756e8 | ||
| 
						 | 
					e6ccc6ed70 | ||
| 
						 | 
					e959a01fac | ||
| 
						 | 
					17674bfdf7 | ||
| 
						 | 
					d807d4c21f | ||
| 
						 | 
					b4690d2eab | ||
| 
						 | 
					886657a641 | ||
| 
						 | 
					db896db5a7 | ||
| 
						 | 
					2357ae17e7 | ||
| 
						 | 
					9f1c5491d2 | ||
| 
						 | 
					70b52222f5 | ||
| 
						 | 
					88cb59727c | ||
| 
						 | 
					781bfdc314 | ||
| 
						 | 
					b66723b23e | ||
| 
						 | 
					cf96d71c22 | ||
| 
						 | 
					1a111921da | ||
| 
						 | 
					5d9bb428bb | ||
| 
						 | 
					9833757b5d | ||
| 
						 | 
					4195343c0d | ||
| 
						 | 
					042bee4e5c | ||
| 
						 | 
					4afba1f3d9 | ||
| 
						 | 
					5999d45a5d | ||
| 
						 | 
					f69e5d6a19 | ||
| 
						 | 
					3517637702 | ||
| 
						 | 
					e2809bfb42 | ||
| 
						 | 
					68b33cc5c7 | ||
| 
						 | 
					4c02cf8ecc | ||
| 
						 | 
					271daaf768 | ||
| 
						 | 
					efbb7ee432 | ||
| 
						 | 
					6471ec71aa | ||
| 
						 | 
					cb45708061 | ||
| 
						 | 
					02597f2885 | ||
| 
						 | 
					8c6a514edf | ||
| 
						 | 
					7f3fdab793 | ||
| 
						 | 
					5372f5f989 | ||
| 
						 | 
					6d24c09a69 | ||
| 
						 | 
					a8d72c79db | ||
| 
						 | 
					1f713e0106 | ||
| 
						 | 
					03f84c8260 | ||
| 
						 | 
					6d5eb464c9 | ||
| 
						 | 
					67f8de9ab8 | ||
| 
						 | 
					2d95ceedc5 | ||
| 
						 | 
					6526d765fc | ||
| 
						 | 
					3d520f7c2d | ||
| 
						 | 
					9c37519b55 | ||
| 
						 | 
					7e9cfcd0dc | ||
| 
						 | 
					a99ce1f5b1 | ||
| 
						 | 
					42660b3cf1 | ||
| 
						 | 
					f30258c439 | ||
| 
						 | 
					93ff4c69f7 | ||
| 
						 | 
					79571bb1ca | ||
| 
						 | 
					f72c1a58cb | ||
| 
						 | 
					2461396f69 | ||
| 
						 | 
					81a071df2f | ||
| 
						 | 
					6841abe842 | ||
| 
						 | 
					cb70355d87 | ||
| 
						 | 
					b17442bb04 | ||
| 
						 | 
					4874e235fb | ||
| 
						 | 
					06afa6eb94 | ||
| 
						 | 
					58e4205d6c | ||
| 
						 | 
					733394d6dd | ||
| 
						 | 
					2de9558dea | ||
| 
						 | 
					6bd173fced | ||
| 
						 | 
					6b00cd746a | ||
| 
						 | 
					9309ea6617 | ||
| 
						 | 
					05c9e3aea5 | ||
| 
						 | 
					88bac3e664 | ||
| 
						 | 
					5473b6bc2f | ||
| 
						 | 
					38e408076e | ||
| 
						 | 
					dc100d87b5 | ||
| 
						 | 
					6f6b31dadc | ||
| 
						 | 
					b08b158b44 | ||
| 
						 | 
					177f27d71e | ||
| 
						 | 
					928bd9a149 | ||
| 
						 | 
					e53113b8ac | ||
| 
						 | 
					1fe83b4afe | ||
| 
						 | 
					e8f31f80d1 | ||
| 
						 | 
					56f5ab43c2 | ||
| 
						 | 
					370385571c | ||
| 
						 | 
					e34a303ce1 | ||
| 
						 | 
					36f120cd20 | ||
| 
						 | 
					0ae7c43fa5 | ||
| 
						 | 
					c0d2943952 | ||
| 
						 | 
					7d453a3b49 | ||
| 
						 | 
					cd447875e6 | ||
| 
						 | 
					692a94293c | ||
| 
						 | 
					efebb10829 | ||
| 
						 | 
					3c3f025923 | ||
| 
						 | 
					5ff6e2dfbb | ||
| 
						 | 
					61ac68f9f6 | ||
| 
						 | 
					7f1022a8b1 | ||
| 
						 | 
					edf6b025b1 | ||
| 
						 | 
					d799df36b3 | ||
| 
						 | 
					9e96812934 | ||
| 
						 | 
					91e97cbe4c | ||
| 
						 | 
					63ee3b32fe | ||
| 
						 | 
					4ff1a2da10 | ||
| 
						 | 
					4c3c975066 | ||
| 
						 | 
					ec5d74f868 | ||
| 
						 | 
					be0853358c | ||
| 
						 | 
					fea15b553d | ||
| 
						 | 
					88ef78745e | ||
| 
						 | 
					be79342515 | ||
| 
						 | 
					064a6176ac | ||
| 
						 | 
					84e7485bfb | ||
| 
						 | 
					f56f72f219 | ||
| 
						 | 
					2bfb23f102 | ||
| 
						 | 
					cf199fec52 | ||
| 
						 | 
					165c20c2c4 | ||
| 
						 | 
					625c6ba4c7 | ||
| 
						 | 
					a32bede701 | ||
| 
						 | 
					8ff5c8874f | ||
| 
						 | 
					c5d38fc262 | ||
| 
						 | 
					6b71970520 | ||
| 
						 | 
					0209e111f6 | ||
| 
						 | 
					dc01af7723 | ||
| 
						 | 
					5435d0412f | ||
| 
						 | 
					922ac25f64 | ||
| 
						 | 
					aed53d6c5a | ||
| 
						 | 
					61cdb9f36a | ||
| 
						 | 
					1acd042c85 | ||
| 
						 | 
					572712d82a | ||
| 
						 | 
					d1697a7556 | ||
| 
						 | 
					c8c6e9ecd9 | ||
| 
						 | 
					90f3e4cf05 | ||
| 
						 | 
					7bd8bf58bb | ||
| 
						 | 
					1190d3f442 | ||
| 
						 | 
					0e4f5cfbab | ||
| 
						 | 
					f1c8db9f8c | ||
| 
						 | 
					2c9abbd554 | ||
| 
						 | 
					2305ae5d8c | ||
| 
						 | 
					dec54bd0ba | ||
| 
						 | 
					aade369737 | ||
| 
						 | 
					2a5e042c70 | ||
| 
						 | 
					1dc4c8c727 | ||
| 
						 | 
					7ca035db88 | ||
| 
						 | 
					a460c42f94 | ||
| 
						 | 
					d16743e728 | ||
| 
						 | 
					4a29fa8caf | ||
| 
						 | 
					250bb54dba | ||
| 
						 | 
					847d05d0b4 | ||
| 
						 | 
					8315aa03fc | ||
| 
						 | 
					b7a4c480d6 | ||
| 
						 | 
					9a35faaa29 | ||
| 
						 | 
					fbe2e28911 | ||
| 
						 | 
					84968e25f3 | ||
| 
						 | 
					10fd0b7b55 | ||
| 
						 | 
					4a46dc6e5c | ||
| 
						 | 
					0ec55604c0 | ||
| 
						 | 
					500007c9ed | ||
| 
						 | 
					f75abba013 | ||
| 
						 | 
					dea113b428 | ||
| 
						 | 
					6abc406a69 | ||
| 
						 | 
					dcbe723bc5 | ||
| 
						 | 
					33c98a28ac | ||
| 
						 | 
					b2ddddfb20 | ||
| 
						 | 
					c24367ebb9 | ||
| 
						 | 
					7397b35379 | ||
| 
						 | 
					baee44c3de | ||
| 
						 | 
					1f2e4ecc30 | ||
| 
						 | 
					955e28006d | ||
| 
						 | 
					bf0736eb1f | ||
| 
						 | 
					3a5b97b7f1 | ||
| 
						 | 
					45bf825066 | ||
| 
						 | 
					4a18d5c89b | ||
| 
						 | 
					174b26c497 | ||
| 
						 | 
					5cacc82f61 | ||
| 
						 | 
					29a90816ff | ||
| 
						 | 
					4bea454021 | ||
| 
						 | 
					8bfd0ae4c4 | ||
| 
						 | 
					378943ce67 | ||
| 
						 | 
					c65d409afd | ||
| 
						 | 
					ed1bbe2cad | ||
| 
						 | 
					b0b3d09063 | ||
| 
						 | 
					0ede2af7a0 | ||
| 
						 | 
					e8d23f7811 | ||
| 
						 | 
					907cd7217e | ||
| 
						 | 
					7c402e5af3 | ||
| 
						 | 
					b8d78a5520 | ||
| 
						 | 
					dfa5862960 | ||
| 
						 | 
					4276908f51 | ||
| 
						 | 
					be23b71e87 | ||
| 
						 | 
					f851acbfff | ||
| 
						 | 
					78ef9b0205 | ||
| 
						 | 
					ed9b0e5cba | ||
| 
						 | 
					752c1a0ce9 | ||
| 
						 | 
					cc30415d0c | ||
| 
						 | 
					03e16611a3 | ||
| 
						 | 
					8e2f3c1c83 | ||
| 
						 | 
					b6d63b2516 | ||
| 
						 | 
					e6b88d02bd | ||
| 
						 | 
					125060ca63 | ||
| 
						 | 
					b4baca9261 | ||
| 
						 | 
					6342b6e332 | ||
| 
						 | 
					a6dc77822b | ||
| 
						 | 
					59bc67052b | ||
| 
						 | 
					c090562828 | ||
| 
						 | 
					69e2ec63c5 | ||
| 
						 | 
					f610a516a0 | ||
| 
						 | 
					2e51a4caa3 | ||
| 
						 | 
					c6fa97a6d6 | ||
| 
						 | 
					24d7159abd | ||
| 
						 | 
					7978dc989d | ||
| 
						 | 
					d99e6b5014 | ||
| 
						 | 
					2cf40fc2b8 | ||
| 
						 | 
					260d08b814 | ||
| 
						 | 
					53dd05d8f6 | ||
| 
						 | 
					fbe7055370 | ||
| 
						 | 
					a5b386205f | ||
| 
						 | 
					916bcab28e | ||
| 
						 | 
					c7373c3dee | ||
| 
						 | 
					9f2c8eb2a1 | ||
| 
						 | 
					65300dcfb0 | ||
| 
						 | 
					9ddc574f9a | ||
| 
						 | 
					2dd9e67874 | ||
| 
						 | 
					f93b03a5e6 | ||
| 
						 | 
					55a47cd30f | ||
| 
						 | 
					5792219d1d | ||
| 
						 | 
					293c58c1e7 | ||
| 
						 | 
					9f375a752e | ||
| 
						 | 
					04dc5a9ca6 | ||
| 
						 | 
					ae6cb5483e | ||
| 
						 | 
					a168ec1d27 | ||
| 
						 | 
					2a35144327 | ||
| 
						 | 
					7207eca1ee | ||
| 
						 | 
					9c34782478 | ||
| 
						 | 
					20e6d22709 | ||
| 
						 | 
					24dd0c61ef | ||
| 
						 | 
					565c15363c | ||
| 
						 | 
					ed67f7b7a7 | ||
| 
						 | 
					6ea8d138d3 | ||
| 
						 | 
					4159ac43aa | ||
| 
						 | 
					419b09b053 | ||
| 
						 | 
					88530f6b76 | ||
| 
						 | 
					a8cb8177f6 | ||
| 
						 | 
					277f8a34f4 | ||
| 
						 | 
					4dde470865 | ||
| 
						 | 
					ab08405984 | ||
| 
						 | 
					b81fde02aa | ||
| 
						 | 
					57dd2ea808 | ||
| 
						 | 
					7043fa702f | ||
| 
						 | 
					f98d2e5cc1 | ||
| 
						 | 
					1a5538251f | ||
| 
						 | 
					f4ddbb5ad1 | ||
| 
						 | 
					74bf705ea8 | ||
| 
						 | 
					676cd3a283 | ||
| 
						 | 
					c6ead3cdd3 | ||
| 
						 | 
					2d53648ce7 | ||
| 
						 | 
					64ca6ac26b | ||
| 
						 | 
					4fe4c00eca | ||
| 
						 | 
					376838a606 | ||
| 
						 | 
					d768a816aa | ||
| 
						 | 
					766e0cb7d1 | ||
| 
						 | 
					6a6b0c8b51 | ||
| 
						 | 
					e24b01cc6f | ||
| 
						 | 
					7f9ef5621a | ||
| 
						 | 
					d7fc9ffc51 | ||
| 
						 | 
					39348038df | ||
| 
						 | 
					9472baae0d | ||
| 
						 | 
					ae17b9ecd5 | ||
| 
						 | 
					74096890ba | ||
| 
						 | 
					889c2282a5 | ||
| 
						 | 
					dca30c44f5 | ||
| 
						 | 
					f2c358c6ce | ||
| 
						 | 
					2ab42de1ec | ||
| 
						 | 
					ac2024ccbf | ||
| 
						 | 
					93164a7d64 | ||
| 
						 | 
					ecff2e5ce1 | ||
| 
						 | 
					c9d630dab6 | ||
| 
						 | 
					d135906dbc | ||
| 
						 | 
					9f427a52cb | ||
| 
						 | 
					5a39d3a838 | ||
| 
						 | 
					013f3d999f | ||
| 
						 | 
					64d30d7adc | ||
| 
						 | 
					7062cb56a9 | ||
| 
						 | 
					9d57828d66 | ||
| 
						 | 
					9ed8dee71b | ||
| 
						 | 
					4692b3345d | ||
| 
						 | 
					e59fb00735 | ||
| 
						 | 
					9275853084 | ||
| 
						 | 
					0c81aa29f9 | ||
| 
						 | 
					01d2e27a2b | ||
| 
						 | 
					dd7aadf7b2 | ||
| 
						 | 
					b2fdf501c5 | ||
| 
						 | 
					345e515735 | ||
| 
						 | 
					945982b0b2 | ||
| 
						 | 
					18ad9cbd10 | ||
| 
						 | 
					f433a75569 | ||
| 
						 | 
					b05389c825 | ||
| 
						 | 
					68875fdf32 | ||
| 
						 | 
					3393e0c02c | ||
| 
						 | 
					a149b2466e | ||
| 
						 | 
					13e230d505 | ||
| 
						 | 
					80b3d7a3c9 | ||
| 
						 | 
					4bd48de60c | ||
| 
						 | 
					2eab92f8e3 | ||
| 
						 | 
					2bbd82cf24 | ||
| 
						 | 
					1bfd3d7f58 | ||
| 
						 | 
					cd77b3e88b | ||
| 
						 | 
					8c93c4dd42 | ||
| 
						 | 
					45d63a5408 | ||
| 
						 | 
					decef971f4 | ||
| 
						 | 
					a288aaefc4 | ||
| 
						 | 
					eed56c77b4 | ||
| 
						 | 
					346601bc32 | ||
| 
						 | 
					5080fbbef0 | ||
| 
						 | 
					b5b724348d | ||
| 
						 | 
					c3ee90d8ca | ||
| 
						 | 
					e1435034ae | ||
| 
						 | 
					bf35c5dc7f | ||
| 
						 | 
					c42d223ac2 | ||
| 
						 | 
					d5654d2b20 | ||
| 
						 | 
					a7508fec1a | ||
| 
						 | 
					c31945e682 | ||
| 
						 | 
					d3203b931e | ||
| 
						 | 
					947f4e90c3 | ||
| 
						 | 
					d184c7b271 | ||
| 
						 | 
					913488c066 | ||
| 
						 | 
					7fa27d9ac6 | ||
| 
						 | 
					c341b9cce5 | ||
| 
						 | 
					bbbf0d45ba | ||
| 
						 | 
					114c402d9e | ||
| 
						 | 
					d51519eba4 | ||
| 
						 | 
					e650f9988b | ||
| 
						 | 
					8ed8454115 | ||
| 
						 | 
					6e101bebb1 | ||
| 
						 | 
					4577b38d22 | ||
| 
						 | 
					a8515e2d28 | ||
| 
						 | 
					964e91052e | ||
| 
						 | 
					4e55e69bff | ||
| 
						 | 
					e501dbb658 | ||
| 
						 | 
					20e505e4b7 | ||
| 
						 | 
					291a26e6e3 | ||
| 
						 | 
					0383911887 | ||
| 
						 | 
					a5c5eb77b5 | ||
| 
						 | 
					90d02be7c5 | ||
| 
						 | 
					04221983ac | ||
| 
						 | 
					dfda027ae8 | ||
| 
						 | 
					21b5a79121 | ||
| 
						 | 
					411a388c62 | ||
| 
						 | 
					61c10d42f6 | ||
| 
						 | 
					68ecfb69a5 | ||
| 
						 | 
					e62fee8eb3 | ||
| 
						 | 
					5566d49103 | ||
| 
						 | 
					48337a4a35 | ||
| 
						 | 
					2c5c4fca14 | ||
| 
						 | 
					4fab95ed20 | ||
| 
						 | 
					6c36ca4628 | ||
| 
						 | 
					9c61c57896 | ||
| 
						 | 
					a618011ca1 | ||
| 
						 | 
					95eef4df79 | ||
| 
						 | 
					ec1e714ac1 | ||
| 
						 | 
					736d658080 | ||
| 
						 | 
					aa2920584e | ||
| 
						 | 
					9d13bfc258 | ||
| 
						 | 
					e43633011c | ||
| 
						 | 
					97027f7fb3 | ||
| 
						 | 
					bf5adc9be4 | ||
| 
						 | 
					7665b436f0 | ||
| 
						 | 
					ffca7b85c2 | ||
| 
						 | 
					eef2fa00d9 | ||
| 
						 | 
					c55551ad7c | ||
| 
						 | 
					c91b521111 | ||
| 
						 | 
					deb35e3e2c | ||
| 
						 | 
					5e2d3c9ec1 | ||
| 
						 | 
					dda454434b | ||
| 
						 | 
					b97d371ce0 | ||
| 
						 | 
					a25c98ac73 | ||
| 
						 | 
					fd47013111 | ||
| 
						 | 
					b3aa469c21 | ||
| 
						 | 
					981c0de27a | ||
| 
						 | 
					1bfe9acbbf | ||
| 
						 | 
					2d1e9ce753 | ||
| 
						 | 
					19043426b9 | ||
| 
						 | 
					6e21ce592e | ||
| 
						 | 
					975c6efbe4 | ||
| 
						 | 
					972491aece | ||
| 
						 | 
					1a8ecda3ee | ||
| 
						 | 
					d36c7b618d | ||
| 
						 | 
					251431ff4f | ||
| 
						 | 
					1a3052793e | ||
| 
						 | 
					84fbc56fd0 | ||
| 
						 | 
					4444ff7632 | ||
| 
						 | 
					7770da4b41 | ||
| 
						 | 
					7202a4d42b | ||
| 
						 | 
					3fa29765fd | ||
| 
						 | 
					b9e468c163 | ||
| 
						 | 
					0172ad2902 | ||
| 
						 | 
					d9aa352ff0 | ||
| 
						 | 
					945ba0300d | ||
| 
						 | 
					9e15cc606e | ||
| 
						 | 
					e011160f3c | ||
| 
						 | 
					9447da5065 | ||
| 
						 | 
					387ed39f6d | ||
| 
						 | 
					e50e5f9336 | ||
| 
						 | 
					6f0d9950f3 | ||
| 
						 | 
					4705ff7d6d | ||
| 
						 | 
					36778eb231 | ||
| 
						 | 
					c6dd154b3e | ||
| 
						 | 
					74b5feea7b | ||
| 
						 | 
					35cae95032 | ||
| 
						 | 
					11a36aa96f | ||
| 
						 | 
					9b0e97ae10 | ||
| 
						 | 
					02ba02604c | ||
| 
						 | 
					42ecf418f5 | ||
| 
						 | 
					48ce525d16 | ||
| 
						 | 
					3081e2ca73 | ||
| 
						 | 
					48ae85b6ff | ||
| 
						 | 
					82281ce47d | ||
| 
						 | 
					4ecd2bafbb | ||
| 
						 | 
					308b9ad8f0 | ||
| 
						 | 
					73b408c242 | ||
| 
						 | 
					51c9eb321a | ||
| 
						 | 
					1657fca2f4 | ||
| 
						 | 
					0d25aad90d | ||
| 
						 | 
					b8c1cb1c2c | ||
| 
						 | 
					6e1d44fd56 | ||
| 
						 | 
					528ff4b451 | ||
| 
						 | 
					f6c29ba3dc | ||
| 
						 | 
					160f9b5bf6 | ||
| 
						 | 
					53e7985c8d | ||
| 
						 | 
					9102342795 | ||
| 
						 | 
					c4488936b2 | ||
| 
						 | 
					4e2b990734 | ||
| 
						 | 
					6ca1418587 | ||
| 
						 | 
					30dd06812e | ||
| 
						 | 
					b29b89ef21 | ||
| 
						 | 
					81ae27d56a | ||
| 
						 | 
					f90bf72280 | ||
| 
						 | 
					abcf7aa591 | ||
| 
						 | 
					40b6d49387 | ||
| 
						 | 
					497b4f92d2 | ||
| 
						 | 
					28566b4966 | ||
| 
						 | 
					b4b15f68c0 | ||
| 
						 | 
					1eb1cf452b | ||
| 
						 | 
					c549810def | ||
| 
						 | 
					0d0ed9187a | ||
| 
						 | 
					dfa81d9efb | ||
| 
						 | 
					1dba06e7b0 | ||
| 
						 | 
					daac87be95 | ||
| 
						 | 
					e97359435e | ||
| 
						 | 
					afce9bcca1 | ||
| 
						 | 
					9c7baca820 | ||
| 
						 | 
					618265e645 | ||
| 
						 | 
					9728978b75 | ||
| 
						 | 
					938c0bbae1 | ||
| 
						 | 
					a0cd818831 | ||
| 
						 | 
					31c4ab5401 | ||
| 
						 | 
					1f65529824 | ||
| 
						 | 
					5b3a6eedd1 | ||
| 
						 | 
					6938440d68 | ||
| 
						 | 
					57ec6c9bad | ||
| 
						 | 
					7a09bc4068 | ||
| 
						 | 
					deb15645a8 | ||
| 
						 | 
					f0b358e8b9 | ||
| 
						 | 
					dce2b5a8fc | ||
| 
						 | 
					59d100d959 | ||
| 
						 | 
					d497b5362b | ||
| 
						 | 
					369b0abdc2 | ||
| 
						 | 
					72240ab31a | ||
| 
						 | 
					dc4e1ddc9f | ||
| 
						 | 
					ff656346fa | ||
| 
						 | 
					ca91057d50 | ||
| 
						 | 
					8c1e7de6cb | ||
| 
						 | 
					207886cd3a | ||
| 
						 | 
					336d1ee733 | ||
| 
						 | 
					bed2b769f5 | ||
| 
						 | 
					26029d9c4c | ||
| 
						 | 
					c64c888929 | ||
| 
						 | 
					8d9db41880 | ||
| 
						 | 
					4fae54a8e0 | ||
| 
						 | 
					9f35928719 | ||
| 
						 | 
					c5af032df5 | ||
| 
						 | 
					8a898a6fcc | ||
| 
						 | 
					9f827ded1c | ||
| 
						 | 
					5daa9411a0 | ||
| 
						 | 
					094d4019b8 | ||
| 
						 | 
					1507f3abba | ||
| 
						 | 
					30e8defe52 | ||
| 
						 | 
					9f4dd3e3e3 | ||
| 
						 | 
					8c00014d7e | ||
| 
						 | 
					1cf12a6350 | ||
| 
						 | 
					dc9461e23f | ||
| 
						 | 
					72d57050df | ||
| 
						 | 
					49d1f665a4 | ||
| 
						 | 
					2c25edc4c1 | ||
| 
						 | 
					d2f098b33d | ||
| 
						 | 
					6f4f7f35f3 | ||
| 
						 | 
					0a4fe6c8db | ||
| 
						 | 
					7bba401d5d | ||
| 
						 | 
					c73cff12f1 | ||
| 
						 | 
					b32d93840e | ||
| 
						 | 
					cb457849fd | ||
| 
						 | 
					cb3c30059a | ||
| 
						 | 
					20dc93e49e | ||
| 
						 | 
					b620447dcc | ||
| 
						 | 
					4ffd2ad1d3 | ||
| 
						 | 
					acc9938ba5 | ||
| 
						 | 
					f6d13ac8cf | ||
| 
						 | 
					24cb653c6b | ||
| 
						 | 
					6dfd3cf68e | ||
| 
						 | 
					073775cbbb | ||
| 
						 | 
					e995d5044e | ||
| 
						 | 
					5b0a79a27a | ||
| 
						 | 
					6747de655e | ||
| 
						 | 
					91bad2b09e | ||
| 
						 | 
					1244d5b713 | ||
| 
						 | 
					c0ed5cd47b | ||
| 
						 | 
					c8281fd38e | ||
| 
						 | 
					fe8e6bff9b | ||
| 
						 | 
					9caf25d144 | ||
| 
						 | 
					348620c7ac | ||
| 
						 | 
					30fc2ab92b | ||
| 
						 | 
					5b5464d525 | ||
| 
						 | 
					cd15a0528f | ||
| 
						 | 
					7b52778eff | ||
| 
						 | 
					162de2f2b5 | ||
| 
						 | 
					f6e4af6fd7 | ||
| 
						 | 
					32b76dcdac | ||
| 
						 | 
					bcfd252052 | ||
| 
						 | 
					32c452779e | ||
| 
						 | 
					118b90c59e | ||
| 
						 | 
					f6a61b140e | ||
| 
						 | 
					75ece4b5cf | ||
| 
						 | 
					724cca4178 | ||
| 
						 | 
					5b3fdb0181 | ||
| 
						 | 
					fcc3d0265d | ||
| 
						 | 
					5356ea7cde | ||
| 
						 | 
					06226df1a9 | ||
| 
						 | 
					bf638ef026 | ||
| 
						 | 
					07973d5db8 | ||
| 
						 | 
					3b3f71121b | ||
| 
						 | 
					47333a34d5 | ||
| 
						 | 
					d92138f703 | ||
| 
						 | 
					b2bf335327 | ||
| 
						 | 
					33bec62a20 | ||
| 
						 | 
					2e630b1847 | ||
| 
						 | 
					002d3fe863 | ||
| 
						 | 
					fb24311e7c | ||
| 
						 | 
					90278430d9 | ||
| 
						 | 
					bcd9d12a8d | ||
| 
						 | 
					79363339b7 | ||
| 
						 | 
					fbe2c6b33e | ||
| 
						 | 
					fc11f47229 | ||
| 
						 | 
					2b23d89d14 | ||
| 
						 | 
					9cfa3cff54 | ||
| 
						 | 
					6507653e72 | ||
| 
						 | 
					7fe747d1eb | ||
| 
						 | 
					32567c9f3b | ||
| 
						 | 
					4f3d52fedc | ||
| 
						 | 
					8321bab39c | ||
| 
						 | 
					989238802a | ||
| 
						 | 
					9051fc538f | ||
| 
						 | 
					03fd7f27db | ||
| 
						 | 
					45d6a15ae9 | ||
| 
						 | 
					6c6ca18664 | ||
| 
						 | 
					97fe2b40c1 | ||
| 
						 | 
					f689ab5017 | ||
| 
						 | 
					edb7cac271 | ||
| 
						 | 
					81d87a2a28 | ||
| 
						 | 
					7366f0b304 | ||
| 
						 | 
					1d8fa09c80 | ||
| 
						 | 
					e085e6c84c | ||
| 
						 | 
					008fa4584d | ||
| 
						 | 
					c8c49133d9 | ||
| 
						 | 
					961f1dea06 | ||
| 
						 | 
					1700426256 | ||
| 
						 | 
					aa7f5baad2 | ||
| 
						 | 
					45acdd6f6d | ||
| 
						 | 
					8b354e776b | ||
| 
						 | 
					868f5e44ca | ||
| 
						 | 
					4e5fdd11ea | ||
| 
						 | 
					d552a3391a | ||
| 
						 | 
					d023b4e2dd | ||
| 
						 | 
					fa79cc9c23 | ||
| 
						 | 
					06daa75fb9 | ||
| 
						 | 
					ffa304c838 | ||
| 
						 | 
					df21765a3e | ||
| 
						 | 
					5a6ae115f8 | ||
| 
						 | 
					5e5df40b9b | ||
| 
						 | 
					6d4943e81f | ||
| 
						 | 
					57cffe901f | ||
| 
						 | 
					a758f61793 | ||
| 
						 | 
					b3b35df2a2 | ||
| 
						 | 
					5ad50246fc | ||
| 
						 | 
					d89b895cfd | ||
| 
						 | 
					d793c292cb | ||
| 
						 | 
					57749b1b9f | ||
| 
						 | 
					1cdb7854a5 | ||
| 
						 | 
					704d33b347 | ||
| 
						 | 
					b2a7515ee8 | ||
| 
						 | 
					f4f2b52995 | ||
| 
						 | 
					c7d5edbf5e | ||
| 
						 | 
					d8f07f1674 | ||
| 
						 | 
					78bfb45b07 | ||
| 
						 | 
					6ad4d60555 | ||
| 
						 | 
					2fad8aa209 | ||
| 
						 | 
					74397d45b2 | ||
| 
						 | 
					c8ca769d3b | ||
| 
						 | 
					25d42c17e3 | ||
| 
						 | 
					a377811f15 | ||
| 
						 | 
					ef1b6b2cf2 | ||
| 
						 | 
					1699389a46 | ||
| 
						 | 
					ad8ee3d7d1 | ||
| 
						 | 
					39f0a4d8e9 | ||
| 
						 | 
					15a9821cc2 | ||
| 
						 | 
					53e97e7433 | ||
| 
						 | 
					bc0ecd202a | ||
| 
						 | 
					b307daa23f | ||
| 
						 | 
					4c95b1bfda | ||
| 
						 | 
					9359fc5ff2 | ||
| 
						 | 
					a238d7d1eb | ||
| 
						 | 
					0e92313331 | ||
| 
						 | 
					3e719c99f5 | ||
| 
						 | 
					2a4d0dcb89 | ||
| 
						 | 
					2e155fde39 | ||
| 
						 | 
					9a8c8cb22e | ||
| 
						 | 
					04aa7441ab | ||
| 
						 | 
					28dc54f6d9 | ||
| 
						 | 
					a1e1165200 | ||
| 
						 | 
					ddba003d5e | ||
| 
						 | 
					e59d9a34c9 | ||
| 
						 | 
					9e198c4bd0 | ||
| 
						 | 
					7eceffbfef | ||
| 
						 | 
					8043f01b13 | ||
| 
						 | 
					41c0f68630 | ||
| 
						 | 
					2c627637c5 | ||
| 
						 | 
					58f4b3511e | ||
| 
						 | 
					93fac08ec3 | ||
| 
						 | 
					23c3bee970 | ||
| 
						 | 
					73ff97ad76 | ||
| 
						 | 
					0d8ffc2007 | ||
| 
						 | 
					a32f7fb832 | ||
| 
						 | 
					496cf69e40 | ||
| 
						 | 
					eb17330837 | ||
| 
						 | 
					2708603bb4 | ||
| 
						 | 
					e4f1cda7de | ||
| 
						 | 
					4359b88bbe | ||
| 
						 | 
					c079fde3f7 | ||
| 
						 | 
					6e94156199 | ||
| 
						 | 
					1f67a3a985 | ||
| 
						 | 
					4cba294d79 | ||
| 
						 | 
					e642fd7a1c | ||
| 
						 | 
					5448e6739c | ||
| 
						 | 
					f0389d8d37 | ||
| 
						 | 
					a5313cf360 | ||
| 
						 | 
					b26c45b033 | ||
| 
						 | 
					986093affa | ||
| 
						 | 
					f88e0acb0e | ||
| 
						 | 
					aed461b431 | ||
| 
						 | 
					8bbd0e826c | ||
| 
						 | 
					40c45f86d4 | ||
| 
						 | 
					a0b7277724 | ||
| 
						 | 
					54bc369ad7 | ||
| 
						 | 
					2d3855fc6e | ||
| 
						 | 
					1cd47f5f6e | ||
| 
						 | 
					675564835c | ||
| 
						 | 
					2456cd58c4 | ||
| 
						 | 
					43a107026d | ||
| 
						 | 
					ef0498a00b | ||
| 
						 | 
					f1784f2fd2 | ||
| 
						 | 
					730f5752ff | ||
| 
						 | 
					a88c73b43a | ||
| 
						 | 
					a6d204e241 | ||
| 
						 | 
					941baf6641 | ||
| 
						 | 
					b41a614686 | ||
| 
						 | 
					aac751832a | ||
| 
						 | 
					52a08e90d1 | ||
| 
						 | 
					6b5f0458fe | ||
| 
						 | 
					b52a2738d4 | ||
| 
						 | 
					10f99d7b77 | ||
| 
						 | 
					593222afe1 | ||
| 
						 | 
					7b1856e5a1 | ||
| 
						 | 
					3d5d81bf39 | ||
| 
						 | 
					50f06b46f4 | ||
| 
						 | 
					be6076c0ad | ||
| 
						 | 
					6125e07d79 | ||
| 
						 | 
					d5b8c46499 | ||
| 
						 | 
					7805e23588 | ||
| 
						 | 
					9117b9d17a | ||
| 
						 | 
					e274c8fb72 | ||
| 
						 | 
					e8dbd66e2b | ||
| 
						 | 
					8b9b23603f | ||
| 
						 | 
					aefb9dc5e5 | ||
| 
						 | 
					a8c1b19a31 | ||
| 
						 | 
					29c8d2a54a | ||
| 
						 | 
					87827be0c2 | ||
| 
						 | 
					e4572e5210 | ||
| 
						 | 
					3e8e12a6b6 | ||
| 
						 | 
					5ddbb8f41a | ||
| 
						 | 
					3c44e92bcb | ||
| 
						 | 
					5e8d95f590 | ||
| 
						 | 
					2156704924 | ||
| 
						 | 
					4e49aa0ca3 | ||
| 
						 | 
					d5d1c53735 | ||
| 
						 | 
					1aac5c0ee8 | ||
| 
						 | 
					4434328b0a | ||
| 
						 | 
					9b2cfb890c | ||
| 
						 | 
					b2f364ec62 | ||
| 
						 | 
					b7aeb4c9b5 | ||
| 
						 | 
					370f48da2a | ||
| 
						 | 
					32def77ace | ||
| 
						 | 
					531c81ece8 | ||
| 
						 | 
					73582b8117 | ||
| 
						 | 
					5c33091cfa | ||
| 
						 | 
					56327ebe6a | ||
| 
						 | 
					e0031b1c78 | ||
| 
						 | 
					b2ac5cb2d0 | ||
| 
						 | 
					6757ef89b3 | ||
| 
						 | 
					bf6eea6536 | ||
| 
						 | 
					ec4346f6f9 | ||
| 
						 | 
					e42ff486a8 | ||
| 
						 | 
					bc9058d041 | ||
| 
						 | 
					4a276f3039 | ||
| 
						 | 
					acf47d8f24 | ||
| 
						 | 
					f62d1ea3d5 | ||
| 
						 | 
					f923bba73c | ||
| 
						 | 
					e3738c49b8 | ||
| 
						 | 
					41746da8c2 | ||
| 
						 | 
					23b97c6bb5 | ||
| 
						 | 
					4a7f7171f5 | ||
| 
						 | 
					961092281f | ||
| 
						 | 
					036b3f331b | ||
| 
						 | 
					9ac5c355a2 | ||
| 
						 | 
					3d0b604c14 | ||
| 
						 | 
					257b2bfb6c | ||
| 
						 | 
					90528846e8 | ||
| 
						 | 
					32509c9731 | ||
| 
						 | 
					d3f940833d | ||
| 
						 | 
					b335e351d4 | ||
| 
						 | 
					67bcde9ba8 | ||
| 
						 | 
					169bfde4d4 | ||
| 
						 | 
					0a7f291268 | ||
| 
						 | 
					0c2c2e71a6 | ||
| 
						 | 
					d1d746afb4 | ||
| 
						 | 
					db6e41f0ed | ||
| 
						 | 
					5b2b60ae98 | ||
| 
						 | 
					c90a1ae0c9 | ||
| 
						 | 
					c679fb298e | ||
| 
						 | 
					17c7cad545 | ||
| 
						 | 
					164c263b5c | ||
| 
						 | 
					a9bb9d0eb4 | ||
| 
						 | 
					cc6688d796 | ||
| 
						 | 
					9b1f24df3d | ||
| 
						 | 
					595e804ae3 | ||
| 
						 | 
					b381e9b952 | ||
| 
						 | 
					28418076b2 | ||
| 
						 | 
					abdfdb029e | ||
| 
						 | 
					8465b81d50 | ||
| 
						 | 
					ed65b6e512 | ||
| 
						 | 
					d793544518 | ||
| 
						 | 
					53480a673b | ||
| 
						 | 
					ad187f8905 | ||
| 
						 | 
					2280f82fc6 | ||
| 
						 | 
					e6714faffb | ||
| 
						 | 
					af8f2bb174 | ||
| 
						 | 
					d7501c16bf | ||
| 
						 | 
					804196a418 | ||
| 
						 | 
					50d70c01d6 | ||
| 
						 | 
					9fc601cfbb | ||
| 
						 | 
					fed5333248 | ||
| 
						 | 
					3d1dab4404 | ||
| 
						 | 
					29c2fd46d2 | ||
| 
						 | 
					a3d5cdb07c | ||
| 
						 | 
					d99c0f6b4a | ||
| 
						 | 
					43f21e62aa | ||
| 
						 | 
					50425bc137 | ||
| 
						 | 
					0c690586e0 | ||
| 
						 | 
					bc8c5fe58d | ||
| 
						 | 
					0cc0db32e3 | ||
| 
						 | 
					d68f7641a3 | ||
| 
						 | 
					4fcbaa3dd9 | ||
| 
						 | 
					5e56584285 | ||
| 
						 | 
					ca26ccb083 | ||
| 
						 | 
					3e8b713b06 | ||
| 
						 | 
					13eca7d782 | ||
| 
						 | 
					af3d4e1b02 | ||
| 
						 | 
					80afb40ae3 | ||
| 
						 | 
					3333428b44 | ||
| 
						 | 
					a131de9bb2 | ||
| 
						 | 
					0ddd002f60 | ||
| 
						 | 
					e7209103e6 | ||
| 
						 | 
					53f062d050 | ||
| 
						 | 
					b5b65403a4 | ||
| 
						 | 
					1a3914fe0c | ||
| 
						 | 
					b7e3cb31a5 | ||
| 
						 | 
					9769137a43 | ||
| 
						 | 
					c0688f1aef | ||
| 
						 | 
					6c29853bf2 | ||
| 
						 | 
					2e9802b7a7 | ||
| 
						 | 
					7483896e15 | ||
| 
						 | 
					4b4f249e0d | ||
| 
						 | 
					196dcf93bc | ||
| 
						 | 
					2c11ec308b | ||
| 
						 | 
					e5eb96c83a | ||
| 
						 | 
					54ed003ace | ||
| 
						 | 
					f18e10253d | ||
| 
						 | 
					c9add317a9 | ||
| 
						 | 
					6d1741030b | ||
| 
						 | 
					b8dc932c05 | ||
| 
						 | 
					17f8d8db61 | ||
| 
						 | 
					38437fa135 | ||
| 
						 | 
					82f35daaaf | ||
| 
						 | 
					b529bba4bf | ||
| 
						 | 
					dde33ea9c3 | ||
| 
						 | 
					cb0d89705b | ||
| 
						 | 
					f49353b42f | ||
| 
						 | 
					573c61dcde | ||
| 
						 | 
					51f38e6c2d | ||
| 
						 | 
					2de213732a | ||
| 
						 | 
					3798c36686 | ||
| 
						 | 
					209abea1db | ||
| 
						 | 
					250705e7b5 | ||
| 
						 | 
					5a96822f2c | ||
| 
						 | 
					23b34259e0 | ||
| 
						 | 
					11b6cb8aae | ||
| 
						 | 
					a4bade7aac | ||
| 
						 | 
					e322b5d167 | ||
| 
						 | 
					01af4edcfe | ||
| 
						 | 
					ff0945cbdc | ||
| 
						 | 
					d5ec7d66a8 | ||
| 
						 | 
					dc0aebabe6 | ||
| 
						 | 
					52828ca214 | ||
| 
						 | 
					757e9886a0 | ||
| 
						 | 
					f45e8c7bdd | ||
| 
						 | 
					ea904b4074 | ||
| 
						 | 
					ec6158d029 | ||
| 
						 | 
					4386445c18 | ||
| 
						 | 
					a585aa6750 | ||
| 
						 | 
					2475a52061 | ||
| 
						 | 
					001dfac061 | ||
| 
						 | 
					1b37c55e26 | ||
| 
						 | 
					3442781798 | ||
| 
						 | 
					c9d3f123a6 | ||
| 
						 | 
					d069a4d15d | ||
| 
						 | 
					f1ad8fb627 | ||
| 
						 | 
					d7406b1528 | ||
| 
						 | 
					02ce897e80 | ||
| 
						 | 
					0bd9d3a60e | ||
| 
						 | 
					b4c81fb6db | ||
| 
						 | 
					0f566bda2b | ||
| 
						 | 
					f97a8149cd | ||
| 
						 | 
					f4b6a3e9c0 | ||
| 
						 | 
					7dfae89768 | ||
| 
						 | 
					d41ca3f0e2 | ||
| 
						 | 
					65fc4c55be | ||
| 
						 | 
					5135d6b985 | ||
| 
						 | 
					2202edeff0 | ||
| 
						 | 
					c8f759ec74 | ||
| 
						 | 
					5fda10c6f1 | ||
| 
						 | 
					11ba084e1b | ||
| 
						 | 
					cddd00166c | ||
| 
						 | 
					0190aa7353 | ||
| 
						 | 
					1546de87f0 | ||
| 
						 | 
					affffaed3d | ||
| 
						 | 
					0c644f1462 | ||
| 
						 | 
					a2da5c7daa | ||
| 
						 | 
					c155d83f5b | ||
| 
						 | 
					5a03e3ac3f | ||
| 
						 | 
					08b2097967 | ||
| 
						 | 
					15401859b5 | ||
| 
						 | 
					6f24165170 | ||
| 
						 | 
					a8afd9382c | ||
| 
						 | 
					caddf00d78 | ||
| 
						 | 
					e105098b3f | ||
| 
						 | 
					9852e7e4d7 | ||
| 
						 | 
					b855560192 | ||
| 
						 | 
					f2f50efea3 | ||
| 
						 | 
					2b3cd246e5 | ||
| 
						 | 
					7171ade2c2 | ||
| 
						 | 
					76ec9151d1 | ||
| 
						 | 
					6c24dd9005 | ||
| 
						 | 
					e323afb0ce | ||
| 
						 | 
					1fd43fd86e | ||
| 
						 | 
					3e70c81ed9 | ||
| 
						 | 
					6e07229564 | ||
| 
						 | 
					859d5eb2d7 | ||
| 
						 | 
					29b0c4a01c | ||
| 
						 | 
					b824f0f458 | ||
| 
						 | 
					43ea53a04a | ||
| 
						 | 
					fa07f00aaf | ||
| 
						 | 
					dbb834ffeb | ||
| 
						 | 
					8549a8a5dc | ||
| 
						 | 
					887c250852 | ||
| 
						 | 
					710c1c34d1 | ||
| 
						 | 
					e16818108f | ||
| 
						 | 
					0cb76e79df | ||
| 
						 | 
					6cb419673e | ||
| 
						 | 
					72d668c332 | ||
| 
						 | 
					5ce4799a38 | ||
| 
						 | 
					6178da0142 | ||
| 
						 | 
					27713e3fc2 | ||
| 
						 | 
					3492c47b18 | ||
| 
						 | 
					43dc001b62 | ||
| 
						 | 
					8280b43a62 | ||
| 
						 | 
					85d9b02d16 | ||
| 
						 | 
					bfd502f027 | ||
| 
						 | 
					f1ed5fa827 | ||
| 
						 | 
					5bb9e1b4d4 | ||
| 
						 | 
					7de819237d | ||
| 
						 | 
					6cfab29b71 | ||
| 
						 | 
					55708796af | ||
| 
						 | 
					7074f1df07 | ||
| 
						 | 
					67d8ab07e6 | ||
| 
						 | 
					4e63da0669 | ||
| 
						 | 
					15b0a5651c | ||
| 
						 | 
					4e66723517 | ||
| 
						 | 
					3e53c86001 | ||
| 
						 | 
					524e5b844b | ||
| 
						 | 
					e1f09dfd84 | ||
| 
						 | 
					f16411ccfd | ||
| 
						 | 
					2bbcd45b05 | ||
| 
						 | 
					fdc6c6ef08 | ||
| 
						 | 
					6e87cc8da6 | ||
| 
						 | 
					2d0b6c72b8 | ||
| 
						 | 
					3e84046f90 | ||
| 
						 | 
					cc1cb996f1 | ||
| 
						 | 
					32fbeacdfb | ||
| 
						 | 
					431aad3c15 | ||
| 
						 | 
					0454f2c490 | ||
| 
						 | 
					5f911774bf | ||
| 
						 | 
					66b7e42790 | ||
| 
						 | 
					6a419388fc | ||
| 
						 | 
					abda7c1147 | ||
| 
						 | 
					88b48dc680 | ||
| 
						 | 
					661d35dfb2 | ||
| 
						 | 
					f99c9daa39 | ||
| 
						 | 
					019b3f3e5a | ||
| 
						 | 
					d6584eba8c | ||
| 
						 | 
					a379c433a3 | ||
| 
						 | 
					006c7c6bb1 | ||
| 
						 | 
					bd4a902a15 | ||
| 
						 | 
					17ae5e9f13 | ||
| 
						 | 
					baa5f52422 | ||
| 
						 | 
					b3620451b2 | ||
| 
						 | 
					d2f17d9615 | ||
| 
						 | 
					561cbe5678 | ||
| 
						 | 
					756d2074b8 | ||
| 
						 | 
					c65db618bb | ||
| 
						 | 
					8355647403 | ||
| 
						 | 
					b839d73411 | ||
| 
						 | 
					4563c1e043 | ||
| 
						 | 
					11f35a036d | ||
| 
						 | 
					d8646dab14 | ||
| 
						 | 
					47b3cd98f2 | ||
| 
						 | 
					27c7e53882 | ||
| 
						 | 
					b2b28803fb | ||
| 
						 | 
					8e92b1b9ce | ||
| 
						 | 
					0f41ccf370 | ||
| 
						 | 
					c44544a1d7 | ||
| 
						 | 
					4e50f02638 | ||
| 
						 | 
					174ea15647 | ||
| 
						 | 
					18f8258a87 | ||
| 
						 | 
					376bbb5887 | ||
| 
						 | 
					2c8275409e | ||
| 
						 | 
					892582b541 | ||
| 
						 | 
					57b53c1b0a | ||
| 
						 | 
					004c3ca521 | ||
| 
						 | 
					f0f00f9272 | ||
| 
						 | 
					a243c68736 | ||
| 
						 | 
					467d9f2a34 | ||
| 
						 | 
					226a94963a | ||
| 
						 | 
					d7f0d147b1 | ||
| 
						 | 
					26902b9aad | ||
| 
						 | 
					3c69d6bec4 | ||
| 
						 | 
					4f44677a41 | ||
| 
						 | 
					88d9f669c5 | ||
| 
						 | 
					22e1421672 | ||
| 
						 | 
					5409414eff | ||
| 
						 | 
					7134507de0 | ||
| 
						 | 
					fe41d9853c | ||
| 
						 | 
					d07692cd96 | ||
| 
						 | 
					82ae57136b | ||
| 
						 | 
					30baeaaeab | ||
| 
						 | 
					87a0f4b92e | ||
| 
						 | 
					1b08bcbfe3 | ||
| 
						 | 
					346b1001eb | ||
| 
						 | 
					b61a84c8e6 | ||
| 
						 | 
					a543ea44bc | ||
| 
						 | 
					b0dd3d1b94 | ||
| 
						 | 
					461be68b75 | ||
| 
						 | 
					21fb688d26 | ||
| 
						 | 
					d8faad27b7 | ||
| 
						 | 
					dab7075946 | ||
| 
						 | 
					dfc8e96daa | ||
| 
						 | 
					71d3eaf358 | ||
| 
						 | 
					ef6b25be63 | ||
| 
						 | 
					b452f43322 | ||
| 
						 | 
					52891f832f | ||
| 
						 | 
					9990cb75c1 | ||
| 
						 | 
					a5cc69c7ae | ||
| 
						 | 
					0b4b8ba64e | ||
| 
						 | 
					268e78c305 | ||
| 
						 | 
					c900a78c99 | ||
| 
						 | 
					46ffb2dc97 | ||
| 
						 | 
					10acacb3bf | ||
| 
						 | 
					aab790a656 | ||
| 
						 | 
					1319aad994 | ||
| 
						 | 
					3c0ce01cea | ||
| 
						 | 
					9fcbefebdb | ||
| 
						 | 
					017d2a887f | ||
| 
						 | 
					0416482605 | ||
| 
						 | 
					0f17424918 | ||
| 
						 | 
					55ed10db21 | ||
| 
						 | 
					3877b6bfe9 | ||
| 
						 | 
					a0f32454b6 | ||
| 
						 | 
					6fda4d7e5d | ||
| 
						 | 
					36a252ea46 | ||
| 
						 | 
					a31a195246 | ||
| 
						 | 
					5f590d2218 | ||
| 
						 | 
					791b7bc715 | ||
| 
						 | 
					19ae090787 | ||
| 
						 | 
					db3076621b | ||
| 
						 | 
					9ae5743515 | ||
| 
						 | 
					c184b140df | ||
| 
						 | 
					9d80aa7e3f | ||
| 
						 | 
					15671a90a9 | ||
| 
						 | 
					0048464449 | ||
| 
						 | 
					b422166ce0 | ||
| 
						 | 
					81be661ae2 | ||
| 
						 | 
					8681c66eec | ||
| 
						 | 
					69a0034e50 | ||
| 
						 | 
					c9a1778134 | ||
| 
						 | 
					326794e9c6 | ||
| 
						 | 
					2dd5ca1fbc | ||
| 
						 | 
					3042945ac8 | ||
| 
						 | 
					da29b0d335 | ||
| 
						 | 
					6abbc68188 | ||
| 
						 | 
					25f6c7fd8b | ||
| 
						 | 
					1cf3571ea4 | ||
| 
						 | 
					d769e7a58c | ||
| 
						 | 
					fa3619f233 | ||
| 
						 | 
					a414cbcad3 | ||
| 
						 | 
					c6196da587 | ||
| 
						 | 
					5d48762647 | ||
| 
						 | 
					77e749405d | ||
| 
						 | 
					9ccd4e224f | ||
| 
						 | 
					1dad4f3672 | ||
| 
						 | 
					59745556b4 | ||
| 
						 | 
					fab4447179 | ||
| 
						 | 
					417b8d4705 | ||
| 
						 | 
					e614ec4769 | ||
| 
						 | 
					a6b03f4138 | ||
| 
						 | 
					809fa4cc59 | ||
| 
						 | 
					463f448595 | ||
| 
						 | 
					5cd0cf8cce | ||
| 
						 | 
					49cb959494 | ||
| 
						 | 
					783a73c47f | ||
| 
						 | 
					99bf516908 | ||
| 
						 | 
					a26c372cfc | ||
| 
						 | 
					ed5ac22e5b | ||
| 
						 | 
					3d11b8f896 | ||
| 
						 | 
					2840dcd2a6 | ||
| 
						 | 
					bd5770c6b1 | ||
| 
						 | 
					a9c5de8654 | ||
| 
						 | 
					837685c522 | 
@@ -3,6 +3,8 @@ libcrypto.pc
 | 
			
		||||
libssl.pc
 | 
			
		||||
MINFO
 | 
			
		||||
makefile.one
 | 
			
		||||
tmp
 | 
			
		||||
out
 | 
			
		||||
outinc
 | 
			
		||||
rehash.time
 | 
			
		||||
testlog
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										82
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
			
		||||
# Object files
 | 
			
		||||
*.o
 | 
			
		||||
 | 
			
		||||
# editor artefacts
 | 
			
		||||
*.swp
 | 
			
		||||
.#*
 | 
			
		||||
#*#
 | 
			
		||||
*~
 | 
			
		||||
 | 
			
		||||
# Top level excludes
 | 
			
		||||
/Makefile.bak
 | 
			
		||||
/Makefile
 | 
			
		||||
/MINFO
 | 
			
		||||
/*.a
 | 
			
		||||
/include
 | 
			
		||||
/*.pc
 | 
			
		||||
/rehash.time
 | 
			
		||||
/inc.*
 | 
			
		||||
/makefile.*
 | 
			
		||||
/out.*
 | 
			
		||||
/tmp.*
 | 
			
		||||
 | 
			
		||||
# Most *.c files under test/ are symlinks
 | 
			
		||||
/test/*.c
 | 
			
		||||
# Apart from these
 | 
			
		||||
!/test/asn1test.c
 | 
			
		||||
!/test/methtest.c
 | 
			
		||||
!/test/dummytest.c
 | 
			
		||||
!/test/igetest.c
 | 
			
		||||
!/test/r160test.c
 | 
			
		||||
!/test/fips_algvs.c
 | 
			
		||||
 | 
			
		||||
/test/*.ss
 | 
			
		||||
/test/*.srl
 | 
			
		||||
/test/.rnd
 | 
			
		||||
/test/test*.pem
 | 
			
		||||
/test/newkey.pem
 | 
			
		||||
 | 
			
		||||
# Certificate symbolic links
 | 
			
		||||
*.0
 | 
			
		||||
 | 
			
		||||
# Links under apps
 | 
			
		||||
/apps/CA.pl
 | 
			
		||||
/apps/md4.c
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Auto generated headers
 | 
			
		||||
/crypto/buildinf.h
 | 
			
		||||
/crypto/opensslconf.h
 | 
			
		||||
 | 
			
		||||
# Auto generated assembly language source files
 | 
			
		||||
*.s
 | 
			
		||||
!/crypto/bn/asm/pa-risc2.s
 | 
			
		||||
!/crypto/bn/asm/pa-risc2W.s
 | 
			
		||||
 | 
			
		||||
# Executables
 | 
			
		||||
/apps/openssl
 | 
			
		||||
/test/sha256t
 | 
			
		||||
/test/sha512t
 | 
			
		||||
/test/*test
 | 
			
		||||
/test/fips_aesavs
 | 
			
		||||
/test/fips_desmovs
 | 
			
		||||
/test/fips_dhvs
 | 
			
		||||
/test/fips_drbgvs
 | 
			
		||||
/test/fips_dssvs
 | 
			
		||||
/test/fips_ecdhvs
 | 
			
		||||
/test/fips_ecdsavs
 | 
			
		||||
/test/fips_rngvs
 | 
			
		||||
/test/fips_test_suite
 | 
			
		||||
*.so*
 | 
			
		||||
*.dylib*
 | 
			
		||||
*.dll*
 | 
			
		||||
# Exceptions
 | 
			
		||||
!/test/bctest
 | 
			
		||||
!/crypto/des/times/486-50.sol
 | 
			
		||||
 | 
			
		||||
# Misc auto generated files
 | 
			
		||||
/tools/c_rehash
 | 
			
		||||
/test/evptests.txt
 | 
			
		||||
lib
 | 
			
		||||
Makefile.save
 | 
			
		||||
*.bak
 | 
			
		||||
							
								
								
									
										826
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										826
									
								
								CHANGES
									
									
									
									
									
								
							@@ -2,255 +2,499 @@
 | 
			
		||||
 OpenSSL CHANGES
 | 
			
		||||
 _______________
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.1 and 1.1.0  [xx XXX xxxx]
 | 
			
		||||
 Changes between 1.0.1f and 1.0.2 [xx XXX xxxx]
 | 
			
		||||
 | 
			
		||||
  *) Add flag to EC_KEY to use cofactor ECDH if set.
 | 
			
		||||
  *) Use algorithm specific chains in SSL_CTX_use_certificate_chain_file():
 | 
			
		||||
     this fixes a limiation in previous versions of OpenSSL.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Update fips_test_suite to support multiple command line options. New
 | 
			
		||||
     test to induce all self test errors in sequence and check expected
 | 
			
		||||
     failures.
 | 
			
		||||
  *) TLS pad extension: draft-agl-tls-padding-02
 | 
			
		||||
 | 
			
		||||
     Workaround for the "TLS hang bug" (see FAQ and PR#2771): if the
 | 
			
		||||
     TLS client Hello record length value would otherwise be > 255 and
 | 
			
		||||
     less that 512 pad with a dummy extension containing zeroes so it
 | 
			
		||||
     is at least 512 bytes long.
 | 
			
		||||
 | 
			
		||||
     To enable it use an unused extension number (for example chrome uses
 | 
			
		||||
     35655) using:
 | 
			
		||||
 | 
			
		||||
     e.g. -DTLSEXT_TYPE_padding=35655
 | 
			
		||||
 | 
			
		||||
     Since the extension is ignored the actual number doesn't matter as long
 | 
			
		||||
     as it doesn't clash with any existing extension.
 | 
			
		||||
 | 
			
		||||
     This will be updated when the extension gets an official number.
 | 
			
		||||
 | 
			
		||||
     [Adam Langley, Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Extended RSA OAEP support via EVP_PKEY API. Options to specify digest,
 | 
			
		||||
     MGF1 digest and OAEP label.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add FIPS_{rsa,dsa,ecdsa}_{sign,verify} functions which digest and
 | 
			
		||||
     sign or verify all in one operation.
 | 
			
		||||
  *) Add callbacks supporting generation and retrieval of supplemental
 | 
			
		||||
     data entries.
 | 
			
		||||
     [Scott Deboy <sdeboy@apache.org>, Trevor Perrin and Ben Laurie]
 | 
			
		||||
 | 
			
		||||
  *) Add EVP support for key wrapping algorithms, to avoid problems with
 | 
			
		||||
     existing code the flag EVP_CIPHER_CTX_WRAP_ALLOW has to be set in
 | 
			
		||||
     the EVP_CIPHER_CTX or an error is returned. Add AES and DES3 wrap
 | 
			
		||||
     algorithms and include tests cases.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add fips_algvs: a multicall fips utility incorporaing all the algorithm
 | 
			
		||||
     test programs and fips_test_suite. Includes functionality to parse
 | 
			
		||||
     the minimal script output of fipsalgest.pl directly.
 | 
			
		||||
  *) Add functions to allocate and set the fields of an ECDSA_METHOD
 | 
			
		||||
     structure.
 | 
			
		||||
     [Douglas E. Engert, Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add option SSL_OP_SAFARI_ECDHE_ECDSA_BUG (part of SSL_OP_ALL) which
 | 
			
		||||
     avoids preferring ECDHE-ECDSA ciphers when the client appears to be
 | 
			
		||||
     Safari on OS X.  Safari on OS X 10.8..10.8.3 advertises support for
 | 
			
		||||
     several ECDHE-ECDSA ciphers, but fails to negotiate them.  The bug
 | 
			
		||||
     is fixed in OS X 10.8.4, but Apple have ruled out both hot fixing
 | 
			
		||||
     10.8..10.8.3 and forcing users to upgrade to 10.8.4 or newer.
 | 
			
		||||
     [Rob Stradling, Adam Langley]
 | 
			
		||||
 | 
			
		||||
  *) New functions OPENSSL_gmtime_diff and ASN1_TIME_diff to find the
 | 
			
		||||
     difference in days and seconds between two tm or ASN1_TIME structures.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add authorisation parameter to FIPS_module_mode_set().
 | 
			
		||||
  *) Add -rev test option to s_server to just reverse order of characters
 | 
			
		||||
     received by client and send back to server. Also prints an abbreviated
 | 
			
		||||
     summary of the connection parameters.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add FIPS selftest for ECDH algorithm using P-224 and B-233 curves.
 | 
			
		||||
  *) New option -brief for s_client and s_server to print out a brief summary
 | 
			
		||||
     of connection parameters.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Use separate DRBG fields for internal and external flags. New function
 | 
			
		||||
     FIPS_drbg_health_check() to perform on demand health checking. Add
 | 
			
		||||
     generation tests to fips_test_suite with reduced health check interval to 
 | 
			
		||||
     demonstrate periodic health checking. Add "nodh" option to
 | 
			
		||||
     fips_test_suite to skip very slow DH test.
 | 
			
		||||
  *) Add callbacks for arbitrary TLS extensions.
 | 
			
		||||
     [Trevor Perrin <trevp@trevp.net> and Ben Laurie]
 | 
			
		||||
 | 
			
		||||
  *) New option -crl_download in several openssl utilities to download CRLs
 | 
			
		||||
     from CRLDP extension in certificates.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) New function FIPS_get_cipherbynid() to lookup FIPS supported ciphers
 | 
			
		||||
     based on NID.
 | 
			
		||||
  *) New options -CRL and -CRLform for s_client and s_server for CRLs.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) More extensive health check for DRBG checking many more failure modes.
 | 
			
		||||
     New function FIPS_selftest_drbg_all() to handle every possible DRBG
 | 
			
		||||
     combination: call this in fips_test_suite.
 | 
			
		||||
  *) New function X509_CRL_diff to generate a delta CRL from the difference
 | 
			
		||||
     of two full CRLs. Add support to "crl" utility.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add support for Dual EC DRBG from SP800-90. Update DRBG algorithm test
 | 
			
		||||
     and POST to handle Dual EC cases.
 | 
			
		||||
  *) New functions to set lookup_crls function and to retrieve
 | 
			
		||||
     X509_STORE from X509_STORE_CTX.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add support for canonical generation of DSA parameter 'g'. See 
 | 
			
		||||
     FIPS 186-3 A.2.3.
 | 
			
		||||
 | 
			
		||||
  *) Add support for HMAC DRBG from SP800-90. Update DRBG algorithm test and
 | 
			
		||||
     POST to handle HMAC cases.
 | 
			
		||||
  *) Print out deprecated issuer and subject unique ID fields in
 | 
			
		||||
     certificates.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add functions FIPS_module_version() and FIPS_module_version_text()
 | 
			
		||||
     to return numberical and string versions of the FIPS module number.
 | 
			
		||||
  *) Extend OCSP I/O functions so they can be used for simple general purpose
 | 
			
		||||
     HTTP as well as OCSP. New wrapper function which can be used to download
 | 
			
		||||
     CRLs using the OCSP API.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Rename FIPS_mode_set and FIPS_mode to FIPS_module_mode_set and
 | 
			
		||||
     FIPS_module_mode. FIPS_mode and FIPS_mode_set will be implmeneted
 | 
			
		||||
     outside the validated module in the FIPS capable OpenSSL.
 | 
			
		||||
  *) Delegate command line handling in s_client/s_server to SSL_CONF APIs.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Minor change to DRBG entropy callback semantics. In some cases
 | 
			
		||||
     there is no mutiple of the block length between min_len and
 | 
			
		||||
     max_len. Allow the callback to return more than max_len bytes
 | 
			
		||||
     of entropy but discard any extra: it is the callback's responsibility
 | 
			
		||||
     to ensure that the extra data discarded does not impact the
 | 
			
		||||
     requested amount of entropy.
 | 
			
		||||
  *) SSL_CONF* functions. These provide a common framework for application
 | 
			
		||||
     configuration using configuration files or command lines.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add PRNG security strength checks to RSA, DSA and ECDSA using 
 | 
			
		||||
     information in FIPS186-3, SP800-57 and SP800-131A.
 | 
			
		||||
  *) SSL/TLS tracing code. This parses out SSL/TLS records using the
 | 
			
		||||
     message callback and prints the results. Needs compile time option
 | 
			
		||||
     "enable-ssl-trace". New options to s_client and s_server to enable
 | 
			
		||||
     tracing.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) CCM support via EVP. Interface is very similar to GCM case except we
 | 
			
		||||
     must supply all data in one chunk (i.e. no update, final) and the
 | 
			
		||||
     message length must be supplied if AAD is used. Add algorithm test
 | 
			
		||||
     support.
 | 
			
		||||
  *) New ctrl and macro to retrieve supported points extensions.
 | 
			
		||||
     Print out extension in s_server and s_client.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initial version of POST overhaul. Add POST callback to allow the status
 | 
			
		||||
     of POST to be monitored and/or failures induced. Modify fips_test_suite
 | 
			
		||||
     to use callback. Always run all selftests even if one fails.
 | 
			
		||||
  *) New functions to retrieve certificate signature and signature
 | 
			
		||||
     OID NID.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) XTS support including algorithm test driver in the fips_gcmtest program.
 | 
			
		||||
     Note: this does increase the maximum key length from 32 to 64 bytes but
 | 
			
		||||
     there should be no binary compatibility issues as existing applications
 | 
			
		||||
     will never use XTS mode.
 | 
			
		||||
  *) Add functions to retrieve and manipulate the raw cipherlist sent by a
 | 
			
		||||
     client to OpenSSL.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Extensive reorganisation of FIPS PRNG behaviour. Remove all dependencies
 | 
			
		||||
     to OpenSSL RAND code and replace with a tiny FIPS RAND API which also
 | 
			
		||||
     performs algorithm blocking for unapproved PRNG types. Also do not
 | 
			
		||||
     set PRNG type in FIPS_mode_set(): leave this to the application.
 | 
			
		||||
     Add default OpenSSL DRBG handling: sets up FIPS PRNG and seeds with
 | 
			
		||||
     the standard OpenSSL PRNG: set additional data to a date time vector.
 | 
			
		||||
  *) New Suite B modes for TLS code. These use and enforce the requirements
 | 
			
		||||
     of RFC6460: restrict ciphersuites, only permit Suite B algorithms and
 | 
			
		||||
     only use Suite B curves. The Suite B modes can be set by using the
 | 
			
		||||
     strings "SUITEB128", "SUITEB192" or "SUITEB128ONLY" for the cipherstring.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Rename old X9.31 PRNG functions of the form FIPS_rand* to FIPS_x931*.
 | 
			
		||||
     This shouldn't present any incompatibility problems because applications
 | 
			
		||||
     shouldn't be using these directly and any that are will need to rethink
 | 
			
		||||
     anyway as the X9.31 PRNG is now deprecated by FIPS 140-2
 | 
			
		||||
  *) New chain verification flags for Suite B levels of security. Check
 | 
			
		||||
     algorithms are acceptable when flags are set in X509_verify_cert.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Extensive self tests and health checking required by SP800-90 DRBG.
 | 
			
		||||
     Remove strength parameter from FIPS_drbg_instantiate and always
 | 
			
		||||
     instantiate at maximum supported strength.
 | 
			
		||||
  *) Make tls1_check_chain return a set of flags indicating checks passed
 | 
			
		||||
     by a certificate chain. Add additional tests to handle client
 | 
			
		||||
     certificates: checks for matching certificate type and issuer name
 | 
			
		||||
     comparison.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add ECDH code to fips module and fips_ecdhvs for primitives only testing.
 | 
			
		||||
  *) If an attempt is made to use a signature algorithm not in the peer
 | 
			
		||||
     preference list abort the handshake. If client has no suitable
 | 
			
		||||
     signature algorithms in response to a certificate request do not
 | 
			
		||||
     use the certificate.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) New algorithm test program fips_dhvs to handle DH primitives only testing.
 | 
			
		||||
  *) If server EC tmp key is not in client preference list abort handshake.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) New function DH_compute_key_padded() to compute a DH key and pad with
 | 
			
		||||
     leading zeroes if needed: this complies with SP800-56A et al.
 | 
			
		||||
  *) Add support for certificate stores in CERT structure. This makes it
 | 
			
		||||
     possible to have different stores per SSL structure or one store in
 | 
			
		||||
     the parent SSL_CTX. Include distint stores for certificate chain
 | 
			
		||||
     verification and chain building. New ctrl SSL_CTRL_BUILD_CERT_CHAIN
 | 
			
		||||
     to build and store a certificate chain in CERT structure: returing
 | 
			
		||||
     an error if the chain cannot be built: this will allow applications
 | 
			
		||||
     to test if a chain is correctly configured.
 | 
			
		||||
 | 
			
		||||
     Note: if the CERT based stores are not set then the parent SSL_CTX
 | 
			
		||||
     store is used to retain compatibility with existing behaviour.
 | 
			
		||||
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initial implementation of SP800-90 DRBGs for Hash and CTR. Not used by
 | 
			
		||||
     anything, incomplete, subject to change and largely untested at present.
 | 
			
		||||
  *) New function ssl_set_client_disabled to set a ciphersuite disabled
 | 
			
		||||
     mask based on the current session, check mask when sending client
 | 
			
		||||
     hello and checking the requested ciphersuite.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Modify fipscanisteronly build option to only build the necessary object
 | 
			
		||||
     files by filtering FIPS_EX_OBJ through a perl script in crypto/Makefile.
 | 
			
		||||
  *) New ctrls to retrieve and set certificate types in a certificate
 | 
			
		||||
     request message. Print out received values in s_client. If certificate
 | 
			
		||||
     types is not set with custom values set sensible values based on
 | 
			
		||||
     supported signature algorithms.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add experimental option FIPSSYMS to give all symbols in
 | 
			
		||||
     fipscanister.o and FIPS or fips prefix. This will avoid
 | 
			
		||||
     conflicts with future versions of OpenSSL. Add perl script
 | 
			
		||||
     util/fipsas.pl to preprocess assembly language source files
 | 
			
		||||
     and rename any affected symbols.
 | 
			
		||||
  *) Support for distinct client and server supported signature algorithms.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add selftest checks and algorithm block of non-fips algorithms in
 | 
			
		||||
     FIPS mode. Remove DES2 from selftests.
 | 
			
		||||
  *) Add certificate callback. If set this is called whenever a certificate
 | 
			
		||||
     is required by client or server. An application can decide which
 | 
			
		||||
     certificate chain to present based on arbitrary criteria: for example
 | 
			
		||||
     supported signature algorithms. Add very simple example to s_server.
 | 
			
		||||
     This fixes many of the problems and restrictions of the existing client
 | 
			
		||||
     certificate callback: for example you can now clear an existing
 | 
			
		||||
     certificate and specify the whole chain.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add ECDSA code to fips module. Add tiny fips_ecdsa_check to just
 | 
			
		||||
     return internal method without any ENGINE dependencies. Add new
 | 
			
		||||
     tiny fips sign and verify functions.
 | 
			
		||||
  *) Add new "valid_flags" field to CERT_PKEY structure which determines what
 | 
			
		||||
     the certificate can be used for (if anything). Set valid_flags field 
 | 
			
		||||
     in new tls1_check_chain function. Simplify ssl_set_cert_masks which used
 | 
			
		||||
     to have similar checks in it.
 | 
			
		||||
 | 
			
		||||
     Add new "cert_flags" field to CERT structure and include a "strict mode".
 | 
			
		||||
     This enforces some TLS certificate requirements (such as only permitting
 | 
			
		||||
     certificate signature algorithms contained in the supported algorithms
 | 
			
		||||
     extension) which some implementations ignore: this option should be used
 | 
			
		||||
     with caution as it could cause interoperability issues.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) New build option no-ec2m to disable characteristic 2 code.
 | 
			
		||||
  *) Update and tidy signature algorithm extension processing. Work out
 | 
			
		||||
     shared signature algorithms based on preferences and peer algorithms
 | 
			
		||||
     and print them out in s_client and s_server. Abort handshake if no
 | 
			
		||||
     shared signature algorithms.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) New build option "fipscanisteronly". This only builds fipscanister.o
 | 
			
		||||
     and (currently) associated fips utilities. Uses the file Makefile.fips
 | 
			
		||||
     instead of Makefile.org as the prototype.
 | 
			
		||||
  *) Add new functions to allow customised supported signature algorithms
 | 
			
		||||
     for SSL and SSL_CTX structures. Add options to s_client and s_server
 | 
			
		||||
     to support them.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add some FIPS mode restrictions to GCM. Add internal IV generator.
 | 
			
		||||
     Update fips_gcmtest to use IV generator.
 | 
			
		||||
  *) New function SSL_certs_clear() to delete all references to certificates
 | 
			
		||||
     from an SSL structure. Before this once a certificate had been added
 | 
			
		||||
     it couldn't be removed.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initial, experimental EVP support for AES-GCM. AAD can be input by
 | 
			
		||||
     setting output buffer to NULL. The *Final function must be
 | 
			
		||||
     called although it will not retrieve any additional data. The tag
 | 
			
		||||
     can be set or retrieved with a ctrl. The IV length is by default 12
 | 
			
		||||
     bytes (96 bits) but can be set to an alternative value. If the IV
 | 
			
		||||
     length exceeds the maximum IV length (currently 16 bytes) it cannot be
 | 
			
		||||
     set before the key. 
 | 
			
		||||
  *) Integrate hostname, email address and IP address checking with certificate
 | 
			
		||||
     verification. New verify options supporting checking in opensl utility.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) New flag in ciphers: EVP_CIPH_FLAG_CUSTOM_CIPHER. This means the
 | 
			
		||||
     underlying do_cipher function handles all cipher semantics itself
 | 
			
		||||
     including padding and finalisation. This is useful if (for example)
 | 
			
		||||
     an ENGINE cipher handles block padding itself. The behaviour of
 | 
			
		||||
     do_cipher is subtly changed if this flag is set: the return value
 | 
			
		||||
     is the number of characters written to the output buffer (zero is
 | 
			
		||||
     no longer an error code) or a negative error code. Also if the
 | 
			
		||||
     input buffer is NULL and length 0 finalisation should be performed.
 | 
			
		||||
  *) Fixes and wildcard matching support to hostname and email checking
 | 
			
		||||
     functions. Add manual page.
 | 
			
		||||
     [Florian Weimer (Red Hat Product Security Team)]
 | 
			
		||||
 | 
			
		||||
  *) New functions to check a hostname email or IP address against a
 | 
			
		||||
     certificate. Add options x509 utility to print results of checks against
 | 
			
		||||
     a certificate.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) If a candidate issuer certificate is already part of the constructed
 | 
			
		||||
     path ignore it: new debug notification X509_V_ERR_PATH_LOOP for this case.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
  *) Fix OCSP checking.
 | 
			
		||||
     [Rob Stradling <rob.stradling@comodo.com> and Ben Laurie]
 | 
			
		||||
 | 
			
		||||
  *) Improve forward-security support: add functions
 | 
			
		||||
 | 
			
		||||
       void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx, int (*cb)(SSL *ssl, int is_forward_secure))
 | 
			
		||||
       void SSL_set_not_resumable_session_callback(SSL *ssl, int (*cb)(SSL *ssl, int is_forward_secure))
 | 
			
		||||
 | 
			
		||||
     for use by SSL/TLS servers; the callback function will be called whenever a
 | 
			
		||||
     new session is created, and gets to decide whether the session may be
 | 
			
		||||
     cached to make it resumable (return 0) or not (return 1).  (As by the
 | 
			
		||||
     SSL/TLS protocol specifications, the session_id sent by the server will be
 | 
			
		||||
     empty to indicate that the session is not resumable; also, the server will
 | 
			
		||||
     not generate RFC 4507 (RFC 5077) session tickets.)
 | 
			
		||||
 | 
			
		||||
     A simple reasonable callback implementation is to return is_forward_secure.
 | 
			
		||||
     This parameter will be set to 1 or 0 depending on the ciphersuite selected
 | 
			
		||||
     by the SSL/TLS server library, indicating whether it can provide forward
 | 
			
		||||
     security.
 | 
			
		||||
     [Emilia K<>sper <emilia.kasper@esat.kuleuven.be> (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Add Next Protocol Negotiation,
 | 
			
		||||
     http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-00. Can be
 | 
			
		||||
     disabled with a no-npn flag to config or Configure. Code donated
 | 
			
		||||
     by Google.
 | 
			
		||||
     [Adam Langley <agl@google.com> and Ben Laurie]
 | 
			
		||||
 | 
			
		||||
  *) New function OPENSSL_gmtime_diff to find the difference in days
 | 
			
		||||
     and seconds between two tm structures. This will be used to provide
 | 
			
		||||
     additional functionality for ASN1_TIME.
 | 
			
		||||
  *) Initial experimental support for explicitly trusted non-root CAs. 
 | 
			
		||||
     OpenSSL still tries to build a complete chain to a root but if an
 | 
			
		||||
     intermediate CA has a trust setting included that is used. The first
 | 
			
		||||
     setting is used: whether to trust (e.g., -addtrust option to the x509
 | 
			
		||||
     utility) or reject.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add -trusted_first option which attempts to find certificates in the
 | 
			
		||||
     trusted store even if an untrusted chain is also supplied.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initial experimental support for explicitly trusted non-root CAs. 
 | 
			
		||||
     OpenSSL still tries to build a complete chain to a root but if an
 | 
			
		||||
     intermediate CA has a trust setting included that is used. The first
 | 
			
		||||
     setting is used: whether to trust or reject.
 | 
			
		||||
  *) MIPS assembly pack updates: support for MIPS32r2 and SmartMIPS ASE,
 | 
			
		||||
     platform support for Linux and Android.
 | 
			
		||||
     [Andy Polyakov]
 | 
			
		||||
 | 
			
		||||
  *) Support for linux-x32, ILP32 environment in x86_64 framework.
 | 
			
		||||
     [Andy Polyakov]
 | 
			
		||||
 | 
			
		||||
  *) RFC 5878 (TLS Authorization Extensions) support.
 | 
			
		||||
     [Emilia Kasper, Adam Langley, Ben Laurie (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Experimental multi-implementation support for FIPS capable OpenSSL.
 | 
			
		||||
     When in FIPS mode the approved implementations are used as normal,
 | 
			
		||||
     when not in FIPS mode the internal unapproved versions are used instead.
 | 
			
		||||
     This means that the FIPS capable OpenSSL isn't forced to use the
 | 
			
		||||
     (often lower perfomance) FIPS implementations outside FIPS mode.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) New -verify_name option in command line utilities to set verification
 | 
			
		||||
     parameters by name.
 | 
			
		||||
  *) Transparently support X9.42 DH parameters when calling
 | 
			
		||||
     PEM_read_bio_DHparameters. This means existing applications can handle
 | 
			
		||||
     the new parameter format automatically.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initial CMAC implementation. WARNING: EXPERIMENTAL, API MAY CHANGE.
 | 
			
		||||
     Add CMAC pkey methods.
 | 
			
		||||
  *) Initial experimental support for X9.42 DH parameter format: mainly
 | 
			
		||||
     to support use of 'q' parameter for RFC5114 parameters.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Experimental regnegotiation in s_server -www mode. If the client 
 | 
			
		||||
     browses /reneg connection is renegotiated. If /renegcert it is
 | 
			
		||||
     renegotiated requesting a certificate.
 | 
			
		||||
  *) Add DH parameters from RFC5114 including test data to dhtest.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add an "external" session cache for debugging purposes to s_server. This
 | 
			
		||||
     should help trace issues which normally are only apparent in deployed
 | 
			
		||||
     multi-process servers.
 | 
			
		||||
  *) Support for automatic EC temporary key parameter selection. If enabled
 | 
			
		||||
     the most preferred EC parameters are automatically used instead of
 | 
			
		||||
     hardcoded fixed parameters. Now a server just has to call:
 | 
			
		||||
     SSL_CTX_set_ecdh_auto(ctx, 1) and the server will automatically
 | 
			
		||||
     support ECDH and use the most appropriate parameters.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Extensive audit of libcrypto with DEBUG_UNUSED. Fix many cases where
 | 
			
		||||
     return value is ignored. NB. The functions RAND_add(), RAND_seed(),
 | 
			
		||||
     BIO_set_cipher() and some obscure PEM functions were changed so they
 | 
			
		||||
     can now return an error. The RAND changes required a change to the
 | 
			
		||||
     RAND_METHOD structure.
 | 
			
		||||
  *) Enhance and tidy EC curve and point format TLS extension code. Use
 | 
			
		||||
     static structures instead of allocation if default values are used.
 | 
			
		||||
     New ctrls to set curves we wish to support and to retrieve shared curves.
 | 
			
		||||
     Print out shared curves in s_server. New options to s_server and s_client
 | 
			
		||||
     to set list of supported curves.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) New macro __owur for "OpenSSL Warn Unused Result". This makes use of
 | 
			
		||||
     a gcc attribute to warn if the result of a function is ignored. This
 | 
			
		||||
     is enable if DEBUG_UNUSED is set. Add to several functions in evp.h
 | 
			
		||||
     whose return value is often ignored. 
 | 
			
		||||
  *) New ctrls to retrieve supported signature algorithms and 
 | 
			
		||||
     supported curve values as an array of NIDs. Extend openssl utility
 | 
			
		||||
     to print out received values.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0f and 1.0.1  [xx XXX xxxx]
 | 
			
		||||
  *) Add new APIs EC_curve_nist2nid and EC_curve_nid2nist which convert
 | 
			
		||||
     between NIDs and the more common NIST names such as "P-256". Enhance
 | 
			
		||||
     ecparam utility and ECC method to recognise the NIST names for curves.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Enhance SSL/TLS certificate chain handling to support different
 | 
			
		||||
     chains for each certificate instead of one chain in the parent SSL_CTX.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Support for fixed DH ciphersuite client authentication: where both
 | 
			
		||||
     server and client use DH certificates with common parameters.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Support for fixed DH ciphersuites: those requiring DH server
 | 
			
		||||
     certificates.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.1e and 1.0.1f [6 Jan 2014]
 | 
			
		||||
 | 
			
		||||
  *) Fix for TLS record tampering bug. A carefully crafted invalid 
 | 
			
		||||
     handshake could crash OpenSSL with a NULL pointer exception.
 | 
			
		||||
     Thanks to Anton Johansson for reporting this issues.
 | 
			
		||||
     (CVE-2013-4353)
 | 
			
		||||
 | 
			
		||||
  *) Keep original DTLS digest and encryption contexts in retransmission
 | 
			
		||||
     structures so we can use the previous session parameters if they need
 | 
			
		||||
     to be resent. (CVE-2013-6450)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add option SSL_OP_SAFARI_ECDHE_ECDSA_BUG (part of SSL_OP_ALL) which
 | 
			
		||||
     avoids preferring ECDHE-ECDSA ciphers when the client appears to be
 | 
			
		||||
     Safari on OS X.  Safari on OS X 10.8..10.8.3 advertises support for
 | 
			
		||||
     several ECDHE-ECDSA ciphers, but fails to negotiate them.  The bug
 | 
			
		||||
     is fixed in OS X 10.8.4, but Apple have ruled out both hot fixing
 | 
			
		||||
     10.8..10.8.3 and forcing users to upgrade to 10.8.4 or newer.
 | 
			
		||||
     [Rob Stradling, Adam Langley]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.1d and 1.0.1e [11 Feb 2013]
 | 
			
		||||
 | 
			
		||||
  *) Correct fix for CVE-2013-0169. The original didn't work on AES-NI
 | 
			
		||||
     supporting platforms or when small records were transferred.
 | 
			
		||||
     [Andy Polyakov, Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.1c and 1.0.1d [5 Feb 2013]
 | 
			
		||||
 | 
			
		||||
  *) Make the decoding of SSLv3, TLS and DTLS CBC records constant time.
 | 
			
		||||
 | 
			
		||||
     This addresses the flaw in CBC record processing discovered by 
 | 
			
		||||
     Nadhem Alfardan and Kenny Paterson. Details of this attack can be found
 | 
			
		||||
     at: http://www.isg.rhul.ac.uk/tls/     
 | 
			
		||||
 | 
			
		||||
     Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
 | 
			
		||||
     Security Group at Royal Holloway, University of London
 | 
			
		||||
     (www.isg.rhul.ac.uk) for discovering this flaw and Adam Langley and
 | 
			
		||||
     Emilia K<>sper for the initial patch.
 | 
			
		||||
     (CVE-2013-0169)
 | 
			
		||||
     [Emilia K<>sper, Adam Langley, Ben Laurie, Andy Polyakov, Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Fix flaw in AESNI handling of TLS 1.2 and 1.1 records for CBC mode
 | 
			
		||||
     ciphersuites which can be exploited in a denial of service attack.
 | 
			
		||||
     Thanks go to and to Adam Langley <agl@chromium.org> for discovering
 | 
			
		||||
     and detecting this bug and to Wolfgang Ettlinger
 | 
			
		||||
     <wolfgang.ettlinger@gmail.com> for independently discovering this issue.
 | 
			
		||||
     (CVE-2012-2686)
 | 
			
		||||
     [Adam Langley]
 | 
			
		||||
 | 
			
		||||
  *) Return an error when checking OCSP signatures when key is NULL.
 | 
			
		||||
     This fixes a DoS attack. (CVE-2013-0166)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Make openssl verify return errors.
 | 
			
		||||
     [Chris Palmer <palmer@google.com> and Ben Laurie]
 | 
			
		||||
 | 
			
		||||
  *) Call OCSP Stapling callback after ciphersuite has been chosen, so
 | 
			
		||||
     the right response is stapled. Also change SSL_get_certificate()
 | 
			
		||||
     so it returns the certificate actually sent.
 | 
			
		||||
     See http://rt.openssl.org/Ticket/Display.html?id=2836.
 | 
			
		||||
     [Rob Stradling <rob.stradling@comodo.com>]
 | 
			
		||||
 | 
			
		||||
  *) Fix possible deadlock when decoding public keys.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Don't use TLS 1.0 record version number in initial client hello
 | 
			
		||||
     if renegotiating.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.1b and 1.0.1c [10 May 2012]
 | 
			
		||||
 | 
			
		||||
  *) Sanity check record length before skipping explicit IV in TLS
 | 
			
		||||
     1.2, 1.1 and DTLS to fix DoS attack.
 | 
			
		||||
 | 
			
		||||
     Thanks to Codenomicon for discovering this issue using Fuzz-o-Matic
 | 
			
		||||
     fuzzing as a service testing platform.
 | 
			
		||||
     (CVE-2012-2333)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initialise tkeylen properly when encrypting CMS messages.
 | 
			
		||||
     Thanks to Solar Designer of Openwall for reporting this issue.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) In FIPS mode don't try to use composite ciphers as they are not
 | 
			
		||||
     approved.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.1a and 1.0.1b [26 Apr 2012]
 | 
			
		||||
 | 
			
		||||
  *) OpenSSL 1.0.0 sets SSL_OP_ALL to 0x80000FFFL and OpenSSL 1.0.1 and
 | 
			
		||||
     1.0.1a set SSL_OP_NO_TLSv1_1 to 0x00000400L which would unfortunately
 | 
			
		||||
     mean any application compiled against OpenSSL 1.0.0 headers setting
 | 
			
		||||
     SSL_OP_ALL would also set SSL_OP_NO_TLSv1_1, unintentionally disablng
 | 
			
		||||
     TLS 1.1 also. Fix this by changing the value of SSL_OP_NO_TLSv1_1 to
 | 
			
		||||
     0x10000000L Any application which was previously compiled against
 | 
			
		||||
     OpenSSL 1.0.1 or 1.0.1a headers and which cares about SSL_OP_NO_TLSv1_1
 | 
			
		||||
     will need to be recompiled as a result. Letting be results in
 | 
			
		||||
     inability to disable specifically TLS 1.1 and in client context,
 | 
			
		||||
     in unlike event, limit maximum offered version to TLS 1.0 [see below].
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) In order to ensure interoperabilty SSL_OP_NO_protocolX does not
 | 
			
		||||
     disable just protocol X, but all protocols above X *if* there are
 | 
			
		||||
     protocols *below* X still enabled. In more practical terms it means
 | 
			
		||||
     that if application wants to disable TLS1.0 in favor of TLS1.1 and
 | 
			
		||||
     above, it's not sufficient to pass SSL_OP_NO_TLSv1, one has to pass
 | 
			
		||||
     SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2. This applies to
 | 
			
		||||
     client side.
 | 
			
		||||
     [Andy Polyakov]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.1 and 1.0.1a [19 Apr 2012]
 | 
			
		||||
 | 
			
		||||
  *) Check for potentially exploitable overflows in asn1_d2i_read_bio
 | 
			
		||||
     BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer
 | 
			
		||||
     in CRYPTO_realloc_clean.
 | 
			
		||||
 | 
			
		||||
     Thanks to Tavis Ormandy, Google Security Team, for discovering this
 | 
			
		||||
     issue and to Adam Langley <agl@chromium.org> for fixing it.
 | 
			
		||||
     (CVE-2012-2110)
 | 
			
		||||
     [Adam Langley (Google), Tavis Ormandy, Google Security Team]
 | 
			
		||||
 | 
			
		||||
  *) Don't allow TLS 1.2 SHA-256 ciphersuites in TLS 1.0, 1.1 connections.
 | 
			
		||||
     [Adam Langley]
 | 
			
		||||
 | 
			
		||||
  *) Workarounds for some broken servers that "hang" if a client hello
 | 
			
		||||
     record length exceeds 255 bytes.
 | 
			
		||||
 | 
			
		||||
     1. Do not use record version number > TLS 1.0 in initial client
 | 
			
		||||
        hello: some (but not all) hanging servers will now work.
 | 
			
		||||
     2. If we set OPENSSL_MAX_TLS1_2_CIPHER_LENGTH this will truncate
 | 
			
		||||
	the number of ciphers sent in the client hello. This should be
 | 
			
		||||
        set to an even number, such as 50, for example by passing:
 | 
			
		||||
        -DOPENSSL_MAX_TLS1_2_CIPHER_LENGTH=50 to config or Configure.
 | 
			
		||||
        Most broken servers should now work.
 | 
			
		||||
     3. If all else fails setting OPENSSL_NO_TLS1_2_CLIENT will disable
 | 
			
		||||
	TLS 1.2 client support entirely.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Fix SEGV in Vector Permutation AES module observed in OpenSSH.
 | 
			
		||||
     [Andy Polyakov]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0h and 1.0.1  [14 Mar 2012]
 | 
			
		||||
 | 
			
		||||
  *) Add compatibility with old MDC2 signatures which use an ASN1 OCTET
 | 
			
		||||
     STRING form instead of a DigestInfo.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) The format used for MDC2 RSA signatures is inconsistent between EVP
 | 
			
		||||
     and the RSA_sign/RSA_verify functions. This was made more apparent when
 | 
			
		||||
     OpenSSL used RSA_sign/RSA_verify for some RSA signatures in particular
 | 
			
		||||
     those which went through EVP_PKEY_METHOD in 1.0.0 and later. Detect 
 | 
			
		||||
     the correct format in RSA_verify so both forms transparently work.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Some servers which support TLS 1.0 can choke if we initially indicate
 | 
			
		||||
     support for TLS 1.2 and later renegotiate using TLS 1.0 in the RSA
 | 
			
		||||
     encrypted premaster secret. As a workaround use the maximum pemitted
 | 
			
		||||
     client version in client hello, this should keep such servers happy
 | 
			
		||||
     and still work with previous versions of OpenSSL.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add support for TLS/DTLS heartbeats.
 | 
			
		||||
     [Robin Seggelmann <seggelmann@fh-muenster.de>]
 | 
			
		||||
 | 
			
		||||
  *) Add support for SCTP.
 | 
			
		||||
     [Robin Seggelmann <seggelmann@fh-muenster.de>]
 | 
			
		||||
 | 
			
		||||
  *) Improved PRNG seeding for VOS.
 | 
			
		||||
     [Paul Green <Paul.Green@stratus.com>]
 | 
			
		||||
 | 
			
		||||
  *) Extensive assembler packs updates, most notably:
 | 
			
		||||
 | 
			
		||||
	- x86[_64]:     AES-NI, PCLMULQDQ, RDRAND support;
 | 
			
		||||
	- x86[_64]:     SSSE3 support (SHA1, vector-permutation AES);
 | 
			
		||||
	- x86_64:       bit-sliced AES implementation;
 | 
			
		||||
	- ARM:          NEON support, contemporary platforms optimizations;
 | 
			
		||||
	- s390x:        z196 support;
 | 
			
		||||
	- *:            GHASH and GF(2^m) multiplication implementations;
 | 
			
		||||
 | 
			
		||||
     [Andy Polyakov]
 | 
			
		||||
 | 
			
		||||
  *) Make TLS-SRP code conformant with RFC 5054 API cleanup
 | 
			
		||||
     (removal of unnecessary code)
 | 
			
		||||
     [Peter Sylvester <peter.sylvester@edelweb.fr>]
 | 
			
		||||
 | 
			
		||||
  *) Add TLS key material exporter from RFC 5705.
 | 
			
		||||
     [Eric Rescorla]
 | 
			
		||||
 | 
			
		||||
  *) Add DTLS-SRTP negotiation from RFC 5764.
 | 
			
		||||
     [Eric Rescorla]
 | 
			
		||||
 | 
			
		||||
  *) Add Next Protocol Negotiation,
 | 
			
		||||
     http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-00. Can be
 | 
			
		||||
     disabled with a no-npn flag to config or Configure. Code donated
 | 
			
		||||
     by Google.
 | 
			
		||||
     [Adam Langley <agl@google.com> and Ben Laurie]
 | 
			
		||||
 | 
			
		||||
  *) Add optional 64-bit optimized implementations of elliptic curves NIST-P224,
 | 
			
		||||
     NIST-P256, NIST-P521, with constant-time single point multiplication on
 | 
			
		||||
@@ -365,8 +609,8 @@
 | 
			
		||||
     keep original code iff non-FIPS operations are allowed.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Add -attime option to openssl verify.
 | 
			
		||||
     [Peter Eckersley <pde@eff.org> and Ben Laurie]
 | 
			
		||||
  *) Add -attime option to openssl utilities.
 | 
			
		||||
     [Peter Eckersley <pde@eff.org>, Ben Laurie and Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Redirect DSA and DH operations to FIPS module in FIPS mode.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
@@ -479,7 +723,134 @@
 | 
			
		||||
       Add command line options to s_client/s_server.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0e and 1.0.0f [xx XXX xxxx]
 | 
			
		||||
 Changes between 1.0.0j and 1.0.0k [5 Feb 2013]
 | 
			
		||||
 | 
			
		||||
  *) Make the decoding of SSLv3, TLS and DTLS CBC records constant time.
 | 
			
		||||
 | 
			
		||||
     This addresses the flaw in CBC record processing discovered by 
 | 
			
		||||
     Nadhem Alfardan and Kenny Paterson. Details of this attack can be found
 | 
			
		||||
     at: http://www.isg.rhul.ac.uk/tls/     
 | 
			
		||||
 | 
			
		||||
     Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
 | 
			
		||||
     Security Group at Royal Holloway, University of London
 | 
			
		||||
     (www.isg.rhul.ac.uk) for discovering this flaw and Adam Langley and
 | 
			
		||||
     Emilia K<>sper for the initial patch.
 | 
			
		||||
     (CVE-2013-0169)
 | 
			
		||||
     [Emilia K<>sper, Adam Langley, Ben Laurie, Andy Polyakov, Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Return an error when checking OCSP signatures when key is NULL.
 | 
			
		||||
     This fixes a DoS attack. (CVE-2013-0166)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Call OCSP Stapling callback after ciphersuite has been chosen, so
 | 
			
		||||
     the right response is stapled. Also change SSL_get_certificate()
 | 
			
		||||
     so it returns the certificate actually sent.
 | 
			
		||||
     See http://rt.openssl.org/Ticket/Display.html?id=2836.
 | 
			
		||||
     (This is a backport)
 | 
			
		||||
     [Rob Stradling <rob.stradling@comodo.com>]
 | 
			
		||||
 | 
			
		||||
  *) Fix possible deadlock when decoding public keys.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0i and 1.0.0j [10 May 2012]
 | 
			
		||||
 | 
			
		||||
  [NB: OpenSSL 1.0.0i and later 1.0.0 patch levels were released after
 | 
			
		||||
  OpenSSL 1.0.1.]
 | 
			
		||||
 | 
			
		||||
  *) Sanity check record length before skipping explicit IV in DTLS
 | 
			
		||||
     to fix DoS attack.
 | 
			
		||||
 | 
			
		||||
     Thanks to Codenomicon for discovering this issue using Fuzz-o-Matic
 | 
			
		||||
     fuzzing as a service testing platform.
 | 
			
		||||
     (CVE-2012-2333)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initialise tkeylen properly when encrypting CMS messages.
 | 
			
		||||
     Thanks to Solar Designer of Openwall for reporting this issue.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0h and 1.0.0i [19 Apr 2012]
 | 
			
		||||
 | 
			
		||||
  *) Check for potentially exploitable overflows in asn1_d2i_read_bio
 | 
			
		||||
     BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer
 | 
			
		||||
     in CRYPTO_realloc_clean.
 | 
			
		||||
 | 
			
		||||
     Thanks to Tavis Ormandy, Google Security Team, for discovering this
 | 
			
		||||
     issue and to Adam Langley <agl@chromium.org> for fixing it.
 | 
			
		||||
     (CVE-2012-2110)
 | 
			
		||||
     [Adam Langley (Google), Tavis Ormandy, Google Security Team]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0g and 1.0.0h [12 Mar 2012]
 | 
			
		||||
 | 
			
		||||
  *) Fix MMA (Bleichenbacher's attack on PKCS #1 v1.5 RSA padding) weakness
 | 
			
		||||
     in CMS and PKCS7 code. When RSA decryption fails use a random key for
 | 
			
		||||
     content decryption and always return the same error. Note: this attack
 | 
			
		||||
     needs on average 2^20 messages so it only affects automated senders. The
 | 
			
		||||
     old behaviour can be reenabled in the CMS code by setting the
 | 
			
		||||
     CMS_DEBUG_DECRYPT flag: this is useful for debugging and testing where
 | 
			
		||||
     an MMA defence is not necessary.
 | 
			
		||||
     Thanks to Ivan Nestlerode <inestlerode@us.ibm.com> for discovering
 | 
			
		||||
     this issue. (CVE-2012-0884)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Fix CVE-2011-4619: make sure we really are receiving a 
 | 
			
		||||
     client hello before rejecting multiple SGC restarts. Thanks to
 | 
			
		||||
     Ivan Nestlerode <inestlerode@us.ibm.com> for discovering this bug.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0f and 1.0.0g [18 Jan 2012]
 | 
			
		||||
 | 
			
		||||
  *) Fix for DTLS DoS issue introduced by fix for CVE-2011-4109.
 | 
			
		||||
     Thanks to Antonio Martin, Enterprise Secure Access Research and
 | 
			
		||||
     Development, Cisco Systems, Inc. for discovering this bug and
 | 
			
		||||
     preparing a fix. (CVE-2012-0050)
 | 
			
		||||
     [Antonio Martin]
 | 
			
		||||
 | 
			
		||||
 Changes between 1.0.0e and 1.0.0f [4 Jan 2012]
 | 
			
		||||
 | 
			
		||||
  *) Nadhem Alfardan and Kenny Paterson have discovered an extension
 | 
			
		||||
     of the Vaudenay padding oracle attack on CBC mode encryption
 | 
			
		||||
     which enables an efficient plaintext recovery attack against
 | 
			
		||||
     the OpenSSL implementation of DTLS. Their attack exploits timing
 | 
			
		||||
     differences arising during decryption processing. A research
 | 
			
		||||
     paper describing this attack can be found at:
 | 
			
		||||
                  http://www.isg.rhul.ac.uk/~kp/dtls.pdf
 | 
			
		||||
     Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
 | 
			
		||||
     Security Group at Royal Holloway, University of London
 | 
			
		||||
     (www.isg.rhul.ac.uk) for discovering this flaw and to Robin Seggelmann
 | 
			
		||||
     <seggelmann@fh-muenster.de> and Michael Tuexen <tuexen@fh-muenster.de>
 | 
			
		||||
     for preparing the fix. (CVE-2011-4108)
 | 
			
		||||
     [Robin Seggelmann, Michael Tuexen]
 | 
			
		||||
 | 
			
		||||
  *) Clear bytes used for block padding of SSL 3.0 records.
 | 
			
		||||
     (CVE-2011-4576)
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Only allow one SGC handshake restart for SSL/TLS. Thanks to George
 | 
			
		||||
     Kadianakis <desnacked@gmail.com> for discovering this issue and
 | 
			
		||||
     Adam Langley for preparing the fix. (CVE-2011-4619)
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Check parameters are not NULL in GOST ENGINE. (CVE-2012-0027)
 | 
			
		||||
     [Andrey Kulikov <amdeich@gmail.com>]
 | 
			
		||||
 | 
			
		||||
  *) Prevent malformed RFC3779 data triggering an assertion failure.
 | 
			
		||||
     Thanks to Andrew Chi, BBN Technologies, for discovering the flaw
 | 
			
		||||
     and Rob Austein <sra@hactrn.net> for fixing it. (CVE-2011-4577)
 | 
			
		||||
     [Rob Austein <sra@hactrn.net>]
 | 
			
		||||
 | 
			
		||||
  *) Improved PRNG seeding for VOS.
 | 
			
		||||
     [Paul Green <Paul.Green@stratus.com>]
 | 
			
		||||
 | 
			
		||||
  *) Fix ssl_ciph.c set-up race.
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Fix spurious failures in ecdsatest.c.
 | 
			
		||||
     [Emilia K<>sper (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Fix the BIO_f_buffer() implementation (which was mixing different
 | 
			
		||||
     interpretations of the '..._len' fields).
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Fix handling of BN_BLINDING: now BN_BLINDING_invert_ex (rather than
 | 
			
		||||
     BN_BLINDING_invert_ex) calls BN_BLINDING_update, ensuring that concurrent
 | 
			
		||||
@@ -1399,7 +1770,136 @@
 | 
			
		||||
  *) Change 'Configure' script to enable Camellia by default.
 | 
			
		||||
     [NTT]
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8r and 0.9.8s [xx XXX xxxx]
 | 
			
		||||
 Changes between 0.9.8x and 0.9.8y [5 Feb 2013]
 | 
			
		||||
 | 
			
		||||
  *) Make the decoding of SSLv3, TLS and DTLS CBC records constant time.
 | 
			
		||||
 | 
			
		||||
     This addresses the flaw in CBC record processing discovered by 
 | 
			
		||||
     Nadhem Alfardan and Kenny Paterson. Details of this attack can be found
 | 
			
		||||
     at: http://www.isg.rhul.ac.uk/tls/     
 | 
			
		||||
 | 
			
		||||
     Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
 | 
			
		||||
     Security Group at Royal Holloway, University of London
 | 
			
		||||
     (www.isg.rhul.ac.uk) for discovering this flaw and Adam Langley and
 | 
			
		||||
     Emilia K<>sper for the initial patch.
 | 
			
		||||
     (CVE-2013-0169)
 | 
			
		||||
     [Emilia K<>sper, Adam Langley, Ben Laurie, Andy Polyakov, Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Return an error when checking OCSP signatures when key is NULL.
 | 
			
		||||
     This fixes a DoS attack. (CVE-2013-0166)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Call OCSP Stapling callback after ciphersuite has been chosen, so
 | 
			
		||||
     the right response is stapled. Also change SSL_get_certificate()
 | 
			
		||||
     so it returns the certificate actually sent.
 | 
			
		||||
     See http://rt.openssl.org/Ticket/Display.html?id=2836.
 | 
			
		||||
     (This is a backport)
 | 
			
		||||
     [Rob Stradling <rob.stradling@comodo.com>]
 | 
			
		||||
 | 
			
		||||
  *) Fix possible deadlock when decoding public keys.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8w and 0.9.8x [10 May 2012]
 | 
			
		||||
 | 
			
		||||
  *) Sanity check record length before skipping explicit IV in DTLS
 | 
			
		||||
     to fix DoS attack.
 | 
			
		||||
 | 
			
		||||
     Thanks to Codenomicon for discovering this issue using Fuzz-o-Matic
 | 
			
		||||
     fuzzing as a service testing platform.
 | 
			
		||||
     (CVE-2012-2333)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Initialise tkeylen properly when encrypting CMS messages.
 | 
			
		||||
     Thanks to Solar Designer of Openwall for reporting this issue.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8v and 0.9.8w [23 Apr 2012]
 | 
			
		||||
 | 
			
		||||
  *) The fix for CVE-2012-2110 did not take into account that the 
 | 
			
		||||
     'len' argument to BUF_MEM_grow and BUF_MEM_grow_clean is an
 | 
			
		||||
     int in OpenSSL 0.9.8, making it still vulnerable. Fix by 
 | 
			
		||||
     rejecting negative len parameter. (CVE-2012-2131)
 | 
			
		||||
     [Tomas Hoger <thoger@redhat.com>]
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8u and 0.9.8v [19 Apr 2012]
 | 
			
		||||
 | 
			
		||||
  *) Check for potentially exploitable overflows in asn1_d2i_read_bio
 | 
			
		||||
     BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer
 | 
			
		||||
     in CRYPTO_realloc_clean.
 | 
			
		||||
 | 
			
		||||
     Thanks to Tavis Ormandy, Google Security Team, for discovering this
 | 
			
		||||
     issue and to Adam Langley <agl@chromium.org> for fixing it.
 | 
			
		||||
     (CVE-2012-2110)
 | 
			
		||||
     [Adam Langley (Google), Tavis Ormandy, Google Security Team]
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8t and 0.9.8u [12 Mar 2012]
 | 
			
		||||
 | 
			
		||||
  *) Fix MMA (Bleichenbacher's attack on PKCS #1 v1.5 RSA padding) weakness
 | 
			
		||||
     in CMS and PKCS7 code. When RSA decryption fails use a random key for
 | 
			
		||||
     content decryption and always return the same error. Note: this attack
 | 
			
		||||
     needs on average 2^20 messages so it only affects automated senders. The
 | 
			
		||||
     old behaviour can be reenabled in the CMS code by setting the
 | 
			
		||||
     CMS_DEBUG_DECRYPT flag: this is useful for debugging and testing where
 | 
			
		||||
     an MMA defence is not necessary.
 | 
			
		||||
     Thanks to Ivan Nestlerode <inestlerode@us.ibm.com> for discovering
 | 
			
		||||
     this issue. (CVE-2012-0884)
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
  *) Fix CVE-2011-4619: make sure we really are receiving a 
 | 
			
		||||
     client hello before rejecting multiple SGC restarts. Thanks to
 | 
			
		||||
     Ivan Nestlerode <inestlerode@us.ibm.com> for discovering this bug.
 | 
			
		||||
     [Steve Henson]
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8s and 0.9.8t [18 Jan 2012]
 | 
			
		||||
 | 
			
		||||
  *) Fix for DTLS DoS issue introduced by fix for CVE-2011-4109.
 | 
			
		||||
     Thanks to Antonio Martin, Enterprise Secure Access Research and
 | 
			
		||||
     Development, Cisco Systems, Inc. for discovering this bug and
 | 
			
		||||
     preparing a fix. (CVE-2012-0050)
 | 
			
		||||
     [Antonio Martin]
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8r and 0.9.8s [4 Jan 2012]
 | 
			
		||||
 | 
			
		||||
  *) Nadhem Alfardan and Kenny Paterson have discovered an extension
 | 
			
		||||
     of the Vaudenay padding oracle attack on CBC mode encryption
 | 
			
		||||
     which enables an efficient plaintext recovery attack against
 | 
			
		||||
     the OpenSSL implementation of DTLS. Their attack exploits timing
 | 
			
		||||
     differences arising during decryption processing. A research
 | 
			
		||||
     paper describing this attack can be found at:
 | 
			
		||||
                  http://www.isg.rhul.ac.uk/~kp/dtls.pdf
 | 
			
		||||
     Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
 | 
			
		||||
     Security Group at Royal Holloway, University of London
 | 
			
		||||
     (www.isg.rhul.ac.uk) for discovering this flaw and to Robin Seggelmann
 | 
			
		||||
     <seggelmann@fh-muenster.de> and Michael Tuexen <tuexen@fh-muenster.de>
 | 
			
		||||
     for preparing the fix. (CVE-2011-4108)
 | 
			
		||||
     [Robin Seggelmann, Michael Tuexen]
 | 
			
		||||
 | 
			
		||||
  *) Stop policy check failure freeing same buffer twice. (CVE-2011-4109)
 | 
			
		||||
     [Ben Laurie, Kasper <ekasper@google.com>]
 | 
			
		||||
 | 
			
		||||
  *) Clear bytes used for block padding of SSL 3.0 records.
 | 
			
		||||
     (CVE-2011-4576)
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Only allow one SGC handshake restart for SSL/TLS. Thanks to George
 | 
			
		||||
     Kadianakis <desnacked@gmail.com> for discovering this issue and
 | 
			
		||||
     Adam Langley for preparing the fix. (CVE-2011-4619)
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 
 | 
			
		||||
  *) Prevent malformed RFC3779 data triggering an assertion failure.
 | 
			
		||||
     Thanks to Andrew Chi, BBN Technologies, for discovering the flaw
 | 
			
		||||
     and Rob Austein <sra@hactrn.net> for fixing it. (CVE-2011-4577)
 | 
			
		||||
     [Rob Austein <sra@hactrn.net>]
 | 
			
		||||
 | 
			
		||||
  *) Fix ssl_ciph.c set-up race.
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Fix spurious failures in ecdsatest.c.
 | 
			
		||||
     [Emilia K<>sper (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Fix the BIO_f_buffer() implementation (which was mixing different
 | 
			
		||||
     interpretations of the '..._len' fields).
 | 
			
		||||
     [Adam Langley (Google)]
 | 
			
		||||
 | 
			
		||||
  *) Fix handling of BN_BLINDING: now BN_BLINDING_invert_ex (rather than
 | 
			
		||||
     BN_BLINDING_invert_ex) calls BN_BLINDING_update, ensuring that concurrent
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										328
									
								
								Configure
									
									
									
									
									
								
							
							
						
						
									
										328
									
								
								Configure
									
									
									
									
									
								
							@@ -10,7 +10,7 @@ use strict;
 | 
			
		||||
 | 
			
		||||
# see INSTALL for instructions.
 | 
			
		||||
 | 
			
		||||
my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimental-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-krb5] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] os/compiler[:flags]\n";
 | 
			
		||||
my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimental-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-krb5] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] os/compiler[:flags]\n";
 | 
			
		||||
 | 
			
		||||
# Options:
 | 
			
		||||
#
 | 
			
		||||
@@ -56,6 +56,7 @@ my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimenta
 | 
			
		||||
# [no-]zlib     [don't] compile support for zlib compression.
 | 
			
		||||
# zlib-dynamic	Like "zlib", but the zlib library is expected to be a shared
 | 
			
		||||
#		library and will be loaded in run-time by the OpenSSL library.
 | 
			
		||||
# sctp          include SCTP support
 | 
			
		||||
# 386           generate 80386 code
 | 
			
		||||
# no-sse2	disables IA-32 SSE2 code, above option implies no-sse2
 | 
			
		||||
# no-<cipher>   build without specified algorithm (rsa, idea, rc5, ...)
 | 
			
		||||
@@ -123,23 +124,23 @@ my $tlib="-lnsl -lsocket";
 | 
			
		||||
my $bits1="THIRTY_TWO_BIT ";
 | 
			
		||||
my $bits2="SIXTY_FOUR_BIT ";
 | 
			
		||||
 | 
			
		||||
my $x86_asm="x86cpuid.o:bn-586.o co-586.o x86-mont.o x86-gf2m.o:des-586.o crypt586.o:aes-586.o vpaes-x86.o aesni-x86.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp_block.o wp-mmx.o:cmll-x86.o:ghash-x86.o:e_padlock-x86.o";
 | 
			
		||||
my $x86_asm="x86cpuid.o:bn-586.o co-586.o x86-mont.o x86-gf2m.o:des-586.o crypt586.o:aes-586.o vpaes-x86.o aesni-x86.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp_block.o wp-mmx.o:cmll-x86.o:ghash-x86.o:";
 | 
			
		||||
 | 
			
		||||
my $x86_elf_asm="$x86_asm:elf";
 | 
			
		||||
 | 
			
		||||
my $x86_64_asm="x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o modexp512-x86_64.o::aes-x86_64.o vpaes-x86_64.o bsaes-x86_64.o aesni-x86_64.o aesni-sha1-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o::rc4-x86_64.o rc4-md5-x86_64.o:::wp-x86_64.o:cmll-x86_64.o cmll_misc.o:ghash-x86_64.o:e_padlock-x86_64.o";
 | 
			
		||||
my $x86_64_asm="x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o rsaz_exp.o rsaz-x86_64.o rsaz-avx2.o::aes-x86_64.o vpaes-x86_64.o bsaes-x86_64.o aesni-x86_64.o aesni-sha1-x86_64.o aesni-sha256-x86_64.o aesni-mb-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o::rc4-x86_64.o rc4-md5-x86_64.o:::wp-x86_64.o:cmll-x86_64.o cmll_misc.o:ghash-x86_64.o aesni-gcm-x86_64.o:";
 | 
			
		||||
my $ia64_asm="ia64cpuid.o:bn-ia64.o ia64-mont.o::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o::rc4-ia64.o rc4_skey.o:::::ghash-ia64.o::void";
 | 
			
		||||
my $sparcv9_asm="sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o:des_enc-sparc.o fcrypt_b.o:aes_core.o aes_cbc.o aes-sparcv9.o:::sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o:::::::ghash-sparcv9.o::void";
 | 
			
		||||
my $sparcv9_asm="sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o vis3-mont.o sparct4-mont.o sparcv9-gf2m.o:des_enc-sparc.o fcrypt_b.o dest4-sparcv9.o:aes_core.o aes_cbc.o aes-sparcv9.o aest4-sparcv9.o::md5-sparcv9.o:sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o::::::camellia.o cmll_misc.o cmll_cbc.o cmllt4-sparcv9.o:ghash-sparcv9.o::void";
 | 
			
		||||
my $sparcv8_asm=":sparcv8.o:des_enc-sparc.o fcrypt_b.o:::::::::::::void";
 | 
			
		||||
my $alpha_asm="alphacpuid.o:bn_asm.o alpha-mont.o:::::sha1-alpha.o:::::::ghash-alpha.o::void";
 | 
			
		||||
my $mips32_asm=":bn-mips.o::aes_cbc.o aes-mips.o:::sha1-mips.o sha256-mips.o::::::::";
 | 
			
		||||
my $mips64_asm=":bn-mips.o mips-mont.o::aes_cbc.o aes-mips.o:::sha1-mips.o sha256-mips.o sha512-mips.o::::::::";
 | 
			
		||||
my $s390x_asm="s390xcap.o s390xcpuid.o:bn-s390x.o s390x-mont.o s390x-gf2m.o::aes_ctr.o aes-s390x.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::ghash-s390x.o:";
 | 
			
		||||
my $armv4_asm="armcap.o armv4cpuid.o:bn_asm.o armv4-mont.o armv4-gf2m.o::aes_cbc.o aes-armv4.o:::sha1-armv4-large.o sha256-armv4.o sha512-armv4.o:::::::ghash-armv4.o::void";
 | 
			
		||||
my $mips32_asm=$mips64_asm; $mips32_asm =~ s/\s*sha512\-mips\.o//;
 | 
			
		||||
my $s390x_asm="s390xcap.o s390xcpuid.o:bn-s390x.o s390x-mont.o s390x-gf2m.o::aes-s390x.o aes-ctr.o aes-xts.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::ghash-s390x.o:";
 | 
			
		||||
my $armv4_asm="armcap.o armv4cpuid.o:bn_asm.o armv4-mont.o armv4-gf2m.o::aes_cbc.o aes-armv4.o bsaes-armv7.o:::sha1-armv4-large.o sha256-armv4.o sha512-armv4.o:::::::ghash-armv4.o::void";
 | 
			
		||||
my $parisc11_asm="pariscid.o:bn_asm.o parisc-mont.o::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o::32";
 | 
			
		||||
my $parisc20_asm="pariscid.o:pa-risc2W.o parisc-mont.o::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o::64";
 | 
			
		||||
my $ppc32_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o::aes_core.o aes_cbc.o aes-ppc.o:::sha1-ppc.o sha256-ppc.o::::::::";
 | 
			
		||||
my $ppc64_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o::aes_core.o aes_cbc.o aes-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o::::::::";
 | 
			
		||||
my $ppc64_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o::aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o::::::::";
 | 
			
		||||
my $ppc32_asm=$ppc64_asm;
 | 
			
		||||
my $no_asm=":::::::::::::::void";
 | 
			
		||||
 | 
			
		||||
# As for $BSDthreads. Idea is to maintain "collective" set of flags,
 | 
			
		||||
@@ -169,26 +170,31 @@ my %table=(
 | 
			
		||||
"debug-ben",	"gcc:$gcc_devteam_warn -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DDEBUG_SAFESTACK -O2 -pipe::(unknown):::::",
 | 
			
		||||
"debug-ben-openbsd","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -O2 -pedantic -Wall -Wshadow -Werror -pipe::(unknown)::::",
 | 
			
		||||
"debug-ben-openbsd-debug","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -g3 -O2 -pedantic -Wall -Wshadow -Werror -pipe::(unknown)::::",
 | 
			
		||||
"debug-ben-debug",	"gcc:$gcc_devteam_warn -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -g3 -O2 -pipe::(unknown)::::::",
 | 
			
		||||
"debug-ben-debug",	"gcc44:$gcc_devteam_warn -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -DDEBUG_UNUSED -g3 -O2 -pipe::(unknown)::::::",
 | 
			
		||||
"debug-ben-debug-64",	"gcc:$gcc_devteam_warn -Wno-error=overlength-strings -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -DDEBUG_UNUSED -g3 -O3 -pipe::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-ben-macos",	"cc:$gcc_devteam_warn -arch i386 -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -DDEBUG_UNUSED -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -O3 -DL_ENDIAN -g3 -pipe::(unknown)::-Wl,-search_paths_first::::",
 | 
			
		||||
"debug-ben-macos-gcc46",	"gcc-mp-4.6:$gcc_devteam_warn -Wconversion -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -DDEBUG_UNUSED -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -O3 -DL_ENDIAN -g3 -pipe::(unknown)::::::",
 | 
			
		||||
"debug-ben-darwin64","cc:$gcc_devteam_warn -g -Wno-language-extension-token -Wno-extended-offsetof -arch x86_64 -O3 -DL_ENDIAN -Wall::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL:".eval{my $asm=$x86_64_asm;$asm=~s/rc4\-[^:]+//;$asm}.":macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch x86_64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"debug-ben-debug-64-clang",	"clang:$gcc_devteam_warn -Wno-error=overlength-strings -Wno-error=extended-offsetof -Qunused-arguments -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -DDEBUG_UNUSED -g3 -O3 -pipe::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-ben-no-opt",	"gcc: -Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -DDEBUG_SAFESTACK -DCRYPTO_MDEBUG -Werror -DL_ENDIAN -DTERMIOS -Wall -g3::(unknown)::::::",
 | 
			
		||||
"debug-ben-strict",	"gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DCONST_STRICT -O2 -Wall -Wshadow -Werror -Wpointer-arith -Wcast-qual -Wwrite-strings -pipe::(unknown)::::::",
 | 
			
		||||
"debug-rse","cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}",
 | 
			
		||||
"debug-bodo",	"gcc:$gcc_devteam_warn -DBN_DEBUG -DBN_DEBUG_RAND -DCONF_DEBUG -DBIO_PAIR_DEBUG -m64 -DL_ENDIAN -DTERMIO -g -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
 | 
			
		||||
"debug-bodo",	"gcc:$gcc_devteam_warn -Wno-error=overlength-strings -DBN_DEBUG -DBN_DEBUG_RAND -DCONF_DEBUG -DBIO_PAIR_DEBUG -m64 -DL_ENDIAN -DTERMIO -g -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
 | 
			
		||||
"debug-ulf", "gcc:-DTERMIOS -DL_ENDIAN -march=i486 -Wall -DBN_DEBUG -DBN_DEBUG_RAND -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -g -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations:::CYGWIN32:::${no_asm}:win32:cygwin-shared:::.dll",
 | 
			
		||||
"debug-steve64", "gcc:$gcc_devteam_warn -m64 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -g::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-steve32", "gcc:$gcc_devteam_warn -m32 -DL_ENDIAN -DCONF_DEBUG -DDEBUG_SAFESTACK -g -pipe::-D_REENTRANT::-rdynamic -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC:-m32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-steve64", "gcc:$gcc_devteam_warn -m64 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -Wno-overlength-strings -g::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-steve32", "gcc:$gcc_devteam_warn -m32 -DL_ENDIAN -DCONF_DEBUG -DDEBUG_SAFESTACK -Wno-overlength-strings -g -pipe::-D_REENTRANT::-rdynamic -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC:-m32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-steve-opt", "gcc:$gcc_devteam_warn -m64 -O3 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -g::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-elf","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-noasm","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-elf-extreme","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-noasm-extreme","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-elf","gcc:-DLEVITTE_DEBUG -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -ggdb -g3 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-noasm","gcc:-DLEVITTE_DEBUG -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -ggdb -g3 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-elf-extreme","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -DPEDANTIC -ggdb -g3 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-levitte-linux-noasm-extreme","gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -ggdb -g3 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-geoff32","gcc:-DBN_DEBUG -DBN_DEBUG_RAND -DBN_STRICT -DPURIFY -DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_ASM -DOPENSSL_NO_INLINE_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -O1 -ggdb2 -Wall -Werror -Wundef -pedantic -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Wmissing-prototypes -Wmissing-declarations -Wno-long-long::-D_REENTRANT::-ldl:BN_LLONG:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-geoff64","gcc:-DBN_DEBUG -DBN_DEBUG_RAND -DBN_STRICT -DPURIFY -DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_ASM -DOPENSSL_NO_INLINE_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -O1 -ggdb2 -Wall -Werror -Wundef -pedantic -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Wmissing-prototypes -Wmissing-declarations -Wno-long-long::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-linux-pentium","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -mcpu=pentium -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn",
 | 
			
		||||
"debug-linux-ppro","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -mcpu=pentiumpro -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn",
 | 
			
		||||
"debug-linux-elf","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -march=i486 -Wall::-D_REENTRANT::-lefence -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-linux-elf-noefence","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -march=i486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-linux-ia32-aes", "gcc:-DAES_EXPERIMENTAL -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:x86cpuid.o:bn-586.o co-586.o x86-mont.o:des-586.o crypt586.o:aes_x86core.o aes_cbc.o aesni-x86.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp_block.o wp-mmx.o::ghash-x86.o:e_padlock-x86.o:elf:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-linux-ia32-aes", "gcc:-DAES_EXPERIMENTAL -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:x86cpuid.o:bn-586.o co-586.o x86-mont.o:des-586.o crypt586.o:aes_x86core.o aes_cbc.o aesni-x86.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp_block.o wp-mmx.o::ghash-x86.o::elf:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-linux-generic32","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DTERMIO -g -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-linux-generic64","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DTERMIO -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-linux-x86_64","gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -m64 -DL_ENDIAN -DTERMIO -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
 | 
			
		||||
@@ -199,8 +205,8 @@ my %table=(
 | 
			
		||||
"cc",		"cc:-O::(unknown)::::::",
 | 
			
		||||
 | 
			
		||||
####VOS Configurations
 | 
			
		||||
"vos-gcc","gcc:-O3 -Wall -D_POSIX_C_SOURCE=200112L -D_BSD -D_VOS_EXTENDED_NAMES -DB_ENDIAN::(unknown):VOS:-Wl,-map:BN_LLONG:${no_asm}:::::.so:",
 | 
			
		||||
"debug-vos-gcc","gcc:-O0 -g -Wall -D_POSIX_C_SOURCE=200112L -D_BSD -D_VOS_EXTENDED_NAMES -DB_ENDIAN -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG::(unknown):VOS:-Wl,-map:BN_LLONG:${no_asm}:::::.so:",
 | 
			
		||||
"vos-gcc","gcc:-O3 -Wall -DOPENSSL_SYSNAME_VOS -D_POSIX_C_SOURCE=200112L -D_BSD -D_VOS_EXTENDED_NAMES -DB_ENDIAN::(unknown):VOS:-Wl,-map:BN_LLONG:${no_asm}:::::.so:",
 | 
			
		||||
"debug-vos-gcc","gcc:-O0 -g -Wall -DOPENSSL_SYSNAME_VOS -D_POSIX_C_SOURCE=200112L -D_BSD -D_VOS_EXTENDED_NAMES -DB_ENDIAN -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG::(unknown):VOS:-Wl,-map:BN_LLONG:${no_asm}:::::.so:",
 | 
			
		||||
 | 
			
		||||
#### Solaris x86 with GNU C setups
 | 
			
		||||
# -DOPENSSL_NO_INLINE_ASM switches off inline assembler. We have to do it
 | 
			
		||||
@@ -240,7 +246,7 @@ my %table=(
 | 
			
		||||
"solaris-sparcv7-cc","cc:-xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${no_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"solaris-sparcv8-cc","cc:-xarch=v8 -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"solaris-sparcv9-cc","cc:-xtarget=ultra -xarch=v8plus -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK_LL DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"solaris64-sparcv9-cc","cc:-xtarget=ultra -xarch=v9 -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-xarch=v9 -G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):/usr/ccs/bin/ar rs::/64",
 | 
			
		||||
"solaris64-sparcv9-cc","cc:-xtarget=ultra -xarch=v9 -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-xarch=v9 -G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/64",
 | 
			
		||||
####
 | 
			
		||||
"debug-solaris-sparcv8-cc","cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG_ALL -xarch=v8 -g -O -xstrconst -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"debug-solaris-sparcv9-cc","cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG_ALL -xtarget=ultra -xarch=v8plus -g -O -xstrconst -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK_LL DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", 
 | 
			
		||||
@@ -293,8 +299,8 @@ my %table=(
 | 
			
		||||
# Since there is mention of this in shlib/hpux10-cc.sh
 | 
			
		||||
"hpux-parisc-cc-o4","cc:-Ae +O4 +ESlit -z -DB_ENDIAN -DBN_DIV2W -DMD32_XARRAY::-D_REENTRANT::-ldld:BN_LLONG DES_PTR DES_UNROLL DES_RISC1:${no_asm}:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"hpux-parisc-gcc","gcc:-O3 -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-Wl,+s -ldld:BN_LLONG DES_PTR DES_UNROLL DES_RISC1:${no_asm}:dl:hpux-shared:-fPIC:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"hpux-parisc1_1-gcc","gcc:-O3 -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-Wl,+s -ldld:BN_LLONG DES_PTR DES_UNROLL DES_RISC1:${parisc11_asm}:dl:hpux-shared:-fPIC:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"hpux-parisc2-gcc","gcc:-march=2.0 -O3 -DB_ENDIAN -D_REENTRANT::::-Wl,+s -ldld:SIXTY_FOUR_BIT RC4_CHAR RC4_CHUNK DES_PTR DES_UNROLL DES_RISC1::pa-risc2.o::::::::::::::void:dl:hpux-shared:-fPIC:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"hpux-parisc1_1-gcc","gcc:-O3 -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-Wl,+s -ldld:BN_LLONG DES_PTR DES_UNROLL DES_RISC1:${parisc11_asm}:dl:hpux-shared:-fPIC:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/pa1.1",
 | 
			
		||||
"hpux-parisc2-gcc","gcc:-march=2.0 -O3 -DB_ENDIAN -D_REENTRANT::::-Wl,+s -ldld:SIXTY_FOUR_BIT RC4_CHAR RC4_CHUNK DES_PTR DES_UNROLL DES_RISC1:".eval{my $asm=$parisc20_asm;$asm=~s/2W\./2\./;$asm=~s/:64/:32/;$asm}.":dl:hpux-shared:-fPIC:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/pa20_32",
 | 
			
		||||
"hpux64-parisc2-gcc","gcc:-O3 -DB_ENDIAN -D_REENTRANT::::-ldl:SIXTY_FOUR_BIT_LONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT::pa-risc2W.o::::::::::::::void:dlfcn:hpux-shared:-fpic:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/pa20_64",
 | 
			
		||||
 | 
			
		||||
# More attempts at unified 10.X and 11.X targets for HP C compiler.
 | 
			
		||||
@@ -303,7 +309,7 @@ my %table=(
 | 
			
		||||
# Kevin Steves <ks@hp.se>
 | 
			
		||||
"hpux-parisc-cc","cc:+O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DBN_DIV2W -DMD32_XARRAY::-D_REENTRANT::-Wl,+s -ldld:MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT:${no_asm}:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"hpux-parisc1_1-cc","cc:+DA1.1 +O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DMD32_XARRAY::-D_REENTRANT::-Wl,+s -ldld:MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT:${parisc11_asm}:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/pa1.1",
 | 
			
		||||
"hpux-parisc2-cc","cc:+DA2.0 +DS2.0 +O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DMD32_XARRAY -D_REENTRANT::::-Wl,+s -ldld:SIXTY_FOUR_BIT MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT::pa-risc2.o::::::::::::::void:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"hpux-parisc2-cc","cc:+DA2.0 +DS2.0 +O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DMD32_XARRAY -D_REENTRANT::::-Wl,+s -ldld:SIXTY_FOUR_BIT MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT:".eval{my $asm=$parisc20_asm;$asm=~s/2W\./2\./;$asm=~s/:64/:32/;$asm}.":dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/pa20_32",
 | 
			
		||||
"hpux64-parisc2-cc","cc:+DD64 +O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DMD32_XARRAY -D_REENTRANT::::-ldl:SIXTY_FOUR_BIT_LONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT:${parisc20_asm}:dlfcn:hpux-shared:+Z:+DD64 -b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/pa20_64",
 | 
			
		||||
 | 
			
		||||
# HP/UX IA-64 targets
 | 
			
		||||
@@ -345,17 +351,26 @@ my %table=(
 | 
			
		||||
# It's believed that majority of ARM toolchains predefine appropriate -march.
 | 
			
		||||
# If you compiler does not, do complement config command line with one!
 | 
			
		||||
"linux-armv4",	"gcc:-DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
# Configure script adds minimally required -march for assembly support,
 | 
			
		||||
# if no -march was specified at command line. mips32 and mips64 below
 | 
			
		||||
# refer to contemporary MIPS Architecture specifications, MIPS32 and
 | 
			
		||||
# MIPS64, rather than to kernel bitness.
 | 
			
		||||
"linux-mips32",	"gcc:-mabi=32 -DTERMIO -O3 -Wall -DBN_DIV3W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-mips64",   "gcc:-mabi=n32 -DTERMIO -O3 -Wall -DBN_DIV3W::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips64_asm}:n32:dlfcn:linux-shared:-fPIC:-mabi=n32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::32",
 | 
			
		||||
"linux64-mips64",   "gcc:-mabi=64 -DTERMIO -O3 -Wall -DBN_DIV3W::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips64_asm}:64:dlfcn:linux-shared:-fPIC:-mabi=64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
 | 
			
		||||
#### IA-32 targets...
 | 
			
		||||
"linux-ia32-icc",	"icc:-DL_ENDIAN -DTERMIO -O2 -no_cpprt::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-KPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-ia32-icc",	"icc:-DL_ENDIAN -DTERMIO -O2::-D_REENTRANT::-ldl -no_cpprt:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-KPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-elf",	"gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-aout",	"gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -march=i486 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_asm}:a.out",
 | 
			
		||||
####
 | 
			
		||||
"linux-generic64","gcc:-DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-ppc64",	"gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL:${ppc64_asm}:linux64:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
 | 
			
		||||
"linux-ppc64le","gcc:-m64 -DL_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL:$ppc64_asm:linux64le:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::",
 | 
			
		||||
"linux-ia64",	"gcc:-DL_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_UNROLL DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-ia64-ecc","ecc:-DL_ENDIAN -DTERMIO -O2 -Wall -no_cpprt::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-ia64-icc","icc:-DL_ENDIAN -DTERMIO -O2 -Wall -no_cpprt::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-ia64-icc","icc:-DL_ENDIAN -DTERMIO -O2 -Wall::-D_REENTRANT::-ldl -no_cpprt:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"linux-x86_64",	"gcc:-m64 -DL_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
 | 
			
		||||
"linux-x86_64-icc", "icc:-DL_ENDIAN -DTERMIO -O2::-D_REENTRANT::-ldl -no_cpprt:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
 | 
			
		||||
"linux-x32",	"gcc:-mx32 -DL_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-mx32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::x32",
 | 
			
		||||
"linux64-s390x",	"gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL:${s390x_asm}:64:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
 | 
			
		||||
#### So called "highgprs" target for z/Architecture CPUs
 | 
			
		||||
# "Highgprs" is kernel feature first implemented in Linux 2.6.32, see
 | 
			
		||||
@@ -402,6 +417,7 @@ my %table=(
 | 
			
		||||
"android","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"android-x86","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:".eval{my $asm=${x86_elf_asm};$asm=~s/:elf/:android/;$asm}.":dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"android-armv7","gcc:-march=armv7-a -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
"android-mips","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
 | 
			
		||||
#### *BSD [do see comment about ${BSDthreads} above!]
 | 
			
		||||
"BSD-generic32","gcc:-DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
 | 
			
		||||
@@ -461,8 +477,8 @@ my %table=(
 | 
			
		||||
"aix64-gcc","gcc:-maix64 -O -DB_ENDIAN::-pthread:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-maix64 -shared -Wl,-G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X64",
 | 
			
		||||
# Below targets assume AIX 5. Idea is to effectively disregard $OBJECT_MODE
 | 
			
		||||
# at build time. $OBJECT_MODE is respected at ./config stage!
 | 
			
		||||
"aix-cc",   "cc:-q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded:AIX::BN_LLONG RC4_CHAR:${ppc32_asm}:aix32:dlfcn:aix-shared::-q32 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 32",
 | 
			
		||||
"aix64-cc", "cc:-q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-q64 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 64",
 | 
			
		||||
"aix-cc",   "cc:-q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded -D_THREAD_SAFE:AIX::BN_LLONG RC4_CHAR:${ppc32_asm}:aix32:dlfcn:aix-shared::-q32 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 32",
 | 
			
		||||
"aix64-cc", "cc:-q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded -D_THREAD_SAFE:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-q64 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 64",
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Cray T90 and similar (SDSC)
 | 
			
		||||
@@ -544,6 +560,7 @@ my %table=(
 | 
			
		||||
# Cygwin
 | 
			
		||||
"Cygwin-pre1.3", "gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall::(unknown):CYGWIN32::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:win32",
 | 
			
		||||
"Cygwin", "gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 -Wall:::CYGWIN32::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_asm}:coff:dlfcn:cygwin-shared:-D_WINDLL:-shared:.dll.a",
 | 
			
		||||
"Cygwin-x86_64", "gcc:-DTERMIOS -DL_ENDIAN -O3 -Wall:::CYGWIN32::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:mingw64:dlfcn:cygwin-shared:-D_WINDLL:-shared:.dll.a",
 | 
			
		||||
"debug-Cygwin", "gcc:-DTERMIOS -DL_ENDIAN -march=i486 -Wall -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -g -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror:::CYGWIN32:::${no_asm}:dlfcn:cygwin-shared:-D_WINDLL:-shared:.dll.a",
 | 
			
		||||
 | 
			
		||||
# NetWare from David Ward (dsward@novell.com)
 | 
			
		||||
@@ -574,9 +591,10 @@ my %table=(
 | 
			
		||||
"rhapsody-ppc-cc","cc:-O3 -DB_ENDIAN::(unknown):MACOSX_RHAPSODY::BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}::",
 | 
			
		||||
"darwin-ppc-cc","cc:-arch ppc -O3 -DB_ENDIAN -Wa,-force_cpusubtype_ALL::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${ppc32_asm}:osx32:dlfcn:darwin-shared:-fPIC -fno-common:-arch ppc -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"darwin64-ppc-cc","cc:-arch ppc64 -O3 -DB_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${ppc64_asm}:osx64:dlfcn:darwin-shared:-fPIC -fno-common:-arch ppc64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"darwin-i386-cc","cc:-arch i386 -O3 -fomit-frame-pointer -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_INT RC4_CHUNK DES_UNROLL BF_PTR:${x86_asm}:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch i386 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"darwin-i386-cc","cc:-arch i386 -O3 -fomit-frame-pointer -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_INT RC4_CHUNK DES_UNROLL BF_PTR:".eval{my $asm=$x86_asm;$asm=~s/cast\-586\.o//;$asm}.":macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch i386 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"debug-darwin-i386-cc","cc:-arch i386 -g3 -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_INT RC4_CHUNK DES_UNROLL BF_PTR:${x86_asm}:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch i386 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"darwin64-x86_64-cc","cc:-arch x86_64 -O3 -DL_ENDIAN -Wall::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch x86_64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"darwin64-x86_64-cc","cc:-arch x86_64 -O3 -DL_ENDIAN -Wall::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:".eval{my $asm=$x86_64_asm;$asm=~s/rc4\-[^:]+//;$asm}.":macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch x86_64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"debug-darwin64-x86_64-cc","cc:-arch x86_64 -ggdb -g2 -O0 -DL_ENDIAN -Wall::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:".eval{my $asm=$x86_64_asm;$asm=~s/rc4\-[^:]+//;$asm}.":macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch x86_64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
"debug-darwin-ppc-cc","cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DB_ENDIAN -g -Wall -O::-D_REENTRANT:MACOSX::BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${ppc32_asm}:osx32:dlfcn:darwin-shared:-fPIC:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
# iPhoneOS/iOS
 | 
			
		||||
"iphoneos-cross","llvm-gcc:-O3 -isysroot \$(CROSS_TOP)/SDKs/\$(CROSS_SDK) -fomit-frame-pointer -fno-common::-D_REENTRANT:iOS:-Wl,-search_paths_first%:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}:dlfcn:darwin-shared:-fPIC -fno-common:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 | 
			
		||||
@@ -658,10 +676,8 @@ my $openssldir="";
 | 
			
		||||
my $exe_ext="";
 | 
			
		||||
my $install_prefix= "$ENV{'INSTALL_PREFIX'}";
 | 
			
		||||
my $cross_compile_prefix="";
 | 
			
		||||
my $fipslibdir="/usr/local/ssl/fips-2.0/lib/";
 | 
			
		||||
my $nofipscanistercheck=0;
 | 
			
		||||
my $fipscanisterinternal="n";
 | 
			
		||||
my $fipscanisteronly = 0;
 | 
			
		||||
my $fipsdir="/usr/local/ssl/fips-2.0";
 | 
			
		||||
my $fipslibdir="";
 | 
			
		||||
my $baseaddr="0xFB00000";
 | 
			
		||||
my $no_threads=0;
 | 
			
		||||
my $threads=0;
 | 
			
		||||
@@ -699,40 +715,36 @@ my $default_ranlib;
 | 
			
		||||
my $perl;
 | 
			
		||||
my $fips=0;
 | 
			
		||||
 | 
			
		||||
if (exists $ENV{FIPSDIR})
 | 
			
		||||
	{
 | 
			
		||||
	$fipsdir = $ENV{FIPSDIR};
 | 
			
		||||
	$fipsdir =~ s/\/$//;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
# All of the following is disabled by default (RC5 was enabled before 0.9.8):
 | 
			
		||||
 | 
			
		||||
my %disabled = ( # "what"         => "comment" [or special keyword "experimental"]
 | 
			
		||||
		 "dane"           => "experimental",
 | 
			
		||||
		 "ec_nistp_64_gcc_128" => "default",
 | 
			
		||||
		 "gmp"		  => "default",
 | 
			
		||||
		 "jpake"          => "experimental",
 | 
			
		||||
		 "libunbound"     => "experimental",
 | 
			
		||||
		 "md2"            => "default",
 | 
			
		||||
		 "multiblock"	  => "experimental",
 | 
			
		||||
		 "rc5"            => "default",
 | 
			
		||||
		 "rfc3779"	  => "default",
 | 
			
		||||
		 "sctp"       => "default",
 | 
			
		||||
		 "shared"         => "default",
 | 
			
		||||
		 "ssl-trace"	  => "default",
 | 
			
		||||
		 "store"	  => "experimental",
 | 
			
		||||
		 "zlib"           => "default",
 | 
			
		||||
		 "zlib-dynamic"   => "default"
 | 
			
		||||
	       );
 | 
			
		||||
my @experimental = ();
 | 
			
		||||
 | 
			
		||||
# If ssl directory missing assume truncated FIPS tarball
 | 
			
		||||
if (!-d "ssl")
 | 
			
		||||
	{
 | 
			
		||||
	print STDERR "Auto Configuring fipsonly\n";
 | 
			
		||||
	$fips = 1;
 | 
			
		||||
	$nofipscanistercheck = 1;
 | 
			
		||||
	$fipslibdir="";
 | 
			
		||||
	$fipscanisterinternal="y";
 | 
			
		||||
	$fipscanisteronly = 2;
 | 
			
		||||
	if (! -f "crypto/bn/bn_gf2m.c" )
 | 
			
		||||
		{
 | 
			
		||||
		$disabled{ec2m} = "forced";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
# This is what $depflags will look like with the above defaults
 | 
			
		||||
# (we need this to see if we should advise the user to run "make depend"):
 | 
			
		||||
my $default_depflags = " -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_STORE";
 | 
			
		||||
my $default_depflags = " -DOPENSSL_NO_DANE -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_LIBUNBOUND -DOPENSSL_NO_MD2 -DOPENSSL_NO_MULTIBLOCK -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_SSL_TRACE -DOPENSSL_NO_STORE";
 | 
			
		||||
 | 
			
		||||
# Explicit "no-..." options will be collected in %disabled along with the defaults.
 | 
			
		||||
# To remove something from %disabled, use "enable-foo" (unless it's experimental).
 | 
			
		||||
@@ -790,6 +802,7 @@ PROCESS_ARGS:
 | 
			
		||||
 | 
			
		||||
		# rewrite some options in "enable-..." form
 | 
			
		||||
		s /^-?-?shared$/enable-shared/;
 | 
			
		||||
		s /^sctp$/enable-sctp/;
 | 
			
		||||
		s /^threads$/enable-threads/;
 | 
			
		||||
		s /^zlib$/enable-zlib/;
 | 
			
		||||
		s /^zlib-dynamic$/enable-zlib-dynamic/;
 | 
			
		||||
@@ -869,49 +882,9 @@ PROCESS_ARGS:
 | 
			
		||||
			# The check for the option is there so scripts aren't
 | 
			
		||||
			# broken
 | 
			
		||||
			}
 | 
			
		||||
		elsif (/^nofipscanistercheck$/)
 | 
			
		||||
			{
 | 
			
		||||
			$fips = 1;
 | 
			
		||||
			$nofipscanistercheck = 1;
 | 
			
		||||
			}
 | 
			
		||||
		elsif (/^fipscheck$/)
 | 
			
		||||
			{
 | 
			
		||||
			if ($fipscanisteronly != 2)
 | 
			
		||||
				{
 | 
			
		||||
				print STDERR <<"EOF";
 | 
			
		||||
ERROR: FIPS not autodetected. Not running from restricted tarball??
 | 
			
		||||
EOF
 | 
			
		||||
				exit(1);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		elsif (/^fipscanisteronly$/)
 | 
			
		||||
			{
 | 
			
		||||
			$fips = 1;
 | 
			
		||||
			$nofipscanistercheck = 1;
 | 
			
		||||
			$fipslibdir="";
 | 
			
		||||
			$fipscanisterinternal="y";
 | 
			
		||||
			$fipscanisteronly = 1;
 | 
			
		||||
			}
 | 
			
		||||
		elsif (/^fipscanisterbuild$/)
 | 
			
		||||
			{
 | 
			
		||||
			$fips = 1;
 | 
			
		||||
			$nofipscanistercheck = 1;
 | 
			
		||||
			$fipslibdir="";
 | 
			
		||||
			$fipscanisterinternal="y";
 | 
			
		||||
			$fipscanisteronly = 1;
 | 
			
		||||
			}
 | 
			
		||||
		elsif (/^[-+]/)
 | 
			
		||||
			{
 | 
			
		||||
			if (/^-[lL](.*)$/ or /^-Wl,/)
 | 
			
		||||
				{
 | 
			
		||||
				$libs.=$_." ";
 | 
			
		||||
				}
 | 
			
		||||
			elsif (/^-[^-]/ or /^\+/)
 | 
			
		||||
				{
 | 
			
		||||
				$_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
 | 
			
		||||
				$flags.=$_." ";
 | 
			
		||||
				}
 | 
			
		||||
			elsif (/^--prefix=(.*)$/)
 | 
			
		||||
			if (/^--prefix=(.*)$/)
 | 
			
		||||
				{
 | 
			
		||||
				$prefix=$1;
 | 
			
		||||
				}
 | 
			
		||||
@@ -939,9 +912,13 @@ EOF
 | 
			
		||||
				{
 | 
			
		||||
				$withargs{"zlib-include"}="-I$1";
 | 
			
		||||
				}
 | 
			
		||||
			elsif (/^--with-fipsdir=(.*)$/)
 | 
			
		||||
				{
 | 
			
		||||
				$fipsdir="$1";
 | 
			
		||||
				}
 | 
			
		||||
			elsif (/^--with-fipslibdir=(.*)$/)
 | 
			
		||||
				{
 | 
			
		||||
				$fipslibdir="$1/";
 | 
			
		||||
				$fipslibdir="$1";
 | 
			
		||||
				}
 | 
			
		||||
			elsif (/^--with-baseaddr=(.*)$/)
 | 
			
		||||
				{
 | 
			
		||||
@@ -951,10 +928,14 @@ EOF
 | 
			
		||||
				{
 | 
			
		||||
				$cross_compile_prefix=$1;
 | 
			
		||||
				}
 | 
			
		||||
			else
 | 
			
		||||
			elsif (/^-[lL](.*)$/ or /^-Wl,/)
 | 
			
		||||
				{
 | 
			
		||||
				print STDERR $usage;
 | 
			
		||||
				exit(1);
 | 
			
		||||
				$libs.=$_." ";
 | 
			
		||||
				}
 | 
			
		||||
			else	# common if (/^[-+]/), just pass down...
 | 
			
		||||
				{
 | 
			
		||||
				$_ =~ s/%([0-9a-f]{1,2})/chr(hex($1))/gei;
 | 
			
		||||
				$flags.=$_." ";
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		elsif ($_ =~ /^([^:]+):(.+)$/)
 | 
			
		||||
@@ -1021,6 +1002,17 @@ if (defined($disabled{"md5"}) || defined($disabled{"rsa"}))
 | 
			
		||||
	$disabled{"ssl2"} = "forced";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
if ($fips && $fipslibdir eq "")
 | 
			
		||||
	{
 | 
			
		||||
	$fipslibdir = $fipsdir . "/lib/";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
# RSAX ENGINE sets default non-FIPS RSA method.
 | 
			
		||||
if ($fips)
 | 
			
		||||
	{
 | 
			
		||||
	$disabled{"rsax"} = "forced";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
# SSL 3.0 and TLS requires MD5 and SHA and either RSA or DSA+DH
 | 
			
		||||
if (defined($disabled{"md5"}) || defined($disabled{"sha"})
 | 
			
		||||
    || (defined($disabled{"rsa"})
 | 
			
		||||
@@ -1041,10 +1033,11 @@ if (defined($disabled{"ec"}) || defined($disabled{"dsa"})
 | 
			
		||||
	$disabled{"gost"} = "forced";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
# SRP requires TLSEXT
 | 
			
		||||
# SRP and HEARTBEATS require TLSEXT
 | 
			
		||||
if (defined($disabled{"tlsext"}))
 | 
			
		||||
	{
 | 
			
		||||
	$disabled{"srp"} = "forced";
 | 
			
		||||
	$disabled{"heartbeats"} = "forced";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
if ($target eq "TABLE") {
 | 
			
		||||
@@ -1070,10 +1063,6 @@ print "Configuring for $target\n";
 | 
			
		||||
 | 
			
		||||
&usage if (!defined($table{$target}));
 | 
			
		||||
 | 
			
		||||
if ($fips)
 | 
			
		||||
	{
 | 
			
		||||
	delete $disabled{"shared"} if ($disabled{"shared"} eq "default");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
foreach (sort (keys %disabled))
 | 
			
		||||
	{
 | 
			
		||||
@@ -1120,6 +1109,8 @@ foreach (sort (keys %disabled))
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				push @skip, $algo;
 | 
			
		||||
				# fix-up crypto/directory name(s)
 | 
			
		||||
				@skip[$#skip]="whrlpool" if $algo eq "whirlpool";
 | 
			
		||||
				print " (skip dir)";
 | 
			
		||||
 | 
			
		||||
				$depflags .= " -DOPENSSL_NO_$ALGO";
 | 
			
		||||
@@ -1131,7 +1122,6 @@ foreach (sort (keys %disabled))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
my $exp_cflags = "";
 | 
			
		||||
 | 
			
		||||
foreach (sort @experimental)
 | 
			
		||||
	{
 | 
			
		||||
	my $ALGO;
 | 
			
		||||
@@ -1147,24 +1137,7 @@ my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
 | 
			
		||||
$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
 | 
			
		||||
$exe_ext=".nlm" if ($target =~ /netware/);
 | 
			
		||||
$exe_ext=".pm"  if ($target =~ /vos/);
 | 
			
		||||
if ($openssldir eq "" and $prefix eq "")
 | 
			
		||||
	{
 | 
			
		||||
	if ($fips)
 | 
			
		||||
		{
 | 
			
		||||
		if (exists $ENV{FIPSDIR})
 | 
			
		||||
			{
 | 
			
		||||
			$openssldir="$ENV{FIPSDIR}";
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
			$openssldir="/usr/local/ssl/fips-2.0";
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		$openssldir="/usr/local/ssl";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
$openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
 | 
			
		||||
$prefix=$openssldir if $prefix eq "";
 | 
			
		||||
 | 
			
		||||
$default_ranlib= &which("ranlib") or $default_ranlib="true";
 | 
			
		||||
@@ -1172,10 +1145,6 @@ $perl=$ENV{'PERL'} or $perl=&which("perl5") or $perl=&which("perl")
 | 
			
		||||
  or $perl="perl";
 | 
			
		||||
my $make = $ENV{'MAKE'} || "make";
 | 
			
		||||
 | 
			
		||||
my $fips_auth_key = $ENV{'FIPS_AUTH_KEY'};
 | 
			
		||||
my $fips_auth_officer = $ENV{'FIPS_AUTH_OFFICER'};
 | 
			
		||||
my $fips_auth_user = $ENV{'FIPS_AUTH_USER'};
 | 
			
		||||
 | 
			
		||||
$cross_compile_prefix=$ENV{'CROSS_COMPILE'} if $cross_compile_prefix eq "";
 | 
			
		||||
 | 
			
		||||
chop $openssldir if $openssldir =~ /\/$/;
 | 
			
		||||
@@ -1246,6 +1215,12 @@ if ($target =~ /^mingw/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
 | 
			
		||||
	$shared_ldflag =~ s/\-mno\-cygwin\s*//;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
if ($target =~ /linux.*\-mips/ && !$no_asm && $flags !~ /\-m(ips|arch=)/) {
 | 
			
		||||
	# minimally required architecture flags for assembly modules
 | 
			
		||||
	$cflags="-mips2 $cflags" if ($target =~ /mips32/);
 | 
			
		||||
	$cflags="-mips3 $cflags" if ($target =~ /mips64/);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $no_shared_warn=0;
 | 
			
		||||
my $no_user_cflags=0;
 | 
			
		||||
 | 
			
		||||
@@ -1375,12 +1350,6 @@ if ($no_asm)
 | 
			
		||||
	$cpuid_obj=$bn_obj=
 | 
			
		||||
	$des_obj=$aes_obj=$bf_obj=$cast_obj=$rc4_obj=$rc5_obj=$cmll_obj=
 | 
			
		||||
	$modes_obj=$sha1_obj=$md5_obj=$rmd160_obj=$wp_obj=$engines_obj="";
 | 
			
		||||
	$cflags=~s/\-D[BL]_ENDIAN//		if ($fips);
 | 
			
		||||
	$thread_cflags=~s/\-D[BL]_ENDIAN//	if ($fips);
 | 
			
		||||
	}
 | 
			
		||||
elsif (defined($disabled{ec2m}))
 | 
			
		||||
	{
 | 
			
		||||
	$bn_obj =~ s/\w+-gf2m.o//;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
if (!$no_shared)
 | 
			
		||||
@@ -1418,7 +1387,7 @@ if ($zlib)
 | 
			
		||||
my $shared_mark = "";
 | 
			
		||||
if ($shared_target eq "")
 | 
			
		||||
	{
 | 
			
		||||
	$no_shared_warn = 1 if !$no_shared && !$fips;
 | 
			
		||||
	$no_shared_warn = 1 if !$no_shared;
 | 
			
		||||
	$no_shared = 1;
 | 
			
		||||
	}
 | 
			
		||||
if (!$no_shared)
 | 
			
		||||
@@ -1459,6 +1428,7 @@ if ($target =~ /\-icc$/)	# Intel C compiler
 | 
			
		||||
		}
 | 
			
		||||
	if ($iccver>=8)
 | 
			
		||||
		{
 | 
			
		||||
		$cflags=~s/\-KPIC/-fPIC/;
 | 
			
		||||
		# Eliminate unnecessary dependency from libirc.a. This is
 | 
			
		||||
		# essential for shared library support, as otherwise
 | 
			
		||||
		# apps/openssl can end up in endless loop upon startup...
 | 
			
		||||
@@ -1466,12 +1436,17 @@ if ($target =~ /\-icc$/)	# Intel C compiler
 | 
			
		||||
		}
 | 
			
		||||
	if ($iccver>=9)
 | 
			
		||||
		{
 | 
			
		||||
		$cflags.=" -i-static";
 | 
			
		||||
		$cflags=~s/\-no_cpprt/-no-cpprt/;
 | 
			
		||||
		$lflags.=" -i-static";
 | 
			
		||||
		$lflags=~s/\-no_cpprt/-no-cpprt/;
 | 
			
		||||
		}
 | 
			
		||||
	if ($iccver>=10)
 | 
			
		||||
		{
 | 
			
		||||
		$cflags=~s/\-i\-static/-static-intel/;
 | 
			
		||||
		$lflags=~s/\-i\-static/-static-intel/;
 | 
			
		||||
		}
 | 
			
		||||
	if ($iccver>=11)
 | 
			
		||||
		{
 | 
			
		||||
		$cflags.=" -no-intel-extensions";	# disable Cilk
 | 
			
		||||
		$lflags=~s/\-no\-cpprt/-no-cxxlib/;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -1518,11 +1493,7 @@ $cflags.=" -DOPENSSL_BN_ASM_GF2m" if ($bn_obj =~ /-gf2m/);
 | 
			
		||||
if ($fips)
 | 
			
		||||
	{
 | 
			
		||||
	$openssl_other_defines.="#define OPENSSL_FIPS\n";
 | 
			
		||||
	if ($fipscanisterinternal eq "y")
 | 
			
		||||
		{
 | 
			
		||||
		$openssl_other_defines.="#define OPENSSL_FIPSCANISTER\n";
 | 
			
		||||
		$cflags = "-DOPENSSL_FIPSCANISTER $cflags";
 | 
			
		||||
		}
 | 
			
		||||
	$cflags .= " -I\$(FIPSDIR)/include";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
$cpuid_obj="mem_clr.o"	unless ($cpuid_obj =~ /\.o$/);
 | 
			
		||||
@@ -1557,11 +1528,12 @@ if ($rmd160_obj =~ /\.o$/)
 | 
			
		||||
if ($aes_obj =~ /\.o$/)
 | 
			
		||||
	{
 | 
			
		||||
	$cflags.=" -DAES_ASM";
 | 
			
		||||
	# aes_ctr.o is not a real file, only indication that assembler
 | 
			
		||||
	# aes-ctr.o is not a real file, only indication that assembler
 | 
			
		||||
	# module implements AES_ctr32_encrypt...
 | 
			
		||||
	$cflags.=" -DAES_CTR_ASM" if ($aes_obj =~ s/\s*aes_ctr\.o//);
 | 
			
		||||
	$cflags.=" -DAES_CTR_ASM" if ($aes_obj =~ s/\s*aes\-ctr\.o//);
 | 
			
		||||
	# aes-xts.o indicates presense of AES_xts_[en|de]crypt...
 | 
			
		||||
	$cflags.=" -DAES_XTS_ASM" if ($aes_obj =~ s/\s*aes\-xts\.o//);
 | 
			
		||||
	$aes_obj =~ s/\s*(vpaes|aesni)\-x86\.o//g if ($no_sse2);
 | 
			
		||||
	$aes_obj =~ s/\s*(vp|bs)aes-\w*\.o//g if ($fipscanisterinternal eq "y");
 | 
			
		||||
	$cflags.=" -DVPAES_ASM" if ($aes_obj =~ m/vpaes/);
 | 
			
		||||
	$cflags.=" -DBSAES_ASM" if ($aes_obj =~ m/bsaes/);
 | 
			
		||||
	}
 | 
			
		||||
@@ -1569,7 +1541,7 @@ else	{
 | 
			
		||||
	$aes_obj=$aes_enc;
 | 
			
		||||
	}
 | 
			
		||||
$wp_obj="" if ($wp_obj =~ /mmx/ && $processor eq "386");
 | 
			
		||||
if ($wp_obj =~ /\.o$/)
 | 
			
		||||
if ($wp_obj =~ /\.o$/ && !$disabled{"whirlpool"})
 | 
			
		||||
	{
 | 
			
		||||
	$cflags.=" -DWHIRLPOOL_ASM";
 | 
			
		||||
	}
 | 
			
		||||
@@ -1628,35 +1600,11 @@ if ($strict_warnings)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
if ($fipscanisterinternal eq "y")
 | 
			
		||||
	{
 | 
			
		||||
	open(IN,"<fips/fips_auth.in") || die "can't open fips_auth.in";
 | 
			
		||||
	open(OUT,">fips/fips_auth.h") || die "can't open fips_auth.h";
 | 
			
		||||
	while(<IN>)
 | 
			
		||||
		{
 | 
			
		||||
		s/FIPS_AUTH_KEY.*$/FIPS_AUTH_KEY $fips_auth_key/ if defined $fips_auth_key;
 | 
			
		||||
		s/FIPS_AUTH_CRYPTO_OFFICER.*$/FIPS_AUTH_CRYPTO_OFFICER $fips_auth_officer/ if defined $fips_auth_officer;
 | 
			
		||||
		s/FIPS_AUTH_CRYPTO_USER.*$/FIPS_AUTH_CRYPTO_USER $fips_auth_user/ if defined $fips_auth_user;
 | 
			
		||||
		print OUT $_;
 | 
			
		||||
		}
 | 
			
		||||
	close IN;
 | 
			
		||||
	close OUT;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
my $mforg = $fipscanisteronly ? "Makefile.fips" : "Makefile.org";
 | 
			
		||||
 | 
			
		||||
open(IN,"<$mforg") || die "unable to read $mforg:$!\n";
 | 
			
		||||
open(IN,'<Makefile.org') || die "unable to read Makefile.org:$!\n";
 | 
			
		||||
unlink("$Makefile.new") || die "unable to remove old $Makefile.new:$!\n" if -e "$Makefile.new";
 | 
			
		||||
open(OUT,">$Makefile.new") || die "unable to create $Makefile.new:$!\n";
 | 
			
		||||
print OUT "### Generated automatically from $mforg by Configure.\n\n";
 | 
			
		||||
print OUT "### Generated automatically from Makefile.org by Configure.\n\n";
 | 
			
		||||
my $sdirs=0;
 | 
			
		||||
 | 
			
		||||
if ($fipscanisteronly)
 | 
			
		||||
	{
 | 
			
		||||
	$aes_obj =~ s/aesni-sha1-x86_64.o//;
 | 
			
		||||
	$bn_obj =~ s/modexp512-x86_64.o//;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
while (<IN>)
 | 
			
		||||
	{
 | 
			
		||||
	chomp;
 | 
			
		||||
@@ -1669,7 +1617,6 @@ while (<IN>)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	$sdirs = 0 unless /\\$/;
 | 
			
		||||
        s/fips // if (/^DIRS=/ && !$fips);
 | 
			
		||||
        s/engines // if (/^DIRS=/ && $disabled{"engine"});
 | 
			
		||||
	s/ccgost// if (/^ENGDIRS=/ && $disabled{"gost"});
 | 
			
		||||
	s/^VERSION=.*/VERSION=$version/;
 | 
			
		||||
@@ -1730,12 +1677,12 @@ while (<IN>)
 | 
			
		||||
	s/^LIBKRB5=.*/LIBKRB5=$withargs{"krb5-lib"}/;
 | 
			
		||||
	s/^LIBZLIB=.*/LIBZLIB=$withargs{"zlib-lib"}/;
 | 
			
		||||
	s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{"zlib-include"}/;
 | 
			
		||||
 | 
			
		||||
	s/^FIPSDIR=.*/FIPSDIR=$fipsdir/;
 | 
			
		||||
	s/^FIPSLIBDIR=.*/FIPSLIBDIR=$fipslibdir/;
 | 
			
		||||
	s/^FIPSCANLIB=.*/FIPSCANLIB=libcrypto/ if $fips;
 | 
			
		||||
	s/^SHARED_FIPS=.*/SHARED_FIPS=/;
 | 
			
		||||
	s/^SHLIBDIRS=.*/SHLIBDIRS= crypto ssl/;
 | 
			
		||||
	s/^FIPSCANISTERINTERNAL=.*/FIPSCANISTERINTERNAL=$fipscanisterinternal/;
 | 
			
		||||
	s/^BASEADDR=.*/BASEADDR=$baseaddr/;
 | 
			
		||||
 | 
			
		||||
	s/^SHLIB_TARGET=.*/SHLIB_TARGET=$shared_target/;
 | 
			
		||||
	s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/;
 | 
			
		||||
	s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared);
 | 
			
		||||
@@ -1758,10 +1705,6 @@ while (<IN>)
 | 
			
		||||
		s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.\$(SHLIB_MAJOR).dylib .dylib/;
 | 
			
		||||
		}
 | 
			
		||||
	s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=$shared_ldflag/;
 | 
			
		||||
	if ($fipscanisteronly && exists $disabled{"ec2m"})
 | 
			
		||||
		{
 | 
			
		||||
		next if (/ec2_/ || /bn_gf2m/);
 | 
			
		||||
		}
 | 
			
		||||
	print OUT $_."\n";
 | 
			
		||||
	}
 | 
			
		||||
close(IN);
 | 
			
		||||
@@ -2000,9 +1943,7 @@ EOF
 | 
			
		||||
	$make_targets .= " gentests" if $symlink;
 | 
			
		||||
	(system $make_command.$make_targets) == 0 or exit $?
 | 
			
		||||
		if $make_targets ne "";
 | 
			
		||||
	if ( $fipscanisteronly )
 | 
			
		||||
		{}
 | 
			
		||||
	elsif ( $perl =~ m@^/@) {
 | 
			
		||||
	if ( $perl =~ m@^/@) {
 | 
			
		||||
	    &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
 | 
			
		||||
	    &dofile("apps/CA.pl",$perl,'^#!/', '#!%s');
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -2010,7 +1951,7 @@ EOF
 | 
			
		||||
	    &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";',  '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
 | 
			
		||||
	    &dofile("apps/CA.pl",'/usr/local/bin/perl','^#!/', '#!%s');
 | 
			
		||||
	}
 | 
			
		||||
	if ($depflags ne $default_depflags && !$make_depend && !$fipscanisteronly) {
 | 
			
		||||
	if ($depflags ne $default_depflags && !$make_depend) {
 | 
			
		||||
		print <<EOF;
 | 
			
		||||
 | 
			
		||||
Since you've disabled or enabled at least one algorithm, you need to do
 | 
			
		||||
@@ -2053,16 +1994,9 @@ BEGIN
 | 
			
		||||
    BEGIN
 | 
			
		||||
	BLOCK "040904b0"
 | 
			
		||||
	BEGIN
 | 
			
		||||
#if defined(FIPS)
 | 
			
		||||
	    VALUE "Comments", "WARNING: TEST VERSION ONLY ***NOT*** FIPS 140-2 VALIDATED.\\0"
 | 
			
		||||
#endif
 | 
			
		||||
	    // Required:	    
 | 
			
		||||
	    VALUE "CompanyName", "The OpenSSL Project, http://www.openssl.org/\\0"
 | 
			
		||||
#if defined(FIPS)
 | 
			
		||||
	    VALUE "FileDescription", "TEST UNVALIDATED FIPS140-2 DLL\\0"
 | 
			
		||||
#else
 | 
			
		||||
	    VALUE "FileDescription", "OpenSSL Shared Library\\0"
 | 
			
		||||
#endif
 | 
			
		||||
	    VALUE "FileVersion", "$version\\0"
 | 
			
		||||
#if defined(CRYPTO)
 | 
			
		||||
	    VALUE "InternalName", "libeay32\\0"
 | 
			
		||||
@@ -2070,9 +2004,6 @@ BEGIN
 | 
			
		||||
#elif defined(SSL)
 | 
			
		||||
	    VALUE "InternalName", "ssleay32\\0"
 | 
			
		||||
	    VALUE "OriginalFilename", "ssleay32.dll\\0"
 | 
			
		||||
#elif defined(FIPS)
 | 
			
		||||
	    VALUE "InternalName", "libosslfips\\0"
 | 
			
		||||
	    VALUE "OriginalFilename", "libosslfips.dll\\0"
 | 
			
		||||
#endif
 | 
			
		||||
	    VALUE "ProductName", "The OpenSSL Toolkit\\0"
 | 
			
		||||
	    VALUE "ProductVersion", "$version\\0"
 | 
			
		||||
@@ -2115,21 +2046,6 @@ libraries on this platform, they will at least look at it and try their best
 | 
			
		||||
(but please first make sure you have tried with a current version of OpenSSL).
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
print <<\EOF if ($fipscanisterinternal eq "y");
 | 
			
		||||
 | 
			
		||||
WARNING: OpenSSL has been configured using unsupported option(s) to internally
 | 
			
		||||
generate a fipscanister.o object module for TESTING PURPOSES ONLY; that
 | 
			
		||||
compiled module is NOT FIPS 140-2 validated and CANNOT be used to replace the
 | 
			
		||||
OpenSSL FIPS Object Module as identified by the CMVP
 | 
			
		||||
(http://csrc.nist.gov/cryptval/) in any application requiring the use of FIPS
 | 
			
		||||
140-2 validated software. 
 | 
			
		||||
 | 
			
		||||
This is a test OpenSSL 2.0 FIPS module.
 | 
			
		||||
 | 
			
		||||
See the file README.FIPS for details of how to build a test library.
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
exit(0);
 | 
			
		||||
 | 
			
		||||
sub usage
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										62
									
								
								FAQ
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								FAQ
									
									
									
									
									
								
							@@ -10,6 +10,7 @@ OpenSSL  -  Frequently Asked Questions
 | 
			
		||||
* Why aren't tools like 'autoconf' and 'libtool' used?
 | 
			
		||||
* What is an 'engine' version?
 | 
			
		||||
* How do I check the authenticity of the OpenSSL distribution?
 | 
			
		||||
* How does the versioning scheme work?
 | 
			
		||||
 | 
			
		||||
[LEGAL] Legal questions
 | 
			
		||||
 | 
			
		||||
@@ -82,11 +83,11 @@ OpenSSL  -  Frequently Asked Questions
 | 
			
		||||
* Which is the current version of OpenSSL?
 | 
			
		||||
 | 
			
		||||
The current version is available from <URL: http://www.openssl.org>.
 | 
			
		||||
OpenSSL 1.0.0e was released on Sep 6th, 2011.
 | 
			
		||||
OpenSSL 1.0.1a was released on Apr 19th, 2012.
 | 
			
		||||
 | 
			
		||||
In addition to the current stable release, you can also access daily
 | 
			
		||||
snapshots of the OpenSSL development version at <URL:
 | 
			
		||||
ftp://ftp.openssl.org/snapshot/>, or get it by anonymous CVS access.
 | 
			
		||||
ftp://ftp.openssl.org/snapshot/>, or get it by anonymous Git access.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
* Where is the documentation?
 | 
			
		||||
@@ -108,7 +109,9 @@ In addition, you can read the most current versions at
 | 
			
		||||
<URL: http://www.openssl.org/docs/>. Note that the online documents refer
 | 
			
		||||
to the very latest development versions of OpenSSL and may include features
 | 
			
		||||
not present in released versions. If in doubt refer to the documentation
 | 
			
		||||
that came with the version of OpenSSL you are using.
 | 
			
		||||
that came with the version of OpenSSL you are using. The pod format
 | 
			
		||||
documentation is included in each OpenSSL distribution under the docs
 | 
			
		||||
directory.
 | 
			
		||||
 | 
			
		||||
For information on parts of libcrypto that are not yet documented, you
 | 
			
		||||
might want to read Ariel Glenn's documentation on SSLeay 0.9, OpenSSL's
 | 
			
		||||
@@ -173,14 +176,31 @@ just do:
 | 
			
		||||
 | 
			
		||||
   pgp TARBALL.asc
 | 
			
		||||
 | 
			
		||||
* How does the versioning scheme work?
 | 
			
		||||
 | 
			
		||||
After the release of OpenSSL 1.0.0 the versioning scheme changed. Letter 
 | 
			
		||||
releases (e.g. 1.0.1a) can only contain bug and security fixes and no
 | 
			
		||||
new features. Minor releases change the last number (e.g. 1.0.2) and 
 | 
			
		||||
can contain new features that retain binary compatibility. Changes to
 | 
			
		||||
the middle number are considered major releases and neither source nor
 | 
			
		||||
binary compatibility is guaranteed.
 | 
			
		||||
 | 
			
		||||
Therefore the answer to the common question "when will feature X be
 | 
			
		||||
backported to OpenSSL 1.0.0/0.9.8?" is "never" but it could appear
 | 
			
		||||
in the next minor release.
 | 
			
		||||
 | 
			
		||||
* What happens when the letter release reaches z?
 | 
			
		||||
 | 
			
		||||
It was decided after the release of OpenSSL 0.9.8y the next version should
 | 
			
		||||
be 0.9.8za then 0.9.8zb and so on.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[LEGAL] =======================================================================
 | 
			
		||||
 | 
			
		||||
* Do I need patent licenses to use OpenSSL?
 | 
			
		||||
 | 
			
		||||
The patents section of the README file lists patents that may apply to
 | 
			
		||||
you if you want to use OpenSSL.  For information on intellectual
 | 
			
		||||
property rights, please consult a lawyer.  The OpenSSL team does not
 | 
			
		||||
offer legal advice.
 | 
			
		||||
For information on intellectual property rights, please consult a lawyer.
 | 
			
		||||
The OpenSSL team does not offer legal advice.
 | 
			
		||||
 | 
			
		||||
You can configure OpenSSL so as not to use IDEA, MDC2 and RC5 by using
 | 
			
		||||
 ./config no-idea no-mdc2 no-rc5
 | 
			
		||||
@@ -284,7 +304,7 @@ current directory in this case, but this has changed with 0.9.6a.)
 | 
			
		||||
Check out the CA.pl(1) manual page. This provides a simple wrapper round
 | 
			
		||||
the 'req', 'verify', 'ca' and 'pkcs12' utilities. For finer control check
 | 
			
		||||
out the manual pages for the individual utilities and the certificate
 | 
			
		||||
extensions documentation (currently in doc/openssl.txt).
 | 
			
		||||
extensions documentation (in ca(1), req(1), x509v3_config(5) )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
* Why can't I create certificate requests?
 | 
			
		||||
@@ -597,8 +617,8 @@ valid for the current DOS session.
 | 
			
		||||
* What is special about OpenSSL on Redhat?
 | 
			
		||||
 | 
			
		||||
Red Hat Linux (release 7.0 and later) include a preinstalled limited
 | 
			
		||||
version of OpenSSL. For patent reasons, support for IDEA, RC5 and MDC2
 | 
			
		||||
is disabled in this version. The same may apply to other Linux distributions.
 | 
			
		||||
version of OpenSSL. Red Hat has chosen to disable support for IDEA, RC5 and
 | 
			
		||||
MDC2 in this version. The same may apply to other Linux distributions.
 | 
			
		||||
Users may therefore wish to install more or all of the features left out.
 | 
			
		||||
 | 
			
		||||
To do this you MUST ensure that you do not overwrite the openssl that is in
 | 
			
		||||
@@ -621,11 +641,6 @@ relevant updates in packages up to and including 0.9.6b.
 | 
			
		||||
A possible way around this is to persuade Red Hat to produce a non-US
 | 
			
		||||
version of Red Hat Linux.
 | 
			
		||||
 | 
			
		||||
FYI: Patent numbers and expiry dates of US patents:
 | 
			
		||||
MDC-2: 4,908,861 13/03/2007
 | 
			
		||||
IDEA:  5,214,703 25/05/2010
 | 
			
		||||
RC5:   5,724,428 03/03/2015
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
* Why does the OpenSSL compilation fail on MacOS X?
 | 
			
		||||
 | 
			
		||||
@@ -848,7 +863,7 @@ The opposite assumes we already have len bytes in buf:
 | 
			
		||||
 p = buf;
 | 
			
		||||
 p7 = d2i_PKCS7(NULL, &p, len);
 | 
			
		||||
 | 
			
		||||
At this point p7 contains a valid PKCS7 structure of NULL if an error
 | 
			
		||||
At this point p7 contains a valid PKCS7 structure or NULL if an error
 | 
			
		||||
occurred. If an error occurred ERR_print_errors(bio) should give more
 | 
			
		||||
information.
 | 
			
		||||
 | 
			
		||||
@@ -860,6 +875,21 @@ that has been read or written. This may well be uninitialized data
 | 
			
		||||
and attempts to free the buffer will have unpredictable results
 | 
			
		||||
because it no longer points to the same address.
 | 
			
		||||
 | 
			
		||||
Memory allocation and encoding can also be combined in a single
 | 
			
		||||
operation by the ASN1 routines:
 | 
			
		||||
 | 
			
		||||
 unsigned char *buf = NULL;	/* mandatory */
 | 
			
		||||
 int len;
 | 
			
		||||
 len = i2d_PKCS7(p7, &buf);
 | 
			
		||||
 if (len < 0)
 | 
			
		||||
	/* Error */
 | 
			
		||||
 /* Do some things with 'buf' */
 | 
			
		||||
 /* Finished with buf: free it */
 | 
			
		||||
 OPENSSL_free(buf);
 | 
			
		||||
 | 
			
		||||
In this special case the "buf" parameter is *not* incremented, it points
 | 
			
		||||
to the start of the encoding.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
* OpenSSL uses DER but I need BER format: does OpenSSL support BER?
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								GitConfigure
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										8
									
								
								GitConfigure
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
BRANCH=`git rev-parse --abbrev-ref HEAD`
 | 
			
		||||
 | 
			
		||||
./Configure $@ no-symlinks
 | 
			
		||||
make files
 | 
			
		||||
util/mk1mf.pl OUT=out.$BRANCH TMP=tmp.$BRANCH INC=inc.$BRANCH copy > makefile.$BRANCH
 | 
			
		||||
make -f makefile.$BRANCH init
 | 
			
		||||
							
								
								
									
										5
									
								
								GitMake
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										5
									
								
								GitMake
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
BRANCH=`git rev-parse --abbrev-ref HEAD`
 | 
			
		||||
 | 
			
		||||
make -f makefile.$BRANCH $@
 | 
			
		||||
							
								
								
									
										6
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								INSTALL
									
									
									
									
									
								
							@@ -103,6 +103,12 @@
 | 
			
		||||
                define preprocessor symbols, specify additional libraries,
 | 
			
		||||
                library directories or other compiler options.
 | 
			
		||||
 | 
			
		||||
  -DHAVE_CRYPTODEV Enable the BSD cryptodev engine even if we are not using
 | 
			
		||||
		BSD. Useful if you are running ocf-linux or something
 | 
			
		||||
		similar. Once enabled you can also enable the use of
 | 
			
		||||
		cryptodev digests, which is usually slower unless you have
 | 
			
		||||
		large amounts data. Use -DUSE_CRYPTODEV_DIGESTS to force
 | 
			
		||||
		it.
 | 
			
		||||
 | 
			
		||||
 Installation in Detail
 | 
			
		||||
 ----------------------
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@
 | 
			
		||||
  is required if you intend to utilize assembler modules. Note that NASM
 | 
			
		||||
  is now the only supported assembler.
 | 
			
		||||
 | 
			
		||||
 If you are compiling from a tarball or a CVS snapshot then the Win32 files
 | 
			
		||||
 If you are compiling from a tarball or a Git snapshot then the Win32 files
 | 
			
		||||
 may well be not up to date. This may mean that some "tweaking" is required to
 | 
			
		||||
 get it all to work. See the trouble shooting section later on for if (when?)
 | 
			
		||||
 it goes wrong.
 | 
			
		||||
@@ -257,7 +257,7 @@
 | 
			
		||||
 | 
			
		||||
 then ms\do_XXX should not give a warning any more. However the numbers that
 | 
			
		||||
 get assigned by this technique may not match those that eventually get
 | 
			
		||||
 assigned in the CVS tree: so anything linked against this version of the
 | 
			
		||||
 assigned in the Git tree: so anything linked against this version of the
 | 
			
		||||
 library may need to be recompiled.
 | 
			
		||||
 | 
			
		||||
 If you get errors about unresolved symbols there are several possible
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										62
									
								
								MacOS/GUSI_Init.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								MacOS/GUSI_Init.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
/**************** BEGIN GUSI CONFIGURATION ****************************
 | 
			
		||||
 *
 | 
			
		||||
 * GUSI Configuration section generated by GUSI Configurator
 | 
			
		||||
 * last modified: Wed Jan  5 20:33:51 2000
 | 
			
		||||
 *
 | 
			
		||||
 * This section will be overwritten by the next run of Configurator.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define GUSI_SOURCE
 | 
			
		||||
#include <GUSIConfig.h>
 | 
			
		||||
#include <sys/cdefs.h>
 | 
			
		||||
 | 
			
		||||
/* Declarations of Socket Factories */
 | 
			
		||||
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
void GUSIwithInetSockets();
 | 
			
		||||
void GUSIwithLocalSockets();
 | 
			
		||||
void GUSIwithMTInetSockets();
 | 
			
		||||
void GUSIwithMTTcpSockets();
 | 
			
		||||
void GUSIwithMTUdpSockets();
 | 
			
		||||
void GUSIwithOTInetSockets();
 | 
			
		||||
void GUSIwithOTTcpSockets();
 | 
			
		||||
void GUSIwithOTUdpSockets();
 | 
			
		||||
void GUSIwithPPCSockets();
 | 
			
		||||
void GUSISetupFactories();
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
/* Configure Socket Factories */
 | 
			
		||||
 | 
			
		||||
void GUSISetupFactories()
 | 
			
		||||
{
 | 
			
		||||
#ifdef GUSISetupFactories_BeginHook
 | 
			
		||||
	GUSISetupFactories_BeginHook
 | 
			
		||||
#endif
 | 
			
		||||
	GUSIwithInetSockets();
 | 
			
		||||
#ifdef GUSISetupFactories_EndHook
 | 
			
		||||
	GUSISetupFactories_EndHook
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Declarations of File Devices */
 | 
			
		||||
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
void GUSIwithDConSockets();
 | 
			
		||||
void GUSIwithNullSockets();
 | 
			
		||||
void GUSISetupDevices();
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
/* Configure File Devices */
 | 
			
		||||
 | 
			
		||||
void GUSISetupDevices()
 | 
			
		||||
{
 | 
			
		||||
#ifdef GUSISetupDevices_BeginHook
 | 
			
		||||
	GUSISetupDevices_BeginHook
 | 
			
		||||
#endif
 | 
			
		||||
	GUSIwithNullSockets();
 | 
			
		||||
#ifdef GUSISetupDevices_EndHook
 | 
			
		||||
	GUSISetupDevices_EndHook
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************** END GUSI CONFIGURATION *************************/
 | 
			
		||||
							
								
								
									
										2753
									
								
								MacOS/GetHTTPS.src/CPStringUtils.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2753
									
								
								MacOS/GetHTTPS.src/CPStringUtils.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										104
									
								
								MacOS/GetHTTPS.src/CPStringUtils.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								MacOS/GetHTTPS.src/CPStringUtils.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void CopyPStrToCStr(const unsigned char *thePStr,char *theCStr,const int maxCStrLength);
 | 
			
		||||
void CopyPStrToPStr(const unsigned char *theSrcPStr,unsigned char *theDstPStr,const int maxDstStrLength);
 | 
			
		||||
void CopyCStrToCStr(const char *theSrcCStr,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
void CopyCStrToPStr(const char *theSrcCStr,unsigned char *theDstPStr,const int maxDstStrLength);
 | 
			
		||||
void ConcatPStrToCStr(const unsigned char *thePStr,char *theCStr,const int maxCStrLength);
 | 
			
		||||
void ConcatPStrToPStr(const unsigned char *theSrcPStr,unsigned char *theDstPStr,const int maxDstStrLength);
 | 
			
		||||
void ConcatCStrToPStr(const char *theSrcCStr,unsigned char *theDstPStr,const int maxDstStrLength);
 | 
			
		||||
void ConcatCStrToCStr(const char *theSrcCStr,char *theDstCStr,const int maxCStrLength);
 | 
			
		||||
 | 
			
		||||
void ConcatCharToCStr(const char theChar,char *theDstCStr,const int maxCStrLength);
 | 
			
		||||
void ConcatCharToPStr(const char theChar,unsigned char *theDstPStr,const int maxPStrLength);
 | 
			
		||||
 | 
			
		||||
int ComparePStrs(const unsigned char *theFirstPStr,const unsigned char *theSecondPStr,const Boolean ignoreCase = true);
 | 
			
		||||
int CompareCStrs(const char *theFirstCStr,const char *theSecondCStr,const Boolean ignoreCase = true);
 | 
			
		||||
int CompareCStrToPStr(const char *theCStr,const unsigned char *thePStr,const Boolean ignoreCase = true);
 | 
			
		||||
 | 
			
		||||
Boolean CStrsAreEqual(const char *theFirstCStr,const char *theSecondCStr,const Boolean ignoreCase = true);
 | 
			
		||||
Boolean PStrsAreEqual(const unsigned char *theFirstCStr,const unsigned char *theSecondCStr,const Boolean ignoreCase = true);
 | 
			
		||||
 | 
			
		||||
void CopyLongIntToCStr(const long theNum,char *theCStr,const int maxCStrLength,const int numDigits = -1);
 | 
			
		||||
void CopyUnsignedLongIntToCStr(const unsigned long theNum,char *theCStr,const int maxCStrLength);
 | 
			
		||||
void ConcatLongIntToCStr(const long theNum,char *theCStr,const int maxCStrLength,const int numDigits = -1);
 | 
			
		||||
void CopyCStrAndConcatLongIntToCStr(const char *theSrcCStr,const long theNum,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
 | 
			
		||||
void CopyLongIntToPStr(const long theNum,unsigned char *thePStr,const int maxPStrLength,const int numDigits = -1);
 | 
			
		||||
void ConcatLongIntToPStr(const long theNum,unsigned char *thePStr,const int maxPStrLength,const int numDigits = -1);
 | 
			
		||||
 | 
			
		||||
long CStrLength(const char *theCString);
 | 
			
		||||
long PStrLength(const unsigned char *thePString);
 | 
			
		||||
 | 
			
		||||
OSErr CopyCStrToExistingHandle(const char *theCString,Handle theHandle);
 | 
			
		||||
OSErr CopyLongIntToExistingHandle(const long inTheLongInt,Handle theHandle);
 | 
			
		||||
 | 
			
		||||
OSErr CopyCStrToNewHandle(const char *theCString,Handle *theHandle);
 | 
			
		||||
OSErr CopyPStrToNewHandle(const unsigned char *thePString,Handle *theHandle);
 | 
			
		||||
OSErr CopyLongIntToNewHandle(const long inTheLongInt,Handle *theHandle);
 | 
			
		||||
 | 
			
		||||
OSErr AppendCStrToHandle(const char *theCString,Handle theHandle,long *currentLength = nil,long *maxLength = nil);
 | 
			
		||||
OSErr AppendCharsToHandle(const char *theChars,const int numChars,Handle theHandle,long *currentLength = nil,long *maxLength = nil);
 | 
			
		||||
OSErr AppendPStrToHandle(const unsigned char *thePString,Handle theHandle,long *currentLength = nil);
 | 
			
		||||
OSErr AppendLongIntToHandle(const long inTheLongInt,Handle theHandle,long *currentLength = nil);
 | 
			
		||||
 | 
			
		||||
void ZeroMem(void *theMemPtr,const unsigned long numBytes);
 | 
			
		||||
 | 
			
		||||
char *FindCharInCStr(const char theChar,const char *theCString);
 | 
			
		||||
long FindCharOffsetInCStr(const char theChar,const char *theCString,const Boolean inIgnoreCase = false);
 | 
			
		||||
long FindCStrOffsetInCStr(const char *theCSubstring,const char *theCString,const Boolean inIgnoreCase = false);
 | 
			
		||||
 | 
			
		||||
void CopyCSubstrToCStr(const char *theSrcCStr,const int maxCharsToCopy,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
void CopyCSubstrToPStr(const char *theSrcCStr,const int maxCharsToCopy,unsigned char *theDstPStr,const int maxDstStrLength);
 | 
			
		||||
 | 
			
		||||
void InsertCStrIntoCStr(const char *theSrcCStr,const int theInsertionOffset,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
void InsertPStrIntoCStr(const unsigned char *theSrcPStr,const int theInsertionOffset,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
OSErr InsertCStrIntoHandle(const char *theCString,Handle theHandle,const long inInsertOffset);
 | 
			
		||||
 | 
			
		||||
void CopyCStrAndInsertCStrIntoCStr(const char *theSrcCStr,const char *theInsertCStr,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
 | 
			
		||||
void CopyCStrAndInsertCStrsLongIntsIntoCStr(const char *theSrcCStr,const char **theInsertCStrs,const long *theLongInts,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
 | 
			
		||||
void CopyCStrAndInsert1LongIntIntoCStr(const char *theSrcCStr,const long theNum,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
void CopyCStrAndInsert2LongIntsIntoCStr(const char *theSrcCStr,const long long1,const long long2,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
void CopyCStrAndInsert3LongIntsIntoCStr(const char *theSrcCStr,const long long1,const long long2,const long long3,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
 | 
			
		||||
void CopyCStrAndInsertCStrLongIntIntoCStr(const char *theSrcCStr,const char *theInsertCStr,const long theNum,char *theDstCStr,const int maxDstStrLength);
 | 
			
		||||
OSErr CopyCStrAndInsertCStrLongIntIntoHandle(const char *theSrcCStr,const char *theInsertCStr,const long theNum,Handle *theHandle);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OSErr CopyIndexedWordToCStr(char *theSrcCStr,int whichWord,char *theDstCStr,int maxDstCStrLength);
 | 
			
		||||
OSErr CopyIndexedWordToNewHandle(char *theSrcCStr,int whichWord,Handle *outTheHandle);
 | 
			
		||||
 | 
			
		||||
OSErr CopyIndexedLineToCStr(const char *theSrcCStr,int inWhichLine,int *lineEndIndex,Boolean *gotLastLine,char *theDstCStr,const int maxDstCStrLength);
 | 
			
		||||
OSErr CopyIndexedLineToNewHandle(const char *theSrcCStr,int inWhichLine,Handle *outNewHandle);
 | 
			
		||||
 | 
			
		||||
OSErr ExtractIntFromCStr(const char *theSrcCStr,int *outInt,Boolean skipLeadingSpaces = true);
 | 
			
		||||
OSErr ExtractIntFromPStr(const unsigned char *theSrcPStr,int *outInt,Boolean skipLeadingSpaces = true);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ConvertCStrToUpperCase(char *theSrcCStr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int CountOccurencesOfCharInCStr(const char inChar,const char *inSrcCStr);
 | 
			
		||||
int CountWordsInCStr(const char *inSrcCStr);
 | 
			
		||||
 | 
			
		||||
OSErr CountDigits(const char *inCStr,int *outNumIntegerDigits,int *outNumFractDigits);
 | 
			
		||||
 | 
			
		||||
void ExtractCStrItemFromCStr(const char *inSrcCStr,const char inItemDelimiter,const int inItemNumber,Boolean *foundItem,char *outDstCharPtr,const int inDstCharPtrMaxLength,const Boolean inTreatMultipleDelimsAsSingleDelim = false);
 | 
			
		||||
OSErr ExtractCStrItemFromCStrIntoNewHandle(const char *inSrcCStr,const char inItemDelimiter,const int inItemNumber,Boolean *foundItem,Handle *outNewHandle,const Boolean inTreatMultipleDelimsAsSingleDelim = false);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OSErr ExtractFloatFromCStr(const char *inCString,extended80 *outFloat);
 | 
			
		||||
OSErr CopyFloatToCStr(const extended80 *theFloat,char *theCStr,const int maxCStrLength,const int inMaxNumIntDigits = -1,const int inMaxNumFractDigits = -1);
 | 
			
		||||
 | 
			
		||||
void SkipWhiteSpace(char **ioSrcCharPtr,const Boolean inStopAtEOL = false);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,9 +1,5 @@
 | 
			
		||||
/* fips_dsa_sign.c */
 | 
			
		||||
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
 | 
			
		||||
 * project 2007.
 | 
			
		||||
 */
 | 
			
		||||
/* ====================================================================
 | 
			
		||||
 * Copyright (c) 2011 The OpenSSL Project.  All rights reserved.
 | 
			
		||||
 * Copyright (c) 1998-1999 The OpenSSL Project.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
@@ -20,12 +16,12 @@
 | 
			
		||||
 * 3. All advertising materials mentioning features or use of this
 | 
			
		||||
 *    software must display the following acknowledgment:
 | 
			
		||||
 *    "This product includes software developed by the OpenSSL Project
 | 
			
		||||
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 | 
			
		||||
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 | 
			
		||||
 *
 | 
			
		||||
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 | 
			
		||||
 *    endorse or promote products derived from this software without
 | 
			
		||||
 *    prior written permission. For written permission, please contact
 | 
			
		||||
 *    licensing@OpenSSL.org.
 | 
			
		||||
 *    openssl-core@openssl.org.
 | 
			
		||||
 *
 | 
			
		||||
 * 5. Products derived from this software may not be called "OpenSSL"
 | 
			
		||||
 *    nor may "OpenSSL" appear in their names without prior written
 | 
			
		||||
@@ -34,7 +30,7 @@
 | 
			
		||||
 * 6. Redistributions of any form whatsoever must retain the following
 | 
			
		||||
 *    acknowledgment:
 | 
			
		||||
 *    "This product includes software developed by the OpenSSL Project
 | 
			
		||||
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 | 
			
		||||
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 | 
			
		||||
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
@@ -56,86 +52,119 @@
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
#define OPENSSL_FIPSAPI
 | 
			
		||||
 
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <openssl/evp.h>
 | 
			
		||||
#include <openssl/dsa.h>
 | 
			
		||||
#include <openssl/err.h>
 | 
			
		||||
#include <openssl/sha.h>
 | 
			
		||||
#include <openssl/bn.h>
 | 
			
		||||
 
 | 
			
		||||
#ifdef OPENSSL_FIPS
 | 
			
		||||
 #include "ErrorHandling.hpp"
 | 
			
		||||
#include "CPStringUtils.hpp"
 | 
			
		||||
 | 
			
		||||
/* FIPS versions of DSA_sign() and DSA_verify().
 | 
			
		||||
 * Handle DSA_SIG structures to avoid need to handle ASN1.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __EXCEPTIONS_ENABLED__
 | 
			
		||||
	#include "CMyException.hpp"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
DSA_SIG * FIPS_dsa_sign_ctx(DSA *dsa, EVP_MD_CTX *ctx)
 | 
			
		||||
 | 
			
		||||
static char					gErrorMessageBuffer[512];
 | 
			
		||||
 | 
			
		||||
char 						*gErrorMessage = gErrorMessageBuffer;
 | 
			
		||||
int							gErrorMessageMaxLength = sizeof(gErrorMessageBuffer);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void SetErrorMessage(const char *theErrorMessage)
 | 
			
		||||
{
 | 
			
		||||
	if (theErrorMessage != nil)
 | 
			
		||||
	{
 | 
			
		||||
	DSA_SIG *s;
 | 
			
		||||
	unsigned char dig[EVP_MAX_MD_SIZE];
 | 
			
		||||
	unsigned int dlen;
 | 
			
		||||
        FIPS_digestfinal(ctx, dig, &dlen);
 | 
			
		||||
	s = dsa->meth->dsa_do_sign(dig,dlen,dsa);
 | 
			
		||||
	OPENSSL_cleanse(dig, dlen);
 | 
			
		||||
	return s;
 | 
			
		||||
		CopyCStrToCStr(theErrorMessage,gErrorMessage,gErrorMessageMaxLength);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void SetErrorMessageAndAppendLongInt(const char *theErrorMessage,const long theLongInt)
 | 
			
		||||
{
 | 
			
		||||
	if (theErrorMessage != nil)
 | 
			
		||||
	{
 | 
			
		||||
		CopyCStrAndConcatLongIntToCStr(theErrorMessage,theLongInt,gErrorMessage,gErrorMessageMaxLength);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SetErrorMessageAndCStrAndLongInt(const char *theErrorMessage,const char * theCStr,const long theLongInt)
 | 
			
		||||
{
 | 
			
		||||
	if (theErrorMessage != nil)
 | 
			
		||||
	{
 | 
			
		||||
		CopyCStrAndInsertCStrLongIntIntoCStr(theErrorMessage,theCStr,theLongInt,gErrorMessage,gErrorMessageMaxLength);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
DSA_SIG * FIPS_dsa_sign_digest(DSA *dsa, const unsigned char *dig, int dlen)
 | 
			
		||||
	{
 | 
			
		||||
	if (FIPS_selftest_failed())
 | 
			
		||||
		{
 | 
			
		||||
		FIPSerr(FIPS_F_FIPS_DSA_SIGN_DIGEST, FIPS_R_SELFTEST_FAILED);
 | 
			
		||||
		return NULL;
 | 
			
		||||
		}
 | 
			
		||||
	return dsa->meth->dsa_do_sign(dig, dlen, dsa);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int FIPS_dsa_verify_ctx(DSA *dsa, EVP_MD_CTX *ctx, DSA_SIG *s)
 | 
			
		||||
void SetErrorMessageAndCStr(const char *theErrorMessage,const char * theCStr)
 | 
			
		||||
{
 | 
			
		||||
	if (theErrorMessage != nil)
 | 
			
		||||
	{
 | 
			
		||||
	int ret=-1;
 | 
			
		||||
	unsigned char dig[EVP_MAX_MD_SIZE];
 | 
			
		||||
	unsigned int dlen;
 | 
			
		||||
        FIPS_digestfinal(ctx, dig, &dlen);
 | 
			
		||||
	ret=dsa->meth->dsa_do_verify(dig,dlen,s,dsa);
 | 
			
		||||
	OPENSSL_cleanse(dig, dlen);
 | 
			
		||||
	return ret;
 | 
			
		||||
		CopyCStrAndInsertCStrLongIntIntoCStr(theErrorMessage,theCStr,-1,gErrorMessage,gErrorMessageMaxLength);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int FIPS_dsa_verify_digest(DSA *dsa,
 | 
			
		||||
				const unsigned char *dig, int dlen, DSA_SIG *s)
 | 
			
		||||
	{
 | 
			
		||||
	if (FIPS_selftest_failed())
 | 
			
		||||
		{
 | 
			
		||||
		FIPSerr(FIPS_F_FIPS_DSA_VERIFY_DIGEST, FIPS_R_SELFTEST_FAILED);
 | 
			
		||||
		return -1;
 | 
			
		||||
		}
 | 
			
		||||
	return dsa->meth->dsa_do_verify(dig,dlen,s,dsa);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
int FIPS_dsa_verify(DSA *dsa, const unsigned char *msg, size_t msglen,
 | 
			
		||||
			const EVP_MD *mhash, DSA_SIG *s)
 | 
			
		||||
void AppendCStrToErrorMessage(const char *theErrorMessage)
 | 
			
		||||
{
 | 
			
		||||
	if (theErrorMessage != nil)
 | 
			
		||||
	{
 | 
			
		||||
	int ret=-1;
 | 
			
		||||
	unsigned char dig[EVP_MAX_MD_SIZE];
 | 
			
		||||
	unsigned int dlen;
 | 
			
		||||
        FIPS_digest(msg, msglen, dig, &dlen, mhash);
 | 
			
		||||
	ret=FIPS_dsa_verify_digest(dsa, dig, dlen, s);
 | 
			
		||||
	OPENSSL_cleanse(dig, dlen);
 | 
			
		||||
	return ret;
 | 
			
		||||
		ConcatCStrToCStr(theErrorMessage,gErrorMessage,gErrorMessageMaxLength);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DSA_SIG * FIPS_dsa_sign(DSA *dsa, const unsigned char *msg, size_t msglen,
 | 
			
		||||
			const EVP_MD *mhash)
 | 
			
		||||
	{
 | 
			
		||||
	DSA_SIG *s;
 | 
			
		||||
	unsigned char dig[EVP_MAX_MD_SIZE];
 | 
			
		||||
	unsigned int dlen;
 | 
			
		||||
        FIPS_digest(msg, msglen, dig, &dlen, mhash);
 | 
			
		||||
	s = FIPS_dsa_sign_digest(dsa, dig, dlen);
 | 
			
		||||
	OPENSSL_cleanse(dig, dlen);
 | 
			
		||||
	return s;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
void AppendLongIntToErrorMessage(const long theLongInt)
 | 
			
		||||
{
 | 
			
		||||
	ConcatLongIntToCStr(theLongInt,gErrorMessage,gErrorMessageMaxLength);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
char *GetErrorMessage(void)
 | 
			
		||||
{
 | 
			
		||||
	return gErrorMessage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OSErr GetErrorMessageInNewHandle(Handle *inoutHandle)
 | 
			
		||||
{
 | 
			
		||||
OSErr		errCode;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	errCode = CopyCStrToNewHandle(gErrorMessage,inoutHandle);
 | 
			
		||||
	
 | 
			
		||||
	return(errCode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OSErr GetErrorMessageInExistingHandle(Handle inoutHandle)
 | 
			
		||||
{
 | 
			
		||||
OSErr		errCode;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	errCode = CopyCStrToExistingHandle(gErrorMessage,inoutHandle);
 | 
			
		||||
	
 | 
			
		||||
	return(errCode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OSErr AppendErrorMessageToHandle(Handle inoutHandle)
 | 
			
		||||
{
 | 
			
		||||
OSErr		errCode;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	errCode = AppendCStrToHandle(gErrorMessage,inoutHandle,nil);
 | 
			
		||||
	
 | 
			
		||||
	return(errCode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __EXCEPTIONS_ENABLED__
 | 
			
		||||
 | 
			
		||||
void ThrowErrorMessageException(void)
 | 
			
		||||
{
 | 
			
		||||
	ThrowDescriptiveException(gErrorMessage);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										147
									
								
								MacOS/GetHTTPS.src/ErrorHandling.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								MacOS/GetHTTPS.src/ErrorHandling.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,147 @@
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef kGenericError
 | 
			
		||||
	#define kGenericError		-1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern char	*gErrorMessage;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void SetErrorMessage(const char *theErrorMessage);
 | 
			
		||||
void SetErrorMessageAndAppendLongInt(const char *theErrorMessage,const long theLongInt);
 | 
			
		||||
void SetErrorMessageAndCStrAndLongInt(const char *theErrorMessage,const char * theCStr,const long theLongInt);
 | 
			
		||||
void SetErrorMessageAndCStr(const char *theErrorMessage,const char * theCStr);
 | 
			
		||||
void AppendCStrToErrorMessage(const char *theErrorMessage);
 | 
			
		||||
void AppendLongIntToErrorMessage(const long theLongInt);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
char *GetErrorMessage(void);
 | 
			
		||||
OSErr GetErrorMessageInNewHandle(Handle *inoutHandle);
 | 
			
		||||
OSErr GetErrorMessageInExistingHandle(Handle inoutHandle);
 | 
			
		||||
OSErr AppendErrorMessageToHandle(Handle inoutHandle);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __EXCEPTIONS_ENABLED__
 | 
			
		||||
	void ThrowErrorMessageException(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	A bunch of evil macros that would be unnecessary if I were always using C++ !
 | 
			
		||||
 | 
			
		||||
#define SetErrorMessageAndBailIfNil(theArg,theMessage)								\
 | 
			
		||||
{																					\
 | 
			
		||||
	if (theArg == nil)																\
 | 
			
		||||
	{																				\
 | 
			
		||||
		SetErrorMessage(theMessage);												\
 | 
			
		||||
		errCode = kGenericError;													\
 | 
			
		||||
		goto EXITPOINT;																\
 | 
			
		||||
	}																				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrorMessageAndBail(theMessage)											\
 | 
			
		||||
{																					\
 | 
			
		||||
		SetErrorMessage(theMessage);												\
 | 
			
		||||
		errCode = kGenericError;													\
 | 
			
		||||
		goto EXITPOINT;																\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrorMessageAndLongIntAndBail(theMessage,theLongInt)						\
 | 
			
		||||
{																					\
 | 
			
		||||
		SetErrorMessageAndAppendLongInt(theMessage,theLongInt);						\
 | 
			
		||||
		errCode = kGenericError;													\
 | 
			
		||||
		goto EXITPOINT;																\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrorMessageAndLongIntAndBailIfError(theErrCode,theMessage,theLongInt)	\
 | 
			
		||||
{																					\
 | 
			
		||||
	if (theErrCode != noErr)														\
 | 
			
		||||
	{																				\
 | 
			
		||||
		SetErrorMessageAndAppendLongInt(theMessage,theLongInt);						\
 | 
			
		||||
		errCode = theErrCode;														\
 | 
			
		||||
		goto EXITPOINT;																\
 | 
			
		||||
	}																				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrorMessageCStrLongIntAndBailIfError(theErrCode,theMessage,theCStr,theLongInt)	\
 | 
			
		||||
{																					\
 | 
			
		||||
	if (theErrCode != noErr)														\
 | 
			
		||||
	{																				\
 | 
			
		||||
		SetErrorMessageAndCStrAndLongInt(theMessage,theCStr,theLongInt);			\
 | 
			
		||||
		errCode = theErrCode;														\
 | 
			
		||||
		goto EXITPOINT;																\
 | 
			
		||||
	}																				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrorMessageAndCStrAndBail(theMessage,theCStr)							\
 | 
			
		||||
{																					\
 | 
			
		||||
	SetErrorMessageAndCStr(theMessage,theCStr);										\
 | 
			
		||||
	errCode = kGenericError;														\
 | 
			
		||||
	goto EXITPOINT;																	\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrorMessageAndBailIfError(theErrCode,theMessage)						\
 | 
			
		||||
{																					\
 | 
			
		||||
	if (theErrCode != noErr)														\
 | 
			
		||||
	{																				\
 | 
			
		||||
		SetErrorMessage(theMessage);												\
 | 
			
		||||
		errCode = theErrCode;														\
 | 
			
		||||
		goto EXITPOINT;																\
 | 
			
		||||
	}																				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrorMessageAndLongIntAndBailIfNil(theArg,theMessage,theLongInt)			\
 | 
			
		||||
{																					\
 | 
			
		||||
	if (theArg == nil)																\
 | 
			
		||||
	{																				\
 | 
			
		||||
		SetErrorMessageAndAppendLongInt(theMessage,theLongInt);						\
 | 
			
		||||
		errCode = kGenericError;													\
 | 
			
		||||
		goto EXITPOINT;																\
 | 
			
		||||
	}																				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define BailIfError(theErrCode)														\
 | 
			
		||||
{																					\
 | 
			
		||||
	if ((theErrCode) != noErr)														\
 | 
			
		||||
	{																				\
 | 
			
		||||
		goto EXITPOINT;																\
 | 
			
		||||
	}																				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrCodeAndBail(theErrCode)												\
 | 
			
		||||
{																					\
 | 
			
		||||
	errCode = theErrCode;															\
 | 
			
		||||
																					\
 | 
			
		||||
	goto EXITPOINT;																	\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SetErrorCodeAndMessageAndBail(theErrCode,theMessage)						\
 | 
			
		||||
{																					\
 | 
			
		||||
	SetErrorMessage(theMessage);													\
 | 
			
		||||
	errCode = theErrCode;															\
 | 
			
		||||
	goto EXITPOINT;																	\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define BailNow()																	\
 | 
			
		||||
{																					\
 | 
			
		||||
	errCode = kGenericError;														\
 | 
			
		||||
	goto EXITPOINT;																	\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										209
									
								
								MacOS/GetHTTPS.src/GetHTTPS.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								MacOS/GetHTTPS.src/GetHTTPS.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,209 @@
 | 
			
		||||
/*
 | 
			
		||||
 *	An demo illustrating how to retrieve a URI from a secure HTTP server.
 | 
			
		||||
 *
 | 
			
		||||
 *	Author: 	Roy Wood
 | 
			
		||||
 *	Date:		September 7, 1999
 | 
			
		||||
 *	Comments:	This relies heavily on my MacSockets library.
 | 
			
		||||
 *				This project is also set up so that it expects the OpenSSL source folder (0.9.4 as I write this)
 | 
			
		||||
 *				to live in a folder called "OpenSSL-0.9.4" in this project's parent folder.  For example:
 | 
			
		||||
 *
 | 
			
		||||
 *					Macintosh HD:
 | 
			
		||||
 *						Development:
 | 
			
		||||
 *							OpenSSL-0.9.4:
 | 
			
		||||
 *								(OpenSSL sources here)
 | 
			
		||||
 *							OpenSSL Example:
 | 
			
		||||
 *								(OpenSSL example junk here)
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *				Also-- before attempting to compile this, make sure the aliases in "OpenSSL-0.9.4:include:openssl" 
 | 
			
		||||
 *				are installed!  Use the AppleScript applet in the "openssl-0.9.4" folder to do this!
 | 
			
		||||
 */
 | 
			
		||||
/* modified to seed the PRNG */
 | 
			
		||||
/* modified to use CRandomizer for seeding */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Include some funky libs I've developed over time
 | 
			
		||||
 | 
			
		||||
#include "CPStringUtils.hpp"
 | 
			
		||||
#include "ErrorHandling.hpp"
 | 
			
		||||
#include "MacSocket.h"
 | 
			
		||||
#include "Randomizer.h"
 | 
			
		||||
 | 
			
		||||
//	We use the OpenSSL implementation of SSL....
 | 
			
		||||
//	This was a lot of work to finally get going, though you wouldn't know it by the results!
 | 
			
		||||
 | 
			
		||||
#include <openssl/ssl.h>
 | 
			
		||||
#include <openssl/err.h>
 | 
			
		||||
 | 
			
		||||
#include <timer.h>
 | 
			
		||||
 | 
			
		||||
//	Let's try grabbing some data from here:
 | 
			
		||||
 | 
			
		||||
#define kHTTPS_DNS		"www.apache-ssl.org"
 | 
			
		||||
#define kHTTPS_Port		443
 | 
			
		||||
#define kHTTPS_URI		"/"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Forward-declare this
 | 
			
		||||
 | 
			
		||||
OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr);
 | 
			
		||||
 | 
			
		||||
//	My idle-wait callback.  Doesn't do much, does it?  Silly cooperative multitasking.
 | 
			
		||||
 | 
			
		||||
OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr)
 | 
			
		||||
{
 | 
			
		||||
#pragma unused(inUserRefPtr)
 | 
			
		||||
 | 
			
		||||
EventRecord		theEvent;
 | 
			
		||||
	::EventAvail(everyEvent,&theEvent);
 | 
			
		||||
	
 | 
			
		||||
	CRandomizer *randomizer = (CRandomizer*)inUserRefPtr;
 | 
			
		||||
	if (randomizer)
 | 
			
		||||
		randomizer->PeriodicAction();
 | 
			
		||||
 | 
			
		||||
	return(noErr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Finally!
 | 
			
		||||
 | 
			
		||||
void main(void)
 | 
			
		||||
{
 | 
			
		||||
	OSErr				errCode;
 | 
			
		||||
	int					theSocket = -1;
 | 
			
		||||
	int					theTimeout = 30;
 | 
			
		||||
 | 
			
		||||
	SSL_CTX				*ssl_ctx = nil;
 | 
			
		||||
	SSL					*ssl = nil;
 | 
			
		||||
 | 
			
		||||
	char				tempString[256];
 | 
			
		||||
	UnsignedWide		microTickCount;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	CRandomizer randomizer;
 | 
			
		||||
	
 | 
			
		||||
	printf("OpenSSL Demo by Roy Wood, roy@centricsystems.ca\n\n");
 | 
			
		||||
	
 | 
			
		||||
	BailIfError(errCode = MacSocket_Startup());
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	//	Create a socket-like object
 | 
			
		||||
	
 | 
			
		||||
	BailIfError(errCode = MacSocket_socket(&theSocket,false,theTimeout * 60,MyMacSocket_IdleWaitCallback,&randomizer));
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	//	Set up the connect string and try to connect
 | 
			
		||||
	
 | 
			
		||||
	CopyCStrAndInsertCStrLongIntIntoCStr("%s:%ld",kHTTPS_DNS,kHTTPS_Port,tempString,sizeof(tempString));
 | 
			
		||||
	
 | 
			
		||||
	printf("Connecting to %s....\n",tempString);
 | 
			
		||||
 | 
			
		||||
	BailIfError(errCode = MacSocket_connect(theSocket,tempString));
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	//	Init SSL stuff
 | 
			
		||||
	
 | 
			
		||||
	SSL_load_error_strings();
 | 
			
		||||
	
 | 
			
		||||
	SSLeay_add_ssl_algorithms();
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	//	Pick the SSL method
 | 
			
		||||
	
 | 
			
		||||
//	ssl_ctx = SSL_CTX_new(SSLv2_client_method());
 | 
			
		||||
	ssl_ctx = SSL_CTX_new(SSLv23_client_method());
 | 
			
		||||
//	ssl_ctx = SSL_CTX_new(SSLv3_client_method());
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
	//	Create an SSL thingey and try to negotiate the connection
 | 
			
		||||
	
 | 
			
		||||
	ssl = SSL_new(ssl_ctx);
 | 
			
		||||
	
 | 
			
		||||
	SSL_set_fd(ssl,theSocket);
 | 
			
		||||
	
 | 
			
		||||
	errCode = SSL_connect(ssl);
 | 
			
		||||
	
 | 
			
		||||
	if (errCode < 0)
 | 
			
		||||
	{
 | 
			
		||||
		SetErrorMessageAndLongIntAndBail("OpenSSL: Can't initiate SSL connection, SSL_connect() = ",errCode);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//	Request the URI from the host
 | 
			
		||||
	
 | 
			
		||||
	CopyCStrToCStr("GET ",tempString,sizeof(tempString));
 | 
			
		||||
	ConcatCStrToCStr(kHTTPS_URI,tempString,sizeof(tempString));
 | 
			
		||||
	ConcatCStrToCStr(" HTTP/1.0\r\n\r\n",tempString,sizeof(tempString));
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	errCode = SSL_write(ssl,tempString,CStrLength(tempString));
 | 
			
		||||
	
 | 
			
		||||
	if (errCode < 0)
 | 
			
		||||
	{
 | 
			
		||||
		SetErrorMessageAndLongIntAndBail("OpenSSL: Error writing data via ssl, SSL_write() = ",errCode);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	for (;;)
 | 
			
		||||
	{
 | 
			
		||||
	char	tempString[256];
 | 
			
		||||
	int		bytesRead;
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		//	Read some bytes and dump them to the console
 | 
			
		||||
		
 | 
			
		||||
		bytesRead = SSL_read(ssl,tempString,sizeof(tempString) - 1);
 | 
			
		||||
		
 | 
			
		||||
		if (bytesRead == 0 && MacSocket_RemoteEndIsClosing(theSocket))
 | 
			
		||||
		{
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if (bytesRead < 0)
 | 
			
		||||
		{
 | 
			
		||||
			SetErrorMessageAndLongIntAndBail("OpenSSL: Error reading data via ssl, SSL_read() = ",bytesRead);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		tempString[bytesRead] = '\0';
 | 
			
		||||
		
 | 
			
		||||
		printf("%s", tempString);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	printf("\n\n\n");
 | 
			
		||||
	
 | 
			
		||||
	//	All done!
 | 
			
		||||
	
 | 
			
		||||
	errCode = noErr;
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
EXITPOINT:
 | 
			
		||||
 | 
			
		||||
	//	Clean up and go home
 | 
			
		||||
	
 | 
			
		||||
	if (theSocket >= 0)
 | 
			
		||||
	{
 | 
			
		||||
		MacSocket_close(theSocket);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if (ssl != nil)
 | 
			
		||||
	{
 | 
			
		||||
		SSL_free(ssl);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if (ssl_ctx != nil)
 | 
			
		||||
	{
 | 
			
		||||
		SSL_CTX_free(ssl_ctx);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	if (errCode != noErr)
 | 
			
		||||
	{
 | 
			
		||||
		printf("An error occurred:\n");
 | 
			
		||||
		
 | 
			
		||||
		printf("%s",GetErrorMessage());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	MacSocket_Shutdown();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1607
									
								
								MacOS/GetHTTPS.src/MacSocket.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1607
									
								
								MacOS/GetHTTPS.src/MacSocket.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										103
									
								
								MacOS/GetHTTPS.src/MacSocket.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								MacOS/GetHTTPS.src/MacSocket.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	kMacSocket_TimeoutErr = -2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Since MacSocket does busy waiting, I do a callback while waiting
 | 
			
		||||
 | 
			
		||||
typedef OSErr (*MacSocket_IdleWaitCallback)(void *);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this before anything else!
 | 
			
		||||
 | 
			
		||||
OSErr MacSocket_Startup(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to cleanup before quitting
 | 
			
		||||
 | 
			
		||||
OSErr MacSocket_Shutdown(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to allocate a "socket" (reference number is returned in outSocketNum)
 | 
			
		||||
//	Note that inDoThreadSwitching is pretty much irrelevant right now, since I ignore it
 | 
			
		||||
//	The inTimeoutTicks parameter is applied during reads/writes of data
 | 
			
		||||
//	The inIdleWaitCallback parameter specifies a callback which is called during busy-waiting periods
 | 
			
		||||
//	The inUserRefPtr parameter is passed back to the idle-wait callback
 | 
			
		||||
 | 
			
		||||
OSErr MacSocket_socket(int *outSocketNum,const Boolean inDoThreadSwitching,const long inTimeoutTicks,MacSocket_IdleWaitCallback inIdleWaitCallback,void *inUserRefPtr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to connect to an IP/DNS address
 | 
			
		||||
//	Note that inTargetAddressAndPort is in "IP:port" format-- e.g. 10.1.1.1:123
 | 
			
		||||
 | 
			
		||||
OSErr MacSocket_connect(const int inSocketNum,char *inTargetAddressAndPort);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to listen on a port
 | 
			
		||||
//	Since this a low-performance implementation, I allow a maximum of 1 (one!) incoming request when I listen
 | 
			
		||||
 | 
			
		||||
OSErr MacSocket_listen(const int inSocketNum,const int inPortNum);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to close a socket
 | 
			
		||||
 | 
			
		||||
OSErr MacSocket_close(const int inSocketNum);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to receive data on a socket
 | 
			
		||||
//	Most parameters' purpose are obvious-- except maybe "inBlock" which controls whether I wait for data or return immediately
 | 
			
		||||
 | 
			
		||||
int MacSocket_recv(const int inSocketNum,void *outBuff,int outBuffLength,const Boolean inBlock);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to send data on a socket
 | 
			
		||||
 | 
			
		||||
int MacSocket_send(const int inSocketNum,const void *inBuff,int inBuffLength);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	If zero bytes were read in a call to MacSocket_recv(), it may be that the remote end has done a half-close
 | 
			
		||||
//	This function will let you check whether that's true or not
 | 
			
		||||
 | 
			
		||||
Boolean MacSocket_RemoteEndIsClosing(const int inSocketNum);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to see if the listen has completed after a call to MacSocket_listen()
 | 
			
		||||
 | 
			
		||||
Boolean MacSocket_ListenCompleted(const int inSocketNum);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	These really aren't very useful anymore
 | 
			
		||||
 | 
			
		||||
Boolean MacSocket_LocalEndIsOpen(const int inSocketNum);
 | 
			
		||||
Boolean MacSocket_RemoteEndIsOpen(const int inSocketNum);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	You may wish to change the userRefPtr for a socket callback-- use this to do it
 | 
			
		||||
 | 
			
		||||
void MacSocket_SetUserRefPtr(const int inSocketNum,void *inNewRefPtr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call these to get the socket's IP:port descriptor
 | 
			
		||||
 | 
			
		||||
void MacSocket_GetLocalIPAndPort(const int inSocketNum,char *outIPAndPort,const int inIPAndPortLength);
 | 
			
		||||
void MacSocket_GetRemoteIPAndPort(const int inSocketNum,char *outIPAndPort,const int inIPAndPortLength);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//	Call this to get error info from a socket
 | 
			
		||||
 | 
			
		||||
void MacSocket_GetSocketErrorInfo(const int inSocketNum,int *outSocketErrCode,char *outSocketErrString,const int inSocketErrStringMaxLength);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										4940
									
								
								MacOS/OpenSSL.mcp.hqx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4940
									
								
								MacOS/OpenSSL.mcp.hqx
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										476
									
								
								MacOS/Randomizer.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										476
									
								
								MacOS/Randomizer.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,476 @@
 | 
			
		||||
/* 
 | 
			
		||||
------- Strong random data generation on a Macintosh (pre - OS X) ------
 | 
			
		||||
		
 | 
			
		||||
--	GENERAL: We aim to generate unpredictable bits without explicit
 | 
			
		||||
	user interaction. A general review of the problem may be found
 | 
			
		||||
	in RFC 1750, "Randomness Recommendations for Security", and some
 | 
			
		||||
	more discussion, of general and Mac-specific issues has appeared
 | 
			
		||||
	in "Using and Creating Cryptographic- Quality Random Numbers" by
 | 
			
		||||
	Jon Callas (www.merrymeet.com/jon/usingrandom.html).
 | 
			
		||||
 | 
			
		||||
	The data and entropy estimates provided below are based on my
 | 
			
		||||
	limited experimentation and estimates, rather than by any
 | 
			
		||||
	rigorous study, and the entropy estimates tend to be optimistic.
 | 
			
		||||
	They should not be considered absolute.
 | 
			
		||||
 | 
			
		||||
	Some of the information being collected may be correlated in
 | 
			
		||||
	subtle ways. That includes mouse positions, timings, and disk
 | 
			
		||||
	size measurements. Some obvious correlations will be eliminated
 | 
			
		||||
	by the programmer, but other, weaker ones may remain. The
 | 
			
		||||
	reliability of the code depends on such correlations being
 | 
			
		||||
	poorly understood, both by us and by potential interceptors.
 | 
			
		||||
 | 
			
		||||
	This package has been planned to be used with OpenSSL, v. 0.9.5.
 | 
			
		||||
	It requires the OpenSSL function RAND_add. 
 | 
			
		||||
 | 
			
		||||
--	OTHER WORK: Some source code and other details have been
 | 
			
		||||
	published elsewhere, but I haven't found any to be satisfactory
 | 
			
		||||
	for the Mac per se:
 | 
			
		||||
 | 
			
		||||
	* The Linux random number generator (by Theodore Ts'o, in
 | 
			
		||||
	  drivers/char/random.c), is a carefully designed open-source
 | 
			
		||||
	  crypto random number package. It collects data from a variety
 | 
			
		||||
	  of sources, including mouse, keyboard and other interrupts.
 | 
			
		||||
	  One nice feature is that it explicitly estimates the entropy
 | 
			
		||||
	  of the data it collects. Some of its features (e.g. interrupt
 | 
			
		||||
	  timing) cannot be reliably exported to the Mac without using
 | 
			
		||||
	  undocumented APIs.
 | 
			
		||||
 | 
			
		||||
	* Truerand by Don P. Mitchell and Matt Blaze uses variations
 | 
			
		||||
	  between different timing mechanisms on the same system. This
 | 
			
		||||
	  has not been tested on the Mac, but requires preemptive
 | 
			
		||||
	  multitasking, and is hardware-dependent, and can't be relied
 | 
			
		||||
	  on to work well if only one oscillator is present.
 | 
			
		||||
 | 
			
		||||
	* Cryptlib's RNG for the Mac (RNDMAC.C by Peter Gutmann),
 | 
			
		||||
	  gathers a lot of information about the machine and system
 | 
			
		||||
	  environment. Unfortunately, much of it is constant from one
 | 
			
		||||
	  startup to the next. In other words, the random seed could be
 | 
			
		||||
	  the same from one day to the next. Some of the APIs are
 | 
			
		||||
	  hardware-dependent, and not all are compatible with Carbon (OS
 | 
			
		||||
	  X). Incidentally, the EGD library is based on the UNIX entropy
 | 
			
		||||
	  gathering methods in cryptlib, and isn't suitable for MacOS
 | 
			
		||||
	  either.
 | 
			
		||||
 | 
			
		||||
	* Mozilla (and perhaps earlier versions of Netscape) uses the
 | 
			
		||||
	  time of day (in seconds) and an uninitialized local variable
 | 
			
		||||
	  to seed the random number generator. The time of day is known
 | 
			
		||||
	  to an outside interceptor (to within the accuracy of the
 | 
			
		||||
	  system clock). The uninitialized variable could easily be
 | 
			
		||||
	  identical between subsequent launches of an application, if it
 | 
			
		||||
	  is reached through the same path.
 | 
			
		||||
 | 
			
		||||
	* OpenSSL provides the function RAND_screen(), by G. van
 | 
			
		||||
	  Oosten, which hashes the contents of the screen to generate a
 | 
			
		||||
	  seed. This is not useful for an extension or for an
 | 
			
		||||
	  application which launches at startup time, since the screen
 | 
			
		||||
	  is likely to look identical from one launch to the next. This
 | 
			
		||||
	  method is also rather slow.
 | 
			
		||||
 | 
			
		||||
	* Using variations in disk drive seek times has been proposed
 | 
			
		||||
	  (Davis, Ihaka and Fenstermacher, world.std.com/~dtd/;
 | 
			
		||||
	  Jakobsson, Shriver, Hillyer and Juels,
 | 
			
		||||
	  www.bell-labs.com/user/shriver/random.html). These variations
 | 
			
		||||
	  appear to be due to air turbulence inside the disk drive
 | 
			
		||||
	  mechanism, and are very strongly unpredictable. Unfortunately
 | 
			
		||||
	  this technique is slow, and some implementations of it may be
 | 
			
		||||
	  patented (see Shriver's page above.) It of course cannot be
 | 
			
		||||
	  used with a RAM disk.
 | 
			
		||||
 | 
			
		||||
--	TIMING: On the 601 PowerPC the time base register is guaranteed
 | 
			
		||||
	to change at least once every 10 addi instructions, i.e. 10
 | 
			
		||||
	cycles. On a 60 MHz machine (slowest PowerPC) this translates to
 | 
			
		||||
	a resolution of 1/6 usec. Newer machines seem to be using a 10
 | 
			
		||||
	cycle resolution as well.
 | 
			
		||||
	
 | 
			
		||||
	For 68K Macs, the Microseconds() call may be used. See Develop
 | 
			
		||||
	issue 29 on the Apple developer site
 | 
			
		||||
	(developer.apple.com/dev/techsupport/develop/issue29/minow.html)
 | 
			
		||||
	for information on its accuracy and resolution. The code below
 | 
			
		||||
	has been tested only on PowerPC based machines.
 | 
			
		||||
 | 
			
		||||
	The time from machine startup to the launch of an application in
 | 
			
		||||
	the startup folder has a variance of about 1.6 msec on a new G4
 | 
			
		||||
	machine with a defragmented and optimized disk, most extensions
 | 
			
		||||
	off and no icons on the desktop. This can be reasonably taken as
 | 
			
		||||
	a lower bound on the variance. Most of this variation is likely
 | 
			
		||||
	due to disk seek time variability. The distribution of startup
 | 
			
		||||
	times is probably not entirely even or uncorrelated. This needs
 | 
			
		||||
	to be investigated, but I am guessing that it not a majpor
 | 
			
		||||
	problem. Entropy = log2 (1600/0.166) ~= 13 bits on a 60 MHz
 | 
			
		||||
	machine, ~16 bits for a 450 MHz machine.
 | 
			
		||||
 | 
			
		||||
	User-launched application startup times will have a variance of
 | 
			
		||||
	a second or more relative to machine startup time. Entropy >~22
 | 
			
		||||
	bits.
 | 
			
		||||
 | 
			
		||||
	Machine startup time is available with a 1-second resolution. It
 | 
			
		||||
	is predictable to no better a minute or two, in the case of
 | 
			
		||||
	people who show up punctually to work at the same time and
 | 
			
		||||
	immediately start their computer. Using the scheduled startup
 | 
			
		||||
	feature (when available) will cause the machine to start up at
 | 
			
		||||
	the same time every day, making the value predictable. Entropy
 | 
			
		||||
	>~7 bits, or 0 bits with scheduled startup.
 | 
			
		||||
 | 
			
		||||
	The time of day is of course known to an outsider and thus has 0
 | 
			
		||||
	entropy if the system clock is regularly calibrated.
 | 
			
		||||
 | 
			
		||||
--	KEY TIMING: A  very fast typist (120 wpm) will have a typical
 | 
			
		||||
	inter-key timing interval of 100 msec. We can assume a variance
 | 
			
		||||
	of no less than 2 msec -- maybe. Do good typists have a constant
 | 
			
		||||
	rhythm, like drummers? Since what we measure is not the
 | 
			
		||||
	key-generated interrupt but the time at which the key event was
 | 
			
		||||
	taken off the event queue, our resolution is roughly the time
 | 
			
		||||
	between process switches, at best 1 tick (17 msec). I  therefore
 | 
			
		||||
	consider this technique questionable and not very useful for
 | 
			
		||||
	obtaining high entropy data on the Mac.
 | 
			
		||||
 | 
			
		||||
--	MOUSE POSITION AND TIMING: The high bits of the mouse position
 | 
			
		||||
	are far from arbitrary, since the mouse tends to stay in a few
 | 
			
		||||
	limited areas of the screen. I am guessing that the position of
 | 
			
		||||
	the mouse is arbitrary within a 6 pixel square. Since the mouse
 | 
			
		||||
	stays still for long periods of time, it should be sampled only
 | 
			
		||||
	after it was moved, to avoid correlated data. This gives an
 | 
			
		||||
	entropy of log2(6*6) ~= 5 bits per measurement.
 | 
			
		||||
 | 
			
		||||
	The time during which the mouse stays still can vary from zero
 | 
			
		||||
	to, say, 5 seconds (occasionally longer). If the still time is
 | 
			
		||||
	measured by sampling the mouse during null events, and null
 | 
			
		||||
	events are received once per tick, its resolution is 1/60th of a
 | 
			
		||||
	second, giving an entropy of log2 (60*5) ~= 8 bits per
 | 
			
		||||
	measurement. Since the distribution of still times is uneven,
 | 
			
		||||
	this estimate is on the high side.
 | 
			
		||||
 | 
			
		||||
	For simplicity and compatibility across system versions, the
 | 
			
		||||
	mouse is to be sampled explicitly (e.g. in the event loop),
 | 
			
		||||
	rather than in a time manager task.
 | 
			
		||||
 | 
			
		||||
--	STARTUP DISK TOTAL FILE SIZE: Varies typically by at least 20k
 | 
			
		||||
	from one startup to the next, with 'minimal' computer use. Won't
 | 
			
		||||
	vary at all if machine is started again immediately after
 | 
			
		||||
	startup (unless virtual memory is on), but any application which
 | 
			
		||||
	uses the web and caches information to disk is likely to cause
 | 
			
		||||
	this much variation or more. The variation is probably not
 | 
			
		||||
	random, but I don't know in what way. File sizes tend to be
 | 
			
		||||
	divisible by 4 bytes since file format fields are often
 | 
			
		||||
	long-aligned. Entropy > log2 (20000/4) ~= 12 bits.
 | 
			
		||||
	
 | 
			
		||||
--	STARTUP DISK FIRST AVAILABLE ALLOCATION BLOCK: As the volume
 | 
			
		||||
	gets fragmented this could be anywhere in principle. In a
 | 
			
		||||
	perfectly unfragmented volume this will be strongly correlated
 | 
			
		||||
	with the total file size on the disk. With more fragmentation
 | 
			
		||||
	comes less certainty. I took the variation in this value to be
 | 
			
		||||
	1/8 of the total file size on the volume.
 | 
			
		||||
 | 
			
		||||
--	SYSTEM REQUIREMENTS: The code here requires System 7.0 and above
 | 
			
		||||
	(for Gestalt and Microseconds calls). All the calls used are
 | 
			
		||||
	Carbon-compatible.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*------------------------------ Includes ----------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "Randomizer.h"
 | 
			
		||||
 | 
			
		||||
// Mac OS API
 | 
			
		||||
#include <Files.h>
 | 
			
		||||
#include <Folders.h>
 | 
			
		||||
#include <Events.h>
 | 
			
		||||
#include <Processes.h>
 | 
			
		||||
#include <Gestalt.h>
 | 
			
		||||
#include <Resources.h>
 | 
			
		||||
#include <LowMem.h>
 | 
			
		||||
 | 
			
		||||
// Standard C library
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
/*---------------------- Function declarations -----------------------*/
 | 
			
		||||
 | 
			
		||||
// declared in OpenSSL/crypto/rand/rand.h
 | 
			
		||||
extern "C" void RAND_add (const void *buf, int num, double entropy);
 | 
			
		||||
 | 
			
		||||
unsigned long GetPPCTimer (bool is601);	// Make it global if needed
 | 
			
		||||
					// elsewhere
 | 
			
		||||
 | 
			
		||||
/*---------------------------- Constants -----------------------------*/
 | 
			
		||||
 | 
			
		||||
#define kMouseResolution 6		// Mouse position has to differ
 | 
			
		||||
					// from the last one by this
 | 
			
		||||
					// much to be entered
 | 
			
		||||
#define kMousePositionEntropy 5.16	// log2 (kMouseResolution**2)
 | 
			
		||||
#define kTypicalMouseIdleTicks 300.0	// I am guessing that a typical
 | 
			
		||||
					// amount of time between mouse
 | 
			
		||||
					// moves is 5 seconds
 | 
			
		||||
#define kVolumeBytesEntropy 12.0	// about log2 (20000/4),
 | 
			
		||||
					// assuming a variation of 20K
 | 
			
		||||
					// in total file size and
 | 
			
		||||
					// long-aligned file formats.
 | 
			
		||||
#define kApplicationUpTimeEntropy 6.0	// Variance > 1 second, uptime
 | 
			
		||||
					// in ticks  
 | 
			
		||||
#define kSysStartupEntropy 7.0		// Entropy for machine startup
 | 
			
		||||
					// time
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*------------------------ Function definitions ----------------------*/
 | 
			
		||||
 | 
			
		||||
CRandomizer::CRandomizer (void)
 | 
			
		||||
{
 | 
			
		||||
	long	result;
 | 
			
		||||
	
 | 
			
		||||
	mSupportsLargeVolumes =
 | 
			
		||||
		(Gestalt(gestaltFSAttr, &result) == noErr) &&
 | 
			
		||||
		((result & (1L << gestaltFSSupports2TBVols)) != 0);
 | 
			
		||||
	
 | 
			
		||||
	if (Gestalt (gestaltNativeCPUtype, &result) != noErr)
 | 
			
		||||
	{
 | 
			
		||||
		mIsPowerPC = false;
 | 
			
		||||
		mIs601 = false;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		mIs601 = (result == gestaltCPU601);
 | 
			
		||||
		mIsPowerPC = (result >= gestaltCPU601);
 | 
			
		||||
	}
 | 
			
		||||
	mLastMouse.h = mLastMouse.v = -10;	// First mouse will
 | 
			
		||||
						// always be recorded
 | 
			
		||||
	mLastPeriodicTicks = TickCount();
 | 
			
		||||
	GetTimeBaseResolution ();
 | 
			
		||||
	
 | 
			
		||||
	// Add initial entropy
 | 
			
		||||
	AddTimeSinceMachineStartup ();
 | 
			
		||||
	AddAbsoluteSystemStartupTime ();
 | 
			
		||||
	AddStartupVolumeInfo ();
 | 
			
		||||
	AddFiller ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CRandomizer::PeriodicAction (void)
 | 
			
		||||
{
 | 
			
		||||
	AddCurrentMouse ();
 | 
			
		||||
	AddNow (0.0);	// Should have a better entropy estimate here
 | 
			
		||||
	mLastPeriodicTicks = TickCount();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*------------------------- Private Methods --------------------------*/
 | 
			
		||||
 | 
			
		||||
void CRandomizer::AddCurrentMouse (void)
 | 
			
		||||
{
 | 
			
		||||
	Point mouseLoc;
 | 
			
		||||
	unsigned long lastCheck;	// Ticks since mouse was last
 | 
			
		||||
					// sampled
 | 
			
		||||
 | 
			
		||||
#if TARGET_API_MAC_CARBON
 | 
			
		||||
	GetGlobalMouse (&mouseLoc);
 | 
			
		||||
#else
 | 
			
		||||
	mouseLoc = LMGetMouseLocation();
 | 
			
		||||
#endif
 | 
			
		||||
	
 | 
			
		||||
	if (labs (mLastMouse.h - mouseLoc.h) > kMouseResolution/2 &&
 | 
			
		||||
	    labs (mLastMouse.v - mouseLoc.v) > kMouseResolution/2)
 | 
			
		||||
		AddBytes (&mouseLoc, sizeof (mouseLoc),
 | 
			
		||||
				kMousePositionEntropy);
 | 
			
		||||
	
 | 
			
		||||
	if (mLastMouse.h == mouseLoc.h && mLastMouse.v == mouseLoc.v)
 | 
			
		||||
		mMouseStill ++;
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		double entropy;
 | 
			
		||||
		
 | 
			
		||||
		// Mouse has moved. Add the number of measurements for
 | 
			
		||||
		// which it's been still. If the resolution is too
 | 
			
		||||
		// coarse, assume the entropy is 0.
 | 
			
		||||
 | 
			
		||||
		lastCheck = TickCount() - mLastPeriodicTicks;
 | 
			
		||||
		if (lastCheck <= 0)
 | 
			
		||||
			lastCheck = 1;
 | 
			
		||||
		entropy = log2l
 | 
			
		||||
			(kTypicalMouseIdleTicks/(double)lastCheck);
 | 
			
		||||
		if (entropy < 0.0)
 | 
			
		||||
			entropy = 0.0;
 | 
			
		||||
		AddBytes (&mMouseStill, sizeof (mMouseStill), entropy);
 | 
			
		||||
		mMouseStill = 0;
 | 
			
		||||
	}
 | 
			
		||||
	mLastMouse = mouseLoc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CRandomizer::AddAbsoluteSystemStartupTime (void)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long	now;		// Time in seconds since
 | 
			
		||||
					// 1/1/1904
 | 
			
		||||
	GetDateTime (&now);
 | 
			
		||||
	now -= TickCount() / 60;	// Time in ticks since machine
 | 
			
		||||
					// startup
 | 
			
		||||
	AddBytes (&now, sizeof (now), kSysStartupEntropy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CRandomizer::AddTimeSinceMachineStartup (void)
 | 
			
		||||
{
 | 
			
		||||
	AddNow (1.5);			// Uncertainty in app startup
 | 
			
		||||
					// time is > 1.5 msec (for
 | 
			
		||||
					// automated app startup).
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CRandomizer::AddAppRunningTime (void)
 | 
			
		||||
{
 | 
			
		||||
	ProcessSerialNumber PSN;
 | 
			
		||||
	ProcessInfoRec		ProcessInfo;
 | 
			
		||||
	
 | 
			
		||||
	ProcessInfo.processInfoLength = sizeof (ProcessInfoRec);
 | 
			
		||||
	ProcessInfo.processName = nil;
 | 
			
		||||
	ProcessInfo.processAppSpec = nil;
 | 
			
		||||
	
 | 
			
		||||
	GetCurrentProcess (&PSN);
 | 
			
		||||
	GetProcessInformation (&PSN, &ProcessInfo);
 | 
			
		||||
 | 
			
		||||
	// Now add the amount of time in ticks that the current process
 | 
			
		||||
	// has been active
 | 
			
		||||
 | 
			
		||||
	AddBytes (&ProcessInfo, sizeof (ProcessInfoRec),
 | 
			
		||||
			kApplicationUpTimeEntropy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CRandomizer::AddStartupVolumeInfo (void)
 | 
			
		||||
{
 | 
			
		||||
	short			vRefNum;
 | 
			
		||||
	long			dirID;
 | 
			
		||||
	XVolumeParam	pb;
 | 
			
		||||
	OSErr			err;
 | 
			
		||||
	
 | 
			
		||||
	if (!mSupportsLargeVolumes)
 | 
			
		||||
		return;
 | 
			
		||||
		
 | 
			
		||||
	FindFolder (kOnSystemDisk, kSystemFolderType, kDontCreateFolder,
 | 
			
		||||
			&vRefNum, &dirID);
 | 
			
		||||
	pb.ioVRefNum = vRefNum;
 | 
			
		||||
	pb.ioCompletion = 0;
 | 
			
		||||
	pb.ioNamePtr = 0;
 | 
			
		||||
	pb.ioVolIndex = 0;
 | 
			
		||||
	err = PBXGetVolInfoSync (&pb);
 | 
			
		||||
	if (err != noErr)
 | 
			
		||||
		return;
 | 
			
		||||
		
 | 
			
		||||
	// Base the entropy on the amount of space used on the disk and
 | 
			
		||||
	// on the next available allocation block. A lot else might be
 | 
			
		||||
	// unpredictable, so might as well toss the whole block in. See
 | 
			
		||||
	// comments for entropy estimate justifications.
 | 
			
		||||
 | 
			
		||||
	AddBytes (&pb, sizeof (pb),
 | 
			
		||||
		kVolumeBytesEntropy +
 | 
			
		||||
		log2l (((pb.ioVTotalBytes.hi - pb.ioVFreeBytes.hi)
 | 
			
		||||
				* 4294967296.0D +
 | 
			
		||||
			(pb.ioVTotalBytes.lo - pb.ioVFreeBytes.lo))
 | 
			
		||||
				/ pb.ioVAlBlkSiz - 3.0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
	On a typical startup CRandomizer will come up with about 60
 | 
			
		||||
	bits of good, unpredictable data. Assuming no more input will
 | 
			
		||||
	be available, we'll need some more lower-quality data to give
 | 
			
		||||
	OpenSSL the 128 bits of entropy it desires. AddFiller adds some
 | 
			
		||||
	relatively predictable data into the soup.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void CRandomizer::AddFiller (void)
 | 
			
		||||
{
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		ProcessSerialNumber psn;	// Front process serial
 | 
			
		||||
						// number
 | 
			
		||||
		RGBColor	hiliteRGBValue;	// User-selected
 | 
			
		||||
						// highlight color
 | 
			
		||||
		long		processCount;	// Number of active
 | 
			
		||||
						// processes
 | 
			
		||||
		long		cpuSpeed;	// Processor speed
 | 
			
		||||
		long		totalMemory;	// Total logical memory
 | 
			
		||||
						// (incl. virtual one)
 | 
			
		||||
		long		systemVersion;	// OS version
 | 
			
		||||
		short		resFile;	// Current resource file
 | 
			
		||||
	} data;
 | 
			
		||||
	
 | 
			
		||||
	GetNextProcess ((ProcessSerialNumber*) kNoProcess);
 | 
			
		||||
	while (GetNextProcess (&data.psn) == noErr)
 | 
			
		||||
		data.processCount++;
 | 
			
		||||
	GetFrontProcess (&data.psn);
 | 
			
		||||
	LMGetHiliteRGB (&data.hiliteRGBValue);
 | 
			
		||||
	Gestalt (gestaltProcClkSpeed, &data.cpuSpeed);
 | 
			
		||||
	Gestalt (gestaltLogicalRAMSize, &data.totalMemory);
 | 
			
		||||
	Gestalt (gestaltSystemVersion, &data.systemVersion);
 | 
			
		||||
	data.resFile = CurResFile ();
 | 
			
		||||
	
 | 
			
		||||
	// Here we pretend to feed the PRNG completely random data. This
 | 
			
		||||
	// is of course false, as much of the above data is predictable
 | 
			
		||||
	// by an outsider. At this point we don't have any more
 | 
			
		||||
	// randomness to add, but with OpenSSL we must have a 128 bit
 | 
			
		||||
	// seed before we can start. We just add what we can, without a
 | 
			
		||||
	// real entropy estimate, and hope for the best.
 | 
			
		||||
 | 
			
		||||
	AddBytes (&data, sizeof(data), 8.0 * sizeof(data));
 | 
			
		||||
	AddCurrentMouse ();
 | 
			
		||||
	AddNow (1.0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-------------------  LOW LEVEL ---------------------
 | 
			
		||||
 | 
			
		||||
void CRandomizer::AddBytes (void *data, long size, double entropy)
 | 
			
		||||
{
 | 
			
		||||
	RAND_add (data, size, entropy * 0.125);	// Convert entropy bits
 | 
			
		||||
						// to bytes
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CRandomizer::AddNow (double millisecondUncertainty)
 | 
			
		||||
{
 | 
			
		||||
	long time = SysTimer();
 | 
			
		||||
	AddBytes (&time, sizeof (time), log2l (millisecondUncertainty *
 | 
			
		||||
			mTimebaseTicksPerMillisec));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//----------------- TIMING SUPPORT ------------------
 | 
			
		||||
 | 
			
		||||
void CRandomizer::GetTimeBaseResolution (void)
 | 
			
		||||
{	
 | 
			
		||||
#ifdef __powerc
 | 
			
		||||
	long speed;
 | 
			
		||||
	
 | 
			
		||||
	// gestaltProcClkSpeed available on System 7.5.2 and above
 | 
			
		||||
	if (Gestalt (gestaltProcClkSpeed, &speed) != noErr)
 | 
			
		||||
		// Only PowerPCs running pre-7.5.2 are 60-80 MHz
 | 
			
		||||
		// machines.
 | 
			
		||||
		mTimebaseTicksPerMillisec =  6000.0D;
 | 
			
		||||
	// Assume 10 cycles per clock update, as in 601 spec. Seems true
 | 
			
		||||
	// for later chips as well.
 | 
			
		||||
	mTimebaseTicksPerMillisec = speed / 1.0e4D;
 | 
			
		||||
#else
 | 
			
		||||
	// 68K VIA-based machines (see Develop Magazine no. 29)
 | 
			
		||||
	mTimebaseTicksPerMillisec = 783.360D;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned long CRandomizer::SysTimer (void)	// returns the lower 32
 | 
			
		||||
						// bit of the chip timer
 | 
			
		||||
{
 | 
			
		||||
#ifdef __powerc
 | 
			
		||||
	return GetPPCTimer (mIs601);
 | 
			
		||||
#else
 | 
			
		||||
	UnsignedWide usec;
 | 
			
		||||
	Microseconds (&usec);
 | 
			
		||||
	return usec.lo;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef __powerc
 | 
			
		||||
// The timebase is available through mfspr on 601, mftb on later chips.
 | 
			
		||||
// Motorola recommends that an 601 implementation map mftb to mfspr
 | 
			
		||||
// through an exception, but I haven't tested to see if MacOS actually
 | 
			
		||||
// does this. We only sample the lower 32 bits of the timer (i.e. a
 | 
			
		||||
// few minutes of resolution)
 | 
			
		||||
 | 
			
		||||
asm unsigned long GetPPCTimer (register bool is601)
 | 
			
		||||
{
 | 
			
		||||
	cmplwi	is601, 0	// Check if 601
 | 
			
		||||
	bne	_601		// if non-zero goto _601
 | 
			
		||||
	mftb  	r3		// Available on 603 and later.
 | 
			
		||||
	blr			// return with result in r3
 | 
			
		||||
_601:
 | 
			
		||||
	mfspr r3, spr5  	// Available on 601 only.
 | 
			
		||||
				// blr inserted automatically
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										43
									
								
								MacOS/Randomizer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								MacOS/Randomizer.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
 | 
			
		||||
//	Gathers unpredictable system data to be used for generating
 | 
			
		||||
//	random bits
 | 
			
		||||
 | 
			
		||||
#include <MacTypes.h>
 | 
			
		||||
 | 
			
		||||
class CRandomizer
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	CRandomizer (void);
 | 
			
		||||
	void PeriodicAction (void);
 | 
			
		||||
	
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
	// Private calls
 | 
			
		||||
 | 
			
		||||
	void		AddTimeSinceMachineStartup (void);
 | 
			
		||||
	void		AddAbsoluteSystemStartupTime (void);
 | 
			
		||||
	void		AddAppRunningTime (void);
 | 
			
		||||
	void		AddStartupVolumeInfo (void);
 | 
			
		||||
	void		AddFiller (void);
 | 
			
		||||
 | 
			
		||||
	void		AddCurrentMouse (void);
 | 
			
		||||
	void		AddNow (double millisecondUncertainty);
 | 
			
		||||
	void		AddBytes (void *data, long size, double entropy);
 | 
			
		||||
	
 | 
			
		||||
	void		GetTimeBaseResolution (void);
 | 
			
		||||
	unsigned long	SysTimer (void);
 | 
			
		||||
 | 
			
		||||
	// System Info	
 | 
			
		||||
	bool		mSupportsLargeVolumes;
 | 
			
		||||
	bool		mIsPowerPC;
 | 
			
		||||
	bool		mIs601;
 | 
			
		||||
	
 | 
			
		||||
	// Time info
 | 
			
		||||
	double		mTimebaseTicksPerMillisec;
 | 
			
		||||
	unsigned long	mLastPeriodicTicks;
 | 
			
		||||
	
 | 
			
		||||
	// Mouse info
 | 
			
		||||
	long		mSamplePeriod;
 | 
			
		||||
	Point		mLastMouse;
 | 
			
		||||
	long		mMouseStill;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										18
									
								
								MacOS/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								MacOS/TODO
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
Verify server certificate
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
Currently omitted from the project:
 | 
			
		||||
 | 
			
		||||
	crypto/tmdiff.c
 | 
			
		||||
	crypto/bio/bss_conn.c
 | 
			
		||||
	crypto/bio/b_sock.c
 | 
			
		||||
	crypto/bio/bss_acpt.c
 | 
			
		||||
	crypto/bio/bss_log.h
 | 
			
		||||
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
Build libraries to link with...
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
Port openssl application.
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
BN optimizations (currently PPC version is compiled with BN_LLONG)
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
							
								
								
									
										9
									
								
								MacOS/_MWERKS_GUSI_prefix.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								MacOS/_MWERKS_GUSI_prefix.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
#include <MacHeaders.h>
 | 
			
		||||
#define B_ENDIAN
 | 
			
		||||
#ifdef __POWERPC__
 | 
			
		||||
#pragma longlong on
 | 
			
		||||
#endif
 | 
			
		||||
#if 1
 | 
			
		||||
#define MAC_OS_GUSI_SOURCE
 | 
			
		||||
#endif
 | 
			
		||||
#define MONOLITH
 | 
			
		||||
							
								
								
									
										9
									
								
								MacOS/_MWERKS_prefix.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								MacOS/_MWERKS_prefix.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
#include <MacHeaders.h>
 | 
			
		||||
#define B_ENDIAN
 | 
			
		||||
#ifdef __POWERPC__
 | 
			
		||||
#pragma longlong on
 | 
			
		||||
#endif
 | 
			
		||||
#if 0
 | 
			
		||||
#define MAC_OS_GUSI_SOURCE
 | 
			
		||||
#endif
 | 
			
		||||
#define MONOLITH
 | 
			
		||||
							
								
								
									
										5
									
								
								MacOS/buildinf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								MacOS/buildinf.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
#ifndef MK1MF_BUILD
 | 
			
		||||
#  define CFLAGS	"-DB_ENDIAN"
 | 
			
		||||
#  define PLATFORM	"macos"
 | 
			
		||||
#  define DATE		"Sun Feb 27 19:44:16 MET 2000"
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										820
									
								
								MacOS/mklinks.as.hqx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										820
									
								
								MacOS/mklinks.as.hqx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,820 @@
 | 
			
		||||
(This file must be converted with BinHex 4.0)
 | 
			
		||||
 | 
			
		||||
:#QeVE'PZDh-ZBA-!39"36'&`E(3J!!!!!!!!!*LiI6m!!!!!!3!!!*G#!!#@3J!
 | 
			
		||||
!!AChFQPd!!!!K3)"!3m(Fh9`F'pbG!!!!)B#!3%$"(0eFQ8!!!#(!J-%"!3("3C
 | 
			
		||||
cGfPdBfJ!!!#)!J%"#39cH@jMD!!!!)N#"J%$!`-&"3-'FhPcG'9Y!!!!LJ)&"3)
 | 
			
		||||
%!J8("!-#!`4dB@*X!!!!L`))!3-$!`-$!`-$"(4PE'`!!!#-!J)"#38$G'KP!!!
 | 
			
		||||
!M3))(J)@!Ki#!J))!K)#!`)B!Kd%G'KPE3!!!)i#!J%&#`4dD'9j!!!!M`)#!J)
 | 
			
		||||
#$3TdD(*[G@GSEh9d!!!!N!!#!3%&"(4TCQB!!!#4!J%"!`4dD@eP!!!!NJ)"!JS
 | 
			
		||||
#!h4T!!!!'N!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!H!!!!!!!#!!!!!!
 | 
			
		||||
!!!!!!!!!!!!!rrrrr`!!!$3!!!!N!!!!!#"[!!5JAb"[!!5K++!M6R9$9'mJFR9
 | 
			
		||||
Z)(4SDA-JFf0bDA"d)'&`F'aTBf&dD@pZ,#"jEh8JEA9cG#"QDA*cG#"TER0dB@a
 | 
			
		||||
X)%&`F'aP8f0bDA"d,J!!!)C8D'Pc)(0MFQP`G#"MFQ9KG'9c)#iZ,fPZBfaeC'8
 | 
			
		||||
[Eh"PER0cE#"KEQ3JCQPXE(-JDA3JGfPdD#"ZC@0PFh0KFRNJB@aTBA0PFbi0$8P
 | 
			
		||||
d)'eTCfKd)(4KDf8JB5"hD'PXC5"dEb"MEfe`E'9dC5"cEb"`E'9KFf8JBQ8JF'&
 | 
			
		||||
dD@9ZG$SY+3!!!#S!!J!!!!!!$3!+!"!!!!!-!!!!!!!!!!!!63!0!!S!%!%!!!`
 | 
			
		||||
!!!!!!!!!!!!B!!!!+!!!!!!!!!!)!!!!)!#N2c`!!DR`!!!!l!!!!!&19[ri,`0
 | 
			
		||||
f!#m$-$bKVDG'*KmY52ri,`-`2+LITdBQ(b!ZrrLa`'FJ,`-J2'0`ER4"l[rm)NL
 | 
			
		||||
KV5+)*Kp+3'B)5Ulrr'F#GJ%3!bBZrr41ANje6PB!!#m-@Bm[2%j29%Nr2!#!U"m
 | 
			
		||||
SAb!-CJK`!cm!UFKJ+#m-UC)J9#!)d+J!'#&!!"JJ9#!)d+J!(#&!!"a9Mbm8)&q
 | 
			
		||||
JAMk!9%mSE[rm6Pj1G8j@!!![$%kkre4+!'FU@Bm[2'&`E(3[2(0MF(4`)DJU+&m
 | 
			
		||||
J$'F5@Bm[$#mm!!!!!A!!U#UTp&K26VVrG#KZrra1ANje!!!!('&`E(3!!!!"4P*
 | 
			
		||||
&4J!!!!!!J%P$6L-!!!!!!*B!!!!"!!!!!!G"8&"-!!!!!!!"!!!"!!!!!S!!!!4
 | 
			
		||||
!!!"i)!!!K"!!!3))!!)#"!!%"!)!#!J"!"!8!)!J)J"!3%%!)2#!J"#*!%!)KJ!
 | 
			
		||||
J")3!)!*!!"!")!!3!K!!%!3)!"!)"!!J%!)!3#!"!)"!!S%!J!5#!3!)4!)!#%J
 | 
			
		||||
%!!KB#!!%C"!!!m)J!!!"3!!!!)!!!!%!!!!$J!!!"m!!!(rJ!!$rm!!"rrJ!!rr
 | 
			
		||||
m!!IrrJ!2rrm!(rrrJ$rrrm"rrrrJrrrrm2rrrrMrrrrmrrrrrRrrrrmrrrrq(rr
 | 
			
		||||
rr!rrrrJ(rrr`!rrri!(rrm!$rrq!"rrr!!rrrJ!2rr`!$rri!!IRm!!$`q!!!!(
 | 
			
		||||
!!!!!J!!!!!)!!!!!!!!!!!m!!!!!!!!!!!!!!!!!!!$`m!!!!!!!!!!!!!!!!!!
 | 
			
		||||
2!!m!!!!!!!!!!!!!!!rrm!!!m!!!!!!!!!!!!!$`c0m!!!m!!!!!!!!!!!!2!!c
 | 
			
		||||
-m!!!m!!!!!!!!!!!m!$-cI!!!!m!!!!!!!!!$`!-c0m!!!!!m!!!!!!!!2!!c-h
 | 
			
		||||
`!!!!!!m!!!!!!!m!$-cIh`!!!!!!m!!!!!$`!-c0rGh`!!!!!!m!!!!2!!c-hph
 | 
			
		||||
-h`!!!!!!m!!!rrr-cIhF`-h`!!!!!!m!!2lFr0rGc!`-h`!!!!!!m!$pc-rph-$
 | 
			
		||||
!`-h`!!!!!!m!r-`2cF`-$!!-r3!!!!!!m!m!`-c!`-!!$0m!!!!!$-m!m!`-$!`
 | 
			
		||||
!!-cI!!!!!-c`!!m!`-$!!!`-h`!!!!c2!!!!m!`-!!$!c0m!!!$-m!!!!!m!`!!
 | 
			
		||||
-$-hm!!!-c`!!!!!!m!!!`-cIc!!!c2!!!!!!!!m!$!c0r-`!$-m!!!!!!!$pm-$
 | 
			
		||||
-hmc!!-c`!!!!!!!2hI`-cIc-!!c2!!!!!!!!rGc2c0r-`!$-m!!!!!!!!2h-cmh
 | 
			
		||||
mc!!-c`!!!!!!!!$mc!rIr-!!c2!!!!!!!!!!$m$2m!r-$-m!!!!!!!!!!!$rr`!
 | 
			
		||||
!r-c`!!!!!!!!!!!!!!!!!!r2!!!!!!!!!!!!!!!!!!!!m!!!!!!!!!!!!!"!!B!
 | 
			
		||||
13"%J)4"##18%Q)+3!%&!)5!L%%3BL#83*L!G3!#!!B!2`"rJ2r"rq2rmrrlrrhr
 | 
			
		||||
r2riIr"ri2r!ri"h!!)!!!!#!!!!!$r!!!!!!!2r`$`!!!!!2$!m!m!!!!2$!c`!
 | 
			
		||||
2!!!2$!c`!!$`!2r`cpm!!!m!rGrpc2!!!2$p$p`-c`!!$`m!`-$0m!$2!2!-$-h
 | 
			
		||||
`$2!!$`$-hm$2!!!2m-hm$2!!!2h2hm$2!!!!r-rm$2!!!!!2r`r2!!!!!!!!!2!
 | 
			
		||||
!!!!!!!#D8f0bDA"d)%&`F'aTBf&dD@pZ$3e8D'Pc)(0MFQP`G#"MFQ9KG'9c)#i
 | 
			
		||||
Z,fPZBfaeC'8[Eh"PER0cE#"KEQ3JCQPXE(-JDA3JGfPdD#"ZC@0PFh0KFRNJB@a
 | 
			
		||||
TBA0PFbi0$8Pd)'eTCfKd)(4KDf8JB5"hD'PXC5"dEb"MEfe`E'9dC5"cEb"`E'9
 | 
			
		||||
KFf8JBQ8JF'&dD@9ZG$SY+3!!!")!!J!!!!!!!!!!!!%!"J!'%iN!!!!+@1!!!b!
 | 
			
		||||
!!!-J!!!!!"3!+`!(!Cm#@!!V!!F"f!*B!!!!!3!!M`C'BA0N98&6)$%Z-6!a,M%
 | 
			
		||||
`$J!!!!32rrm!!3!#!!-"rrm!!!d!!3!"D`!!!!!!!!!%!J!%!!)!"3!'$3!&!!*
 | 
			
		||||
X!!)!!!U`!!IrrJd!"`!#6`!!!!!+X!!)!!N0!!J!!@X!!!!%#Um!#J)!#J!#!!X
 | 
			
		||||
!$!d!#`!#E!!#!!3!"2rprr`"rrd!!!(rr!!!!J!-!!)!$3!1$3!0!!*X!!%!"!!
 | 
			
		||||
%rrX!$`(rq`!!$!!2!&N!8b"(CA3JF'&dD#"dEb"dD'Pc)%&`F'aP8f0bDA"d)'&
 | 
			
		||||
`F'aPG$XJGA0P)'Pd)(4[)'C[FQdJG'KP)("KG'JJG'mJG'KP)'PZBfaeC'8JCQp
 | 
			
		||||
XC'9b!!)!!!)!$J!#!"!!%3d!%!!#E!!"!!3!"2rk!")"rrS!!!`!%J!Q!#!JB@j
 | 
			
		||||
N)(4SC5"[G'KPFL"bC@aPGQ&ZG#"QEfaNCA*c,J!#!!!#!"%!!J!6!"30!"-!!R-
 | 
			
		||||
!!!!%!"%!&3!@$3!9!!*M!!!!"!!1!"F!'!d!&`!#E!!&!!3!$!!CrrN0!"N!!Qi
 | 
			
		||||
!!!!%!!`!'J!E$3!D!!)d!!!!"3!-rrJ!(!Vrq!!%#Q0[BQS0!"`!!Q`!"3!'!!X
 | 
			
		||||
!(Irh$3!G!!0*!!)!"J!,rrB!([re#[rf!"JZC@&bFfCQC(*KE'Pc!!!!!!!!)!"
 | 
			
		||||
KCQ4b$3!H!!"Q!!!!"J!(![re!!!"rrF!!!d!'`!"E3!!!!3!"3!I$`!I!6J)ER9
 | 
			
		||||
XE!!!!!!!!Gq!rrm!!!!A"NCTEQ4PFJ!!(`*[Me!!ASfm!Qq,i!"HA[!!I&M!!!!
 | 
			
		||||
!!!!!'mi!!JN#!Qq-1!!!Kb%#Ei`J!!!!!%C14&*038e"3e-!!"%!B@aTF`!!!!!
 | 
			
		||||
!fJ!#!!!-6@&MD@jdEh0S)%K%!!!!!!!!!!!!!!!!!!!!XSA5h%*%!!!!!!!A"NC
 | 
			
		||||
TEQ4PFJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
			
		||||
!!!!!!!!!!!!!!!!!!!!!3rLc#@a!4Nj%8Ne"3e2rrrrr!!!!!!!!!!!!!!!!!!!
 | 
			
		||||
!!!!!!!e6HA0dC@dJ4QpXC'9b!!!"!!3!!!!A!!)!)8eKBfPZG'pcD#")4$T6HA0
 | 
			
		||||
dC@dJ4QpXC'9b1NCTEQ4PFJ$rr`!!!Irj!!!0!"J!!@d!!!!-!!hrp!Vrp!!%#Q0
 | 
			
		||||
dH(30!"B!!@m!!!!!!!$rm`[rm`!5-!!(G'KPF'&dD!!(G'KP8'&dD!)!&!!#!#!
 | 
			
		||||
!)3d!)!!#E!!#!")!%[rbrr%"rr)!!!(rm3!!!J!K!!)!)J!M$3!L!!*b!!!!%J!
 | 
			
		||||
A!#3!*3d!*!!#EJ!$!")!&3!Q!#F0!#B!!6%!!!!6!"Arm!Vrm!!%#R4iC'`0!#F
 | 
			
		||||
!!6%!!!!5!"2rl`Vrl`!%#Q&cBh)0!#8!!@m!!!!!!!$rlJ[rlJ!F-!!-G'KPEfa
 | 
			
		||||
NC'9XD@ec!!adD'92E'4%C@aTEA-#!#-!!J!S!#N0!#J!!R)!!!!B!"d!+J!V$3!
 | 
			
		||||
U!!&Y!!!!'!!C!#`-!#`!"`!"1J!#!!!0!#X!!Qi!!`!!!!!!,3!Z$3!Y!!%a!!!
 | 
			
		||||
!'J!Frqd+rqd!"!TdH'4X$3!Z!!%a!!!!'3!Drq`+rq`!"!TKFf0b!J!T!!)!,`!
 | 
			
		||||
`$3![!!*X!!)!(J!Hrq[rkJ(rk`!!!IrU!!!#!$!!!J!a!$)0!$%!!R)!!!!H!#X
 | 
			
		||||
!-`!d$3!c!!*X!!8!(J!T!$Ark3d!03!#EJ!!!"i!+3!f!$F0!$B!!cF"!!!I!#R
 | 
			
		||||
rk!!i!$N+rqJ!"!TMDA4Y$3!i!!&Y!!!!)`!PrqF$rqF!!3d!13!"E3!!!#B!+2r
 | 
			
		||||
Q!rrQrrd0!$F!!@m!!!!H!"rrj3[rj3!5-!!(G'KPF'&dD!!(G'KP8'&dD!(rk3!
 | 
			
		||||
!$3!d!!&[!!!!!!!!rq3,rq3!)$!!$R4SCA"bEfTPBh4`BA4S!!jdD'93FQpUC@0
 | 
			
		||||
d8'&dD!)!-J!#!$S!1`d!1J!#FJ!!!#`!1`!m!$d0!$`!!Q-!!!!X!$N!2J!r$3!
 | 
			
		||||
q!!*X!!8!,!!h!%$ri`d!3!!#EJ!!!#`!0`""!%)0!%%!!cF"!!!Y!$IriJ"$!%3
 | 
			
		||||
+rq)!"!TMDA4Y$3"$!!&Y!!!!-3!crq%$rq%!!3d!4!!"E3!!!$3!0[rJ!rrJrri
 | 
			
		||||
0!%)!!@m!!!!X!#hrh`[rh`!5-!!(G'KPF'&dD!!(G'KP8'&dD!(ri`!!$3!r!!&
 | 
			
		||||
Y!!!!0`!irpi+rpi!"!T849K8$3!p!!&[!!!!!!!!rpd,rpd!&M!!#A4SC@ePF'&
 | 
			
		||||
dD!!*G'KP6@93BA4S!J!l!!)!43"'$3"&!!*X!!)!2!!mrpcrf`(rh!!!!IrE!!!
 | 
			
		||||
#!%B!!J"(!%J0!%F!!R)!!!!m!%8!53"+$3"*!!*M!!!!2!""!%X!6!d!5`!#BJ!
 | 
			
		||||
!!$`!2`"0!%i0!%d!!@m!!!!m!$hrfJ[rfJ!J-!!1G'KPF(*[DQ9MG("KG'J!$R4
 | 
			
		||||
SC9"bEfTPBh43BA4S$3"1!!&Y!!!!23!q!%m-!%m!$3!(D@jME(9NC3!#!!!0!%`
 | 
			
		||||
!!@d!!!!r!%$rf3Vrf3!%#P4&@&30!%S!!@m!!!!!!!$rf![rf!!Q-!!4D@jME(9
 | 
			
		||||
NC@C[E'4PFR"KG'J!%@PZBfaeC'9'EfaNCA*3BA4S!J")!!)!8!"4$3"3!!*b!!!
 | 
			
		||||
!4J"9!&)!8`d!8J!#B`!!!%B!83"8!&80!&3!!Q)!!!"'!%m!9J"A$3"@!!*L!!!
 | 
			
		||||
!4J",!&J!@3d!@!!"E`!!!%B!4rrA#rrA!#!`!!jdD'9`FQpUC@0dF'&dD!!1G'K
 | 
			
		||||
P8(*[DQ9MG&"KG'J0!&N!!@d!!!"(!%S!@J`!@J!0!!GTEQ0XG@4P!!)!!!d!9`!
 | 
			
		||||
"E3!!!%X!6J"E$!"E!!d!"fp`C@jcFf`!!J!!$3"9!!&Y!!!!6`"3rpB+rpB!"!T
 | 
			
		||||
849K8$3"6!!&[!!!!!!!!rp8,rp8!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&
 | 
			
		||||
dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S!J"4!!)!A!"G$3"F!!*b!!!!9J"
 | 
			
		||||
K!&i!A`d!AJ!#B`!!!&B!A3"J!'%0!'!!!Q)!!!"@!&X!BJ"M$3"L!!&[!!!!9J"
 | 
			
		||||
Arp3,rp3!)$!!$R4SCA"bEfTPBh4`BA4S!!jdD'93FQpUC@0d8'&dD!d!B`!"E3!
 | 
			
		||||
!!&F!@J"N$!"N!!`!"Q0bHA"dE`!#!!!0!'%!!@d!!!"E!&crd`Vrd`!%#P4&@&3
 | 
			
		||||
0!&m!!@m!!!!!!!$rdJ[rdJ!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4Qp
 | 
			
		||||
XC'9b8'&dD!)!A3!#!'8!CJd!C3!#FJ!!!')!E3"R!'J0!'F!!Q-!!!"L!'N!D3"
 | 
			
		||||
U$3"T!!*L!!!!BJ"R!'X!E!d!D`!"E`!!!')!Brr4#rr4!#!`!!jdD'9`FQpUC@0
 | 
			
		||||
dF'&dD!!1G'KP8(*[DQ9MG&"KG'J0!'`!!@d!!!"M!'B!E3`!E3!*!!0cFf`!!J!
 | 
			
		||||
!$3"U!!&Y!!!!C`"Srp!+rp!!"!T849K8$3"S!!&[!!!!!!!!rmm,rmm!(M!!$A0
 | 
			
		||||
cE'C[E'4PFR"KG'J!$A0cE%C[E'4PFP"KG'J#!'B!!J"Z!'m0!'i!!R)!!!"Z!(8
 | 
			
		||||
!F!"a$3"`!!*M!!!!EJ"a!()!F`d!FJ!"E`!!!'i!Err1#rr1!#!`!!jdD'9`FQp
 | 
			
		||||
UC@0dF'&dD!!1G'KP8(*[DQ9MG&"KG'J0!(-!!@d!!!"[!($rc3Vrc3!%#P4&@&3
 | 
			
		||||
0!(%!!@m!!!!!!!$rc![rc!!Q-!!4Eh"PER0cE'C[E'4PFR"KG'J!%@p`C@jcFfa
 | 
			
		||||
'EfaNCA*3BA4S!J"[!!)!G!"e$3"d!!*X!!)!GJ"frm[rbJ(rb`!!!Ir+!!!#!(8
 | 
			
		||||
!!J"f!(F0!(B!!R)!!!"f!(X!H!"j$3"i!!&[!!!!GJ"hrmN,rmN!($!!$(4SC@p
 | 
			
		||||
XC'4PE'PYF`!-G'KP6faN4'9XD@ec$3"j!!*Z!!-!!!!!!(S!H`d!HJ!"-3!!!(J
 | 
			
		||||
!H[r)#[r)!!3+G(KNE!d!H`!"-3!!!(F!H2r(#[r(!!3+BA0MFJ)!G`!#!(`!I3d
 | 
			
		||||
!I!!#E!!#!(`!I2r'rm8"rmB!!!(ra3!!!J"p!!)!IJ"r$3"q!!*X!!%!I!"mrm3
 | 
			
		||||
!J!(ra!!!$!#!!%!!1L"NC@aPG'8JEfaN)'PZBfaeC'8kEh"PER0cE#"QEfaNCA)
 | 
			
		||||
JB@jN)(*PBh*PBA4P)'Pd)'0XC@&ZE(N!!J!!!J"r!!)!J3##$3#"!!*X!!)!I!"
 | 
			
		||||
mrm2r`J(r``!!!Ir#!!!#!))!!J#$!)30!)-!!e%!!!"m!+8!K3#'!)F0!)8!!@X
 | 
			
		||||
!!!"r!*`!L!)!L!!#!)N!LJd!L3!$53!#!(m!N[r"!)[r`!Vr`3!B,QeTFf0cE'0
 | 
			
		||||
d+LSU+J!!!!!!!*!!!#SU+LS0!)X!!Qi!!!"r!)i!M!#0$3#-!!)d!!!!K`#1rlm
 | 
			
		||||
!MJVr[`!%#Q0QEf`0!)i!!@d!!!#+!)d!M``!M`!0!!G[F'9ZFh0X!!)!!!d!M3!
 | 
			
		||||
#0!!!!(m!Krqq!*!!#[qq!!3+BfC[E!d!N!!!!@m!!!#$!)Er[3[r[3!Q-!!4D@j
 | 
			
		||||
ME(9NC@C[E'4PFR"KG'J!%@PZBfaeC'9'EfaNCA*3BA4S![r!!!!#!)S!!J#4rl`
 | 
			
		||||
0!*%!!dN!!J#6!*crZ`#5rlS+rlX!'#jMEh*PC'9XEbSU+LS!!!!!!!#3!!!U+LS
 | 
			
		||||
U$3#5!!%a!!!!N`#BrlN+rlN!"!TcC@aP![qk!!!#rl`!!!d!KJ!$8J!!!!!!!2q
 | 
			
		||||
irlIrYJVrZ!!B,Q&cBh*PFR)J+LSU+J!!!!!!!*!!!#SU+LS"rlF!!!,rYJ!!$3#
 | 
			
		||||
(!!*X!!%!T!#Nrl8!N`(rY3!!$!#6!"-!$5"TCfj[FQ8JCA*bEh)!!J!!!J#%!!)
 | 
			
		||||
!P!#9$3#8!!*X!!)!TJ#Qrl6rX`(rY!!!!Iqc!!!#!*8!!J#@!*F0!*B!!dN!!J#
 | 
			
		||||
Q!,lrX[qa!*J+rl)!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@aX!Iqa!!!'!*J
 | 
			
		||||
!!rq`!*N!QJVrX!!%#QY[Bf`0!*N!!@d!!!#U!+hrV`VrV`!%#Q0QEf`'!*S!!rq
 | 
			
		||||
Z!*[rV3VrVJ!%#QPZFfJ0!*X!!M3!!!#`!,MrV!#F#[qX!!3+BfC[E!d!R!!"E`!
 | 
			
		||||
!!,3!YrqV#rqV!#B`!"&TEQ0XG@4PCQpXC'9bF'&dD!!4D@jME(9NC8C[E'4PFP"
 | 
			
		||||
KG'J'rkd!!!)!P`!#!*d!RJd!R3!#FJ!!!,m!aJ#I!+!0!*m!!Q`"!!#r!-)!SIq
 | 
			
		||||
U$3#K!!%a!!!![`$#rkN+rkN!"!TbFfad!IqU!!!0!+!!!@m!!!!!!!$rU![rU!!
 | 
			
		||||
Z-!!9G'KPEQ9hCQpXC'9bFQ9QCA*PEQ0P!"9dD'91CAG'EfaNCA*5C@CPFQ9ZBf8
 | 
			
		||||
#!*i!!J#L!+-0!+)!!dN!!J$(!-lrT`#NrkB+rkF!'#jYDA0MFfaMG#SU+LS!!!!
 | 
			
		||||
!!!#3!!!U+LSU$3#N!!&[!!!!a`$+rk8,rk8!,M!!&A4SC@jPGfC[E'4PFR*PCQ9
 | 
			
		||||
bC@jMC3!9G'KP6Q9h4QpXC'9b8Q9QCA*PEQ0P![qQ!!!#!+-!!J#P!+B0!+8!!R)
 | 
			
		||||
!!!$2!0`!T`#S$3#R!!&Y!!!!c`$5!+N-!+N!$3!(Eh"PER0cE!!#!!!0!+J!!Qi
 | 
			
		||||
!!!!!!!!!UJ#V$3#U!!%a!!!!e`$Erk3+rk3!"!T`EQ&Y$3#V!!%a!!!!dJ$Ark-
 | 
			
		||||
+rk-!"!TcC@aP!J#Q!!)!V!#Y$3#X!!*X!!)!h3$Grk,rS3(rSJ!!!IqK!!!#!+d
 | 
			
		||||
!!J#Z!+m0!+i!!Q`!!3$G!0hrS!#`!IqJ!!!-!,!!(`!C)&0dBA*d)'eKDfPZCb"
 | 
			
		||||
dD'8JB@aTBA0PF`!#!!!#!+m!!J#a!,)0!,%!!dN!!J$G!3ArRrqH!,-+rjm!'#j
 | 
			
		||||
MEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@aX!IqH!!!'!,-!!rqG!,3!Y3VrR3!%#QY
 | 
			
		||||
[Bf`0!,3!!@d!!!$K!16rR!VrR!!%#Q&XD@%'!,8!!rqE!,B!Y`VrQ`!%#QPZFfJ
 | 
			
		||||
0!,B!!M3!!!$R!1rrQJ#i#[qD!!3+BfC[E!d!Z!!"E`!!!1X!l[qC#rqC!$3`!"K
 | 
			
		||||
[F'9ZFh0XD@jME(9NC@C[E'4PFR"KG'J!''p`C@j68da*EQ0XG@4P4QpXC'9b8'&
 | 
			
		||||
dD!B!Y`!$rjJ!ZIqA#[qB!!3+G'mJ)!d!Z3!#EJ!!!2)!r`#k!,X0!,S!!M3!!!$
 | 
			
		||||
i!2rrPJ#m#[q@!!3+CQPXC3d![!!"E3!!!2X!rJ#p$!#p!"-!$@p`C@jcFfaMEfj
 | 
			
		||||
Q,QJ!!J!!$3#l!!)d!!!!mJ$irj8![JVrP3!%#Q0QEf`0!,i!!@m!!!$f!2IrP![
 | 
			
		||||
rP!!@-!!*G'KPE@9`BA4S!!PdD'90C9"KG'J'rjF!!!)!XJ!#!,m!`!d![`!#E!!
 | 
			
		||||
#!3B""[q6rj)"rj-!!!(rNJ!!!J$!!!)!`3$#$3$"!!*b!!!""J%4!--!a!d!``!
 | 
			
		||||
#BJ!!!3B"$3$&!-B0!-8!!@m!!!%'!3RrN3[rN3!N-!!3Bh*jF(4[CQpXC'9bF'&
 | 
			
		||||
dD!!3Bh*jF(4[4QpXC'9b8'&dD!d!aJ!"E3!!!3N"$!$($!$(!!X!"6TKFfia!!)
 | 
			
		||||
!!!d!a!!"E`!!!!!!!2q3!![rN!!!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!)!`J!
 | 
			
		||||
#!-J!b3d!b!!$53!#!4)"22q2rii!bJVrM`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!
 | 
			
		||||
!!'jeE'`"rii!!!B!bJ!$rid!b`$-#[q0!!3+DfpME!d!b`!"E3!!!4B"'Iq-#[q
 | 
			
		||||
-!!3+B@aTB3B!c!!$riX!c3$1#[q,!!3+D@jcD!d!c3!#0!!!!4`"*2q+!-m+riS
 | 
			
		||||
!"!TMCQpX$3$2!!&[!!!")!%MriN,riN!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9
 | 
			
		||||
bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J$1!!2rL!$3riF+riJ!"!T
 | 
			
		||||
dEb!J$3$3!!*Z!!!"*`%f!0%!dJd!d3!#0!!!!5m"0[q'!0-+riB!"!TQD@aP$3$
 | 
			
		||||
6!!&Y!!!"-J%e!03-!03!$!!'BA0Z-5jS!!)!!!d!dJ!#0!!!!5F",rq&!08+ri8
 | 
			
		||||
!"!TMCQpX$3$9!!&[!!!"+`%Zri3,ri3!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!E
 | 
			
		||||
rK`!!!J$*!!)!eJ$A$3$@!!0*!!)"23&Rri2rJJ$B#[q$!"JZBfpbC@0bC@`U+LS
 | 
			
		||||
U!!!!!!!!N!!!ER9XE!(rJJ!!"J$B!!2rJ3$C!0S+ri%!"!TVEf0X$3$C!!&Y!!!
 | 
			
		||||
"33&%ri!+ri!!"!TKE'PK"J$D!!2rI`$E!0`+rhm!"!TTER0S$3$E!!)d!!!"4`&
 | 
			
		||||
2rhi!h3VrIJ!%#Q0QEf`0!0d!!@m!!!&,!8lrI3[rI3!d-!!BEh"PER0cE'PZBfa
 | 
			
		||||
eC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'!0`!!rpm!0l
 | 
			
		||||
rH`VrI!!%#R4[)#!0!0i!!Qi!!!&5!@%!h`$J$3$I!!)d!!!"@J&KrhS!i3VrHJ!
 | 
			
		||||
%#QCTE'80!1%!!@d!!!&G!@!!iJ`!iJ!3!!TKFfiaAfeKBbjS!!)!!!d!i!!#0!!
 | 
			
		||||
!!9)"@[pj!1-+rhN!"!TMCQpX$3$M!!&[!!!"9J&CrhJ,rhJ!&$!!#(4PEA"`BA4
 | 
			
		||||
S!!KdC@e`8'&dD!ErH`!!!J$A!!)!j!$P$3$N!!*X!!)"D!&SrhIrGJ(rG`!!!Ip
 | 
			
		||||
f!!!#!18!!J$Q!1F0!1B!!R)!!!&S!A-!k!$T$3$S!!*L!!!"D!&[!1S!k`d!kJ!
 | 
			
		||||
"E`!!!@J"Drpe#rpe!#3`!""MFRP`G'pQEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*
 | 
			
		||||
3BA4S$3$V!!&Y!!!"D`&Z!1`-!1`!#J!%1Q*TE`!#!!!0!1N!!@m!!!!!!!$rG![
 | 
			
		||||
rG!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S!J$R!!)!l3$Z$3$Y!!0*!!)"G!'Hrh2
 | 
			
		||||
rFJ$[#[pc!"JZBfpbC@0bC@`U+LSU!!!!!!!!N!!!ER9XE!(rFJ!!"J$[!!2rF3$
 | 
			
		||||
`!2%+rh%!"!TVEf0X$3$`!!&Y!!!"H!&lrh!+rh!!"!TKE'PK"J$a!!2rE`$b!2-
 | 
			
		||||
+rfm!"!TTER0S$3$b!!)d!!!"IJ''rfi!p!VrEJ!%#Q0QEf`0!23!!@m!!!'#!BA
 | 
			
		||||
rE3[rE3!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9
 | 
			
		||||
NC8C[E'4PFP"KG'J'!2-!!rpX!2ArD`VrE!!%#R4[)#!0!28!!Qi!!!'*!CJ!pJ$
 | 
			
		||||
h$3$f!!)d!!!"N3'BrfS!q!VrDJ!%#QCTE'80!2J!!@d!!!'8!CF!q3`!q3!,!!9
 | 
			
		||||
LD@mZD!!#!!!0!2F!!M3!!!'*!C(rD3$k#[pT!!3+BfC[E!d!qJ!"E`!!!Bd"N!$
 | 
			
		||||
rD![rD!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S"[pV!!!#!1i!!J$l!2`0!2X!!Q`
 | 
			
		||||
!!J'I!CrrCrpQ!IpR!!!"rfB!!!)!r!!#!2d!rJd!r3!#FJ!!!Cm"UJ$r!3!0!2m
 | 
			
		||||
!!Q)!!!'I!DB"!3%#$3%"!!&[!!!"R`'Lrf8,rf8!*$!!%'0bHA"dEfC[E'4PFR"
 | 
			
		||||
KG'J!%'0bHA"dEdC[E'4PFP"KG'J0!3)!!@d!!!'L!D8"!``"!`!*!!-kBQB!!J!
 | 
			
		||||
!$3%!!!&[!!!!!!!!rf3,rf3!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!)!rJ!#!33
 | 
			
		||||
""3d""!!$53!#!DX"eIpMrf)""JVrB`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'j
 | 
			
		||||
eE'`"rf)!!!B""J!$rf%""`%)#[pK!!3+DfpME!d""`!"E3!!!Dm"X[pJ#[pJ!!3
 | 
			
		||||
+B@aTB3B"#!!$rem"#3%+#[pI!!3+D@jcD!d"#3!#0!!!!E8"[IpH!3X+rei!"!T
 | 
			
		||||
MCQpX$3%,!!&[!!!"Z3'mred,red!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&
 | 
			
		||||
dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J%+!!2rA!%-reX+re`!"!TdEb!
 | 
			
		||||
J$3%-!!*Z!!!"`!(2!3d"$Jd"$3!#0!!!!FJ"crpD!3m+reS!"!TQD@aP$3%2!!&
 | 
			
		||||
Y!!!"b`(1!4!-!4!!%!!+BQa[GfCTFfJZD!!#!!!0!3i!!M3!!!(!!FMr@3%4#[p
 | 
			
		||||
C!!3+BfC[E!d"%3!"E`!!!F3"arpB#rpB!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J
 | 
			
		||||
'reX!!!)""3!#!4)"%`d"%J!#E!!#!GB"e[pAreB"reF!!!(r9J!!!J%6!!)"&!%
 | 
			
		||||
9$3%8!!*b!!!"eJ(K!4B"&`d"&J!#BJ!!!GB"h3%B!4N0!4J!!@m!!!(@!GRr93[
 | 
			
		||||
r93!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD!d"'3!"E3!
 | 
			
		||||
!!GN"h!%D$!%D!!N!!cTLEJ!#!!!0!4F!!@m!!!!!!!$r9![r9!!8-!!)G'9YF("
 | 
			
		||||
KG'J!#(4PEA"3BA4S!J%9!!)"'`%F$3%E!!0*!!)"iJ)-re2r8J%G#[p6!"JZBfp
 | 
			
		||||
bC@0bC@`U+LSU!!!!!!!!N!!!ER9XE!(r8J!!"J%G!!2r83%H!4m+re%!"!TVEf0
 | 
			
		||||
X$3%H!!&Y!!!"jJ(Tre!+re!!"!TKE'PK"J%I!!2r6`%J!5%+rdm!"!TTER0S$3%
 | 
			
		||||
J!!)d!!!"l!(drdi")JVr6J!%#Q0QEf`0!5)!!@m!!!(`!I2r63[r63!d-!!BEh"
 | 
			
		||||
PER0cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J
 | 
			
		||||
'!5%!!rp-!52r5`Vr6!!%#R4[)#!0!5-!!Qi!!!(h!JB"*!%P$3%N!!)d!!!"r`)
 | 
			
		||||
'rdS"*JVr5J!%#QCTE'80!5B!!@d!!!)#!J8"*``"*`!+!!4LELjS!!)!!!d"*3!
 | 
			
		||||
#0!!!!IF"rrp*!5J+rdN!"!TMCQpX$3%S!!&[!!!"q`(qrdJ,rdJ!&$!!#(4PEA"
 | 
			
		||||
`BA4S!!KdC@e`8'&dD!Er5`!!!J%F!!)"+3%U$3%T!!*X!!)#$3)0rdIr4J(r4`!
 | 
			
		||||
!!Ip'!!!#!5S!!J%V!5`0!5X!!R)!!!)0!KJ",3%Z$3%Y!!*L!!!#$3)8!5m"-!d
 | 
			
		||||
",`!"E`!!!Jd#%2p&#rp&!#3`!""MFRP`G'pQEfaNCA*`BA4S!""MFRP`G'p'Efa
 | 
			
		||||
NCA*3BA4S$3%`!!&Y!!!#%!)6!6%-!6%!$3!(1Q*eCQCPFJ!#!!!0!5i!!@m!!!!
 | 
			
		||||
!!!$r4![r4!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S!J%X!!)"-J%c$3%b!!0*!!)
 | 
			
		||||
#'3*$rd2r3J%d#[p$!"JZBfpbC@0bC@`U+LSU!!!!!!!!N!!!ER9XE!(r3J!!"J%
 | 
			
		||||
d!!2r33%e!6B+rd%!"!TVEf0X$3%e!!&Y!!!#(3)Jrd!+rd!!"!TKE'PK"J%f!!2
 | 
			
		||||
r2`%h!6J+rcm!"!TTER0S$3%h!!)d!!!#)`)Vrci"13Vr2J!%#Q0QEf`0!6N!!@m
 | 
			
		||||
!!!)R!LVr23[r23!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0
 | 
			
		||||
-5@jME(9NC8C[E'4PFP"KG'J'!6J!!rmm!6Vr1`Vr2!!%#R4[)#!0!6S!!Qi!!!)
 | 
			
		||||
Z!Md"1`%m$3%l!!)d!!!#0J)prcS"23Vr1J!%#QCTE'80!6d!!@d!!!)j!M`"2J`
 | 
			
		||||
"2J!1!!KLG@CQCA)ZD!!#!!!0!6`!!M3!!!)Z!MEr13%r#[mj!!3+BfC[E!d"2`!
 | 
			
		||||
"E`!!!M)#0Imi#rmi!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J'rcX!!!)"-`!#!8!
 | 
			
		||||
"33d"3!!#E!!#!N3#42mhrcB"rcF!!!(r0J!!!J&"!!)"3J&$$3&#!!*b!!!#4!*
 | 
			
		||||
2!83"43d"4!!#BJ!!!N3#5`&'!8F0!8B!!@m!!!*%!NIr03[r03!N-!!3Bh*jF(4
 | 
			
		||||
[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD!d"4`!"E3!!!NF#5J&)$!&)!!X
 | 
			
		||||
!"6TMBA0d!!)!!!d"43!"E`!!!!!!!2md#rmd!"3`!!KdC@e`F'&dD!!)G'9YF&"
 | 
			
		||||
KG'J#!8-!!J&*!8S0!8N!!dN!!J*3!RVr-rmb!8X+rc-!'#jMEh*PBh*PE#SU+LS
 | 
			
		||||
!!!!!!!#3!!"ZG@aX!Imb!!!'!8X!!rma!8`"63Vr-3!%#QY[Bf`0!8`!!@d!!!*
 | 
			
		||||
8!PIr-!Vr-!!%#Q&XD@%'!8d!!rm[!8i"6`Vr,`!%#QPZFfJ0!8i!!M3!!!*D!Q,
 | 
			
		||||
r,J&3#[mZ!!3+BfC[E!d"8!!"E`!!!Pi#BImY#rmY!$3`!"K[F'9ZFh0XD@jME(9
 | 
			
		||||
NC@C[E'4PFR"KG'J!''p`C@j68da*EQ0XG@4P4QpXC'9b8'&dD!B"6`!$rb`"8Im
 | 
			
		||||
V#[mX!!3+G'mJ)!d"83!#EJ!!!Q8#G!&5!9-0!9)!!M3!!!*Y!R6r+J&8#[mU!!3
 | 
			
		||||
+CQPXC3d"9!!"E3!!!R!#F`&9$!&9!!`!"Q0KFh3ZD!!#!!!0!9-!!M3!!!*P!Qh
 | 
			
		||||
r+3&@#[mT!!3+BfC[E!d"9J!"E`!!!QN#E2mS#rmS!"3`!!KdC@e`F'&dD!!)G'9
 | 
			
		||||
YF&"KG'J'rbX!!!)"5J!#!9F"@!d"9`!#E!!#!RX#HrmRrbB"rbF!!!(r*J!!!J&
 | 
			
		||||
B!!)"@3&D$3&C!!*b!!!#H`+'!9X"A!d"@`!#BJ!!!RX#JJ&G!9i0!9d!!@m!!!*
 | 
			
		||||
l!Rlr*3[r*3!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD!d
 | 
			
		||||
"AJ!"E3!!!Ri#J3&I$!&I!!X!"6TMEfe`!!)!!!d"A!!"E`!!!!!!!2mN#rmN!"3
 | 
			
		||||
`!!KdC@e`F'&dD!!)G'9YF&"KG'J#!9S!!J&J!@%0!@!!!dN!!J+(!V(r)rmL!@)
 | 
			
		||||
+rb-!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@aX!ImL!!!'!@)!!rmK!@-"C!V
 | 
			
		||||
r)3!%#QY[Bf`0!@-!!@d!!!+,!Slr)!Vr)!!%#Q&XD@%'!@3!!rmI!@8"CJVr(`!
 | 
			
		||||
%#QPZFfJ0!@8!!M3!!!+4!TRr(J&R#[mH!!3+BfC[E!d"C`!"E`!!!T8#Q2mG#rm
 | 
			
		||||
G!$3`!"K[F'9ZFh0XD@jME(9NC@C[E'4PFR"KG'J!''p`C@j68da*EQ0XG@4P4Qp
 | 
			
		||||
XC'9b8'&dD!B"CJ!$ra`"D2mE#[mF!!3+G'mJ)!d"D!!#EJ!!!T`#U`&T!@S0!@N
 | 
			
		||||
!!M3!!!+N!U[r'J&V#[mD!!3+CQPXC3d"D`!"E3!!!UF#UJ&X$!&X!!`!"Q0[EA!
 | 
			
		||||
ZD!!#!!!0!@S!!M3!!!+F!U6r'3&Y#[mC!!3+BfC[E!d"E3!"E`!!!U!#SrmB#rm
 | 
			
		||||
B!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J'raX!!!)"B3!#!@i"E`d"EJ!#E!!#!V)
 | 
			
		||||
#X[mAraB"raF!!!(r&J!!!J&[!!)"F!&a$3&`!!*b!!!#XJ+p!A)"F`d"FJ!#BJ!
 | 
			
		||||
!!V)#Z3&d!A80!A3!!@m!!!+b!VAr&3[r&3!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!
 | 
			
		||||
3Bh*jF(4[4QpXC'9b8'&dD!d"G3!"E3!!!V8#Z!&f$!&f!!X!"6TMEfjQ!!)!!!d
 | 
			
		||||
"F`!"E`!!!!!!!2m8#rm8!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J#!A%!!J&h!AJ
 | 
			
		||||
0!AF!!dN!!J+q!ZMr%rm5!AN+ra-!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@a
 | 
			
		||||
X!Im5!!!'!AN!!rm4!AS"H`Vr%3!%#QY[Bf`0!AS!!@d!!!,#!XAr%!Vr%!!%#Q&
 | 
			
		||||
XD@%'!AX!!rm2!A`"I3Vr$`!%#QPZFfJ0!A`!!M3!!!,)!Y$r$J&q#[m1!!3+BfC
 | 
			
		||||
[E!d"IJ!"E`!!!X`#crm0#rm0!$3`!"K[F'9ZFh0XD@jME(9NC@C[E'4PFR"KG'J
 | 
			
		||||
!''p`C@j68da*EQ0XG@4P4QpXC'9b8'&dD!B"I3!$r``"Irm,#[m-!!3+G'mJ)!d
 | 
			
		||||
"I`!#EJ!!!Y-#iJ'!!B%0!B!!!M3!!!,E!Z,r#J'##[m+!!3+CQPXC3d"JJ!"E3!
 | 
			
		||||
!!Yi#i3'$$!'$!!`!"Q0[EQBZD!!#!!!0!B%!!M3!!!,6!Y[r#3'%#[m*!!3+BfC
 | 
			
		||||
[E!d"K!!"E`!!!YF#f[m)#rm)!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J'r`X!!!)
 | 
			
		||||
"H!!#!B8"KJd"K3!#E!!#!ZN#kIm(r`B"r`F!!!(r"J!!!J''!!)"K`')$3'(!!*
 | 
			
		||||
b!!!#k3,d!BN"LJd"L3!#BJ!!!ZN#m!',!B`0!BX!!@m!!!,T!Zcr"3[r"3!N-!!
 | 
			
		||||
3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD!d"M!!"E3!!!Z`#l`'
 | 
			
		||||
0$!'0!!S!"$TNCA-!!J!!$3'+!!&[!!!!!!!!r`3,r`3!&$!!#(4PEA"`BA4S!!K
 | 
			
		||||
dC@e`8'&dD!)"L!!#!Bi"M`d"MJ!$53!#![8$(rm$r`)"N!!+r`-!'#jMEh*PBh*
 | 
			
		||||
PE#SU+LS!!!!!!!#3!!"ZG@aX!Im#!!!'!C!!!!2r!3'4!C)+r`%!"!TVEf0X$3'
 | 
			
		||||
4!!&Y!!!#q3,mr`!+r`!!"!TKE'PK"J'5!!2qr`'6!C3+r[m!"!TTER0S$3'6!!)
 | 
			
		||||
d!!!#r`-(r[i"P3VqrJ!%#Q0QEf`0!C8!!@m!!!-$!`Eqr3[qr3!d-!!BEh"PER0
 | 
			
		||||
cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'!C3
 | 
			
		||||
!!rlm!CEqq`Vqr!!%#R4[)#!0!CB!!Qi!!!-+!aN"P`'B$3'A!!)d!!!$%J-Cr[S
 | 
			
		||||
"Q3VqqJ!%#QCTE'80!CN!!@d!!!-9!aJ"QJ`"QJ!,!!9NCA-ZD!!#!!!0!CJ!!M3
 | 
			
		||||
!!!-+!a,qq3'E#[lj!!3+BfC[E!d"Q`!"E`!!!`i$%Ili#rli!"3`!!KdC@e`F'&
 | 
			
		||||
dD!!)G'9YF&"KG'J'r[X!!!)"M`!#!C`"R3d"R!!#E!!#!b!$)2lhr[B"r[F!!!(
 | 
			
		||||
qpJ!!!J'G!!)"RJ'I$3'H!!*b!!!$)!-V!D!"S3d"S!!#BJ!!!b!$*`'L!D-0!D)
 | 
			
		||||
!!@m!!!-J!b2qp3[qp3!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9
 | 
			
		||||
b8'&dD!d"S`!"E3!!!b-$*J'N$!'N!!N!!cTND!!#!!!0!D%!!@m!!!!!!!$qp![
 | 
			
		||||
qp!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S!J'I!!)"T3'Q$3'P!!0*!!)$,!0@r[2
 | 
			
		||||
qmJ'R#[lc!"JZBfpbC@0bC@`U+LSU!!!!!!!!N!!!ER9XE!(qmJ!!"J'R!!2qm3'
 | 
			
		||||
S!DN+r[%!"!TVEf0X$3'S!!&Y!!!$-!-cr[!+r[!!"!TKE'PK"J'T!!2ql`'U!DX
 | 
			
		||||
+rZm!"!TTER0S$3'U!!)d!!!$0J-qrZi"V!VqlJ!%#Q0QEf`0!D`!!@m!!!-k!ch
 | 
			
		||||
ql3[ql3!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9
 | 
			
		||||
NC8C[E'4PFP"KG'J'!DX!!rlX!Dhqk`Vql!!%#R4[)#!0!Dd!!Qi!!!0"!e!"VJ'
 | 
			
		||||
[$3'Z!!)d!!!$5303rZS"X!VqkJ!%#QCTE'80!E!!!@d!!!0-!dm"X3`"X3!+!!4
 | 
			
		||||
ND#jS!!)!!!d"V`!#0!!!!d%$5IlT!E)+rZN!"!TMCQpX$3'b!!&[!!!$430)rZJ
 | 
			
		||||
,rZJ!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!Eqk`!!!J'Q!!)"X`'d$3'c!!*X!!)
 | 
			
		||||
$9`0ArZIqjJ(qj`!!!IlQ!!!#!E3!!J'e!EB0!E8!!R)!!!0A!f)"Y`'i$3'h!!*
 | 
			
		||||
L!!!$9`0H!EN"ZJd"Z3!"E`!!!eF$@[lP#rlP!#3`!""MFRP`G'pQEfaNCA*`BA4
 | 
			
		||||
S!""MFRP`G'p'EfaNCA*3BA4S$3'k!!&Y!!!$@J0G!EX-!EX!#J!%1Q4cB3!#!!!
 | 
			
		||||
0!EJ!!@m!!!!!!!$qj![qj!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S!J'f!!)"[!'
 | 
			
		||||
p$3'm!!0*!!)$B`10rZ2qiJ'q#[lM!"JZBfpbC@0bC@`U+LSU!!!!!!!!N!!!ER9
 | 
			
		||||
XE!(qiJ!!"J'q!!2qi3'r!F!+rZ%!"!TVEf0X$3'r!!&Y!!!$C`0UrZ!+rZ!!"!T
 | 
			
		||||
KE'PK"J(!!!2qh`("!F)+rYm!"!TTER0S$3("!!)d!!!$E30erYi"``VqhJ!%#Q0
 | 
			
		||||
QEf`0!F-!!@m!!!0a!h6qh3[qh3!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4
 | 
			
		||||
S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'!F)!!rlF!F6qf`Vqh!!%#R4[)#!
 | 
			
		||||
0!F3!!Qi!!!0i!iF"a3('$3(&!!)d!!!$J!1(rYS"a`VqfJ!%#QCTE'80!FF!!@d
 | 
			
		||||
!!!1$!iB"b!`"b!!,!!9NFf%ZD!!#!!!0!FB!!M3!!!0i!i$qf3(*#[lC!!3+BfC
 | 
			
		||||
[E!d"b3!"E`!!!h`$IrlB#rlB!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J'rYX!!!)
 | 
			
		||||
"[3!#!FS"b`d"bJ!#E!!#!ii$M[lArYB"rYF!!!(qeJ!!!J(,!!)"c!(0$3(-!!*
 | 
			
		||||
b!!!$MJ1C!Fi"c`d"cJ!#BJ!!!ii$P3(3!G%0!G!!!@m!!!11!j(qe3[qe3!N-!!
 | 
			
		||||
3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD!d"d3!"E3!!!j%$P!(
 | 
			
		||||
5$!(5!!S!"$TPFR)!!J!!$3(2!!&[!!!!!!!!rY3,rY3!&$!!#(4PEA"`BA4S!!K
 | 
			
		||||
dC@e`8'&dD!)"c3!#!G-"e!d"d`!$53!#!jS$a2l6rY)"e3Vqd`!B,Q0[FQ9MFQ9
 | 
			
		||||
X+LSU+J!!!!!!!*!!!'jeE'`"rY)!!!B"e3!$rY%"eJ(A#[l4!!3+DfpME!d"eJ!
 | 
			
		||||
"E3!!!ji$SIl3#[l3!!3+B@aTB3B"e`!$rXm"f!(C#[l2!!3+D@jcD!d"f!!#0!!
 | 
			
		||||
!!k3$V2l1!GS+rXi!"!TMCQpX$3(D!!&[!!!$U!1VrXd,rXd!0$!!''p`C@jcFfa
 | 
			
		||||
TEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J(C!!2
 | 
			
		||||
qc!(ErXX+rX`!"!TdEb!J$3(E!!*Z!!!$V`1q!G`"h3d"h!!#0!!!!lF$[[l+!Gi
 | 
			
		||||
+rXS!"!TQD@aP$3(H!!&Y!!!$ZJ1p!Gm-!Gm!#`!&CA*b,QJ!!J!!$3(G!!)d!!!
 | 
			
		||||
$V`1hrXN"i!Vqb3!%#Q0QEf`0!H!!!@m!!!1c!lEqb![qb!!8-!!)G'9YF("KG'J
 | 
			
		||||
!#(4PEA"3BA4S"[l,!!!#!G3!!J(K!H)0!H%!!Q`!!J2&!mAqarl'!Il(!!!"rXB
 | 
			
		||||
!!!)"iJ!#!H-"j!d"i`!#FJ!!!m8$d!(P!HB0!H8!!Q)!!!2&!m`"j`(S$3(R!!&
 | 
			
		||||
[!!!$a32)rX8,rX8!*$!!%'0bHA"dEfC[E'4PFR"KG'J!%'0bHA"dEdC[E'4PFP"
 | 
			
		||||
KG'J0!HJ!!@d!!!2)!mX"k3`"k3!+!!3kCAC`!!)!!!d"jJ!"E`!!!!!!!2l%#rl
 | 
			
		||||
%!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J#!H3!!J(U!HX0!HS!!dN!!J24!r[q`rl
 | 
			
		||||
#!H`+rX-!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@aX!Il#!!!'!H`!!rl"!Hd
 | 
			
		||||
"lJVq`3!%#QY[Bf`0!Hd!!@d!!!29!pMq`!Vq`!!%#Q&XD@%'!Hi!!rkr!Hm"m!V
 | 
			
		||||
q[`!%#QPZFfJ0!Hm!!M3!!!2E!q2q[J(a#[kq!!3+BfC[E!d"m3!"E`!!!pm$i[k
 | 
			
		||||
p#rkp!$3`!"K[F'9ZFh0XD@jME(9NC@C[E'4PFR"KG'J!''p`C@j68da*EQ0XG@4
 | 
			
		||||
P4QpXC'9b8'&dD!B"m!!$rV`"m[kl#[km!!3+G'mJ)!d"mJ!#EJ!!!qB$p3(c!I3
 | 
			
		||||
0!I-!!M3!!!2Z!rAqZJ(e#[kk!!3+CQPXC3d"p3!"E3!!!r%$p!(f$!(f!!X!"@9
 | 
			
		||||
fF#jS!!)!!!d"p!!#0!!!!qB$l[kj!IF+rVN!"!TMCQpX$3(h!!&[!!!$kJ2YrVJ
 | 
			
		||||
,rVJ!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!EqZ`!!!J(V!!)"q!(j$3(i!!*X!!)
 | 
			
		||||
$r!2mrVIqYJ(qY`!!!Ikf!!!#!IN!!J(k!IX0!IS!!R)!!!2m"!F"r!(p$3(m!!*
 | 
			
		||||
L!!!$r!3$!Ii"r`d"rJ!"E`!!!r`$rrke#rke!#3`!""MFRP`G'pQEfaNCA*`BA4
 | 
			
		||||
S!""MFRP`G'p'EfaNCA*3BA4S$3(r!!&Y!!!$r`3#!J!-!J!!#`!&1QKYB@-!!J!
 | 
			
		||||
!$3(p!!&[!!!!!!!!rV3,rV3!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!)"q`!#!J%
 | 
			
		||||
#!Jd#!3!$53!#"!J%-[kcrV)#!`VqX`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'j
 | 
			
		||||
eE'`"rV)!!!B#!`!$rV%#"!)&#[ka!!3+DfpME!d#"!!"E3!!"!`%$rk`#[k`!!3
 | 
			
		||||
+B@aTB3B#"3!$rUm#"J)(#[k[!!3+D@jcD!d#"J!#0!!!"")%'[kZ!JJ+rUi!"!T
 | 
			
		||||
MCQpX$3))!!&[!!!%&J3CrUd,rUd!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&
 | 
			
		||||
dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J)(!!2qV!)*rUX+rU`!"!TdEb!
 | 
			
		||||
J$3)*!!*Z!!!%(33X!JS##`d##J!#0!!!"#8%,2kU!J`+rUS!"!TQD@aP$3)-!!&
 | 
			
		||||
Y!!!%+!3V!Jd-!Jd!$!!'D'eKBbjS!!)!!!d##`!#0!!!""d%*IkT!Ji+rUN!"!T
 | 
			
		||||
MCQpX$3)1!!&[!!!%)33NrUJ,rUJ!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!EqU`!
 | 
			
		||||
!!J)#!!)#$`)3$3)2!!*X!!)%-`3crUIqTJ(qT`!!!IkQ!!!#!K!!!J)4!K)0!K%
 | 
			
		||||
!!R)!!!3c"$i#%`)8$3)6!!*L!!!%-`3k!K8#&Jd#&3!"E`!!"$-%0[kP#rkP!#3
 | 
			
		||||
`!""MFRP`G'pQEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S$3)@!!&Y!!!%0J3
 | 
			
		||||
j!KF-!KF!#`!&1QPNC@%!!J!!$3)8!!&[!!!!!!!!rU3,rU3!&$!!#(4PEA"`BA4
 | 
			
		||||
S!!KdC@e`8'&dD!)#%J!#!KJ#'3d#'!!$53!#"$m%DIkMrU)#'JVqS`!B,Q0[FQ9
 | 
			
		||||
MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"rU)!!!B#'J!$rU%#'`)F#[kK!!3+DfpME!d
 | 
			
		||||
#'`!"E3!!"%-%4[kJ#[kJ!!3+B@aTB3B#(!!$rTm#(3)H#[kI!!3+D@jcD!d#(3!
 | 
			
		||||
#0!!!"%N%8IkH!Km+rTi!"!TMCQpX$3)I!!&[!!!%6343rTd,rTd!0$!!''p`C@j
 | 
			
		||||
cFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J)
 | 
			
		||||
H!!2qR!)JrTX+rT`!"!TdEb!J$3)J!!*Z!!!%9!4M!L%#)Jd#)3!#0!!!"&`%Brk
 | 
			
		||||
D!L-+rTS!"!TQD@aP$3)M!!&Y!!!%A`4L!L3-!L3!$!!'D@4PB5jS!!)!!!d#)J!
 | 
			
		||||
#0!!!"&3%A2kC!L8+rTN!"!TMCQpX$3)P!!&[!!!%@!4ErTJ,rTJ!&$!!#(4PEA"
 | 
			
		||||
`BA4S!!KdC@e`8'&dD!EqQ`!!!J)C!!)#*J)R$3)Q!!*X!!)%DJ4UrTIqPJ(qP`!
 | 
			
		||||
!!Ik@!!!#!LF!!J)S!LN0!LJ!!R)!!!4U"(8#+J)V$3)U!!*L!!!%DJ4a!L`#,3d
 | 
			
		||||
#,!!"E`!!"'S%EIk9#rk9!#3`!""MFRP`G'pQEfaNCA*`BA4S!""MFRP`G'p'Efa
 | 
			
		||||
NCA*3BA4S$3)Y!!&Y!!!%E34`!Li-!Li!$!!'1QaSBA0S!!)!!!d#+`!"E`!!!!!
 | 
			
		||||
!!2k8#rk8!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J#!LN!!J)[!M!0!Lm!!dN!!J4
 | 
			
		||||
f"+$qNrk5!M%+rT-!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@aX!Ik5!!!'!M%
 | 
			
		||||
!!rk4!M)#-`VqN3!%#QY[Bf`0!M)!!@d!!!4k"(hqN!!+rT!!!!3+B@aTB3B#-`!
 | 
			
		||||
$rSm#0!)e#[k2!!3+D@jcD!d#0!!#0!!!")!%L2k1!MB+rSi!"!TMCQpX$3)f!!&
 | 
			
		||||
[!!!%K!5(rSd,rSd!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP0
 | 
			
		||||
66%PZBfaeC'9'EfaNCA*3BA4S"J)e!!2qM!)hrSX+rS`!"!TdEb!J$3)h!!*Z!!!
 | 
			
		||||
%L`5D!MJ#13d#1!!#0!!!"*-%Q[k+!MS+rSS!"!TQD@aP$3)k!!&Y!!!%PJ5C!MX
 | 
			
		||||
-!MX!$3!(E'KKFfJZD!!#!!!0!MN!!M3!!!5,"*2qL3)m#[k*!!3+BfC[E!d#2!!
 | 
			
		||||
"E`!!")m%N[k)#rk)!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J'rSX!!!)#-!!#!Md
 | 
			
		||||
#2Jd#23!#E!!#"+%%SIk(rSB"rSF!!!(qKJ!!!J)q!!)#2`*!$3)r!!*b!!!%S35
 | 
			
		||||
X!N%#3Jd#33!#BJ!!"+%%U!*$!N30!N-!!@m!!!5K"+6qK3[qK3!N-!!3Bh*jF(4
 | 
			
		||||
[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD!d#4!!"E3!!"+3%T`*&$!*&!!S
 | 
			
		||||
!"$TYC$)!!J!!$3*#!!&[!!!!!!!!rS3,rS3!&$!!#(4PEA"`BA4S!!KdC@e`8'&
 | 
			
		||||
dD!)#3!!#!NB#4`d#4J!$53!#"+d%erk$rS)#5!VqJ`!B,Q0[FQ9MFQ9X+LSU+J!
 | 
			
		||||
!!!!!!*!!!'jeE'`"rS)!!!B#5!!$rS%#53*+#[k"!!3+DfpME!d#53!"E3!!",%
 | 
			
		||||
%Y2k!#[k!!!3+B@aTB3B#5J!$rRm#5`*-#[jr!!3+D@jcD!d#5`!#0!!!",F%[rj
 | 
			
		||||
q!Nd+rRi!"!TMCQpX$3*0!!&[!!!%Z`5qrRd,rRd!0$!!''p`C@jcFfaTEQ0XG@4
 | 
			
		||||
PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J*-!!2qI!*1rRX
 | 
			
		||||
+rR`!"!TdEb!J$3*1!!*Z!!!%`J64!Nm#8!d#6`!#0!!!"-S%dIjk!P%+rRS!"!T
 | 
			
		||||
QD@aP$3*4!!&Y!!!%c363!P)-!P)!#`!&E@3b,QJ!!J!!$3*3!!)d!!!%`J6+rRN
 | 
			
		||||
#8`VqH3!%#Q0QEf`0!P-!!@m!!!6'"-RqH![qH!!8-!!)G'9YF("KG'J!#(4PEA"
 | 
			
		||||
3BA4S"[jl!!!#!NF!!J*8!P80!P3!!Q`!!J6B"0MqGrjf!Ijh!!!"rRB!!!)#93!
 | 
			
		||||
#!PB#9`d#9J!#FJ!!"0J%i`*B!PN0!PJ!!Q)!!!6B"0m#@J*E$3*D!!&[!!!%f!6
 | 
			
		||||
ErR8,rR8!*$!!%'0bHA"dEfC[E'4PFR"KG'J!%'0bHA"dEdC[E'4PFP"KG'J0!PX
 | 
			
		||||
!!@d!!!6E"0i#A!`#A!!+!!3kE@3e!!)!!!d#@3!"E`!!!!!!!2jd#rjd!"3`!!K
 | 
			
		||||
dC@e`F'&dD!!)G'9YF&"KG'J#!PF!!J*G!Pi0!Pd!!dN!!J6N"3lqFrjb!Pm+rR-
 | 
			
		||||
!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@aX!Ijb!!!'!Pm!!rja!Q!#B3VqF3!
 | 
			
		||||
%#QY[Bf`0!Q!!!@d!!!6S"1[qF!VqF!!%#Q&XD@%'!Q%!!rj[!Q)#B`VqE`!%#QP
 | 
			
		||||
ZFfJ0!Q)!!M3!!!6Z"2EqEJ*N#[jZ!!3+BfC[E!d#C!!"E`!!"2)%pIjY#rjY!$3
 | 
			
		||||
`!"K[F'9ZFh0XD@jME(9NC@C[E'4PFR"KG'J!''p`C@j68da*EQ0XG@4P4QpXC'9
 | 
			
		||||
b8'&dD!B#B`!$rQ`#CIjV#[jX!!3+G'mJ)!d#C3!#EJ!!"2N&#!*Q!QF0!QB!!M3
 | 
			
		||||
!!!8""3MqDJ*S#[jU!!3+CQPXC3d#D!!"E3!!"33&"`*T$!*T!!X!"@eN05jS!!)
 | 
			
		||||
!!!d#C`!#0!!!"2N&!IjT!QS+rQN!"!TMCQpX$3*U!!&[!!!%r38!rQJ,rQJ!&$!
 | 
			
		||||
!#(4PEA"`BA4S!!KdC@e`8'&dD!EqD`!!!J*H!!)#D`*X$3*V!!*X!!)&$`82rQI
 | 
			
		||||
qCJ(qC`!!!IjQ!!!#!Q`!!J*Y!Qi0!Qd!!R)!!!82"4S#E`*`$3*[!!*L!!!&$`8
 | 
			
		||||
@!R%#FJd#F3!"E`!!"3m&%[jP#rjP!#3`!""MFRP`G'pQEfaNCA*`BA4S!""MFRP
 | 
			
		||||
`G'p'EfaNCA*3BA4S$3*b!!&Y!!!&%J89!R--!R-!#`!&1QeNBc)!!J!!$3*`!!&
 | 
			
		||||
[!!!!!!!!rQ3,rQ3!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!)#EJ!#!R3#G3d#G!!
 | 
			
		||||
$53!#"4X&4IjMrQ)#GJVqB`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"rQ)
 | 
			
		||||
!!!B#GJ!$rQ%#G`*i#[jK!!3+DfpME!d#G`!"E3!!"4m&)[jJ#[jJ!!3+B@aTB3B
 | 
			
		||||
#H!!$rPm#H3*k#[jI!!3+D@jcD!d#H3!#0!!!"58&,IjH!RX+rPi!"!TMCQpX$3*
 | 
			
		||||
l!!&[!!!&+38XrPd,rPd!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"
 | 
			
		||||
PEP066%PZBfaeC'9'EfaNCA*3BA4S"J*k!!2qA!*mrPX+rP`!"!TdEb!J$3*m!!*
 | 
			
		||||
Z!!!&-!8r!Rd#IJd#I3!#0!!!"6J&2rjD!Rm+rPS!"!TQD@aP$3*r!!&Y!!!&1`8
 | 
			
		||||
q!S!-!S!!$!!'E@4M-LjS!!)!!!d#IJ!#0!!!"6!&12jC!S%+rPN!"!TMCQpX$3+
 | 
			
		||||
"!!&[!!!&0!8hrPJ,rPJ!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!Eq@`!!!J*e!!)
 | 
			
		||||
#JJ+$$3+#!!*X!!)&4J9'rPIq9J(q9`!!!Ij@!!!#!S-!!J+%!S80!S3!!R)!!!9
 | 
			
		||||
'"9%#KJ+($3+'!!*L!!!&4J90!SJ#L3d#L!!"E`!!"8B&5Ij9#rj9!#3`!""MFRP
 | 
			
		||||
`G'pQEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S$3+*!!&Y!!!&539-!SS-!SS
 | 
			
		||||
!$J!)1QpLDQ9MG(-!!J!!$3+(!!&[!!!!!!!!rP3,rP3!&$!!#(4PEA"`BA4S!!K
 | 
			
		||||
dC@e`8'&dD!)#K3!#!SX#M!d#L`!$53!#"9)&I2j6rP)#M3Vq8`!B,Q0[FQ9MFQ9
 | 
			
		||||
X+LSU+J!!!!!!!*!!!'jeE'`"rP)!!!B#M3!$rP%#MJ+2#[j4!!3+DfpME!d#MJ!
 | 
			
		||||
"E3!!"9B&@Ij3#[j3!!3+B@aTB3B#M`!$rNm#N!!#N3Vq6`!%#QPZFfJ0!T!!!!)
 | 
			
		||||
d!!!&A!9NrNi#NJVq6J!%#Q0QEf`0!T)!!@m!!!9J"@2q63[q63!d-!!BEh"PER0
 | 
			
		||||
cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'!T%
 | 
			
		||||
!!rj-!T2q5`Vq6!!%#R4[)#!0!T-!!Qi!!!9R"AB#P!+9$3+8!!)d!!!&E`9frNS
 | 
			
		||||
#PJVq5J!%#QCTE'80!TB!!@d!!!9b"A8#P``#P`!2!!P[BQTPBh4c,QJ!!J!!$3+
 | 
			
		||||
9!!)d!!!&C`9[rNN#Q!Vq53!%#Q0QEf`0!TJ!!@m!!!9V"@lq5![q5!!8-!!)G'9
 | 
			
		||||
YF("KG'J!#(4PEA"3BA4S"[j,!!!#!S`!!J+C!TS0!TN!!Q`!!J9p"Ahq4rj'!Ij
 | 
			
		||||
(!!!"rNB!!!)#QJ!#!TX#R!d#Q`!#FJ!!"Ad&L!+G!Ti0!Td!!Q)!!!9p"B3#R`+
 | 
			
		||||
J$3+I!!&[!!!&I3@!rN8,rN8!*$!!%'0bHA"dEfC[E'4PFR"KG'J!%'0bHA"dEdC
 | 
			
		||||
[E'4PFP"KG'J0!U!!!@d!!!@!"B-#S3`#S3!+!!3kF'9Y!!)!!!d#RJ!"E`!!!!!
 | 
			
		||||
!!2j%#rj%!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J#!T`!!J+L!U-0!U)!!dN!!J@
 | 
			
		||||
*"E2q3rj#!U3+rN-!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@aX!Ij#!!!'!U3
 | 
			
		||||
!!rj"!U8#TJVq33!%#QY[Bf`0!U8!!@d!!!@0"C!!rN!+rN!!"!TKE'PK"J+Q!!2
 | 
			
		||||
q2`+R!UJ+rMm!"!TTER0S$3+R!!)d!!!&N`@ErMi#U3Vq2J!%#Q0QEf`0!UN!!@m
 | 
			
		||||
!!!@A"CVq23[q23!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0
 | 
			
		||||
-5@jME(9NC8C[E'4PFP"KG'J'!UJ!!rim!UVq1`Vq2!!%#R4[)#!0!US!!Qi!!!@
 | 
			
		||||
H"Dd#U`+X$3+V!!)d!!!&TJ@YrMS#V3Vq1J!%#QCTE'80!Ud!!@d!!!@T"D`#VJ`
 | 
			
		||||
#VJ!,!!9`C@dZD!!#!!!0!U`!!M3!!!@H"DEq13+[#[ij!!3+BfC[E!d#V`!"E`!
 | 
			
		||||
!"D)&TIii#rii!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J'rMX!!!)#S`!#!V!#X3d
 | 
			
		||||
#X!!$53!#"E3&h[ihrMB#XJVq0`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`
 | 
			
		||||
"rMB!!!B#XJ!$rM8#X`+d#[ie!!3+DfpME!d#X`!"E3!!"EJ&Zrid#[id!!3+B@a
 | 
			
		||||
TB3B#Y!!$rM-#Y3+f#[ic!!3+D@jcD!d#Y3!#0!!!"Ei&a[ib!VF+rM)!"!TMCQp
 | 
			
		||||
X$3+h!!&[!!!&`JA&rM%,rM%!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!
 | 
			
		||||
BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J+f!!2q-!+irLm+rM!!"!TdEb!J$3+
 | 
			
		||||
i!!*Z!!!&b3AB!VN#ZJd#Z3!#0!!!"G%&f2iZ!VX+rLi!"!TQD@aP$3+l!!&Y!!!
 | 
			
		||||
&e!AA!V`-!V`!$!!'F'9Y-LjS!!)!!!d#ZJ!#0!!!"FN&dIiY!Vd+rLd!"!TMCQp
 | 
			
		||||
X$3+p!!&[!!!&c3A3rL`,rL`!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!Eq,`!!!J+
 | 
			
		||||
a!!)#[J+r$3+q!!*X!!)&h`AIrL[q+J(q+`!!!IiU!!!#!Vm!!J,!!X%0!X!!!R)
 | 
			
		||||
!!!AI"HS#`J,$$3,#!!*L!!!&h`AQ!X3#a3d#a!!"E`!!"Gm&i[iT#riT!#3`!""
 | 
			
		||||
MFRP`G'pQEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S$3,&!!&Y!!!&iJAP!XB
 | 
			
		||||
-!XB!$3!(1R"VBh-a-J!#!!!0!X-!!@m!!!!!!!$q+![q+!!8-!!)G'9YF("KG'J
 | 
			
		||||
!#(4PEA"3BA4S!J,"!!)#a`,)$3,(!!0*!!)&k`B9rLIq*J,*#[iR!"JZBfpbC@0
 | 
			
		||||
bC@`U+LSU!!!!!!!!N!!!ER9XE!(q*J!!"J,*!!2q*3,+!XX+rL8!"!TVEf0X$3,
 | 
			
		||||
+!!&Y!!!&l`AbrL3+rL3!"!TKE'PK"J,,!!2q)`,-!Xd+rL-!"!TTER0S$3,-!!)
 | 
			
		||||
d!!!&p3AprL)#cJVq)J!%#Q0QEf`0!Xi!!@m!!!Aj"Icq)3[q)3!d-!!BEh"PER0
 | 
			
		||||
cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'!Xd
 | 
			
		||||
!!riJ!Xrq(`Vq)!!%#R4[)#!0!Xm!!Qi!!!B!"Jm#d!,4$3,3!!)d!!!'#!B2rKi
 | 
			
		||||
#dJVq(J!%#QCTE'80!Y)!!@d!!!B,"Ji#d``#d`!1!!K`Df0c-6)ZD!!#!!!0!Y%
 | 
			
		||||
!!M3!!!B!"JMq(3,8#[iG!!3+BfC[E!d#e!!"E`!!"J3'"riF#riF!"3`!!KdC@e
 | 
			
		||||
`F'&dD!!)G'9YF&"KG'J'rKm!!!)#b!!#!Y8#eJd#e3!#E!!#"KB'&[iErKS"rKX
 | 
			
		||||
!!!(q'J!!!J,@!!)#e`,B$3,A!!*b!!!'&JBK!YN#fJd#f3!#BJ!!"KB'(3,E!Y`
 | 
			
		||||
0!YX!!@m!!!B@"KRq'3[q'3!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4Qp
 | 
			
		||||
XC'9b8'&dD!d#h!!"E3!!"KN'(!,G$!,G!!`!"MT`Df0c0`!#!!!0!YS!!@m!!!!
 | 
			
		||||
!!!$q'![q'!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S!J,B!!)#hJ,I$3,H!!0*!!)
 | 
			
		||||
')JC-rKIq&J,J#[iA!"JZBfpbC@0bC@`U+LSU!!!!!!!!N!!!ER9XE!(q&J!!"J,
 | 
			
		||||
J!!2q&3,K!Z)+rK8!"!TVEf0X$3,K!!&Y!!!'*JBTrK3+rK3!"!TKE'PK"J,L!!2
 | 
			
		||||
q%`,M!Z3+rK-!"!TTER0S$3,M!!)d!!!',!BdrK)#j3Vq%J!%#Q0QEf`0!Z8!!@m
 | 
			
		||||
!!!B`"M2q%3[q%3!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0
 | 
			
		||||
-5@jME(9NC8C[E'4PFP"KG'J'!Z3!!ri3!ZEq$`Vq%!!%#R4[)#!0!ZB!!Qi!!!B
 | 
			
		||||
h"NB#j`,S$3,R!!)d!!!'2`C'rJi#k3Vq$J!%#QCTE'80!ZN!!@d!!!C#"N8#kJ`
 | 
			
		||||
#kJ!0!!G`Df0c0bjS!!)!!!d#k!!#0!!!"MF'2ri0!ZX+rJd!"!TMCQpX$3,V!!&
 | 
			
		||||
[!!!'1`BqrJ`,rJ`!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!Eq$`!!!J,I!!)#l!,
 | 
			
		||||
Y$3,X!!*X!!)'63C0rJ[q#J(q#`!!!Ii+!!!#!Zd!!J,Z!Zm0!Zi!!R)!!!C0"PJ
 | 
			
		||||
#m!,a$3,`!!*L!!!'63C8![)#m`d#mJ!"E`!!"Nd'82i*#ri*!#3`!""MFRP`G'p
 | 
			
		||||
QEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S$3,c!!&Y!!!'8!C6![3-![3!#`!
 | 
			
		||||
&1R*KEQ3!!J!!$3,a!!&[!!!!!!!!rJJ,rJJ!&$!!#(4PEA"`BA4S!!KdC@e`8'&
 | 
			
		||||
dD!)#l`!#![8#pJd#p3!$53!#"PN'Jri(rJB#p`Vq"`!B,Q0[FQ9MFQ9X+LSU+J!
 | 
			
		||||
!!!!!!*!!!'jeE'`"rJB!!!B#p`!$rJ8#q!,j#[i&!!3+DfpME!d#q!!"E3!!"Pd
 | 
			
		||||
'B2i%#[i%!!3+B@aTB3B#q3!$rJ-#qJ,l#[i$!!3+D@jcD!d#qJ!#0!!!"Q-'Dri
 | 
			
		||||
#![`+rJ)!"!TMCQpX$3,m!!&[!!!'C`CUrJ%,rJ%!0$!!''p`C@jcFfaTEQ0XG@4
 | 
			
		||||
PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J,l!!2q!!,prIm
 | 
			
		||||
+rJ!!"!TdEb!J$3,p!!*Z!!!'EJCp![i#r`d#rJ!#0!!!"RB'IIhq!`!+rIi!"!T
 | 
			
		||||
QD@aP$3-!!!&Y!!!'H3Cm!`%-!`%!$!!'FQ&ZC#jS!!)!!!d#r`!#0!!!"Qi'G[h
 | 
			
		||||
p!`)+rId!"!TMCQpX$3-#!!&[!!!'FJCerI`,rI`!&$!!#(4PEA"`BA4S!!KdC@e
 | 
			
		||||
`8'&dD!Epr`!!!J,f!!)$!`-%$3-$!!*X!!)'K!D%rI[pqJ(pq`!!!Ihk!!!#!`3
 | 
			
		||||
!!J-&!`B0!`8!!R)!!!D%"Sm$"`-)$3-(!!*L!!!'K!D,!`N$#Jd$#3!"E`!!"S3
 | 
			
		||||
'Krhj#rhj!#3`!""MFRP`G'pQEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S$3-
 | 
			
		||||
+!!&Y!!!'K`D+!`X-!`X!#J!%1R*M-J!#!!!0!`J!!@m!!!!!!!$pq![pq!!8-!!
 | 
			
		||||
)G'9YF("KG'J!#(4PEA"3BA4S!J-'!!)$$!-0$3--!!0*!!)'N!!'Z[hhrIB$$JV
 | 
			
		||||
pp`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"rIB!!!B$$J!$rI8$$`-3#[h
 | 
			
		||||
e!!3+DfpME!d$$`!"E3!!"T3'Prhd#[hd!!3+B@aTB3B$%!!$rI-$%3-5#[hc!!3
 | 
			
		||||
+D@jcD!d$%3!#0!!!"TS'S[hb!a-+rI)!"!TMCQpX$3-6!!&[!!!'RJDKrI%,rI%
 | 
			
		||||
!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'Efa
 | 
			
		||||
NCA*3BA4S"J-5!!2pm!-8rHm+rI!!"!TdEb!J$3-8!!*Z!!!'T3Dd!a8$&Jd$&3!
 | 
			
		||||
#0!!!"Ud'Y2hZ!aF+rHi!"!TQD@aP$3-A!!&Y!!!'X!Dc!aJ-!aJ!#`!&FQ-b,QJ
 | 
			
		||||
!!J!!$3-@!!)d!!!'T3DYrHd$'3Vpl3!%#Q0QEf`0!aN!!@m!!!DT"Ucpl![pl!!
 | 
			
		||||
8-!!)G'9YF("KG'J!#(4PEA"3BA4S"[h[!!!#!`d!!J-D!aX0!aS!!Q`!!JDl"V[
 | 
			
		||||
pkrhU!IhV!!!"rHS!!!)$'`!#!a`$(3d$(!!#FJ!!"VX'aJ-H!am0!ai!!Q)!!!D
 | 
			
		||||
l"X)$)!-K$3-J!!&[!!!'Z`DqrHN,rHN!*$!!%'0bHA"dEfC[E'4PFR"KG'J!%'0
 | 
			
		||||
bHA"dEdC[E'4PFP"KG'J0!b%!!@d!!!Dq"X%$)J`$)J!+!!3kFQ-d!!)!!!d$(`!
 | 
			
		||||
"E`!!!!!!!2hS#rhS!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J#!ad!!J-M!b30!b-
 | 
			
		||||
!!dN!!JE("[(pjrhQ!b8+rHF!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"ZG@aX!Ih
 | 
			
		||||
Q!!!'!b8!!rhP!bB$*`Vpj3!%#QY[Bf`0!bB!!@d!!!E,"Xlpj!Vpj!!%#Q&XD@%
 | 
			
		||||
'!bF!!rhM!bJ$+3Vpi`!%#QPZFfJ0!bJ!!M3!!!E4"YRpiJ-U#[hL!!3+BfC[E!d
 | 
			
		||||
$+J!"E`!!"Y8'f2hK#rhK!$3`!"K[F'9ZFh0XD@jME(9NC@C[E'4PFR"KG'J!''p
 | 
			
		||||
`C@j68da*EQ0XG@4P4QpXC'9b8'&dD!B$+3!$rH!$+rhI#[hJ!!3+G'mJ)!d$+`!
 | 
			
		||||
#EJ!!"Y`'k`-X!bd0!b`!!M3!!!EN"Z[phJ-Z#[hH!!3+CQPXC3d$,J!"E3!!"ZF
 | 
			
		||||
'kJ-[$!-[!!X!"A*M0#jS!!)!!!d$,3!#0!!!"Y`'j2hG!c!+rGd!"!TMCQpX$3-
 | 
			
		||||
`!!&[!!!'i!EMrG`,rG`!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!Eph`!!!J-N!!)
 | 
			
		||||
$-3-b$3-a!!*X!!)'mJEbrG[pfJ(pf`!!!IhD!!!#!c)!!J-c!c30!c-!!R)!!!E
 | 
			
		||||
b"[d$03-f$3-e!!*L!!!'mJEj!cF$1!d$0`!"E`!!"[)'pIhC#rhC!#3`!""MFRP
 | 
			
		||||
`G'pQEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S$3-i!!&Y!!!'p3Ei!cN-!cN
 | 
			
		||||
!#J!%1R*M03!#!!!0!cB!!@m!!!!!!!$pf![pf!!8-!!)G'9YF("KG'J!#(4PEA"
 | 
			
		||||
3BA4S!J-d!!)$1J-l$3-k!!0*!!)'rJFSrGIpeJ-m#[hA!"JZBfpbC@0bC@`U+LS
 | 
			
		||||
U!!!!!!!!N!!!ER9XE!(peJ!!"J-m!!2pe3-p!ci+rG8!"!TVEf0X$3-p!!&Y!!!
 | 
			
		||||
(!JF&rG3+rG3!"!TKE'PK"J-q!!2pd`-r!d!+rG-!"!TTER0S$3-r!!)d!!!(#!F
 | 
			
		||||
3rG)$33VpdJ!%#Q0QEf`0!d%!!@m!!!F-"`rpd3[pd3!d-!!BEh"PER0cE'PZBfa
 | 
			
		||||
eC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'!d!!!rh3!d,
 | 
			
		||||
pc`Vpd!!%#R4[)#!0!d)!!Qi!!!F6"b)$3`0%$30$!!)d!!!('`FLrFi$43VpcJ!
 | 
			
		||||
%#QCTE'80!d8!!@d!!!FH"b%$4J`$4J!,!!9bBc8ZD!!#!!!0!d3!!M3!!!F6"a[
 | 
			
		||||
pc30(#[h0!!3+BfC[E!d$4`!"E`!!"aF('[h-#rh-!"3`!!KdC@e`F'&dD!!)G'9
 | 
			
		||||
YF&"KG'J'rFm!!!)$1`!#!dJ$53d$5!!#E!!#"bN(+Ih,rFS"rFX!!!(pbJ!!!J0
 | 
			
		||||
*!!)$5J0,$30+!!*b!!!(+3Fd!d`$63d$6!!#BJ!!"bN(-!01!dm0!di!!@m!!!F
 | 
			
		||||
T"bcpb3[pb3!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD!d
 | 
			
		||||
$6`!"E3!!"b`(,`03$!03!!d!"cTbDA"PE@3!!J!!$300!!&[!!!!!!!!rFJ,rFJ
 | 
			
		||||
!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!)$5`!#!e%$8Jd$83!$53!#"c8(Arh(rFB
 | 
			
		||||
$8`Vpa`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"rFB!!!B$8`!$rF8$9!0
 | 
			
		||||
9#[h&!!3+DfpME!d$9!!"E3!!"cN(22h%#[h%!!3+B@aTB3B$93!$rF-$9J0A#[h
 | 
			
		||||
$!!3+D@jcD!d$9J!#0!!!"cm(4rh#!eJ+rF)!"!TMCQpX$30B!!&[!!!(3`G'rF%
 | 
			
		||||
,rF%!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9
 | 
			
		||||
'EfaNCA*3BA4S"J0A!!2p`!0CrEm+rF!!"!TdEb!J$30C!!*Z!!!(5JGC!eS$@`d
 | 
			
		||||
$@J!#0!!!"e)(@Ifq!e`+rEi!"!TQD@aP$30F!!&Y!!!(93GB!ed-!ed!$J!)FQP
 | 
			
		||||
`C@eN,QJ!!J!!$30E!!)d!!!(5JG5rEd$AJVp[3!%#Q0QEf`0!ei!!@m!!!G1"e(
 | 
			
		||||
p[![p[!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S"[fr!!!#!e)!!J0I!f!0!em!!Q`
 | 
			
		||||
!!JGJ"f$pZrfk!Ifl!!!"rES!!!)$B!!#!f%$BJd$B3!#FJ!!"f!(D`0M!f30!f-
 | 
			
		||||
!!Q)!!!GJ"fF$C30Q$30P!!&[!!!(B!GMrEN,rEN!*$!!%'0bHA"dEfC[E'4PFR"
 | 
			
		||||
KG'J!%'0bHA"dEdC[E'4PFP"KG'J0!fB!!@d!!!GM"fB$C``$C`!+!!3kFR0K!!)
 | 
			
		||||
!!!d$C!!"E`!!!!!!!2fi#rfi!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J#!f)!!J0
 | 
			
		||||
S!fN0!fJ!!dN!!JGX"jEpYrff!fS+rEF!'#jMEh*PBh*PE#SU+LS!!!!!!!#3!!"
 | 
			
		||||
ZG@aX!Iff!!!'!fS!!rfe!fX$E!VpY3!%#QY[Bf`0!fX!!@d!!!G`"h2pY!VpY!!
 | 
			
		||||
%#Q&XD@%'!f`!!rfc!fd$EJVpX`!%#QPZFfJ0!fd!!M3!!!Gf"hlpXJ0[#[fb!!3
 | 
			
		||||
+BfC[E!d$E`!"E`!!"hS(IIfa#rfa!$3`!"K[F'9ZFh0XD@jME(9NC@C[E'4PFR"
 | 
			
		||||
KG'J!''p`C@j68da*EQ0XG@4P4QpXC'9b8'&dD!B$EJ!$rE!$F2f[#[f`!!3+G'm
 | 
			
		||||
J)!d$F!!#EJ!!"i%(N!!$F30b$30a!!)d!!!(L3H3!2fZ!h-+rDi!"!TQD@aP$30
 | 
			
		||||
c!!&Y!!!(M!H2!h3-!h3!#`!&FR0K,QJ!!J!!$30b!!)d!!!(J3H*rDd$G3VpV3!
 | 
			
		||||
%#Q0QEf`0!h8!!@m!!!H&"iMpV![pV!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S"[f
 | 
			
		||||
[!!!#!fN!!J0f!hF0!hB!!Q`!!JHA"jIpUrfU!IfV!!!"rDS!!!)$G`!#!hJ$H3d
 | 
			
		||||
$H!!#FJ!!"jF(SJ0k!hX0!hS!!Q)!!!HA"ji$I!0p$30m!!&[!!!(P`HDrDN,rDN
 | 
			
		||||
!*$!!%'0bHA"dEfC[E'4PFR"KG'J!%'0bHA"dEdC[E'4PFP"KG'J0!hd!!@d!!!H
 | 
			
		||||
D"jd$IJ`$IJ!-!!BkFh4KBfX!!J!!$30l!!&[!!!!!!!!rDJ,rDJ!&$!!#(4PEA"
 | 
			
		||||
`BA4S!!KdC@e`8'&dD!)$H3!#!hm$J!d$I`!$53!#"k-(cIfRrDB$J3VpT`!B,Q0
 | 
			
		||||
[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"rDB!!!B$J3!$rD8$JJ1$#[fP!!3+Dfp
 | 
			
		||||
ME!d$JJ!"E3!!"kF(U[fN#[fN!!3+B@aTB3B$J`!$rD-$K!1&#[fM!!3+D@jcD!d
 | 
			
		||||
$K!!#0!!!"kd(YIfL!iB+rD)!"!TMCQpX$31'!!&[!!!(X3HdrD%,rD%!0$!!''p
 | 
			
		||||
`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4
 | 
			
		||||
S"J1&!!2pS!1(rCm+rD!!"!TdEb!J$31(!!*Z!!!(Z!I(!iJ$L3d$L!!#0!!!"m!
 | 
			
		||||
(arfH!iS+rCi!"!TQD@aP$31+!!&Y!!!(``I'!iX-!iX!$3!(Fh4KBfXZD!!#!!!
 | 
			
		||||
0!iN!!M3!!!Hi"m$pR31-#[fG!!3+BfC[E!d$M!!"E`!!"l`([rfF#rfF!"3`!!K
 | 
			
		||||
dC@e`F'&dD!!)G'9YF&"KG'J'rCm!!!)$J!!#!id$MJd$M3!$53!#"mi(q2fErCS
 | 
			
		||||
$M`VpQ`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"rCS!!!B$M`!$rCN$N!!
 | 
			
		||||
$N3VpQ3!%#QY[Bf`0!j!!!!&Y!!!(dJI9rCJ+rCJ!"!TKE'PK"J14!!2pP`15!j-
 | 
			
		||||
+rCF!"!TTER0S$315!!)d!!!(f!IJrCB$P!VpPJ!%#Q0QEf`0!j3!!@m!!!IF"pr
 | 
			
		||||
pP3[pP3!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9
 | 
			
		||||
NC8C[E'4PFP"KG'J'!j-!!rf8!jApN`VpP!!%#R4[)#!0!j8!!Qi!!!IM"r)$PJ1
 | 
			
		||||
A$31@!!)d!!!(k`IbrC)$Q!VpNJ!%#QCTE'80!jJ!!@d!!!IZ"r%$Q3`$Q3!4!!Y
 | 
			
		||||
cB@CPFh4KBfXZD!!#!!!0!jF!!M3!!!IM"q[pN31D#[f4!!3+BfC[E!d$QJ!"E`!
 | 
			
		||||
!"qF(k[f3!![pN!!!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!EpN`!!!J11!!)$Q`1
 | 
			
		||||
F$31E!!*X!!)(q3IjrBrpMJ(pM`!!!If1!!!#!j`!!J1G!ji0!jd!!R)!!!Ij#!3
 | 
			
		||||
$R`1J$31I!!*L!!!(q3J!!k%$SJd$S3!"E`!!"rN(r2f0#rf0!#3`!""MFRP`G'p
 | 
			
		||||
QEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S$31L!!&Y!!!(r!Ir!k--!k-!#J!
 | 
			
		||||
%1R0SB3!#!!!0!k!!!@m!!!!!!!$pM![pM!!8-!!)G'9YF("KG'J!#(4PEA"3BA4
 | 
			
		||||
S!J1H!!)$T!1P$31N!!0*!!))"3J[rB[pLJ1Q#[f,!"JZBfpbC@0bC@`U+LSU!!!
 | 
			
		||||
!!!!!N!!!ER9XE!(pLJ!!"J1Q!!2pL31R!kJ+rBN!"!TVEf0X$31R!!&Y!!!)#3J
 | 
			
		||||
-rBJ+rBJ!"!TKE'PK"J1S!!2pK`1T!kS+rBF!"!TTER0S$31T!!)d!!!)$`JArBB
 | 
			
		||||
$U`VpKJ!%#Q0QEf`0!kX!!@m!!!J6#"EpK3[pK3!d-!!BEh"PER0cE'PZBfaeC'9
 | 
			
		||||
QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'!kS!!rf%!kcpJ`V
 | 
			
		||||
pK!!%#R4[)#!0!k`!!Qi!!!JD##N$V31Z$31Y!!)d!!!))JJTrB)$V`VpJJ!%#QC
 | 
			
		||||
TE'80!km!!@d!!!JP##J$X!`$X!!,!!9cD'%ZD!!#!!!0!ki!!M3!!!JD##,pJ31
 | 
			
		||||
a#[f"!!3+BfC[E!d$X3!"E`!!#"i))If!#rf!!"3`!!KdC@e`F'&dD!!)G'9YF&"
 | 
			
		||||
KG'J'rB-!!!)$T3!#!l)$X`d$XJ!#E!!##$!)-2errAi"rAm!!!(pIJ!!!J1c!!)
 | 
			
		||||
$Y!1e$31d!!*b!!!)-!Jl!lB$Y`d$YJ!#BJ!!#$!)0`1i!lN0!lJ!!@m!!!J`#$2
 | 
			
		||||
pI3[pI3!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD!d$Z3!
 | 
			
		||||
"E3!!#$-)0J1k$!1k!!d!"cTdH(4IC')!!J!!$31h!!&[!!!!!!!!rA`,rA`!&$!
 | 
			
		||||
!#(4PEA"`BA4S!!KdC@e`8'&dD!)$Y3!#!lX$[!d$Z`!$53!##$`)C[elrAS$[3V
 | 
			
		||||
pH`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"rAS!!!B$[3!$rAN$[J1r#[e
 | 
			
		||||
j!!3+DfpME!d$[J!"E3!!#%!)3rei#[ei!!3+B@aTB3B$[`!$rAF$`!2"#[eh!!3
 | 
			
		||||
+D@jcD!d$`!!#0!!!#%B)6[ef!m)+rAB!"!TMCQpX$32#!!&[!!!)5JK0rA8,rA8
 | 
			
		||||
!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'Efa
 | 
			
		||||
NCA*3BA4S"J2"!!2pG!2$rA-+rA3!"!TdEb!J$32$!!*Z!!!)83KJ!m3$a3d$a!!
 | 
			
		||||
#0!!!#&N)B2eb!mB+rA)!"!TQD@aP$32'!!&Y!!!)A!KI!mF-!mF!$J!)G(KdAf4
 | 
			
		||||
L,QJ!!J!!$32&!!)d!!!)83KCrA%$b!VpF3!%#Q0QEf`0!mJ!!@m!!!K9#&MpF![
 | 
			
		||||
pF!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S"[ec!!!#!l`!!J2*!mS0!mN!!Q`!!JK
 | 
			
		||||
R#'IpEreZ!Ie[!!!"r@i!!!)$bJ!#!mX$c!d$b`!#FJ!!#'F)FJ20!mi0!md!!Q)
 | 
			
		||||
!!!KR#'i$c`23$322!!&[!!!)C`KUr@d,r@d!*$!!%'0bHA"dEfC[E'4PFR"KG'J
 | 
			
		||||
!%'0bHA"dEdC[E'4PFP"KG'J0!p!!!@d!!!KU#'d$d3`$d3!,!!8kH$8`13!#!!!
 | 
			
		||||
0!mi!!@m!!!!!!!$pE![pE!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S!J2-!!)$dJ2
 | 
			
		||||
6$325!!0*!!))F`LGr@[pDJ28#[eV!"JZBfpbC@0bC@`U+LSU!!!!!!!!N!!!ER9
 | 
			
		||||
XE!(pDJ!!"J28!!2pD329!pB+r@N!"!TVEf0X$329!!&Y!!!)G`Kkr@J+r@J!"!T
 | 
			
		||||
KE'PK"J2@!!2pC`2A!pJ+r@F!"!TTER0S$32A!!)d!!!)I3L&r@B$f3VpCJ!%#Q0
 | 
			
		||||
QEf`0!pN!!@m!!!L"#)6pC3[pC3!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4
 | 
			
		||||
S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'!pJ!!reN!pVpB`VpC!!%#R4[)#!
 | 
			
		||||
0!pS!!Qi!!!L)#*F$f`2F$32E!!)d!!!)N!!)PreL!pd+r@)!"!TQD@aP$32G!!&
 | 
			
		||||
Y!!!)N`L@!pi-!pi!$!!'H$8`15jS!!)!!!d$h!!#0!!!#)J)N!$pB32I#[eK!!3
 | 
			
		||||
+BfC[E!d$h`!"E`!!#)`)MreJ#reJ!"3`!!KdC@e`F'&dD!!)G'9YF&"KG'J'r@-
 | 
			
		||||
!!!)$d`!#!q!$i3d$i!!$53!##*i)b2eIr9i$iJVpA`!B,Q0[FQ9MFQ9X+LSU+J!
 | 
			
		||||
!!!!!!*!!!'jeE'`"r9i!!!B$iJ!$r9d$i`2N#[eG!!3+DfpME!d$i`!"E3!!#+)
 | 
			
		||||
)TIeF#[eF!!3+B@aTB3B$j!!$r9X$j32Q#[eE!!3+D@jcD!d$j3!#0!!!#+J)X2e
 | 
			
		||||
D!qF+r9S!"!TMCQpX$32R!!&[!!!)V!L[r9N,r9N!0$!!''p`C@jcFfaTEQ0XG@4
 | 
			
		||||
PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J2Q!!2p@!2Sr9F
 | 
			
		||||
+r9J!"!TdEb!J$32S!!*Z!!!)X`M#!qN$kJd$k3!#0!!!#,X)`[e@!qX+r9B!"!T
 | 
			
		||||
QD@aP$32V!!&Y!!!)[JM"!q`-!q`!%!!+H$8`19pfCRNZD!!#!!!0!qS!!M3!!!L
 | 
			
		||||
c#,[p932Y#[e9!!3+BfC[E!d$l3!"E`!!#,F)Z[e8#re8!"3`!!KdC@e`F'&dD!!
 | 
			
		||||
)G'9YF&"KG'J'r9F!!!)$i3!#!qi$l`d$lJ!#E!!##-N)bIe6r9)"r9-!!!(p8J!
 | 
			
		||||
!!J2[!!)$m!2a$32`!!*b!!!)b3M8!r)$m`d$mJ!#BJ!!#-N)d!2d!r80!r3!!@m
 | 
			
		||||
!!!M*#-cp83[p83!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&
 | 
			
		||||
dD!d$p3!"E3!!#-`)c`2f$!2f!!d!"cTi06!jGM-!!J!!$32c!!&[!!!!!!!!r9!
 | 
			
		||||
,r9!!&$!!#(4PEA"`BA4S!!KdC@e`8'&dD!)$m3!#!rF$q!d$p`!$53!##08)rre
 | 
			
		||||
2r8i$q3Vp6`!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"r8i!!!B$q3!$r8d
 | 
			
		||||
$qJ2l#[e0!!3+DfpME!d$qJ!"E3!!#0N)h2e-#[e-!!3+B@aTB3B$q`!$r8X$r!2
 | 
			
		||||
p#[e,!!3+D@jcD!d$r!!#0!!!#0m)jre+!ri+r8S!"!TMCQpX$32q!!&[!!!)i`M
 | 
			
		||||
Qr8N,r8N!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfa
 | 
			
		||||
eC'9'EfaNCA*3BA4S"J2p!!2p5!2rr8F+r8J!"!TdEb!J$32r!!*Z!!!)kJMj"!!
 | 
			
		||||
%!3d%!!!#0!!!#2))qIe'"!)+r8B!"!TQD@aP$33#!!&Y!!!)p3Mi"!--"!-!$J!
 | 
			
		||||
)H$8`1ABc,QJ!!J!!$33"!!)d!!!)kJMbr88%"!Vp43!%#Q0QEf`0"!3!!@m!!!M
 | 
			
		||||
Z#2(p4![p4!!8-!!)G'9YF("KG'J!#(4PEA"3BA4S"[e(!!!#!rJ!!J3&"!B0"!8
 | 
			
		||||
!!Q`!!JN!#3$p3re#!Ie$!!!"r8)!!!)%"J!#"!F%#!d%"`!$53!##3!*+[e"r8!
 | 
			
		||||
%#3Vp33!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"r8!!!!B%#3!$r6m%#J3
 | 
			
		||||
,#[dr!!3+DfpME!d%#J!"E3!!#33*"rdq#[dq!!3+B@aTB3B%#`!$r6d%$!30#[d
 | 
			
		||||
p!!3+D@jcD!d%$!!#0!!!#3S*%[dm"!i+r6`!"!TMCQpX$331!!&[!!!*$JN4r6X
 | 
			
		||||
,r6X!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9
 | 
			
		||||
'EfaNCA*3BA4S"J30!!2p1J32r6N+r6S!"!TdEb!J$332!!*Z!!!*&3NN""!%%3d
 | 
			
		||||
%%!!#0!!!#4d**2di"")+r6J!"!TQD@aP$335!!&Y!!!*)!NM""--""-!#`!&Fh0
 | 
			
		||||
X,QJ!!J!!$334!!)d!!!*&3NGr6F%&!Vp0`!%#Q0QEf`0""3!!@m!!!NC#4cp0J[
 | 
			
		||||
p0J!H-!!0Fh0XCQpXC'9bF'&dD!!0Fh0X4QpXC'9b8'&dD!Ep13!!!J3)!!)%&33
 | 
			
		||||
@$339!!0*!!)*+`P9r6Ap0!3A#[de!"JZBfpbC@0bC@`U+LSU!!!!!!!!N!!!ER9
 | 
			
		||||
XE!(p0!!!"J3A!!2p-`3B""N+r6-!"!TVEf0X$33B!!&Y!!!*,`Nbr6)+r6)!"!T
 | 
			
		||||
KE'PK"J3C!!2p-33D""X+r6%!"!TTER0S$33D!!)d!!!*03Npr6!%(!Vp-!!%#Q0
 | 
			
		||||
QEf`0""`!!@m!!!Nj#6cp,`[p,`!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4
 | 
			
		||||
S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'""X!!rdZ""hp,3Vp,J!%#R4[)#!
 | 
			
		||||
0""d!!Qi!!!P!#8m%(J3I$33H!!)d!!!*5!P2r5`%)!Vp,!!%#QCTE'80"#!!!@d
 | 
			
		||||
!!!P,#8i%)3`%)3!-!!CcFf`b,QJ!!J!!$33I!!)d!!!*3!P)r5X%)JVp+`!%#Q0
 | 
			
		||||
QEf`0"#)!!@m!!!P%#8Ip+J[p+J!H-!!0Fh0XCQpXC'9bF'&dD!!0Fh0X4QpXC'9
 | 
			
		||||
b8'&dD!Ep,3!!!J3@!!)%)`3N$33M!!0*!!)*9JQ!r5Rp+!3P#[dT!"JZBfpbC@0
 | 
			
		||||
bC@`U+LSU!!!!!!!!N!!!ER9XE!(p+!!!"J3P!!2p*`3Q"#F+r5F!"!TVEf0X$33
 | 
			
		||||
Q!!&Y!!!*@JPGr5B+r5B!"!TKE'PK"J3R!!2p*33S"#N+r58!"!TTER0S$33S!!)
 | 
			
		||||
d!!!*B!PSr53%+JVp*!!%#Q0QEf`0"#S!!@m!!!PN#@Ip)`[p)`!d-!!BEh"PER0
 | 
			
		||||
cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'"#N
 | 
			
		||||
!!rdL"#[p)3Vp)J!%#R4[)#!0"#X!!Qi!!!PV#AS%,!3Y$33X!!)d!!!*F`Pkr5!
 | 
			
		||||
%,JVp)!!%#QCTE'80"#i!!@d!!!Pf#AN%,``%,`!0!!GcFf`b-bjS!!)!!!d%,3!
 | 
			
		||||
#0!!!#@X*FrdI"$!+r4m!"!TMCQpX$33`!!&[!!!*E`Pbr4i,r4i!(M!!$A0cE'C
 | 
			
		||||
[E'4PFR"KG'J!$A0cE%C[E'4PFP"KG'J'r5%!!!)%*!!#"$%%-Jd%-3!$53!##B%
 | 
			
		||||
*UrdGr4`%-`Vp(3!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"r4`!!!B%-`!
 | 
			
		||||
$r4X%0!3e#[dE!!3+DfpME!d%0!!"E3!!#B8*L2dD#[dD!!3+B@aTB3B%03!$r4N
 | 
			
		||||
%0J3h#[dC!!3+D@jcD!d%0J!#0!!!#BX*NrdB"$J+r4J!"!TMCQpX$33i!!&[!!!
 | 
			
		||||
*M`Q5r4F,r4F!0$!!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%P
 | 
			
		||||
ZBfaeC'9'EfaNCA*3BA4S"J3h!!2p&J3jr48+r4B!"!TdEb!J$33j!!*Z!!!*PJQ
 | 
			
		||||
P"$S%1`d%1J!#0!!!#Ci*TId8"$`+r43!"!TQD@aP$33m!!&Y!!!*S3QN"$d-"$d
 | 
			
		||||
!$!!'Fh0X-bjS!!)!!!d%1`!#0!!!#CB*R[d6"$i+r4-!"!TMCQpX$33q!!&[!!!
 | 
			
		||||
*QJQGr4),r4)!(M!!$A0cE'C[E'4PFR"KG'J!$A0cE%C[E'4PFP"KG'J'r48!!!)
 | 
			
		||||
%-J!#"$m%3!d%2`!$53!##D`*e[d4r4!%33Vp%3!B,Q0[FQ9MFQ9X+LSU+J!!!!!
 | 
			
		||||
!!*!!!'jeE'`"r4!!!!B%33!$r3m%3J4$#[d2!!3+DfpME!d%3J!"E3!!#E!*Xrd
 | 
			
		||||
1#[d1!!3+B@aTB3B%3`!$r3d%4!4&#[d0!!3+D@jcD!d%4!!#0!!!#EB*[[d-"%B
 | 
			
		||||
+r3`!"!TMCQpX$34'!!&[!!!*ZJQpr3X,r3X!0$!!''p`C@jcFfaTEQ0XG@4PCQp
 | 
			
		||||
XC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*3BA4S"J4&!!2p#J4(r3N+r3S
 | 
			
		||||
!"!TdEb!J$34(!!*Z!!!*`3R3"%J%53d%5!!#0!!!#FN*d2d)"%S+r3J!"!TQD@a
 | 
			
		||||
P$34+!!&Y!!!*c!R2"%X-"%X!$!!'G'ac-5jS!!)!!!d%53!#0!!!#F%*bId("%`
 | 
			
		||||
+r3F!"!TMCQpX$34-!!&[!!!*a3R)r3B,r3B!(M!!$A0cE'C[E'4PFR"KG'J!$A0
 | 
			
		||||
cE%C[E'4PFP"KG'J'r3N!!!)%3!!#"%d%6Jd%63!#E!!##GF*erd&r33"r38!!!(
 | 
			
		||||
p"!!!!J41!!)%6`43$342!!0*!!)*e`S"r32p!J44#[d$!"JZBfpbC@0bC@`U+LS
 | 
			
		||||
U!!!!!!!!N!!!ER9XE!(p!J!!"J44!!2p!345"&-+r3%!"!TVEf0X$345!!&Y!!!
 | 
			
		||||
*f`RHr3!+r3!!"!TKE'PK"J46!!2mr`48"&8+r2m!"!TTER0S$348!!)d!!!*i3R
 | 
			
		||||
Tr2i%9JVmrJ!%#Q0QEf`0"&B!!@m!!!RP#HMmr3[mr3!d-!!BEh"PER0cE'PZBfa
 | 
			
		||||
eC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9NC8C[E'4PFP"KG'J'"&8!!rcm"&I
 | 
			
		||||
mq`Vmr!!%#R4[)#!0"&F!!Qi!!!RX#IX%@!4C$34B!!)d!!!*p!Rlr2S%@JVmqJ!
 | 
			
		||||
%#QCTE'80"&S!!@d!!!Rh#IS%@``%@`!1!!KMFRP`G'mZD!!#!!!0"&N!!M3!!!R
 | 
			
		||||
X#I6mq34F#[cj!!3+BfC[E!d%A!!"E`!!#I!*mrci#rci!#3`!""MFRP`G'pQEfa
 | 
			
		||||
NCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S"[cl!!!#"&!!!J4G"&i0"&d!!Q`!!JS
 | 
			
		||||
##J,mprcf!Ich!!!"r2B!!!)%AJ!#"&m%B!d%A`!$53!##J)+,2cer23%B3Vmp3!
 | 
			
		||||
B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"r23!!!B%B3!$r2-%BJ4M#[cc!!3
 | 
			
		||||
+DfpME!d%BJ!"E3!!#JB+#Icb#[cb!!3+B@aTB3B%B`!$r2%%C!4P#[ca!!3+D@j
 | 
			
		||||
cD!d%C!!#0!!!#J`+&2c`"'B+r2!!"!TMCQpX$34Q!!&[!!!+%!S6r1m,r1m!0$!
 | 
			
		||||
!''p`C@jcFfaTEQ0XG@4PCQpXC'9bF'&dD!!BEh"PEP066%PZBfaeC'9'EfaNCA*
 | 
			
		||||
3BA4S"J4P!!2mlJ4Rr1d+r1i!"!TdEb!J$34R!!*Z!!!+&`SQ"'J%D3d%D!!#0!!
 | 
			
		||||
!#Km+*[cX"'S+r1`!"!TQD@aP$34U!!&Y!!!+)JSP"'X-"'X!%!!+Eh"PER0cE(B
 | 
			
		||||
ZD!!#!!!0"'N!!M3!!!SA#Krmk`4X#[cV!!3+BfC[E!d%E!!"E`!!#KX+([cU#rc
 | 
			
		||||
U!#3`!""MFRP`G'pQEfaNCA*`BA4S!""MFRP`G'p'EfaNCA*3BA4S"[cY!!!#"'!
 | 
			
		||||
!!J4Y"'i0"'d!!dN!!JSY#PImkIcS"'m+r1N!'#jMEh*PBh*PE#SU+LS!!!!!!!#
 | 
			
		||||
3!!"ZG@aX!IcS!!!'"'m!!rcR"(!%F3Vmj`!%#QY[Bf`0"(!!!@d!!!Sa#M6mjJV
 | 
			
		||||
mjJ!%#Q&XD@%'"(%!!rcP"()%F`Vmj3!%#QPZFfJ0"()!!M3!!!Sh#Mrmj!4d#[c
 | 
			
		||||
N!!3+BfC[E!d%G!!"E`!!#MX+2[cM#rcM!$3`!"K[F'9ZFh0XD@jME(9NC@C[E'4
 | 
			
		||||
PFR"KG'J!''p`C@j68da*EQ0XG@4P4QpXC'9b8'&dD!B%F`!$r1)%GIcK#[cL!!3
 | 
			
		||||
+G'mJ)!d%G3!#EJ!!#N)+834f"(F0"(B!!M3!!!T+#P(mi!4i#[cJ!!3+CQPXC3d
 | 
			
		||||
%H!!"E3!!#Nd+8!4j$!4j!!i!#(4YC'PQCLjS!!)!!!d%G`!#0!!!#N)+5[cI"(S
 | 
			
		||||
+r0m!"!TMCQpX$34k!!&[!!!+4JT*r0i,r0i!*$!!%'0bHA"dEfC[E'4PFR"KG'J
 | 
			
		||||
!%'0bHA"dEdC[E'4PFP"KG'J'r1%!!!)%EJ!#"(X%I!d%H`!#E!!##PJ+@2cGr0`
 | 
			
		||||
"r0d!!!(mh!!!!J4m!!)%I34q$34p!!*X!!)+@!TBr0[mfJ(mf`!!!IcD!!!#"(i
 | 
			
		||||
!!J4r")!0"(m!!dN!!JTB#S,mfIcB")%+r0N!'#jMEh*PBh*PE#SU+LS!!!!!!!#
 | 
			
		||||
3!!"ZG@aX!IcB!!!'")%!!rcA"))%J`Vme`!%#QY[Bf`0"))!!@d!!!TF#PrmeJV
 | 
			
		||||
meJ!%#Q&XD@%'")-!!rc9")3%K3Vme3!%#QPZFfJ0")3!!M3!!!TL#QVme!5'#[c
 | 
			
		||||
8!!3+BfC[E!d%KJ!"E`!!#QB+DIc6#rc6!$3`!"K[F'9ZFh0XD@jME(9NC@C[E'4
 | 
			
		||||
PFR"KG'J!''p`C@j68da*EQ0XG@4P4QpXC'9b8'&dD!B%K3!$r0)%Krc4#[c5!!3
 | 
			
		||||
+G'mJ)!d%K`!#EJ!!#Qd+I!5)")N0")J!!M3!!!Te#Rcmd!5+#[c3!!3+CQPXC3d
 | 
			
		||||
%LJ!"E3!!#RJ+H`5,$!5,!!`!"Q9IEh-ZD!!#!!!0")N!!M3!!!TY#RAmc`5-#[c
 | 
			
		||||
2!!3+BfC[E!d%M!!"E`!!#R%+G2c1#rc1!#B`!"&[F'9ZFh0XCQpXC'9bF'&dD!!
 | 
			
		||||
4Eh"PER0cE%C[E'4PFP"KG'J'r0%!!!)%J!!#")d%MJd%M3!$53!##S-+VIc0r-`
 | 
			
		||||
%M`Vmc3!B,Q0[FQ9MFQ9X+LSU+J!!!!!!!*!!!'jeE'`"r-`!!!B%M`!$r-X%N!!
 | 
			
		||||
%N3Vmb`!%#QY[Bf`0"*!!!!&Y!!!+K`U+r-S+r-S!"!TKE'PK"J54!!2mb355"*-
 | 
			
		||||
+r-N!"!TTER0S$355!!)d!!!+M3U9r-J%P!Vmb!!%#Q0QEf`0"*3!!@m!!!U4#T6
 | 
			
		||||
ma`[ma`!d-!!BEh"PER0cE'PZBfaeC'9QEfaNCA*`BA4S!"K[F'9Z8e0-5@jME(9
 | 
			
		||||
NC8C[E'4PFP"KG'J'"*-!!rc'"*Ama3VmaJ!%#R4[)#!0"*8!!Qi!!!UB#UF%PJ5
 | 
			
		||||
A$35@!!)d!!!+S!URr-3%Q!Vma!!%#QCTE'80"*J!!@d!!!UM#UB%Q3`%Q3!0!!G
 | 
			
		||||
PAfpc-LjS!!)!!!d%P`!#0!!!#TJ+S2c$"*S+r--!"!TMCQpX$35D!!&[!!!+R!U
 | 
			
		||||
Ir-),r-)!*M!!%@p`C@jcFfaQEfaNCA*`BA4S!"&[F'9ZFh0X4QpXC'9b8'&dD!E
 | 
			
		||||
ma3!!!J51!!)%Qrc"$35E!!*X!!)+VJUZr-$m[`(m`!!!!Ibr!!!#r-%!!!d!#3!
 | 
			
		||||
"E3!!!!!!!3!I!Irq!!!#!!B!!J5F"*d0"*`!!Q`!!J!!!!$m[[bp!Ibq!!!"r,d
 | 
			
		||||
!!!)%R3!#"*i%R`d%RJ!#E!!##V%+b!5Jr,`0"+!!!dN!!JUa#XMmZ`5K"+)+r,X
 | 
			
		||||
!'#jcHA0[C'a[Cf&cDh)!!!!!!!!!!&4&@&30"+%!!@d!!!Ua#V3%S``%S`!'!!!
 | 
			
		||||
!!J!!"J5L!!2mZJ5N"+8+r,S!"!TLG'jc$35N!!&+!!!+Y`Um"+B#"+B!!J5Rr,N
 | 
			
		||||
0"+F!!@d!!!Uh#VS%U!`%U!!+!!4%EfjP!!)!!!,mZ3!!"J5P!!2mZ!5Tr,F+r,J
 | 
			
		||||
!"!TRDACe$35T!!&Y!!!+[`V#r,B$r,B!"3EmY`!!!Ibm!!!#"*m!!J5Ur,80"+S
 | 
			
		||||
!!Q`!!J!!!!$mY2bc!Ibd!!!"r,-!!!,mY3!!$J!#!!!2%!!$!",mXJ5V"+`%V35
 | 
			
		||||
Z"+m%X!5a",)%X`5d",8%YJ5hr,(mX2b[r+i"r,)!!"!%U`!3r+hmV2bVr+VmUIb
 | 
			
		||||
Sr+ImT[bPr+6mSrbLr+(mS2bIr*i+r+d!'#jKCACdEf&`F'jeE'`!!)!!!!#3!!!
 | 
			
		||||
U+LSU#rbX!")`!!GdD'9`BA4S!!GdD'93BA4S#rbV!"``!!adD'9[E'4NC@aTEA-
 | 
			
		||||
!$(4SC8pXC%4PE'PYF`[mUJ!J-!!1G'KPF(*[DQ9MG("KG'J!$R4SC9"bEfTPBh4
 | 
			
		||||
3BA4S#rbT!"B`!!PdD'9YCA"KG'J!#A4SC8eP8'&dD![mU!!Q-!!4D@jME(9NC@C
 | 
			
		||||
[E'4PFR"KG'J!%@PZBfaeC'9'EfaNCA*3BA4S#rbR!$3`!"K[F'9ZFh0XD@jME(9
 | 
			
		||||
NC@C[E'4PFR"KG'J!''p`C@j68da*EQ0XG@4P4QpXC'9b8'&dD![mTJ!N-!!3Bh*
 | 
			
		||||
jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD![mT3!H-!!0Fh0XCQpXC'9
 | 
			
		||||
bF'&dD!!0Fh0X4QpXC'9b8'&dD![mT!!Q-!!4Eh"PER0cE'C[E'4PFR"KG'J!%@p
 | 
			
		||||
`C@jcFfa'EfaNCA*3BA4S#rbM!#i`!"9dD'9ZCAGQEfaNCA*bC@CPFQ9ZBf8!&A4
 | 
			
		||||
SC8jPGdC[E'4PFP*PCQ9bC@jMC3[mSJ!8-!!)G'9YF("KG'J!#(4PEA"3BA4S!Ib
 | 
			
		||||
K!!!"r+!!!!(mR`!!!IbH!!!1"+`!"a$mR35ir*cmQ`5j",VmQJVmR3!B,Q&PGR4
 | 
			
		||||
[BA"`ER9XE!!!J!!!!*!!!#SU+LS0",J!!@X!!!!!#XJ%Z`)%Z`!#!!8%[!)%[!!
 | 
			
		||||
#"*lmQ3,mQ3!!!IbF!!!#r*X!!"!%Z3!!%!5k!)B!(rbBr*ImP[b9r*6mNrb5!#c
 | 
			
		||||
mNIb3!2b2r)lmMIb-!%rmL`"D!&[mLJ"Nr)N!EIb)r)ImKJ#2r)AmK2b$r),mJIb
 | 
			
		||||
!r(rmI[apr(cmH`#Tr(VmHIair(F![Iaf!-ImG3$8!1)!l!$j!3-"%!%D!5F"-3%
 | 
			
		||||
q!8J"93&I!@`"GJ'$!Bd"QJ'N!E%"Z`()!G)"h`(T!IB#!!)0!KF#*!)Z!MX#43*
 | 
			
		||||
5!P`#D3*c!S!#LJ+A!U%#VJ+m!XB#d`,G!ZS#p!-"!`X$'!-L!bm$130'!e!$A30
 | 
			
		||||
R!h3$IJ1,!jN$S`1`!lS$a`24!pi$l!2f"!-%%`3K"#m%234,"&X%D`4j")X%Q35
 | 
			
		||||
Mr(3%U2acr(,mF3VmQ!!%#Q0[BQS+r*F!'#jPBA*cCQCNFQ&XDA-!!!!!!!!J!'&
 | 
			
		||||
QC()+r*B!"!TMG(Kd#rb9!")`!!GdD'9`BA4S!!GdD'93BA4S#[b8!!3+BA0MFJV
 | 
			
		||||
mN`!%#R4iC'`,r*)!($!!$(4SC@pXC'4PE'PYF`!-G'KP6faN4'9XD@ec#[b4!!3
 | 
			
		||||
+BfPdE32mN!$rr3[mM`!J-!!1G'KPF(*[DQ9MG("KG'J!$R4SC9"bEfTPBh43BA4
 | 
			
		||||
S!rb1rri+r)d!"!T849K8#rb-!"B`!!PdD'9YCA"KG'J!#A4SC8eP8'&dD![mL`!
 | 
			
		||||
Q-!!4D@jME(9NC@C[E'4PFR"KG'J!%@PZBfaeC'9'EfaNCA*3BA4S#rb+!$3`!"K
 | 
			
		||||
[F'9ZFh0XD@jME(9NC@C[E'4PFR"KG'J!''p`C@j68da*EQ0XG@4P4QpXC'9b8'&
 | 
			
		||||
dD![mL3!N-!!3Bh*jF(4[CQpXC'9bF'&dD!!3Bh*jF(4[4QpXC'9b8'&dD![mL!!
 | 
			
		||||
H-!!0Fh0XCQpXC'9bF'&dD!!0Fh0X4QpXC'9b8'&dD![mK`!Q-!!4Eh"PER0cE'C
 | 
			
		||||
[E'4PFR"KG'J!%@p`C@jcFfa'EfaNCA*3BA4S#[b'!!3+BfC[E!VmK3!B,QeTFf0
 | 
			
		||||
cE'0d+LSU+J!!!!!!!*!!!#SU+LS+r)3!"!TcC@aP#[b$!"JZBfpbC@4PE'mU+LS
 | 
			
		||||
U!!!!!!!!N!!!+LSU+J(mJJ!!![b"!!!+r)!!"!TVEf0X#[ar!!3+D@jcD!2mIJ!
 | 
			
		||||
%#[ap!"JZBfpbC@0bC@`U+LSU!!!!!!!!N!!!ER9XE!VmI!!%#R*cE(3,r(X!,M!
 | 
			
		||||
!&A4SC@jPGfC[E'4PFR*PCQ9bC@jMC3!9G'KP6Q9h4QpXC'9b8Q9QCA*PEQ0P#[a
 | 
			
		||||
k!!3+F'jKE3VmH3!%#Q&XD@%+r(J!"!TdEb!J#[ah!!3+CQPXC32mGJ!'#rae!"3
 | 
			
		||||
`!!KdC@e`F'&dD!!)G'9YF&"KG'J+r(3!"!TLG'jc#[ac!!3+CfPfG32mFJ!&#[a
 | 
			
		||||
a!"JZFhPcEf4XEfGKFfYb!!!!!!!!!!"849K8%IbD#XRJ%JUYi1%TDJ`!!LrM*N9
 | 
			
		||||
4e%r&jLa&edrSaHBX4Nr%@qPF@eTVA&VU-NAE6m4Ek9aE@QYF@Z`bl5C&hNr,lbA
 | 
			
		||||
Y*N9J!""2bf%!%59K!")Pl5C&B!!66mYK!"3Pl5C&B!!96mYK!"BPl5C&B!!A6m[
 | 
			
		||||
Y*N9J!"K2amAQ,%C2&!!L+Q%!'9m!%#pK!"PK!"S[DJ`!'dmUB3!F,'S-!"eA!!K
 | 
			
		||||
B!"i!(fK2+Q%!)'%!'@%!)5TK!"PI!"![B3!L$!!M6em!*%9J!#92A`!PDJ`!'dp
 | 
			
		||||
K!#BUB3!F,'%!*ba'6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"R1,f%!+Q%!+bp
 | 
			
		||||
K!#`-!#02A`!9B3!Y*89J!#j2+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!,Lp
 | 
			
		||||
K!#TK!#m[B3!X$!!M6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"PI!#i[B3!UB3!
 | 
			
		||||
`,f%!,!`!)dpI!"9K!$%P4@!!,NmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!
 | 
			
		||||
Z,f%!+Q%!-LpK!#`-!#02A`!9B3!c*89J!#j2+Q%!)'%!+'%!)5TK!"PI!"-[B3!
 | 
			
		||||
T+Q%!'9m!,LpK!#TK!$3[B3!X$!!M6em!&@%!059&B!!Z6bTK!#"K!#KK!#%UB3!
 | 
			
		||||
CA`!6,f%!+5TK!"PI!#i[B3!UB3!f,f%!,!`!)dpI!"9K!$FP4@!!,NmUB3!JB3!
 | 
			
		||||
SB3!K+Q%!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%!1#pK!#`-!#02A`!9B3!j*89J!#j
 | 
			
		||||
2+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!,LpK!#TK!$S[B3!X$!!M6em!&@%
 | 
			
		||||
!1b9&B!!Z6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"PI!#i[B3!UB3!m,f%!,!`
 | 
			
		||||
!)dpI!"9K!$dP4@!!,NmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%
 | 
			
		||||
!2LpK!#`-!#02A`!9B3!r*89J!#j2+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m
 | 
			
		||||
!,LpK!#TK!%![B3!X$!!M6em!&@%!359&B!!Z6bTK!#"K!#KK!#%UB3!CA`!6,f%
 | 
			
		||||
!+5TK!"PI!#i[B3!UB3"#,f%!,!`!)dpI!"9K!%-P4@!!,NmUB3!JB3!SB3!K+Q%
 | 
			
		||||
!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%!4#pK!#`-!#02A`!9B3"&*89J!#j2+Q%!)'%
 | 
			
		||||
!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!,LpK!#TK!%B[B3!X$!!M6em!&@%!4b9&B!!
 | 
			
		||||
Z6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"PI!#i[B3!UB3"),f%!,!`!)dpI!"9
 | 
			
		||||
K!%NP4@!!,NmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%!5LpK!#`
 | 
			
		||||
-!#02A`!9B3",*89J!#j2+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!,LpK!#T
 | 
			
		||||
K!%`[B3!X$!!M6em!&@%!659&B!!Z6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"P
 | 
			
		||||
I!#i[B3!UB3"1,f%!,!`!)dpI!"9K!%mP4@!!,NmUB3!JB3!SB3!K+Q%!'9m!%bp
 | 
			
		||||
K!#NUB3!CA`!Z,f%!+Q%!8#pK!#`-!#02A`!9B3"4*89J!#j2+Q%!)'%!+'%!)5T
 | 
			
		||||
K!"PI!"-[B3!T+Q%!'9m!,LpK!#TK!&)[B3!X$!!M6em!&@%!8b9&B!!Z6bTK!#"
 | 
			
		||||
K!#KK!#%UB3!CA`!6,f%!+5TK!"PI!#i[B3!UB3"8,f%!,!`!)dpI!"9K!&8P4@!
 | 
			
		||||
!,NmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%!9LpK!#`-!#02A`!
 | 
			
		||||
9B3"A*89J!#j2+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!,LpK!#TK!&J[B3!
 | 
			
		||||
X$!!M6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"PI!#i[B3!UB3"C,f%!,!`!)dp
 | 
			
		||||
I!"9K!&SP4@!!,NmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%!@bp
 | 
			
		||||
K!#`-!#02A`!9B3"F*89J!#j2+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!,Lp
 | 
			
		||||
K!#TK!&d[B3!X$!!M6em!&@%!AL9&B!!Z6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5T
 | 
			
		||||
K!"PI!#i[B3!UB3"I,f%!,!`!)dpI!"9K!'!P4@!!,NmUB3!JB3!SB3!K+Q%!'9m
 | 
			
		||||
!%bpK!#NUB3!CA`!Z,f%!+Q%!B5pK!#`-!#02A`!9B3"L*89J!#j2+Q%!)'%!+'%
 | 
			
		||||
!)5TK!"PI!"-[B3!T+Q%!'9m!,LpK!#TK!'-[B3!X$!!M6em!&@%!C#9&B!!Z6bT
 | 
			
		||||
K!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"PI!#i[B3!UB3"P,f%!,!`!)dpI!"9K!'B
 | 
			
		||||
P4@!!,NmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%!CbpK!#`-!#0
 | 
			
		||||
2A`!9B3"S*89J!#j2+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!,LpK!#TK!'N
 | 
			
		||||
[B3!X$!!M6em!&@%!DL9&B!!Z6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"PI!#i
 | 
			
		||||
[B3!UB3"V,f%!,!`!)dmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%
 | 
			
		||||
!E#pK!#`-!#02A`!9B3"Y*89J!#j2+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m
 | 
			
		||||
!,LpK!#TK!'i[B3!X$!!M6em!&@%!Eb9&B!!Z6bTK!#"K!#KK!#%UB3!CA`!6,f%
 | 
			
		||||
!+5TK!"PI!#i[B3!UB3"`,f%!,!`!)dpI!"9K!(%P4@!!,NmUB3!JB3!SB3!K+Q%
 | 
			
		||||
!'9m!%bpK!#NUB3!CA`!Z,f%!+Q%!FLpK!#`-!#02+Q%!)'%!+'%!)5TK!"PI!"-
 | 
			
		||||
[B3!T+Q%!'9m!,LpK!#TK!(-[B3!X$!!M6em!&@%!G#9&B!!Z6bTK!#"K!#KK!#%
 | 
			
		||||
UB3!CA`!6,f%!+5TK!"PI!#i[B3!UB3"e,f%!,!`!)dmUB3!JB3!SB3!K+Q%!'9m
 | 
			
		||||
!%bpK!#NUB3!CA`!A,f%!+Q%!GLpK!#`-!#02+Q%!)'%!+'%!)5TK!"PI!"-[B3!
 | 
			
		||||
T+Q%!'9m!&bpK!#TK!(F[B3!X$!!M6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"P
 | 
			
		||||
I!"F[B3!UB3"i,f%!,!`!)dmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!A,f%
 | 
			
		||||
!+Q%!H5pK!#`-!#02+Q%!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!&bpK!#TK!(S
 | 
			
		||||
[B3!X$!!M6bTK!#"K!#KK!#%UB3!CA`!6,f%!+5TK!"PI!"8[B3!UB3"l,f%!,!`
 | 
			
		||||
!)dmUB3!JB3!SB3!K+Q%!'9m!%bpK!#NUB3!CA`!9,f%!+Q%!I#pK!#`-!#02+Q%
 | 
			
		||||
!)'%!+'%!)5TK!"PI!"-[B3!T+Q%!'9m!&5pK!#TK!(d[B3!X$!!M6bTK!#"K!#K
 | 
			
		||||
K!#%UB3!CA`!6,f%!+5TK!"PI!"J[B3!UB3"q,f%!,!`!)dmUB3!JB3!SB3!K+Q%
 | 
			
		||||
!'9m!%bpK!#NUB3!CA`!B,f%!+Q%!IbpK!#`-!#028&92B3#!B3#"B3##DhCK!)0
 | 
			
		||||
K!)4K!#)-!)82$!5Y!&%!5deKBfPZG'pcD#")4$T%CA0VG'p`)%C[E'4PFMT*EQ0
 | 
			
		||||
[E@PZCcT[F'9ZFh0X,90139!Y-6Nj16%b-6%k6@&M6e-kE@YXD@jVFbjKF`!#!!!
 | 
			
		||||
1"+i!!J6mF!5p!ra`!!%1",d!!3!%[J`%[J!'!!!!!J!!$J5[!!)%r'm%[`2mE`!
 | 
			
		||||
%$J5r!!3!"-!%`36#"---"-!!%J!-6@&MD@jdEh0S)%K%!!)!!!`%`3!8!!j%CA0
 | 
			
		||||
VG'p`)%C[E'4PFJ!#!!!-"-)!$J!)5@jMEfeTEQF!!J!!$!6$!"X!&@p`C@jcFf`
 | 
			
		||||
Y8dj"8#da16Nj-6)a-3!#!!!-",!!4J"!6@&MD@jdEh0S)%K%1N4PFfYdEh!J4Qp
 | 
			
		||||
XC'9b1NPZBfpYD@jR1Qp`C@jcFf`Y8dj"8#da16Nj-6)a-6T0B@028`!#!!!-",%
 | 
			
		||||
!5!"#6@&MD@jdEh0S)%K%1N4PFfYdEh!J4QpXC'9b1NPZBfpYD@jR1Qp`C@jcFf`
 | 
			
		||||
Y8dj"8#da16Nj-6)a-6TTEQ0XG@4P!!)!!!`%XJ"3!%T0B@0TER4[FfJJ5%3k4'9
 | 
			
		||||
cDh4[F#"'EfaNCA)k5@jMEfeTEQFkEh"PER0cE#e66N&3,6%j16Na-M%a1QPZBfa
 | 
			
		||||
eC'8kEh"PER0cE!!#!!!-",-!4`""6@&MD@jdEh0S)%K%1N4PFfYdEh!J4QpXC'9
 | 
			
		||||
b1NPZBfpYD@jR1Qp`C@jcFf`Y8dj"8#da16Nj-6)a-6TMFRP`G'm!!J!!$!5d!%3
 | 
			
		||||
!2NeKBfPZG'pcD#")4$T%CA0VG'p`)%C[E'4PFMT*EQ0[E@PZCcT[F'9ZFh0X,90
 | 
			
		||||
139!Y-6Nj16%b-6%kFh0X!!)!!!`%Y3"!!$T0B@0TER4[FfJJ5%3k4'9cDh4[F#"
 | 
			
		||||
'EfaNCA)k5@jMEfeTEQFkEh"PER0cE#e66N&3,6%j16Na-M%a!!)!!!i%YJ!"&!6
 | 
			
		||||
%$J6%!!-B"-AmEJ6'$J6&!!-B"-ImE36)$J6(!!-B"-RmE!6+$J6*!!-B!"rmD`6
 | 
			
		||||
,#[aV!!3+BfC[E!`%b`!1!!K*EQ0[E@PZC`!#!!!+r'`!"!TMCQpX$!6+!"X!&@p
 | 
			
		||||
`C@jcFf`Y8dj"8#da16Nj-6)a-3!#!!!+r'd!"!TMCQpX$!6)!!d!"fPZBfaeC'8
 | 
			
		||||
!!J!!#[aZ!!3+BfC[E!`%aJ!9!!peER4TG'aPC#"QEfaNCA)!!J!!$!5h!%i!5%e
 | 
			
		||||
KBfPZG'pcD#")4$T%CA0VG'p`)%C[E'4PFMT*EQ0[E@PZCcT[F'9ZFh0X,90139!
 | 
			
		||||
Y-6Nj16%b-6%kBh*jF(4[1RJe-$Pf-`!#!!!"r,%!!!(mX!!!!Ib[!!!"r+i!!'&
 | 
			
		||||
cBh)!!3!-qYlHV3!!!3!!!*G#!!#@3J!!!AB!!$-8-0J!!!!F!AB!$h0MFhS!!!#
 | 
			
		||||
#6Np853!!!)jcBh"d!!!!QP4&@&3!!3#QFh4jE!!!!,j$6d4&!!%!bN*14%`!!!$
 | 
			
		||||
LBA"XG!!!!1j'8N9'!!!!qNP$6L-!!!%'D@0X0!!!!4*TBh-M!!!"(QPMFc3!!!%
 | 
			
		||||
UD'CNFJ!!!6C659T&!!!"3PG3Eh-!!!&1!!$rr`!!!!!!!!!!!)$rre!!!"i!!!!
 | 
			
		||||
!!)$rr`!!"cJ#DH#m"'Mrr`!!!*S!!!!!%iRrr`!!"Pi!!!!!"'Mrr`!!!53!!!!
 | 
			
		||||
!!!$rrb!!!9)!!!!!!!(rra3!!@i#DG`%!)$rr`!!!Pi#DH"X!!$rr`!!!Ri!!!!
 | 
			
		||||
!!)$rr`!!!S-#DH"d!*Err`!!!Si!!!!!!*Err`!!!j)!!!!!!*Err`!!"CB#DH%
 | 
			
		||||
i!*Err`!!"GS#DH%dkF$rr`!!"[`!!!!!rrrrr`!!"a)!!!!!!)$rr`!!"b!!!!!
 | 
			
		||||
!*4S:
 | 
			
		||||
							
								
								
									
										116
									
								
								MacOS/opensslconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								MacOS/opensslconf.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
/* MacOS/opensslconf.h */
 | 
			
		||||
 | 
			
		||||
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
 | 
			
		||||
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
 | 
			
		||||
#define OPENSSLDIR "/usr/local/ssl"
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_IDEA_H) && !defined(IDEA_INT)
 | 
			
		||||
#define IDEA_INT unsigned int
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_MD2_H) && !defined(MD2_INT)
 | 
			
		||||
#define MD2_INT unsigned int
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_RC2_H) && !defined(RC2_INT)
 | 
			
		||||
/* I need to put in a mod for the alpha - eay */
 | 
			
		||||
#define RC2_INT unsigned int
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_RC4_H)
 | 
			
		||||
#if !defined(RC4_INT)
 | 
			
		||||
/* using int types make the structure larger but make the code faster
 | 
			
		||||
 * on most boxes I have tested - up to %20 faster. */
 | 
			
		||||
/*
 | 
			
		||||
 * I don't know what does "most" mean, but declaring "int" is a must on:
 | 
			
		||||
 * - Intel P6 because partial register stalls are very expensive;
 | 
			
		||||
 * - elder Alpha because it lacks byte load/store instructions;
 | 
			
		||||
 */
 | 
			
		||||
#define RC4_INT unsigned char
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(RC4_CHUNK)
 | 
			
		||||
/*
 | 
			
		||||
 * This enables code handling data aligned at natural CPU word
 | 
			
		||||
 * boundary. See crypto/rc4/rc4_enc.c for further details.
 | 
			
		||||
 */
 | 
			
		||||
#define RC4_CHUNK unsigned long
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_DES_H) && !defined(DES_LONG)
 | 
			
		||||
/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a
 | 
			
		||||
 * %20 speed up (longs are 8 bytes, int's are 4). */
 | 
			
		||||
#ifndef DES_LONG
 | 
			
		||||
#define DES_LONG unsigned long
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H)
 | 
			
		||||
#define CONFIG_HEADER_BN_H
 | 
			
		||||
#if __option(longlong)
 | 
			
		||||
#  define BN_LLONG
 | 
			
		||||
#else
 | 
			
		||||
#  undef BN_LLONG
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Should we define BN_DIV2W here? */
 | 
			
		||||
 | 
			
		||||
/* Only one for the following should be defined */
 | 
			
		||||
/* The prime number generation stuff may not work when
 | 
			
		||||
 * EIGHT_BIT but I don't care since I've only used this mode
 | 
			
		||||
 * for debuging the bignum libraries */
 | 
			
		||||
#undef SIXTY_FOUR_BIT_LONG
 | 
			
		||||
#undef SIXTY_FOUR_BIT
 | 
			
		||||
#define THIRTY_TWO_BIT
 | 
			
		||||
#undef SIXTEEN_BIT
 | 
			
		||||
#undef EIGHT_BIT
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H)
 | 
			
		||||
#define CONFIG_HEADER_RC4_LOCL_H
 | 
			
		||||
/* if this is defined data[i] is used instead of *data, this is a %20
 | 
			
		||||
 * speedup on x86 */
 | 
			
		||||
#undef RC4_INDEX
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H)
 | 
			
		||||
#define CONFIG_HEADER_BF_LOCL_H
 | 
			
		||||
#define BF_PTR
 | 
			
		||||
#endif /* HEADER_BF_LOCL_H */
 | 
			
		||||
 | 
			
		||||
#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H)
 | 
			
		||||
#define CONFIG_HEADER_DES_LOCL_H
 | 
			
		||||
/* the following is tweaked from a config script, that is why it is a
 | 
			
		||||
 * protected undef/define */
 | 
			
		||||
#ifndef DES_PTR
 | 
			
		||||
#define DES_PTR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* This helps C compiler generate the correct code for multiple functional
 | 
			
		||||
 * units.  It reduces register dependancies at the expense of 2 more
 | 
			
		||||
 * registers */
 | 
			
		||||
#ifndef DES_RISC1
 | 
			
		||||
#define DES_RISC1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef DES_RISC2
 | 
			
		||||
#undef DES_RISC2
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(DES_RISC1) && defined(DES_RISC2)
 | 
			
		||||
YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Unroll the inner loop, this sometimes helps, sometimes hinders.
 | 
			
		||||
 * Very mucy CPU dependant */
 | 
			
		||||
#ifndef DES_UNROLL
 | 
			
		||||
#define DES_UNROLL
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* HEADER_DES_LOCL_H */
 | 
			
		||||
 | 
			
		||||
#ifndef __POWERPC__
 | 
			
		||||
#define MD32_XARRAY
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										638
									
								
								Makefile.fips
									
									
									
									
									
								
							
							
						
						
									
										638
									
								
								Makefile.fips
									
									
									
									
									
								
							@@ -1,638 +0,0 @@
 | 
			
		||||
##
 | 
			
		||||
## Makefile for OpenSSL: fipscanister.o only
 | 
			
		||||
##
 | 
			
		||||
 | 
			
		||||
VERSION=fips-2.0-test
 | 
			
		||||
MAJOR=
 | 
			
		||||
MINOR=
 | 
			
		||||
SHLIB_VERSION_NUMBER=
 | 
			
		||||
SHLIB_VERSION_HISTORY=
 | 
			
		||||
SHLIB_MAJOR=
 | 
			
		||||
SHLIB_MINOR=
 | 
			
		||||
SHLIB_EXT=
 | 
			
		||||
PLATFORM=dist
 | 
			
		||||
OPTIONS=
 | 
			
		||||
CONFIGURE_ARGS=
 | 
			
		||||
SHLIB_TARGET=
 | 
			
		||||
 | 
			
		||||
# HERE indicates where this Makefile lives.  This can be used to indicate
 | 
			
		||||
# where sub-Makefiles are expected to be.  Currently has very limited usage,
 | 
			
		||||
# and should probably not be bothered with at all.
 | 
			
		||||
HERE=.
 | 
			
		||||
 | 
			
		||||
# INSTALL_PREFIX is for package builders so that they can configure
 | 
			
		||||
# for, say, /usr/ and yet have everything installed to /tmp/somedir/usr/.
 | 
			
		||||
# Normally it is left empty.
 | 
			
		||||
INSTALL_PREFIX=
 | 
			
		||||
INSTALLTOP=/usr/local/ssl
 | 
			
		||||
 | 
			
		||||
# Do not edit this manually. Use Configure --openssldir=DIR do change this!
 | 
			
		||||
OPENSSLDIR=/usr/local/ssl
 | 
			
		||||
 | 
			
		||||
# NO_IDEA - Define to build without the IDEA algorithm
 | 
			
		||||
# NO_RC4  - Define to build without the RC4 algorithm
 | 
			
		||||
# NO_RC2  - Define to build without the RC2 algorithm
 | 
			
		||||
# THREADS - Define when building with threads, you will probably also need any
 | 
			
		||||
#           system defines as well, i.e. _REENTERANT for Solaris 2.[34]
 | 
			
		||||
# TERMIO  - Define the termio terminal subsystem, needed if sgtty is missing.
 | 
			
		||||
# TERMIOS - Define the termios terminal subsystem, Silicon Graphics.
 | 
			
		||||
# LONGCRYPT - Define to use HPUX 10.x's long password modification to crypt(3).
 | 
			
		||||
# DEVRANDOM - Give this the value of the 'random device' if your OS supports
 | 
			
		||||
#           one.  32 bytes will be read from this when the random
 | 
			
		||||
#           number generator is initalised.
 | 
			
		||||
# SSL_FORBID_ENULL - define if you want the server to be not able to use the
 | 
			
		||||
#           NULL encryption ciphers.
 | 
			
		||||
#
 | 
			
		||||
# LOCK_DEBUG - turns on lots of lock debug output :-)
 | 
			
		||||
# REF_CHECK - turn on some xyz_free() assertions.
 | 
			
		||||
# REF_PRINT - prints some stuff on structure free.
 | 
			
		||||
# CRYPTO_MDEBUG - turns on my 'memory leak' detecting stuff
 | 
			
		||||
# MFUNC - Make all Malloc/Free/Realloc calls call
 | 
			
		||||
#       CRYPTO_malloc/CRYPTO_free/CRYPTO_realloc which can be setup to
 | 
			
		||||
#       call application defined callbacks via CRYPTO_set_mem_functions()
 | 
			
		||||
# MD5_ASM needs to be defined to use the x86 assembler for MD5
 | 
			
		||||
# SHA1_ASM needs to be defined to use the x86 assembler for SHA1
 | 
			
		||||
# RMD160_ASM needs to be defined to use the x86 assembler for RIPEMD160
 | 
			
		||||
# Do not define B_ENDIAN or L_ENDIAN if 'unsigned long' == 8.  It must
 | 
			
		||||
# equal 4.
 | 
			
		||||
# PKCS1_CHECK - pkcs1 tests.
 | 
			
		||||
 | 
			
		||||
CC= cc
 | 
			
		||||
CFLAG= -O
 | 
			
		||||
DEPFLAG= 
 | 
			
		||||
PEX_LIBS= 
 | 
			
		||||
EX_LIBS= 
 | 
			
		||||
EXE_EXT= 
 | 
			
		||||
ARFLAGS=
 | 
			
		||||
AR=ar $(ARFLAGS) r
 | 
			
		||||
RANLIB= ranlib
 | 
			
		||||
NM= nm
 | 
			
		||||
PERL= perl
 | 
			
		||||
TAR= tar
 | 
			
		||||
TARFLAGS= --no-recursion
 | 
			
		||||
MAKEDEPPROG=makedepend
 | 
			
		||||
LIBDIR=lib
 | 
			
		||||
 | 
			
		||||
# We let the C compiler driver to take care of .s files. This is done in
 | 
			
		||||
# order to be excused from maintaining a separate set of architecture
 | 
			
		||||
# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC
 | 
			
		||||
# gcc, then the driver will automatically translate it to -xarch=v8plus
 | 
			
		||||
# and pass it down to assembler.
 | 
			
		||||
#AS=$(CC) -c
 | 
			
		||||
ASFLAG=$(CFLAG)
 | 
			
		||||
 | 
			
		||||
# For x86 assembler: Set PROCESSOR to 386 if you want to support
 | 
			
		||||
# the 80386.
 | 
			
		||||
PROCESSOR=
 | 
			
		||||
 | 
			
		||||
# CPUID module collects small commonly used assembler snippets
 | 
			
		||||
CPUID_OBJ= 
 | 
			
		||||
BN_ASM= bn_asm.o
 | 
			
		||||
DES_ENC= des_enc.o fcrypt_b.o
 | 
			
		||||
AES_ENC= aes_core.o aes_cbc.o
 | 
			
		||||
BF_ENC= bf_enc.o
 | 
			
		||||
CAST_ENC= c_enc.o
 | 
			
		||||
RC4_ENC= rc4_enc.o
 | 
			
		||||
RC5_ENC= rc5_enc.o
 | 
			
		||||
MD5_ASM_OBJ= 
 | 
			
		||||
SHA1_ASM_OBJ= 
 | 
			
		||||
RMD160_ASM_OBJ= 
 | 
			
		||||
WP_ASM_OBJ=
 | 
			
		||||
CMLL_ENC=
 | 
			
		||||
MODES_ASM_OBJ=
 | 
			
		||||
PERLASM_SCHEME=
 | 
			
		||||
 | 
			
		||||
# KRB5 stuff
 | 
			
		||||
KRB5_INCLUDES=
 | 
			
		||||
LIBKRB5=
 | 
			
		||||
 | 
			
		||||
# Zlib stuff
 | 
			
		||||
ZLIB_INCLUDE=
 | 
			
		||||
LIBZLIB=
 | 
			
		||||
 | 
			
		||||
# This is the location of fipscanister.o and friends.
 | 
			
		||||
# The FIPS module build will place it $(INSTALLTOP)/lib
 | 
			
		||||
# but since $(INSTALLTOP) can only take the default value
 | 
			
		||||
# when the module is built it will be in /usr/local/ssl/lib
 | 
			
		||||
# $(INSTALLTOP) for this build may be different so hard
 | 
			
		||||
# code the path.
 | 
			
		||||
 | 
			
		||||
FIPSLIBDIR=/usr/local/ssl/$(LIBDIR)/
 | 
			
		||||
 | 
			
		||||
# This is set to "y" if fipscanister.o is compiled internally as
 | 
			
		||||
# opposed to coming from an external validated location.
 | 
			
		||||
 | 
			
		||||
FIPSCANISTERINTERNAL=n
 | 
			
		||||
 | 
			
		||||
# This is set if we only build fipscanister.o
 | 
			
		||||
 | 
			
		||||
FIPSCANISTERONLY=y
 | 
			
		||||
 | 
			
		||||
# The location of the library which contains fipscanister.o
 | 
			
		||||
# normally it will be libcrypto unless fipsdso is set in which
 | 
			
		||||
# case it will be libfips. If not compiling in FIPS mode at all
 | 
			
		||||
# this is empty making it a useful test for a FIPS compile.
 | 
			
		||||
 | 
			
		||||
FIPSCANLIB=
 | 
			
		||||
 | 
			
		||||
# Shared library base address. Currently only used on Windows.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
BASEADDR=
 | 
			
		||||
 | 
			
		||||
DIRS=   crypto fips test 
 | 
			
		||||
ENGDIRS= ccgost
 | 
			
		||||
SHLIBDIRS= crypto 
 | 
			
		||||
 | 
			
		||||
# dirs in crypto to build
 | 
			
		||||
SDIRS=  \
 | 
			
		||||
	sha hmac des aes modes \
 | 
			
		||||
	bn ec rsa dsa ecdsa dh \
 | 
			
		||||
	buffer evp ecdh cmac
 | 
			
		||||
# keep in mind that the above list is adjusted by ./Configure
 | 
			
		||||
# according to no-xxx arguments...
 | 
			
		||||
 | 
			
		||||
LINKDIRS=  \
 | 
			
		||||
	objects sha hmac des aes modes \
 | 
			
		||||
	bn ec rsa dsa ecdh cmac ecdsa dh engine \
 | 
			
		||||
	buffer bio stack lhash rand err \
 | 
			
		||||
	evp asn1 ui
 | 
			
		||||
 | 
			
		||||
# tests to perform.  "alltests" is a special word indicating that all tests
 | 
			
		||||
# should be performed.
 | 
			
		||||
TESTS = alltests
 | 
			
		||||
 | 
			
		||||
MAKEFILE= Makefile
 | 
			
		||||
 | 
			
		||||
MANDIR=$(OPENSSLDIR)/man
 | 
			
		||||
MAN1=1
 | 
			
		||||
MAN3=3
 | 
			
		||||
MANSUFFIX=
 | 
			
		||||
HTMLSUFFIX=html
 | 
			
		||||
HTMLDIR=$(OPENSSLDIR)/html
 | 
			
		||||
SHELL=/bin/sh
 | 
			
		||||
 | 
			
		||||
TOP=    .
 | 
			
		||||
ONEDIRS=out tmp
 | 
			
		||||
EDIRS=  times doc bugs util include certs ms shlib mt demos perl sf dep VMS
 | 
			
		||||
WDIRS=  windows
 | 
			
		||||
LIBS=   
 | 
			
		||||
SHARED_CRYPTO=libcrypto$(SHLIB_EXT)
 | 
			
		||||
SHARED_SSL=libssl$(SHLIB_EXT)
 | 
			
		||||
SHARED_LIBS=
 | 
			
		||||
SHARED_LIBS_LINK_EXTS=
 | 
			
		||||
SHARED_LDFLAGS=
 | 
			
		||||
 | 
			
		||||
GENERAL=        Makefile
 | 
			
		||||
BASENAME=       openssl
 | 
			
		||||
NAME=           $(BASENAME)-$(VERSION)
 | 
			
		||||
TARFILE=        openssl-fips-2.0-test.tar
 | 
			
		||||
WTARFILE=       $(NAME)-win.tar
 | 
			
		||||
EXHEADER=       e_os2.h
 | 
			
		||||
HEADER=         e_os.h
 | 
			
		||||
 | 
			
		||||
all: Makefile build_all openssl.pc libssl.pc libcrypto.pc
 | 
			
		||||
 | 
			
		||||
# as we stick to -e, CLEARENV ensures that local variables in lower
 | 
			
		||||
# Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn
 | 
			
		||||
# shell, which [annoyingly enough] terminates unset with error if VAR
 | 
			
		||||
# is not present:-( TOP= && unset TOP is tribute to HP-UX /bin/sh,
 | 
			
		||||
# which terminates unset with error if no variable was present:-(
 | 
			
		||||
CLEARENV=	TOP= && unset TOP $${LIB+LIB} $${LIBS+LIBS}	\
 | 
			
		||||
		$${INCLUDE+INCLUDE} $${INCLUDES+INCLUDES}	\
 | 
			
		||||
		$${DIR+DIR} $${DIRS+DIRS} $${SRC+SRC}		\
 | 
			
		||||
		$${LIBSRC+LIBSRC} $${LIBOBJ+LIBOBJ} $${ALL+ALL}	\
 | 
			
		||||
		$${EXHEADER+EXHEADER} $${HEADER+HEADER}		\
 | 
			
		||||
		$${GENERAL+GENERAL} $${CFLAGS+CFLAGS}		\
 | 
			
		||||
		$${ASFLAGS+ASFLAGS} $${AFLAGS+AFLAGS}		\
 | 
			
		||||
		$${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS}		\
 | 
			
		||||
		$${SHAREDCMD+SHAREDCMD} $${SHAREDFLAGS+SHAREDFLAGS}	\
 | 
			
		||||
		$${SHARED_LIB+SHARED_LIB} $${LIBEXTRAS+LIBEXTRAS}
 | 
			
		||||
 | 
			
		||||
BUILDENV=	PLATFORM='$(PLATFORM)' PROCESSOR='$(PROCESSOR)' \
 | 
			
		||||
		CC='$(CC)' CFLAG='$(CFLAG)' 			\
 | 
			
		||||
		ASFLAG='$(CFLAG) -c'			\
 | 
			
		||||
		AR='$(AR)' NM='$(NM)' RANLIB='$(RANLIB)'	\
 | 
			
		||||
		CROSS_COMPILE='$(CROSS_COMPILE)'	\
 | 
			
		||||
		PERL='$(PERL)' ENGDIRS='$(ENGDIRS)'		\
 | 
			
		||||
		SDIRS='$(SDIRS)' LIBRPATH='$(INSTALLTOP)/$(LIBDIR)'	\
 | 
			
		||||
		INSTALL_PREFIX='$(INSTALL_PREFIX)'		\
 | 
			
		||||
		INSTALLTOP='$(INSTALLTOP)' OPENSSLDIR='$(OPENSSLDIR)'	\
 | 
			
		||||
		LIBDIR='$(LIBDIR)'				\
 | 
			
		||||
		MAKEDEPEND='$$$${TOP}/util/domd $$$${TOP} -MD $(MAKEDEPPROG)' \
 | 
			
		||||
		DEPFLAG='-DOPENSSL_NO_DEPRECATED $(DEPFLAG)'	\
 | 
			
		||||
		MAKEDEPPROG='$(MAKEDEPPROG)'			\
 | 
			
		||||
		SHARED_LDFLAGS='$(SHARED_LDFLAGS)'		\
 | 
			
		||||
		KRB5_INCLUDES='$(KRB5_INCLUDES)' LIBKRB5='$(LIBKRB5)'	\
 | 
			
		||||
		ZLIB_INCLUDE='$(ZLIB_INCLUDE)' LIBZLIB='$(LIBZLIB)'	\
 | 
			
		||||
		EXE_EXT='$(EXE_EXT)' SHARED_LIBS='$(SHARED_LIBS)'	\
 | 
			
		||||
		SHLIB_EXT='$(SHLIB_EXT)' SHLIB_TARGET='$(SHLIB_TARGET)'	\
 | 
			
		||||
		PEX_LIBS='$(PEX_LIBS)' EX_LIBS='$(EX_LIBS)'	\
 | 
			
		||||
		CPUID_OBJ='$(CPUID_OBJ)'			\
 | 
			
		||||
		BN_ASM='$(BN_ASM)' DES_ENC='$(DES_ENC)' 	\
 | 
			
		||||
		AES_ENC='$(AES_ENC)' CMLL_ENC='$(CMLL_ENC)'	\
 | 
			
		||||
		BF_ENC='$(BF_ENC)' CAST_ENC='$(CAST_ENC)'	\
 | 
			
		||||
		RC4_ENC='$(RC4_ENC)' RC5_ENC='$(RC5_ENC)'	\
 | 
			
		||||
		SHA1_ASM_OBJ='$(SHA1_ASM_OBJ)'			\
 | 
			
		||||
		MD5_ASM_OBJ='$(MD5_ASM_OBJ)'			\
 | 
			
		||||
		RMD160_ASM_OBJ='$(RMD160_ASM_OBJ)'		\
 | 
			
		||||
		WP_ASM_OBJ='$(WP_ASM_OBJ)'			\
 | 
			
		||||
		MODES_ASM_OBJ='$(MODES_ASM_OBJ)'		\
 | 
			
		||||
		PERLASM_SCHEME='$(PERLASM_SCHEME)'		\
 | 
			
		||||
		FIPSLIBDIR='${FIPSLIBDIR}'			\
 | 
			
		||||
		FIPSCANLIB="$${FIPSCANLIB:-$(FIPSCANLIB)}"	\
 | 
			
		||||
		FIPSCANISTERINTERNAL='${FIPSCANISTERINTERNAL}'	\
 | 
			
		||||
		FIPSCANISTERONLY='${FIPSCANISTERONLY}'	\
 | 
			
		||||
		FIPS_EX_OBJ='${FIPS_EX_OBJ}'	\
 | 
			
		||||
		THIS=$${THIS:-$@} MAKEFILE=Makefile MAKEOVERRIDES=
 | 
			
		||||
# MAKEOVERRIDES= effectively "equalizes" GNU-ish and SysV-ish make flavors,
 | 
			
		||||
# which in turn eliminates ambiguities in variable treatment with -e.
 | 
			
		||||
 | 
			
		||||
# BUILD_CMD is a generic macro to build a given target in a given
 | 
			
		||||
# subdirectory.  The target must be given through the shell variable
 | 
			
		||||
# `target' and the subdirectory to build in must be given through `dir'.
 | 
			
		||||
# This macro shouldn't be used directly, use RECURSIVE_BUILD_CMD or
 | 
			
		||||
# BUILD_ONE_CMD instead.
 | 
			
		||||
#
 | 
			
		||||
# BUILD_ONE_CMD is a macro to build a given target in a given
 | 
			
		||||
# subdirectory if that subdirectory is part of $(DIRS).  It requires
 | 
			
		||||
# exactly the same shell variables as BUILD_CMD.
 | 
			
		||||
#
 | 
			
		||||
# RECURSIVE_BUILD_CMD is a macro to build a given target in all
 | 
			
		||||
# subdirectories defined in $(DIRS).  It requires that the target
 | 
			
		||||
# is given through the shell variable `target'.
 | 
			
		||||
BUILD_CMD=  if [ -d "$$dir" ]; then \
 | 
			
		||||
	    (	cd $$dir && echo "making $$target in $$dir..." && \
 | 
			
		||||
		$(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. DIR=$$dir $$target \
 | 
			
		||||
	    ) || exit 1; \
 | 
			
		||||
	    fi
 | 
			
		||||
RECURSIVE_BUILD_CMD=for dir in $(DIRS); do $(BUILD_CMD); done
 | 
			
		||||
BUILD_ONE_CMD=\
 | 
			
		||||
	if expr " $(DIRS) " : ".* $$dir " >/dev/null 2>&1; then \
 | 
			
		||||
		$(BUILD_CMD); \
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
reflect:
 | 
			
		||||
	@[ -n "$(THIS)" ] && $(CLEARENV) && $(MAKE) $(THIS) -e $(BUILDENV)
 | 
			
		||||
 | 
			
		||||
FIPS_EX_OBJ= ../crypto/aes/aes_cfb.o \
 | 
			
		||||
	../crypto/aes/aes_ecb.o \
 | 
			
		||||
	../crypto/aes/aes_ofb.o \
 | 
			
		||||
	../crypto/bn/bn_add.o \
 | 
			
		||||
	../crypto/bn/bn_blind.o \
 | 
			
		||||
	../crypto/bn/bn_ctx.o \
 | 
			
		||||
	../crypto/bn/bn_div.o \
 | 
			
		||||
	../crypto/bn/bn_exp2.o \
 | 
			
		||||
	../crypto/bn/bn_exp.o \
 | 
			
		||||
	../crypto/bn/bn_gcd.o \
 | 
			
		||||
	../crypto/bn/bn_gf2m.o \
 | 
			
		||||
	../crypto/bn/bn_lib.o \
 | 
			
		||||
	../crypto/bn/bn_mod.o \
 | 
			
		||||
	../crypto/bn/bn_mont.o \
 | 
			
		||||
	../crypto/bn/bn_mul.o \
 | 
			
		||||
	../crypto/bn/bn_nist.o \
 | 
			
		||||
	../crypto/bn/bn_prime.o \
 | 
			
		||||
	../crypto/bn/bn_rand.o \
 | 
			
		||||
	../crypto/bn/bn_recp.o \
 | 
			
		||||
	../crypto/bn/bn_shift.o \
 | 
			
		||||
	../crypto/bn/bn_sqr.o \
 | 
			
		||||
	../crypto/bn/bn_word.o \
 | 
			
		||||
	../crypto/bn/bn_x931p.o \
 | 
			
		||||
	../crypto/buffer/buf_str.o \
 | 
			
		||||
	../crypto/cmac/cmac.o \
 | 
			
		||||
	../crypto/cryptlib.o \
 | 
			
		||||
	../crypto/des/cfb64ede.o \
 | 
			
		||||
	../crypto/des/cfb64enc.o \
 | 
			
		||||
	../crypto/des/cfb_enc.o \
 | 
			
		||||
	../crypto/des/ecb3_enc.o \
 | 
			
		||||
	../crypto/des/ofb64ede.o \
 | 
			
		||||
	../crypto/des/fcrypt.o \
 | 
			
		||||
	../crypto/des/set_key.o \
 | 
			
		||||
	../crypto/dh/dh_check.o \
 | 
			
		||||
	../crypto/dh/dh_gen.o \
 | 
			
		||||
	../crypto/dh/dh_key.o \
 | 
			
		||||
	../crypto/dsa/dsa_gen.o \
 | 
			
		||||
	../crypto/dsa/dsa_key.o \
 | 
			
		||||
	../crypto/dsa/dsa_ossl.o \
 | 
			
		||||
	../crypto/ec/ec_curve.o \
 | 
			
		||||
	../crypto/ec/ec_cvt.o \
 | 
			
		||||
	../crypto/ec/ec_key.o \
 | 
			
		||||
	../crypto/ec/ec_lib.o \
 | 
			
		||||
	../crypto/ec/ecp_mont.o \
 | 
			
		||||
	../crypto/ec/ec_mult.o \
 | 
			
		||||
	../crypto/ec/ecp_nist.o \
 | 
			
		||||
	../crypto/ec/ecp_smpl.o \
 | 
			
		||||
	../crypto/ec/ec2_mult.o \
 | 
			
		||||
	../crypto/ec/ec2_smpl.o \
 | 
			
		||||
	../crypto/ecdh/ech_key.o \
 | 
			
		||||
	../crypto/ecdh/ech_ossl.o \
 | 
			
		||||
	../crypto/ecdsa/ecs_ossl.o \
 | 
			
		||||
	../crypto/evp/e_aes.o \
 | 
			
		||||
	../crypto/evp/e_des3.o \
 | 
			
		||||
	../crypto/evp/e_null.o \
 | 
			
		||||
	../crypto/evp/m_sha1.o \
 | 
			
		||||
	../crypto/evp/m_dss1.o \
 | 
			
		||||
	../crypto/evp/m_dss.o \
 | 
			
		||||
	../crypto/evp/m_ecdsa.o \
 | 
			
		||||
	../crypto/hmac/hmac.o \
 | 
			
		||||
	../crypto/modes/cbc128.o \
 | 
			
		||||
	../crypto/modes/ccm128.o \
 | 
			
		||||
	../crypto/modes/cfb128.o \
 | 
			
		||||
	../crypto/modes/ctr128.o \
 | 
			
		||||
	../crypto/modes/gcm128.o \
 | 
			
		||||
	../crypto/modes/ofb128.o \
 | 
			
		||||
	../crypto/modes/xts128.o \
 | 
			
		||||
	../crypto/rsa/rsa_eay.o \
 | 
			
		||||
	../crypto/rsa/rsa_gen.o \
 | 
			
		||||
	../crypto/rsa/rsa_crpt.o \
 | 
			
		||||
	../crypto/rsa/rsa_none.o \
 | 
			
		||||
	../crypto/rsa/rsa_oaep.o \
 | 
			
		||||
	../crypto/rsa/rsa_pk1.o \
 | 
			
		||||
	../crypto/rsa/rsa_pss.o \
 | 
			
		||||
	../crypto/rsa/rsa_ssl.o \
 | 
			
		||||
	../crypto/rsa/rsa_x931.o \
 | 
			
		||||
	../crypto/rsa/rsa_x931g.o \
 | 
			
		||||
	../crypto/sha/sha1dgst.o \
 | 
			
		||||
	../crypto/sha/sha256.o \
 | 
			
		||||
	../crypto/sha/sha512.o \
 | 
			
		||||
	../crypto/thr_id.o \
 | 
			
		||||
	../crypto/uid.o
 | 
			
		||||
 | 
			
		||||
sub_all: build_all
 | 
			
		||||
build_all: build_libs
 | 
			
		||||
 | 
			
		||||
build_libs: build_crypto build_fips
 | 
			
		||||
 | 
			
		||||
build_fips:
 | 
			
		||||
	@dir=fips; target=all; [ -z "$(FIPSCANLIB)" ] || $(BUILD_ONE_CMD)
 | 
			
		||||
 | 
			
		||||
build_crypto:
 | 
			
		||||
	if [ -n "$(FIPSCANLIB)" ]; then \
 | 
			
		||||
		EXCL_OBJ='$(AES_ENC) $(BN_ASM) $(DES_ENC) $(CPUID_OBJ) $(SHA1_ASM_OBJ) $(MODES_ASM_OBJ) $(FIPS_EX_OBJ)' ; export EXCL_OBJ ; \
 | 
			
		||||
		ARX='$(PERL) $${TOP}/util/arx.pl $(AR)' ; \
 | 
			
		||||
	else \
 | 
			
		||||
		ARX='${AR}' ; \
 | 
			
		||||
	fi ; export ARX ; \
 | 
			
		||||
	if [ $(FIPSCANISTERINTERNAL) = "y" ]; then \
 | 
			
		||||
		AS='$(PERL) $${TOP}/util/fipsas.pl $${TOP} $${<} $(CC)' ; \
 | 
			
		||||
	else \
 | 
			
		||||
		AS='$(CC) -c' ; \
 | 
			
		||||
	fi ; export AS ; \
 | 
			
		||||
		dir=crypto; target=fips; $(BUILD_ONE_CMD)
 | 
			
		||||
build_ssl:
 | 
			
		||||
	@dir=ssl; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
build_engines:
 | 
			
		||||
	@dir=engines; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
build_apps:
 | 
			
		||||
	@dir=apps; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
build_tests:
 | 
			
		||||
	@dir=test; target=fipsexe; $(BUILD_ONE_CMD)
 | 
			
		||||
build_algvs:
 | 
			
		||||
	@dir=test; target=fipsalgvs; $(BUILD_ONE_CMD)
 | 
			
		||||
build_tools:
 | 
			
		||||
	@dir=tools; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
 | 
			
		||||
all_testapps: build_libs build_testapps
 | 
			
		||||
build_testapps:
 | 
			
		||||
	@dir=crypto; target=testapps; $(BUILD_ONE_CMD)
 | 
			
		||||
 | 
			
		||||
libcrypto$(SHLIB_EXT): libcrypto.a build_fips
 | 
			
		||||
	@if [ "$(SHLIB_TARGET)" != "" ]; then \
 | 
			
		||||
		if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \
 | 
			
		||||
			FIPSLD_CC="$(CC)"; CC=fips/fipsld; \
 | 
			
		||||
			export CC FIPSLD_CC; \
 | 
			
		||||
		fi; \
 | 
			
		||||
		$(MAKE) SHLIBDIRS=crypto build-shared; \
 | 
			
		||||
	else \
 | 
			
		||||
		echo "There's no support for shared libraries on this platform" >&2; \
 | 
			
		||||
		exit 1; \
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
libssl$(SHLIB_EXT): libcrypto$(SHLIB_EXT) libssl.a
 | 
			
		||||
	@if [ "$(SHLIB_TARGET)" != "" ]; then \
 | 
			
		||||
		$(MAKE) SHLIBDIRS=ssl SHLIBDEPS='-lcrypto' build-shared; \
 | 
			
		||||
	else \
 | 
			
		||||
		echo "There's no support for shared libraries on this platform" >&2; \
 | 
			
		||||
		exit 1; \
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
clean-shared:
 | 
			
		||||
	@set -e; for i in $(SHLIBDIRS); do \
 | 
			
		||||
		if [ -n "$(SHARED_LIBS_LINK_EXTS)" ]; then \
 | 
			
		||||
			tmp="$(SHARED_LIBS_LINK_EXTS)"; \
 | 
			
		||||
			for j in $${tmp:-x}; do \
 | 
			
		||||
				( set -x; rm -f lib$$i$$j ); \
 | 
			
		||||
			done; \
 | 
			
		||||
		fi; \
 | 
			
		||||
		( set -x; rm -f lib$$i$(SHLIB_EXT) ); \
 | 
			
		||||
		if [ "$(PLATFORM)" = "Cygwin" ]; then \
 | 
			
		||||
			( set -x; rm -f cyg$$i$(SHLIB_EXT) lib$$i$(SHLIB_EXT).a ); \
 | 
			
		||||
		fi; \
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
link-shared:
 | 
			
		||||
	@ set -e; for i in $(SHLIBDIRS); do \
 | 
			
		||||
		$(MAKE) -f $(HERE)/Makefile.shared -e $(BUILDENV) \
 | 
			
		||||
			LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \
 | 
			
		||||
			LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \
 | 
			
		||||
			symlink.$(SHLIB_TARGET); \
 | 
			
		||||
		libs="$$libs -l$$i"; \
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
build-shared: do_$(SHLIB_TARGET) link-shared
 | 
			
		||||
 | 
			
		||||
do_$(SHLIB_TARGET):
 | 
			
		||||
	@ set -e; libs='-L. $(SHLIBDEPS)'; for i in $(SHLIBDIRS); do \
 | 
			
		||||
		if [ "$$i" = "ssl" -a -n "$(LIBKRB5)" ]; then \
 | 
			
		||||
			libs="$(LIBKRB5) $$libs"; \
 | 
			
		||||
		fi; \
 | 
			
		||||
		$(CLEARENV) && $(MAKE) -f Makefile.shared -e $(BUILDENV) \
 | 
			
		||||
			LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \
 | 
			
		||||
			LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \
 | 
			
		||||
			LIBDEPS="$$libs $(EX_LIBS)" \
 | 
			
		||||
			link_a.$(SHLIB_TARGET); \
 | 
			
		||||
		libs="-l$$i $$libs"; \
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
libcrypto.pc: Makefile
 | 
			
		||||
	@ ( echo 'prefix=$(INSTALLTOP)'; \
 | 
			
		||||
	    echo 'exec_prefix=$${prefix}'; \
 | 
			
		||||
	    echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
 | 
			
		||||
	    echo 'includedir=$${prefix}/include'; \
 | 
			
		||||
	    echo ''; \
 | 
			
		||||
	    echo 'Name: OpenSSL-libcrypto'; \
 | 
			
		||||
	    echo 'Description: OpenSSL cryptography library'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc
 | 
			
		||||
 | 
			
		||||
libssl.pc: Makefile
 | 
			
		||||
	@ ( echo 'prefix=$(INSTALLTOP)'; \
 | 
			
		||||
	    echo 'exec_prefix=$${prefix}'; \
 | 
			
		||||
	    echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
 | 
			
		||||
	    echo 'includedir=$${prefix}/include'; \
 | 
			
		||||
	    echo ''; \
 | 
			
		||||
	    echo 'Name: OpenSSL'; \
 | 
			
		||||
	    echo 'Description: Secure Sockets Layer and cryptography libraries'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc
 | 
			
		||||
 | 
			
		||||
openssl.pc: Makefile
 | 
			
		||||
	@ ( echo 'prefix=$(INSTALLTOP)'; \
 | 
			
		||||
	    echo 'exec_prefix=$${prefix}'; \
 | 
			
		||||
	    echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
 | 
			
		||||
	    echo 'includedir=$${prefix}/include'; \
 | 
			
		||||
	    echo ''; \
 | 
			
		||||
	    echo 'Name: OpenSSL'; \
 | 
			
		||||
	    echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > openssl.pc
 | 
			
		||||
 | 
			
		||||
Makefile: Makefile.fips Configure config
 | 
			
		||||
	@echo "Makefile is older than Makefile.org, Configure or config."
 | 
			
		||||
	@echo "Reconfigure the source tree (via './config' or 'perl Configure'), please."
 | 
			
		||||
	@false
 | 
			
		||||
 | 
			
		||||
libclean:
 | 
			
		||||
	rm -f *.map *.so *.so.* *.dll engines/*.so engines/*.dll *.a engines/*.a */lib */*/lib
 | 
			
		||||
 | 
			
		||||
clean:	libclean
 | 
			
		||||
	rm -f shlib/*.o *.o core a.out fluff testlog make.log cctest cctest.c
 | 
			
		||||
	@set -e; target=clean; $(RECURSIVE_BUILD_CMD)
 | 
			
		||||
	rm -f $(LIBS)
 | 
			
		||||
	rm -f openssl.pc libssl.pc libcrypto.pc
 | 
			
		||||
	rm -f speed.* .pure
 | 
			
		||||
	rm -f $(TARFILE)
 | 
			
		||||
	@set -e; for i in $(ONEDIRS) ;\
 | 
			
		||||
	do \
 | 
			
		||||
	rm -fr $$i/*; \
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
makefile.one: files
 | 
			
		||||
	$(PERL) util/mk1mf.pl >makefile.one; \
 | 
			
		||||
	sh util/do_ms.sh
 | 
			
		||||
 | 
			
		||||
files:
 | 
			
		||||
	$(PERL) $(TOP)/util/files.pl Makefile > $(TOP)/MINFO
 | 
			
		||||
	@set -e; target=files; $(RECURSIVE_BUILD_CMD)
 | 
			
		||||
 | 
			
		||||
links:
 | 
			
		||||
	@$(PERL) $(TOP)/util/mkdir-p.pl include/openssl
 | 
			
		||||
	@$(PERL) $(TOP)/util/mklink.pl include/openssl $(EXHEADER)
 | 
			
		||||
	@set -e; dir=fips target=links; $(BUILD_ONE_CMD)
 | 
			
		||||
	@(cd crypto ; TEST='' SDIRS='$(LINKDIRS)' $(MAKE) -e links)
 | 
			
		||||
 | 
			
		||||
gentests:
 | 
			
		||||
	@(cd test && echo "generating dummy tests (if needed)..." && \
 | 
			
		||||
	$(CLEARENV) && $(MAKE) -e $(BUILDENV) TESTS='$(TESTS)' OPENSSL_DEBUG_MEMORY=on generate );
 | 
			
		||||
 | 
			
		||||
dclean:
 | 
			
		||||
	rm -rf *.bak include/openssl certs/.0
 | 
			
		||||
	@set -e; target=dclean; $(RECURSIVE_BUILD_CMD)
 | 
			
		||||
 | 
			
		||||
test:   tests
 | 
			
		||||
 | 
			
		||||
tests:
 | 
			
		||||
	@echo "Not implemented in FIPS build" ; false
 | 
			
		||||
 | 
			
		||||
report:
 | 
			
		||||
	@$(PERL) util/selftest.pl
 | 
			
		||||
 | 
			
		||||
depend:
 | 
			
		||||
	@echo make depend not supported ; false
 | 
			
		||||
 | 
			
		||||
lint:
 | 
			
		||||
	@set -e; target=lint; $(RECURSIVE_BUILD_CMD)
 | 
			
		||||
 | 
			
		||||
tags:
 | 
			
		||||
	rm -f TAGS
 | 
			
		||||
	find . -name '[^.]*.[ch]' | xargs etags -a
 | 
			
		||||
 | 
			
		||||
errors:
 | 
			
		||||
	$(PERL) util/mkerr.pl -recurse -write
 | 
			
		||||
	(cd engines; $(MAKE) PERL=$(PERL) errors)
 | 
			
		||||
	$(PERL) util/ck_errf.pl -strict */*.c */*/*.c
 | 
			
		||||
 | 
			
		||||
stacks:
 | 
			
		||||
	$(PERL) util/mkstack.pl -write
 | 
			
		||||
 | 
			
		||||
util/libeay.num::
 | 
			
		||||
	$(PERL) util/mkdef.pl crypto update
 | 
			
		||||
 | 
			
		||||
util/ssleay.num::
 | 
			
		||||
	$(PERL) util/mkdef.pl ssl update
 | 
			
		||||
 | 
			
		||||
crypto/objects/obj_dat.h: crypto/objects/obj_dat.pl crypto/objects/obj_mac.h
 | 
			
		||||
	$(PERL) crypto/objects/obj_dat.pl crypto/objects/obj_mac.h crypto/objects/obj_dat.h
 | 
			
		||||
crypto/objects/obj_mac.h: crypto/objects/objects.pl crypto/objects/objects.txt crypto/objects/obj_mac.num
 | 
			
		||||
	$(PERL) crypto/objects/objects.pl crypto/objects/objects.txt crypto/objects/obj_mac.num crypto/objects/obj_mac.h
 | 
			
		||||
crypto/objects/obj_xref.h: crypto/objects/objxref.pl crypto/objects/obj_xref.txt crypto/objects/obj_mac.num
 | 
			
		||||
	$(PERL) crypto/objects/objxref.pl crypto/objects/obj_mac.num crypto/objects/obj_xref.txt >crypto/objects/obj_xref.h
 | 
			
		||||
 | 
			
		||||
apps/openssl-vms.cnf: apps/openssl.cnf
 | 
			
		||||
	$(PERL) VMS/VMSify-conf.pl < apps/openssl.cnf > apps/openssl-vms.cnf
 | 
			
		||||
 | 
			
		||||
crypto/bn/bn_prime.h: crypto/bn/bn_prime.pl
 | 
			
		||||
	$(PERL) crypto/bn/bn_prime.pl >crypto/bn/bn_prime.h
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TABLE: Configure
 | 
			
		||||
	(echo 'Output of `Configure TABLE'"':"; \
 | 
			
		||||
	$(PERL) Configure TABLE) > TABLE
 | 
			
		||||
 | 
			
		||||
update: errors stacks util/libeay.num util/ssleay.num crypto/objects/obj_dat.h crypto/objects/obj_xref.h apps/openssl-vms.cnf crypto/bn/bn_prime.h TABLE depend
 | 
			
		||||
 | 
			
		||||
# Build distribution tar-file. As the list of files returned by "find" is
 | 
			
		||||
# pretty long, on several platforms a "too many arguments" error or similar
 | 
			
		||||
# would occur. Therefore the list of files is temporarily stored into a file
 | 
			
		||||
# and read directly, requiring GNU-Tar. Call "make TAR=gtar dist" if the normal
 | 
			
		||||
# tar does not support the --files-from option.
 | 
			
		||||
tar:
 | 
			
		||||
	find . -type d -print | xargs chmod 755
 | 
			
		||||
	find . -type f -print | xargs chmod a+r
 | 
			
		||||
	find . -type f -perm -0100 -print | xargs chmod a+x
 | 
			
		||||
	find * \! -path CVS/\* \! -path \*/CVS/\* \! -name CVS \! -name .cvsignore \! -name STATUS \! -name TABLE | $(BUILDENV) LINKDIRS='$(LINKDIRS)' $(PERL) util/fipsdist.pl | sort > ../$(TARFILE).list; \
 | 
			
		||||
	$(TAR) $(TARFLAGS) --files-from ../$(TARFILE).list -cvf - | \
 | 
			
		||||
	tardy --user_number=0  --user_name=openssl \
 | 
			
		||||
	      --group_number=0 --group_name=openssl \
 | 
			
		||||
	      --prefix=openssl-$(VERSION) - |\
 | 
			
		||||
	gzip --best >../$(TARFILE).gz; \
 | 
			
		||||
	rm -f ../$(TARFILE).list; \
 | 
			
		||||
	ls -l ../$(TARFILE).gz
 | 
			
		||||
 | 
			
		||||
tar-snap:
 | 
			
		||||
	@$(TAR) $(TARFLAGS) -cvf - \
 | 
			
		||||
		`find * \! -path CVS/\* \! -path \*/CVS/\* \! -name CVS \! -name .cvsignore \! -name STATUS \! -name TABLE \! -name '*.o' \! -name '*.a' \! -name '*.so' \! -name '*.so.*'  \! -name 'openssl' \! -name '*test' \! -name '.#*' \! -name '*~' | sort` |\
 | 
			
		||||
	tardy --user_number=0  --user_name=openssl \
 | 
			
		||||
	      --group_number=0 --group_name=openssl \
 | 
			
		||||
	      --prefix=openssl-$(VERSION) - > ../$(TARFILE);\
 | 
			
		||||
	ls -l ../$(TARFILE)
 | 
			
		||||
 | 
			
		||||
dist:   
 | 
			
		||||
	$(PERL) Configure dist fipscanisteronly
 | 
			
		||||
	@$(MAKE) dist_pem_h
 | 
			
		||||
	@$(MAKE) SDIRS='$(SDIRS)' clean
 | 
			
		||||
	@$(MAKE) -f Makefile.fips TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' tar
 | 
			
		||||
 | 
			
		||||
dist_pem_h:
 | 
			
		||||
	(cd crypto/pem; $(MAKE) -e $(BUILDENV) pem.h; $(MAKE) clean)
 | 
			
		||||
 | 
			
		||||
install: all install_sw
 | 
			
		||||
 | 
			
		||||
install_sw:
 | 
			
		||||
	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \
 | 
			
		||||
		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \
 | 
			
		||||
		$(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl
 | 
			
		||||
	@set -e; headerlist="$(EXHEADER)"; for i in $$headerlist;\
 | 
			
		||||
	do \
 | 
			
		||||
	(cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
 | 
			
		||||
	chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
 | 
			
		||||
	done;
 | 
			
		||||
	@set -e; target=install; $(RECURSIVE_BUILD_CMD)
 | 
			
		||||
 | 
			
		||||
# DO NOT DELETE THIS LINE -- make depend depends on it.
 | 
			
		||||
							
								
								
									
										166
									
								
								Makefile.org
									
									
									
									
									
								
							
							
						
						
									
										166
									
								
								Makefile.org
									
									
									
									
									
								
							@@ -78,7 +78,7 @@ LIBDIR=lib
 | 
			
		||||
# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC
 | 
			
		||||
# gcc, then the driver will automatically translate it to -xarch=v8plus
 | 
			
		||||
# and pass it down to assembler.
 | 
			
		||||
#AS=$(CC) -c
 | 
			
		||||
AS=$(CC) -c
 | 
			
		||||
ASFLAG=$(CFLAG)
 | 
			
		||||
 | 
			
		||||
# For x86 assembler: Set PROCESSOR to 386 if you want to support
 | 
			
		||||
@@ -111,6 +111,9 @@ LIBKRB5=
 | 
			
		||||
ZLIB_INCLUDE=
 | 
			
		||||
LIBZLIB=
 | 
			
		||||
 | 
			
		||||
# TOP level FIPS install directory.
 | 
			
		||||
FIPSDIR=
 | 
			
		||||
 | 
			
		||||
# This is the location of fipscanister.o and friends.
 | 
			
		||||
# The FIPS module build will place it $(INSTALLTOP)/lib
 | 
			
		||||
# but since $(INSTALLTOP) can only take the default value
 | 
			
		||||
@@ -118,12 +121,7 @@ LIBZLIB=
 | 
			
		||||
# $(INSTALLTOP) for this build may be different so hard
 | 
			
		||||
# code the path.
 | 
			
		||||
 | 
			
		||||
FIPSLIBDIR=/usr/local/ssl/$(LIBDIR)/
 | 
			
		||||
 | 
			
		||||
# This is set to "y" if fipscanister.o is compiled internally as
 | 
			
		||||
# opposed to coming from an external validated location.
 | 
			
		||||
 | 
			
		||||
FIPSCANISTERINTERNAL=n
 | 
			
		||||
FIPSLIBDIR=
 | 
			
		||||
 | 
			
		||||
# The location of the library which contains fipscanister.o
 | 
			
		||||
# normally it will be libcrypto unless fipsdso is set in which
 | 
			
		||||
@@ -137,7 +135,7 @@ FIPSCANLIB=
 | 
			
		||||
 | 
			
		||||
BASEADDR=
 | 
			
		||||
 | 
			
		||||
DIRS=   crypto fips ssl engines apps test tools
 | 
			
		||||
DIRS=   crypto ssl engines apps test tools
 | 
			
		||||
ENGDIRS= ccgost
 | 
			
		||||
SHLIBDIRS= crypto ssl
 | 
			
		||||
 | 
			
		||||
@@ -200,13 +198,13 @@ CLEARENV=	TOP= && unset TOP $${LIB+LIB} $${LIBS+LIBS}	\
 | 
			
		||||
		$${EXHEADER+EXHEADER} $${HEADER+HEADER}		\
 | 
			
		||||
		$${GENERAL+GENERAL} $${CFLAGS+CFLAGS}		\
 | 
			
		||||
		$${ASFLAGS+ASFLAGS} $${AFLAGS+AFLAGS}		\
 | 
			
		||||
		$${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS}		\
 | 
			
		||||
		$${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS} $${SCRIPTS+SCRIPTS}	\
 | 
			
		||||
		$${SHAREDCMD+SHAREDCMD} $${SHAREDFLAGS+SHAREDFLAGS}	\
 | 
			
		||||
		$${SHARED_LIB+SHARED_LIB} $${LIBEXTRAS+LIBEXTRAS}
 | 
			
		||||
 | 
			
		||||
BUILDENV=	PLATFORM='$(PLATFORM)' PROCESSOR='$(PROCESSOR)' \
 | 
			
		||||
		CC='$(CC)' CFLAG='$(CFLAG)' 			\
 | 
			
		||||
		ASFLAG='$(CFLAG) -c'			\
 | 
			
		||||
		AS='$(CC)' ASFLAG='$(CFLAG) -c'			\
 | 
			
		||||
		AR='$(AR)' NM='$(NM)' RANLIB='$(RANLIB)'	\
 | 
			
		||||
		CROSS_COMPILE='$(CROSS_COMPILE)'	\
 | 
			
		||||
		PERL='$(PERL)' ENGDIRS='$(ENGDIRS)'		\
 | 
			
		||||
@@ -236,9 +234,8 @@ BUILDENV=	PLATFORM='$(PLATFORM)' PROCESSOR='$(PROCESSOR)' \
 | 
			
		||||
		ENGINES_ASM_OBJ='$(ENGINES_ASM_OBJ)'		\
 | 
			
		||||
		PERLASM_SCHEME='$(PERLASM_SCHEME)'		\
 | 
			
		||||
		FIPSLIBDIR='${FIPSLIBDIR}'			\
 | 
			
		||||
		FIPSDIR='${FIPSDIR}'				\
 | 
			
		||||
		FIPSCANLIB="$${FIPSCANLIB:-$(FIPSCANLIB)}"	\
 | 
			
		||||
		FIPSCANISTERINTERNAL='${FIPSCANISTERINTERNAL}'	\
 | 
			
		||||
		FIPS_EX_OBJ='${FIPS_EX_OBJ}'	\
 | 
			
		||||
		THIS=$${THIS:-$@} MAKEFILE=Makefile MAKEOVERRIDES=
 | 
			
		||||
# MAKEOVERRIDES= effectively "equalizes" GNU-ish and SysV-ish make flavors,
 | 
			
		||||
# which in turn eliminates ambiguities in variable treatment with -e.
 | 
			
		||||
@@ -270,114 +267,17 @@ BUILD_ONE_CMD=\
 | 
			
		||||
reflect:
 | 
			
		||||
	@[ -n "$(THIS)" ] && $(CLEARENV) && $(MAKE) $(THIS) -e $(BUILDENV)
 | 
			
		||||
 | 
			
		||||
FIPS_EX_OBJ= ../crypto/aes/aes_cfb.o \
 | 
			
		||||
	../crypto/aes/aes_ecb.o \
 | 
			
		||||
	../crypto/aes/aes_ofb.o \
 | 
			
		||||
	../crypto/bn/bn_add.o \
 | 
			
		||||
	../crypto/bn/bn_blind.o \
 | 
			
		||||
	../crypto/bn/bn_ctx.o \
 | 
			
		||||
	../crypto/bn/bn_div.o \
 | 
			
		||||
	../crypto/bn/bn_exp2.o \
 | 
			
		||||
	../crypto/bn/bn_exp.o \
 | 
			
		||||
	../crypto/bn/bn_gcd.o \
 | 
			
		||||
	../crypto/bn/bn_gf2m.o \
 | 
			
		||||
	../crypto/bn/bn_lib.o \
 | 
			
		||||
	../crypto/bn/bn_mod.o \
 | 
			
		||||
	../crypto/bn/bn_mont.o \
 | 
			
		||||
	../crypto/bn/bn_mul.o \
 | 
			
		||||
	../crypto/bn/bn_nist.o \
 | 
			
		||||
	../crypto/bn/bn_prime.o \
 | 
			
		||||
	../crypto/bn/bn_rand.o \
 | 
			
		||||
	../crypto/bn/bn_recp.o \
 | 
			
		||||
	../crypto/bn/bn_shift.o \
 | 
			
		||||
	../crypto/bn/bn_sqr.o \
 | 
			
		||||
	../crypto/bn/bn_word.o \
 | 
			
		||||
	../crypto/bn/bn_x931p.o \
 | 
			
		||||
	../crypto/buffer/buf_str.o \
 | 
			
		||||
	../crypto/cmac/cmac.o \
 | 
			
		||||
	../crypto/cryptlib.o \
 | 
			
		||||
	../crypto/des/cfb64ede.o \
 | 
			
		||||
	../crypto/des/cfb64enc.o \
 | 
			
		||||
	../crypto/des/cfb_enc.o \
 | 
			
		||||
	../crypto/des/ecb3_enc.o \
 | 
			
		||||
	../crypto/des/ofb64ede.o \
 | 
			
		||||
	../crypto/des/fcrypt.o \
 | 
			
		||||
	../crypto/des/set_key.o \
 | 
			
		||||
	../crypto/dh/dh_check.o \
 | 
			
		||||
	../crypto/dh/dh_gen.o \
 | 
			
		||||
	../crypto/dh/dh_key.o \
 | 
			
		||||
	../crypto/dsa/dsa_gen.o \
 | 
			
		||||
	../crypto/dsa/dsa_key.o \
 | 
			
		||||
	../crypto/dsa/dsa_ossl.o \
 | 
			
		||||
	../crypto/ec/ec_curve.o \
 | 
			
		||||
	../crypto/ec/ec_cvt.o \
 | 
			
		||||
	../crypto/ec/ec_key.o \
 | 
			
		||||
	../crypto/ec/ec_lib.o \
 | 
			
		||||
	../crypto/ec/ecp_mont.o \
 | 
			
		||||
	../crypto/ec/ec_mult.o \
 | 
			
		||||
	../crypto/ec/ecp_nist.o \
 | 
			
		||||
	../crypto/ec/ecp_smpl.o \
 | 
			
		||||
	../crypto/ec/ec2_mult.o \
 | 
			
		||||
	../crypto/ec/ec2_smpl.o \
 | 
			
		||||
	../crypto/ecdh/ech_key.o \
 | 
			
		||||
	../crypto/ecdh/ech_ossl.o \
 | 
			
		||||
	../crypto/ecdsa/ecs_ossl.o \
 | 
			
		||||
	../crypto/evp/e_aes.o \
 | 
			
		||||
	../crypto/evp/e_des3.o \
 | 
			
		||||
	../crypto/evp/e_null.o \
 | 
			
		||||
	../crypto/evp/m_sha1.o \
 | 
			
		||||
	../crypto/evp/m_dss1.o \
 | 
			
		||||
	../crypto/evp/m_dss.o \
 | 
			
		||||
	../crypto/evp/m_ecdsa.o \
 | 
			
		||||
	../crypto/hmac/hmac.o \
 | 
			
		||||
	../crypto/modes/cbc128.o \
 | 
			
		||||
	../crypto/modes/ccm128.o \
 | 
			
		||||
	../crypto/modes/cfb128.o \
 | 
			
		||||
	../crypto/modes/ctr128.o \
 | 
			
		||||
	../crypto/modes/gcm128.o \
 | 
			
		||||
	../crypto/modes/ofb128.o \
 | 
			
		||||
	../crypto/modes/xts128.o \
 | 
			
		||||
	../crypto/rsa/rsa_eay.o \
 | 
			
		||||
	../crypto/rsa/rsa_gen.o \
 | 
			
		||||
	../crypto/rsa/rsa_crpt.o \
 | 
			
		||||
	../crypto/rsa/rsa_none.o \
 | 
			
		||||
	../crypto/rsa/rsa_oaep.o \
 | 
			
		||||
	../crypto/rsa/rsa_pk1.o \
 | 
			
		||||
	../crypto/rsa/rsa_pss.o \
 | 
			
		||||
	../crypto/rsa/rsa_ssl.o \
 | 
			
		||||
	../crypto/rsa/rsa_x931.o \
 | 
			
		||||
	../crypto/rsa/rsa_x931g.o \
 | 
			
		||||
	../crypto/sha/sha1dgst.o \
 | 
			
		||||
	../crypto/sha/sha256.o \
 | 
			
		||||
	../crypto/sha/sha512.o \
 | 
			
		||||
	../crypto/thr_id.o \
 | 
			
		||||
	../crypto/uid.o
 | 
			
		||||
 | 
			
		||||
sub_all: build_all
 | 
			
		||||
build_all: build_libs build_apps build_tests build_tools
 | 
			
		||||
 | 
			
		||||
build_libs: build_crypto build_fips build_ssl build_engines
 | 
			
		||||
 | 
			
		||||
build_fips:
 | 
			
		||||
	@dir=fips; target=all; [ -z "$(FIPSCANLIB)" ] || $(BUILD_ONE_CMD)
 | 
			
		||||
build_libs: build_crypto build_ssl build_engines
 | 
			
		||||
 | 
			
		||||
build_crypto:
 | 
			
		||||
	if [ -n "$(FIPSCANLIB)" ]; then \
 | 
			
		||||
		EXCL_OBJ='$(AES_ENC) $(BN_ASM) $(DES_ENC) $(CPUID_OBJ) $(SHA1_ASM_OBJ) $(MODES_ASM_OBJ) $(FIPS_EX_OBJ)' ; export EXCL_OBJ ; \
 | 
			
		||||
		ARX='$(PERL) $${TOP}/util/arx.pl $(AR)' ; \
 | 
			
		||||
	else \
 | 
			
		||||
		ARX='${AR}' ; \
 | 
			
		||||
	fi ; export ARX ; \
 | 
			
		||||
	if [ $(FIPSCANISTERINTERNAL) = "y" ]; then \
 | 
			
		||||
		AS='$(PERL) $${TOP}/util/fipsas.pl $${TOP} $${<} $(CC) -c' ; \
 | 
			
		||||
	else \
 | 
			
		||||
		AS='$(CC) -c' ; \
 | 
			
		||||
	fi ; export AS ; \
 | 
			
		||||
		dir=crypto; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
	@dir=crypto; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
build_ssl:
 | 
			
		||||
	@dir=ssl; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
build_engines:
 | 
			
		||||
	@dir=engines; target=all; AS='$(CC) -c'; export AS; $(BUILD_ONE_CMD)
 | 
			
		||||
	@dir=engines; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
build_apps:
 | 
			
		||||
	@dir=apps; target=all; $(BUILD_ONE_CMD)
 | 
			
		||||
build_tests:
 | 
			
		||||
@@ -389,13 +289,21 @@ all_testapps: build_libs build_testapps
 | 
			
		||||
build_testapps:
 | 
			
		||||
	@dir=crypto; target=testapps; $(BUILD_ONE_CMD)
 | 
			
		||||
 | 
			
		||||
libcrypto$(SHLIB_EXT): libcrypto.a build_fips
 | 
			
		||||
fips_premain_dso$(EXE_EXT): libcrypto.a
 | 
			
		||||
	[ -z "$(FIPSCANLIB)" ] || $(CC) $(CFLAG) -Iinclude \
 | 
			
		||||
		-DFINGERPRINT_PREMAIN_DSO_LOAD -o $@  \
 | 
			
		||||
		$(FIPSLIBDIR)fips_premain.c $(FIPSLIBDIR)fipscanister.o \
 | 
			
		||||
		libcrypto.a $(EX_LIBS)
 | 
			
		||||
 | 
			
		||||
libcrypto$(SHLIB_EXT): libcrypto.a fips_premain_dso$(EXE_EXT)
 | 
			
		||||
	@if [ "$(SHLIB_TARGET)" != "" ]; then \
 | 
			
		||||
		if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \
 | 
			
		||||
			FIPSLD_CC="$(CC)"; CC=fips/fipsld; \
 | 
			
		||||
			export CC FIPSLD_CC; \
 | 
			
		||||
			FIPSLD_LIBCRYPTO=libcrypto.a ; \
 | 
			
		||||
			FIPSLD_CC="$(CC)"; CC=$(FIPSDIR)/bin/fipsld; \
 | 
			
		||||
			export CC FIPSLD_CC FIPSLD_LIBCRYPTO; \
 | 
			
		||||
		fi; \
 | 
			
		||||
		$(MAKE) -e SHLIBDIRS=crypto build-shared; \
 | 
			
		||||
		$(MAKE) -e SHLIBDIRS=crypto  CC="$${CC:-$(CC)}" build-shared; \
 | 
			
		||||
		touch -c fips_premain_dso$(EXE_EXT); \
 | 
			
		||||
	else \
 | 
			
		||||
		echo "There's no support for shared libraries on this platform" >&2; \
 | 
			
		||||
		exit 1; \
 | 
			
		||||
@@ -418,7 +326,7 @@ clean-shared:
 | 
			
		||||
			done; \
 | 
			
		||||
		fi; \
 | 
			
		||||
		( set -x; rm -f lib$$i$(SHLIB_EXT) ); \
 | 
			
		||||
		if [ "$(PLATFORM)" = "Cygwin" ]; then \
 | 
			
		||||
		if expr "$(PLATFORM)" : "Cygwin" >/dev/null; then \
 | 
			
		||||
			( set -x; rm -f cyg$$i$(SHLIB_EXT) lib$$i$(SHLIB_EXT).a ); \
 | 
			
		||||
		fi; \
 | 
			
		||||
	done
 | 
			
		||||
@@ -457,7 +365,8 @@ libcrypto.pc: Makefile
 | 
			
		||||
	    echo 'Description: OpenSSL cryptography library'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lcrypto'; \
 | 
			
		||||
	    echo 'Libs.private: $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc
 | 
			
		||||
 | 
			
		||||
libssl.pc: Makefile
 | 
			
		||||
@@ -470,7 +379,8 @@ libssl.pc: Makefile
 | 
			
		||||
	    echo 'Description: Secure Sockets Layer and cryptography libraries'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto'; \
 | 
			
		||||
	    echo 'Libs.private: $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc
 | 
			
		||||
 | 
			
		||||
openssl.pc: Makefile
 | 
			
		||||
@@ -483,7 +393,8 @@ openssl.pc: Makefile
 | 
			
		||||
	    echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \
 | 
			
		||||
	    echo 'Version: '$(VERSION); \
 | 
			
		||||
	    echo 'Requires: '; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Libs: -L$${libdir} -lssl -lcrypto'; \
 | 
			
		||||
	    echo 'Libs.private: $(EX_LIBS)'; \
 | 
			
		||||
	    echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > openssl.pc
 | 
			
		||||
 | 
			
		||||
Makefile: Makefile.org Configure config
 | 
			
		||||
@@ -492,7 +403,7 @@ Makefile: Makefile.org Configure config
 | 
			
		||||
	@false
 | 
			
		||||
 | 
			
		||||
libclean:
 | 
			
		||||
	rm -f *.map *.so *.so.* *.dll engines/*.so engines/*.dll *.a engines/*.a */lib */*/lib
 | 
			
		||||
	rm -f *.map *.so *.so.* *.dylib *.dll engines/*.so engines/*.dll engines/*.dylib *.a engines/*.a */lib */*/lib
 | 
			
		||||
 | 
			
		||||
clean:	libclean
 | 
			
		||||
	rm -f shlib/*.o *.o core a.out fluff rehash.time testlog make.log cctest cctest.c
 | 
			
		||||
@@ -518,9 +429,6 @@ links:
 | 
			
		||||
	@$(PERL) $(TOP)/util/mkdir-p.pl include/openssl
 | 
			
		||||
	@$(PERL) $(TOP)/util/mklink.pl include/openssl $(EXHEADER)
 | 
			
		||||
	@set -e; target=links; $(RECURSIVE_BUILD_CMD)
 | 
			
		||||
	@if [ -z "$(FIPSCANLIB)" ]; then \
 | 
			
		||||
		set -e; target=links; dir=fips ; $(BUILD_CMD) ; \
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
gentests:
 | 
			
		||||
	@(cd test && echo "generating dummy tests (if needed)..." && \
 | 
			
		||||
@@ -537,7 +445,7 @@ rehash.time: certs apps
 | 
			
		||||
		[ -x "apps/openssl.exe" ] && OPENSSL="apps/openssl.exe" || :; \
 | 
			
		||||
		OPENSSL_DEBUG_MEMORY=on; \
 | 
			
		||||
		export OPENSSL OPENSSL_DEBUG_MEMORY; \
 | 
			
		||||
		$(PERL) tools/c_rehash certs) && \
 | 
			
		||||
		$(PERL) tools/c_rehash certs/demo) && \
 | 
			
		||||
		touch rehash.time; \
 | 
			
		||||
	else :; fi
 | 
			
		||||
 | 
			
		||||
@@ -562,9 +470,9 @@ tags:
 | 
			
		||||
	find . -name '[^.]*.[ch]' | xargs etags -a
 | 
			
		||||
 | 
			
		||||
errors:
 | 
			
		||||
	$(PERL) util/ck_errf.pl -strict */*.c */*/*.c
 | 
			
		||||
	$(PERL) util/mkerr.pl -recurse -write
 | 
			
		||||
	(cd engines; $(MAKE) PERL=$(PERL) errors)
 | 
			
		||||
	$(PERL) util/ck_errf.pl -strict */*.c */*/*.c
 | 
			
		||||
 | 
			
		||||
stacks:
 | 
			
		||||
	$(PERL) util/mkstack.pl -write
 | 
			
		||||
@@ -663,7 +571,7 @@ install_sw:
 | 
			
		||||
		do \
 | 
			
		||||
			if [ -f "$$i" -o -f "$$i.a" ]; then \
 | 
			
		||||
			(       echo installing $$i; \
 | 
			
		||||
				if [ "$(PLATFORM)" != "Cygwin" ]; then \
 | 
			
		||||
				if ! expr "$(PLATFORM)" : "Cygwin" >/dev/null; then \
 | 
			
		||||
					cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \
 | 
			
		||||
					chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \
 | 
			
		||||
					mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i; \
 | 
			
		||||
@@ -735,9 +643,9 @@ install_docs:
 | 
			
		||||
	@pod2man="`cd ./util; ./pod2mantest $(PERL)`"; \
 | 
			
		||||
	here="`pwd`"; \
 | 
			
		||||
	filecase=; \
 | 
			
		||||
	if [ "$(PLATFORM)" = "DJGPP" -o "$(PLATFORM)" = "Cygwin" -o "$(PLATFORM)" = "mingw" ]; then \
 | 
			
		||||
	case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*) \
 | 
			
		||||
		filecase=-i; \
 | 
			
		||||
	fi; \
 | 
			
		||||
	esac; \
 | 
			
		||||
	set -e; for i in doc/apps/*.pod; do \
 | 
			
		||||
		fn=`basename $$i .pod`; \
 | 
			
		||||
		sec=`$(PERL) util/extract-section.pl 1 < $$i`; \
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										244
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										244
									
								
								NEWS
									
									
									
									
									
								
							@@ -5,11 +5,110 @@
 | 
			
		||||
  This file gives a brief overview of the major changes between each OpenSSL
 | 
			
		||||
  release. For more details please read the CHANGES file.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0c and OpenSSL 1.0.0d:
 | 
			
		||||
  Major changes between OpenSSL 1.0.1f and OpenSSL 1.0.2 [under development]:
 | 
			
		||||
 | 
			
		||||
      o Suite B support for TLS 1.2 and DTLS 1.2
 | 
			
		||||
      o Support for DTLS 1.2
 | 
			
		||||
      o TLS automatic EC curve selection.
 | 
			
		||||
      o API to set TLS supported signature algorithms and curves
 | 
			
		||||
      o SSL_CONF configuration API.
 | 
			
		||||
      o TLS Brainpool support.
 | 
			
		||||
      o ALPN support.
 | 
			
		||||
      o CMS support for RSA-PSS, RSA-OAEP, ECDH and X9.42 DH.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.1e and OpenSSL 1.0.1f [6 Jan 2014]
 | 
			
		||||
 | 
			
		||||
      o Don't include gmt_unix_time in TLS server and client random values
 | 
			
		||||
      o Fix for TLS record tampering bug CVE-2013-4353
 | 
			
		||||
      o Fix for TLS version checking bug CVE-2013-6449
 | 
			
		||||
      o Fix for DTLS retransmission bug CVE-2013-6450
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.1d and OpenSSL 1.0.1e [11 Feb 2013]:
 | 
			
		||||
 | 
			
		||||
      o Corrected fix for CVE-2013-0169
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.1c and OpenSSL 1.0.1d [4 Feb 2013]:
 | 
			
		||||
 | 
			
		||||
      o Fix renegotiation in TLS 1.1, 1.2 by using the correct TLS version.
 | 
			
		||||
      o Include the fips configuration module.
 | 
			
		||||
      o Fix OCSP bad key DoS attack CVE-2013-0166
 | 
			
		||||
      o Fix for SSL/TLS/DTLS CBC plaintext recovery attack CVE-2013-0169
 | 
			
		||||
      o Fix for TLS AESNI record handling flaw CVE-2012-2686
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.1b and OpenSSL 1.0.1c [10 May 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix TLS/DTLS record length checking bug CVE-2012-2333
 | 
			
		||||
      o Don't attempt to use non-FIPS composite ciphers in FIPS mode.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.1a and OpenSSL 1.0.1b [26 Apr 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix compilation error on non-x86 platforms.
 | 
			
		||||
      o Make FIPS capable OpenSSL ciphers work in non-FIPS mode.
 | 
			
		||||
      o Fix SSL_OP_NO_TLSv1_1 clash with SSL_OP_ALL in OpenSSL 1.0.0
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.1 and OpenSSL 1.0.1a [19 Apr 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for ASN1 overflow bug CVE-2012-2110
 | 
			
		||||
      o Workarounds for some servers that hang on long client hellos.
 | 
			
		||||
      o Fix SEGV in AES code.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.1 [14 Mar 2012]:
 | 
			
		||||
 | 
			
		||||
      o TLS/DTLS heartbeat support.
 | 
			
		||||
      o SCTP support.
 | 
			
		||||
      o RFC 5705 TLS key material exporter.
 | 
			
		||||
      o RFC 5764 DTLS-SRTP negotiation.
 | 
			
		||||
      o Next Protocol Negotiation.
 | 
			
		||||
      o PSS signatures in certificates, requests and CRLs.
 | 
			
		||||
      o Support for password based recipient info for CMS.
 | 
			
		||||
      o Support TLS v1.2 and TLS v1.1.
 | 
			
		||||
      o Preliminary FIPS capability for unvalidated 2.0 FIPS module.
 | 
			
		||||
      o SRP support.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0j and OpenSSL 1.0.0k [5 Feb 2013]:
 | 
			
		||||
 | 
			
		||||
      o Fix for SSL/TLS/DTLS CBC plaintext recovery attack CVE-2013-0169
 | 
			
		||||
      o Fix OCSP bad key DoS attack CVE-2013-0166
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0i and OpenSSL 1.0.0j [10 May 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix DTLS record length checking bug CVE-2012-2333
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.0i [19 Apr 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for ASN1 overflow bug CVE-2012-2110
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0g and OpenSSL 1.0.0h [12 Mar 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for CMS/PKCS#7 MMA CVE-2012-0884
 | 
			
		||||
      o Corrected fix for CVE-2011-4619
 | 
			
		||||
      o Various DTLS fixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0f and OpenSSL 1.0.0g [18 Jan 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for DTLS DoS issue CVE-2012-0050
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0e and OpenSSL 1.0.0f [4 Jan 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for DTLS plaintext recovery attack CVE-2011-4108
 | 
			
		||||
      o Clear block padding bytes of SSL 3.0 records CVE-2011-4576
 | 
			
		||||
      o Only allow one SGC handshake restart for SSL/TLS CVE-2011-4619
 | 
			
		||||
      o Check parameters are not NULL in GOST ENGINE CVE-2012-0027
 | 
			
		||||
      o Check for malformed RFC3779 data CVE-2011-4577
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0d and OpenSSL 1.0.0e [6 Sep 2011]:
 | 
			
		||||
 | 
			
		||||
      o Fix for CRL vulnerability issue CVE-2011-3207
 | 
			
		||||
      o Fix for ECDH crashes CVE-2011-3210
 | 
			
		||||
      o Protection against EC timing attacks.
 | 
			
		||||
      o Support ECDH ciphersuites for certificates using SHA2 algorithms.
 | 
			
		||||
      o Various DTLS fixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0c and OpenSSL 1.0.0d [8 Feb 2011]:
 | 
			
		||||
 | 
			
		||||
      o Fix for security issue CVE-2011-0014
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0b and OpenSSL 1.0.0c:
 | 
			
		||||
  Major changes between OpenSSL 1.0.0b and OpenSSL 1.0.0c [2 Dec 2010]:
 | 
			
		||||
 | 
			
		||||
      o Fix for security issue CVE-2010-4180
 | 
			
		||||
      o Fix for CVE-2010-4252
 | 
			
		||||
@@ -17,18 +116,18 @@
 | 
			
		||||
      o Fix various platform compilation issues.
 | 
			
		||||
      o Corrected fix for security issue CVE-2010-3864.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0a and OpenSSL 1.0.0b:
 | 
			
		||||
  Major changes between OpenSSL 1.0.0a and OpenSSL 1.0.0b [16 Nov 2010]:
 | 
			
		||||
 | 
			
		||||
      o Fix for security issue CVE-2010-3864.
 | 
			
		||||
      o Fix for CVE-2010-2939
 | 
			
		||||
      o Fix WIN32 build system for GOST ENGINE.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 1.0.0 and OpenSSL 1.0.0a:
 | 
			
		||||
  Major changes between OpenSSL 1.0.0 and OpenSSL 1.0.0a [1 Jun 2010]:
 | 
			
		||||
 | 
			
		||||
      o Fix for security issue CVE-2010-1633.
 | 
			
		||||
      o GOST MAC and CFB fixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8n and OpenSSL 1.0.0:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8n and OpenSSL 1.0.0 [29 Mar 2010]:
 | 
			
		||||
 | 
			
		||||
      o RFC3280 path validation: sufficient to process PKITS tests.
 | 
			
		||||
      o Integrated support for PVK files and keyblobs.
 | 
			
		||||
@@ -51,20 +150,55 @@
 | 
			
		||||
      o Opaque PRF Input TLS extension support.
 | 
			
		||||
      o Updated time routines to avoid OS limitations.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8q and OpenSSL 0.9.8r:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8x and OpenSSL 0.9.8y [5 Feb 2013]:
 | 
			
		||||
 | 
			
		||||
      o Fix for SSL/TLS/DTLS CBC plaintext recovery attack CVE-2013-0169
 | 
			
		||||
      o Fix OCSP bad key DoS attack CVE-2013-0166
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8w and OpenSSL 0.9.8x [10 May 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix DTLS record length checking bug CVE-2012-2333
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8v and OpenSSL 0.9.8w [23 Apr 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for CVE-2012-2131 (corrected fix for 0.9.8 and CVE-2012-2110)
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8u and OpenSSL 0.9.8v [19 Apr 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for ASN1 overflow bug CVE-2012-2110
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8t and OpenSSL 0.9.8u [12 Mar 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for CMS/PKCS#7 MMA CVE-2012-0884
 | 
			
		||||
      o Corrected fix for CVE-2011-4619
 | 
			
		||||
      o Various DTLS fixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8s and OpenSSL 0.9.8t [18 Jan 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for DTLS DoS issue CVE-2012-0050
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8r and OpenSSL 0.9.8s [4 Jan 2012]:
 | 
			
		||||
 | 
			
		||||
      o Fix for DTLS plaintext recovery attack CVE-2011-4108
 | 
			
		||||
      o Fix policy check double free error CVE-2011-4109
 | 
			
		||||
      o Clear block padding bytes of SSL 3.0 records CVE-2011-4576
 | 
			
		||||
      o Only allow one SGC handshake restart for SSL/TLS CVE-2011-4619
 | 
			
		||||
      o Check for malformed RFC3779 data CVE-2011-4577
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8q and OpenSSL 0.9.8r [8 Feb 2011]:
 | 
			
		||||
 | 
			
		||||
      o Fix for security issue CVE-2011-0014
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8p and OpenSSL 0.9.8q:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8p and OpenSSL 0.9.8q [2 Dec 2010]:
 | 
			
		||||
 | 
			
		||||
      o Fix for security issue CVE-2010-4180
 | 
			
		||||
      o Fix for CVE-2010-4252
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8o and OpenSSL 0.9.8p:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8o and OpenSSL 0.9.8p [16 Nov 2010]:
 | 
			
		||||
 | 
			
		||||
      o Fix for security issue CVE-2010-3864.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8n and OpenSSL 0.9.8o:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8n and OpenSSL 0.9.8o [1 Jun 2010]:
 | 
			
		||||
 | 
			
		||||
      o Fix for security issue CVE-2010-0742.
 | 
			
		||||
      o Various DTLS fixes.
 | 
			
		||||
@@ -72,12 +206,12 @@
 | 
			
		||||
      o Fix for no-rc4 compilation.
 | 
			
		||||
      o Chil ENGINE unload workaround.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8m and OpenSSL 0.9.8n:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8m and OpenSSL 0.9.8n [24 Mar 2010]:
 | 
			
		||||
 | 
			
		||||
      o CFB cipher definition fixes.
 | 
			
		||||
      o Fix security issues CVE-2010-0740 and CVE-2010-0433.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8l and OpenSSL 0.9.8m:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8l and OpenSSL 0.9.8m [25 Feb 2010]:
 | 
			
		||||
 | 
			
		||||
      o Cipher definition fixes.
 | 
			
		||||
      o Workaround for slow RAND_poll() on some WIN32 versions.
 | 
			
		||||
@@ -89,33 +223,33 @@
 | 
			
		||||
      o Ticket and SNI coexistence fixes.
 | 
			
		||||
      o Many fixes to DTLS handling. 
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8k and OpenSSL 0.9.8l:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8k and OpenSSL 0.9.8l [5 Nov 2009]:
 | 
			
		||||
 | 
			
		||||
      o Temporary work around for CVE-2009-3555: disable renegotiation.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8j and OpenSSL 0.9.8k:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8j and OpenSSL 0.9.8k [25 Mar 2009]:
 | 
			
		||||
 | 
			
		||||
      o Fix various build issues.
 | 
			
		||||
      o Fix security issues (CVE-2009-0590, CVE-2009-0591, CVE-2009-0789)
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8i and OpenSSL 0.9.8j:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8i and OpenSSL 0.9.8j [7 Jan 2009]:
 | 
			
		||||
 | 
			
		||||
      o Fix security issue (CVE-2008-5077)
 | 
			
		||||
      o Merge FIPS 140-2 branch code.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8g and OpenSSL 0.9.8h:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8g and OpenSSL 0.9.8h [28 May 2008]:
 | 
			
		||||
 | 
			
		||||
      o CryptoAPI ENGINE support.
 | 
			
		||||
      o Various precautionary measures.
 | 
			
		||||
      o Fix for bugs affecting certificate request creation.
 | 
			
		||||
      o Support for local machine keyset attribute in PKCS#12 files.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8f and OpenSSL 0.9.8g:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8f and OpenSSL 0.9.8g [19 Oct 2007]:
 | 
			
		||||
 | 
			
		||||
      o Backport of CMS functionality to 0.9.8.
 | 
			
		||||
      o Fixes for bugs introduced with 0.9.8f.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8e and OpenSSL 0.9.8f:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8e and OpenSSL 0.9.8f [11 Oct 2007]:
 | 
			
		||||
 | 
			
		||||
      o Add gcc 4.2 support.
 | 
			
		||||
      o Add support for AES and SSE2 assembly lanugauge optimization
 | 
			
		||||
@@ -126,23 +260,23 @@
 | 
			
		||||
      o RFC4507bis support.
 | 
			
		||||
      o TLS Extensions support.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8d and OpenSSL 0.9.8e:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8d and OpenSSL 0.9.8e [23 Feb 2007]:
 | 
			
		||||
 | 
			
		||||
      o Various ciphersuite selection fixes.
 | 
			
		||||
      o RFC3779 support.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8c and OpenSSL 0.9.8d:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8c and OpenSSL 0.9.8d [28 Sep 2006]:
 | 
			
		||||
 | 
			
		||||
      o Introduce limits to prevent malicious key DoS  (CVE-2006-2940)
 | 
			
		||||
      o Fix security issues (CVE-2006-2937, CVE-2006-3737, CVE-2006-4343)
 | 
			
		||||
      o Changes to ciphersuite selection algorithm
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8b and OpenSSL 0.9.8c:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8b and OpenSSL 0.9.8c [5 Sep 2006]:
 | 
			
		||||
 | 
			
		||||
      o Fix Daniel Bleichenbacher forged signature attack, CVE-2006-4339
 | 
			
		||||
      o New cipher Camellia
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8a and OpenSSL 0.9.8b:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8a and OpenSSL 0.9.8b [4 May 2006]:
 | 
			
		||||
 | 
			
		||||
      o Cipher string fixes.
 | 
			
		||||
      o Fixes for VC++ 2005.
 | 
			
		||||
@@ -152,12 +286,12 @@
 | 
			
		||||
      o Built in dynamic engine compilation support on Win32.
 | 
			
		||||
      o Fixes auto dynamic engine loading in Win32.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.8 and OpenSSL 0.9.8a:
 | 
			
		||||
  Major changes between OpenSSL 0.9.8 and OpenSSL 0.9.8a [11 Oct 2005]:
 | 
			
		||||
 | 
			
		||||
      o Fix potential SSL 2.0 rollback, CVE-2005-2969
 | 
			
		||||
      o Extended Windows CE support
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.8:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.8 [5 Jul 2005]:
 | 
			
		||||
 | 
			
		||||
      o Major work on the BIGNUM library for higher efficiency and to
 | 
			
		||||
        make operations more streamlined and less contradictory.  This
 | 
			
		||||
@@ -231,36 +365,36 @@
 | 
			
		||||
      o Added initial support for Win64.
 | 
			
		||||
      o Added alternate pkg-config files.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7l and OpenSSL 0.9.7m:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7l and OpenSSL 0.9.7m [23 Feb 2007]:
 | 
			
		||||
 | 
			
		||||
      o FIPS 1.1.1 module linking.
 | 
			
		||||
      o Various ciphersuite selection fixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7k and OpenSSL 0.9.7l:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7k and OpenSSL 0.9.7l [28 Sep 2006]:
 | 
			
		||||
 | 
			
		||||
      o Introduce limits to prevent malicious key DoS  (CVE-2006-2940)
 | 
			
		||||
      o Fix security issues (CVE-2006-2937, CVE-2006-3737, CVE-2006-4343)
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7j and OpenSSL 0.9.7k:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7j and OpenSSL 0.9.7k [5 Sep 2006]:
 | 
			
		||||
 | 
			
		||||
      o Fix Daniel Bleichenbacher forged signature attack, CVE-2006-4339
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7i and OpenSSL 0.9.7j:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7i and OpenSSL 0.9.7j [4 May 2006]:
 | 
			
		||||
 | 
			
		||||
      o Visual C++ 2005 fixes.
 | 
			
		||||
      o Update Windows build system for FIPS.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7h and OpenSSL 0.9.7i:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7h and OpenSSL 0.9.7i [14 Oct 2005]:
 | 
			
		||||
 | 
			
		||||
      o Give EVP_MAX_MD_SIZE it's old value, except for a FIPS build.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.7h:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.7h [11 Oct 2005]:
 | 
			
		||||
 | 
			
		||||
      o Fix SSL 2.0 Rollback, CVE-2005-2969
 | 
			
		||||
      o Allow use of fixed-length exponent on DSA signing
 | 
			
		||||
      o Default fixed-window RSA, DSA, DH private-key operations
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7f and OpenSSL 0.9.7g:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7f and OpenSSL 0.9.7g [11 Apr 2005]:
 | 
			
		||||
 | 
			
		||||
      o More compilation issues fixed.
 | 
			
		||||
      o Adaptation to more modern Kerberos API.
 | 
			
		||||
@@ -269,7 +403,7 @@
 | 
			
		||||
      o More constification.
 | 
			
		||||
      o Added processing of proxy certificates (RFC 3820).
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7e and OpenSSL 0.9.7f:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7e and OpenSSL 0.9.7f [22 Mar 2005]:
 | 
			
		||||
 | 
			
		||||
      o Several compilation issues fixed.
 | 
			
		||||
      o Many memory allocation failure checks added.
 | 
			
		||||
@@ -277,12 +411,12 @@
 | 
			
		||||
      o Mandatory basic checks on certificates.
 | 
			
		||||
      o Performance improvements.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7d and OpenSSL 0.9.7e:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7d and OpenSSL 0.9.7e [25 Oct 2004]:
 | 
			
		||||
 | 
			
		||||
      o Fix race condition in CRL checking code.
 | 
			
		||||
      o Fixes to PKCS#7 (S/MIME) code.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7c and OpenSSL 0.9.7d:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7c and OpenSSL 0.9.7d [17 Mar 2004]:
 | 
			
		||||
 | 
			
		||||
      o Security: Fix Kerberos ciphersuite SSL/TLS handshaking bug
 | 
			
		||||
      o Security: Fix null-pointer assignment in do_change_cipher_spec()
 | 
			
		||||
@@ -290,14 +424,14 @@
 | 
			
		||||
      o Multiple X509 verification fixes
 | 
			
		||||
      o Speed up HMAC and other operations
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7b and OpenSSL 0.9.7c:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7b and OpenSSL 0.9.7c [30 Sep 2003]:
 | 
			
		||||
 | 
			
		||||
      o Security: fix various ASN1 parsing bugs.
 | 
			
		||||
      o New -ignore_err option to OCSP utility.
 | 
			
		||||
      o Various interop and bug fixes in S/MIME code.
 | 
			
		||||
      o SSL/TLS protocol fix for unrequested client certificates.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7a and OpenSSL 0.9.7b:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7a and OpenSSL 0.9.7b [10 Apr 2003]:
 | 
			
		||||
 | 
			
		||||
      o Security: counter the Klima-Pokorny-Rosa extension of
 | 
			
		||||
        Bleichbacher's attack 
 | 
			
		||||
@@ -308,7 +442,7 @@
 | 
			
		||||
      o ASN.1: treat domainComponent correctly.
 | 
			
		||||
      o Documentation: fixes and additions.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.7 and OpenSSL 0.9.7a:
 | 
			
		||||
  Major changes between OpenSSL 0.9.7 and OpenSSL 0.9.7a [19 Feb 2003]:
 | 
			
		||||
 | 
			
		||||
      o Security: Important security related bugfixes.
 | 
			
		||||
      o Enhanced compatibility with MIT Kerberos.
 | 
			
		||||
@@ -319,7 +453,7 @@
 | 
			
		||||
      o SSL/TLS: now handles manual certificate chain building.
 | 
			
		||||
      o SSL/TLS: certain session ID malfunctions corrected.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.7:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.7 [30 Dec 2002]:
 | 
			
		||||
 | 
			
		||||
      o New library section OCSP.
 | 
			
		||||
      o Complete rewrite of ASN1 code.
 | 
			
		||||
@@ -365,23 +499,23 @@
 | 
			
		||||
      o SSL/TLS: add callback to retrieve SSL/TLS messages.
 | 
			
		||||
      o SSL/TLS: support AES cipher suites (RFC3268).
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6j and OpenSSL 0.9.6k:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6j and OpenSSL 0.9.6k [30 Sep 2003]:
 | 
			
		||||
 | 
			
		||||
      o Security: fix various ASN1 parsing bugs.
 | 
			
		||||
      o SSL/TLS protocol fix for unrequested client certificates.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6i and OpenSSL 0.9.6j:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6i and OpenSSL 0.9.6j [10 Apr 2003]:
 | 
			
		||||
 | 
			
		||||
      o Security: counter the Klima-Pokorny-Rosa extension of
 | 
			
		||||
        Bleichbacher's attack 
 | 
			
		||||
      o Security: make RSA blinding default.
 | 
			
		||||
      o Build: shared library support fixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6h and OpenSSL 0.9.6i:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6h and OpenSSL 0.9.6i [19 Feb 2003]:
 | 
			
		||||
 | 
			
		||||
      o Important security related bugfixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6g and OpenSSL 0.9.6h:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6g and OpenSSL 0.9.6h [5 Dec 2002]:
 | 
			
		||||
 | 
			
		||||
      o New configuration targets for Tandem OSS and A/UX.
 | 
			
		||||
      o New OIDs for Microsoft attributes.
 | 
			
		||||
@@ -395,25 +529,25 @@
 | 
			
		||||
      o Fixes for smaller building problems.
 | 
			
		||||
      o Updates of manuals, FAQ and other instructive documents.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6f and OpenSSL 0.9.6g:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6f and OpenSSL 0.9.6g [9 Aug 2002]:
 | 
			
		||||
 | 
			
		||||
      o Important building fixes on Unix.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6e and OpenSSL 0.9.6f:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6e and OpenSSL 0.9.6f [8 Aug 2002]:
 | 
			
		||||
 | 
			
		||||
      o Various important bugfixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6d and OpenSSL 0.9.6e:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6d and OpenSSL 0.9.6e [30 Jul 2002]:
 | 
			
		||||
 | 
			
		||||
      o Important security related bugfixes.
 | 
			
		||||
      o Various SSL/TLS library bugfixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6c and OpenSSL 0.9.6d:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6c and OpenSSL 0.9.6d [9 May 2002]:
 | 
			
		||||
 | 
			
		||||
      o Various SSL/TLS library bugfixes.
 | 
			
		||||
      o Fix DH parameter generation for 'non-standard' generators.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6b and OpenSSL 0.9.6c:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6b and OpenSSL 0.9.6c [21 Dec 2001]:
 | 
			
		||||
 | 
			
		||||
      o Various SSL/TLS library bugfixes.
 | 
			
		||||
      o BIGNUM library fixes.
 | 
			
		||||
@@ -426,7 +560,7 @@
 | 
			
		||||
        Broadcom and Cryptographic Appliance's keyserver
 | 
			
		||||
        [in 0.9.6c-engine release].
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6a and OpenSSL 0.9.6b:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6a and OpenSSL 0.9.6b [9 Jul 2001]:
 | 
			
		||||
 | 
			
		||||
      o Security fix: PRNG improvements.
 | 
			
		||||
      o Security fix: RSA OAEP check.
 | 
			
		||||
@@ -443,7 +577,7 @@
 | 
			
		||||
      o Increase default size for BIO buffering filter.
 | 
			
		||||
      o Compatibility fixes in some scripts.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.6a:
 | 
			
		||||
  Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.6a [5 Apr 2001]:
 | 
			
		||||
 | 
			
		||||
      o Security fix: change behavior of OpenSSL to avoid using
 | 
			
		||||
        environment variables when running as root.
 | 
			
		||||
@@ -468,7 +602,7 @@
 | 
			
		||||
      o New function BN_rand_range().
 | 
			
		||||
      o Add "-rand" option to openssl s_client and s_server.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.5a and OpenSSL 0.9.6:
 | 
			
		||||
  Major changes between OpenSSL 0.9.5a and OpenSSL 0.9.6 [10 Oct 2000]:
 | 
			
		||||
 | 
			
		||||
      o Some documentation for BIO and SSL libraries.
 | 
			
		||||
      o Enhanced chain verification using key identifiers.
 | 
			
		||||
@@ -483,7 +617,7 @@
 | 
			
		||||
    [1] The support for external crypto devices is currently a separate
 | 
			
		||||
        distribution.  See the file README.ENGINE.
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.5 and OpenSSL 0.9.5a:
 | 
			
		||||
  Major changes between OpenSSL 0.9.5 and OpenSSL 0.9.5a [1 Apr 2000]:
 | 
			
		||||
 | 
			
		||||
      o Bug fixes for Win32, SuSE Linux, NeXTSTEP and FreeBSD 2.2.8 
 | 
			
		||||
      o Shared library support for HPUX and Solaris-gcc
 | 
			
		||||
@@ -492,7 +626,7 @@
 | 
			
		||||
      o New 'rand' application
 | 
			
		||||
      o New way to check for existence of algorithms from scripts
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.4 and OpenSSL 0.9.5:
 | 
			
		||||
  Major changes between OpenSSL 0.9.4 and OpenSSL 0.9.5 [25 May 2000]:
 | 
			
		||||
 | 
			
		||||
      o S/MIME support in new 'smime' command
 | 
			
		||||
      o Documentation for the OpenSSL command line application
 | 
			
		||||
@@ -528,7 +662,7 @@
 | 
			
		||||
      o Enhanced support for Alpha Linux
 | 
			
		||||
      o Experimental MacOS support
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.3 and OpenSSL 0.9.4:
 | 
			
		||||
  Major changes between OpenSSL 0.9.3 and OpenSSL 0.9.4 [9 Aug 1999]:
 | 
			
		||||
 | 
			
		||||
      o Transparent support for PKCS#8 format private keys: these are used
 | 
			
		||||
        by several software packages and are more secure than the standard
 | 
			
		||||
@@ -539,7 +673,7 @@
 | 
			
		||||
      o New pipe-like BIO that allows using the SSL library when actual I/O
 | 
			
		||||
        must be handled by the application (BIO pair)
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.2b and OpenSSL 0.9.3:
 | 
			
		||||
  Major changes between OpenSSL 0.9.2b and OpenSSL 0.9.3 [24 May 1999]:
 | 
			
		||||
      o Lots of enhancements and cleanups to the Configuration mechanism
 | 
			
		||||
      o RSA OEAP related fixes
 | 
			
		||||
      o Added `openssl ca -revoke' option for revoking a certificate
 | 
			
		||||
@@ -553,7 +687,7 @@
 | 
			
		||||
      o Sparc assembler bignum implementation, optimized hash functions
 | 
			
		||||
      o Option to disable selected ciphers
 | 
			
		||||
 | 
			
		||||
  Major changes between OpenSSL 0.9.1c and OpenSSL 0.9.2b:
 | 
			
		||||
  Major changes between OpenSSL 0.9.1c and OpenSSL 0.9.2b [22 Mar 1999]:
 | 
			
		||||
      o Fixed a security hole related to session resumption
 | 
			
		||||
      o Fixed RSA encryption routines for the p < q case
 | 
			
		||||
      o "ALL" in cipher lists now means "everything except NULL ciphers"
 | 
			
		||||
@@ -575,7 +709,7 @@
 | 
			
		||||
      o Lots of memory leak fixes.
 | 
			
		||||
      o Lots of bug fixes.
 | 
			
		||||
 | 
			
		||||
  Major changes between SSLeay 0.9.0b and OpenSSL 0.9.1c:
 | 
			
		||||
  Major changes between SSLeay 0.9.0b and OpenSSL 0.9.1c [23 Dec 1998]:
 | 
			
		||||
      o Integration of the popular NO_RSA/NO_DSA patches
 | 
			
		||||
      o Initial support for compression inside the SSL record layer
 | 
			
		||||
      o Added BIO proxy and filtering functionality
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								PROBLEMS
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								PROBLEMS
									
									
									
									
									
								
							@@ -197,3 +197,17 @@ reconfigure with additional no-sse2 [or 386] option passed to ./config.
 | 
			
		||||
We don't have framework to associate -ldl with no-dso, therefore the only
 | 
			
		||||
way is to edit Makefile right after ./config no-dso and remove -ldl from
 | 
			
		||||
EX_LIBS line.
 | 
			
		||||
 | 
			
		||||
* hpux-parisc2-cc no-asm build fails with SEGV in ECDSA/DH.
 | 
			
		||||
 | 
			
		||||
Compiler bug, presumably at particular patch level. Remaining
 | 
			
		||||
hpux*-parisc*-cc configurations can be affected too. Drop optimization
 | 
			
		||||
level to +O2 when compiling bn_nist.o.
 | 
			
		||||
 | 
			
		||||
* solaris64-sparcv9-cc link failure
 | 
			
		||||
 | 
			
		||||
Solaris 8 ar can fail to maintain symbol table in .a, which results in
 | 
			
		||||
link failures. Apply 109147-09 or later or modify Makefile generated
 | 
			
		||||
by ./Configure solaris64-sparcv9-cc and replace RANLIB assignment with
 | 
			
		||||
 | 
			
		||||
	RANLIB= /usr/ccs/bin/ar rs
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										30
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								README
									
									
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
 | 
			
		||||
 OpenSSL 1.1.0-dev
 | 
			
		||||
 OpenSSL 1.0.2-beta1 24 Feb 2014
 | 
			
		||||
 | 
			
		||||
 Copyright (c) 1998-2011 The OpenSSL Project
 | 
			
		||||
 Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
 | 
			
		||||
@@ -90,32 +90,6 @@
 | 
			
		||||
        SSL/TLS Client and Server Tests
 | 
			
		||||
        Handling of S/MIME signed or encrypted mail
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 PATENTS
 | 
			
		||||
 -------
 | 
			
		||||
 | 
			
		||||
 Various companies hold various patents for various algorithms in various
 | 
			
		||||
 locations around the world. _YOU_ are responsible for ensuring that your use
 | 
			
		||||
 of any algorithms is legal by checking if there are any patents in your
 | 
			
		||||
 country.  The file contains some of the patents that we know about or are
 | 
			
		||||
 rumored to exist. This is not a definitive list.
 | 
			
		||||
 | 
			
		||||
 RSA Security holds software patents on the RC5 algorithm.  If you
 | 
			
		||||
 intend to use this cipher, you must contact RSA Security for
 | 
			
		||||
 licensing conditions. Their web page is http://www.rsasecurity.com/.
 | 
			
		||||
 | 
			
		||||
 RC4 is a trademark of RSA Security, so use of this label should perhaps
 | 
			
		||||
 only be used with RSA Security's permission.
 | 
			
		||||
 | 
			
		||||
 The IDEA algorithm is patented by Ascom in Austria, France, Germany, Italy,
 | 
			
		||||
 Japan, the Netherlands, Spain, Sweden, Switzerland, UK and the USA.  They
 | 
			
		||||
 should be contacted if that algorithm is to be used; their web page is
 | 
			
		||||
 http://www.ascom.ch/.
 | 
			
		||||
 | 
			
		||||
 NTT and Mitsubishi have patents and pending patents on the Camellia
 | 
			
		||||
 algorithm, but allow use at no charge without requiring an explicit
 | 
			
		||||
 licensing agreement: http://info.isl.ntt.co.jp/crypt/eng/info/chiteki.html
 | 
			
		||||
 | 
			
		||||
 INSTALLATION
 | 
			
		||||
 ------------
 | 
			
		||||
 | 
			
		||||
@@ -190,7 +164,7 @@
 | 
			
		||||
 reason as to why that feature isn't implemented.
 | 
			
		||||
 | 
			
		||||
 Patches should be as up to date as possible, preferably relative to the
 | 
			
		||||
 current CVS or the last snapshot. They should follow the coding style of
 | 
			
		||||
 current Git or the last snapshot. They should follow the coding style of
 | 
			
		||||
 OpenSSL and compile without warnings. Some of the core team developer targets
 | 
			
		||||
 can be used for testing purposes, (debug-steve64, debug-geoff etc). OpenSSL
 | 
			
		||||
 compiles on many varied platforms: try to ensure you only use portable
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								README.ECC
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								README.ECC
									
									
									
									
									
								
							@@ -1,61 +0,0 @@
 | 
			
		||||
NOTE: The OpenSSL Software Foundation has executed a sublicense agreement
 | 
			
		||||
entitled "Elliptic Curve Cryptography Patent License Agreement" with the
 | 
			
		||||
National Security Agency/ Central Security Service Commercial Solutions
 | 
			
		||||
Center (NCSC) dated 2010-11-04. That agreement permits implementation and
 | 
			
		||||
distribution of software containing features covered by any or all of the
 | 
			
		||||
following patents:
 | 
			
		||||
 | 
			
		||||
1.) U.S. Pat. No. 5,761,305 entitled "Key Agreement and Transport Protocol 
 | 
			
		||||
    with Implicit Signatures" issued on June 2, 1998;
 | 
			
		||||
2.) Can. Pat. Appl. Ser. No. 2176972 entitled "Key Agreement and Transport 
 | 
			
		||||
    Protocol with Implicit Signature and Reduced Bandwidth" filed on May 
 | 
			
		||||
    16, 1996;
 | 
			
		||||
3.) U.S. Pat. No. 5,889,865 entitled "Key Agreement and Transport Protocol 
 | 
			
		||||
    with Implicit Signatures" issued on March 30, 1999;
 | 
			
		||||
4.) U.S. Pat. No. 5,896,455 entitled "Key Agreement and Transport Protocol 
 | 
			
		||||
    with Implicit Signatures" issued on April 20, 1999;
 | 
			
		||||
5.) U.S. Pat. No. 5,933,504 entitled "Strengthened Public Key Protocol" 
 | 
			
		||||
    issued on August 3, 1999;
 | 
			
		||||
6.) Can. Pat. Appl. Ser. No. 2176866 entitled "Strengthened Public Key 
 | 
			
		||||
    Protocol" filed on May 17, 1996;
 | 
			
		||||
7.) E.P. Pat. Appl. Ser. No. 96201322.3 entitled "Strengthened Public Key 
 | 
			
		||||
    Protocol" filed on May 17, 1996;
 | 
			
		||||
8.) U.S. Pat. No. 5,999,626 entitled "Digital Signatures on a Smartcard" 
 | 
			
		||||
    issued on December 7, 1999;
 | 
			
		||||
9.) Can. Pat. Appl. Ser. No. 2202566 entitled "Digital Signatures on a 
 | 
			
		||||
    Smartcard" filed on April 14, 1997;
 | 
			
		||||
10.) E.P. Pat. Appl. No. 97106114.8 entitled "Digital Signatures on a 
 | 
			
		||||
     Smartcard" filed on April 15, 1997;
 | 
			
		||||
11.) U.S Pat. No. 6,122,736 entitled "Key Agreement and Transport Protocol 
 | 
			
		||||
     with Implicit Signatures" issued on September 19, 2000;
 | 
			
		||||
12.) Can. Pat. Appl. Ser. No. 2174261 entitled "Key Agreement and Transport 
 | 
			
		||||
     Protocol with Implicit Signatures" filed on April 16, 1996;
 | 
			
		||||
13.) E.P. Pat. Appl. Ser. No. 96105920.1 entitled "Key Agreement and 
 | 
			
		||||
     Transport Protocol with Implicit Signatures" filed on April 16, 1996;
 | 
			
		||||
14.) U.S. Pat. No. 6,141,420 entitled "Elliptic Curve Encryption Systems" 
 | 
			
		||||
     issued on October 31, 2000;
 | 
			
		||||
15.) Can. Pat. Appl. Ser. No. 2155038 entitled "Elliptic Curve Encryption 
 | 
			
		||||
     Systems" filed on July 31, 1995;
 | 
			
		||||
16.) E.P. Pat. Appl. Ser. No. 95926348.4 entitled "Elliptic Curve Encryption 
 | 
			
		||||
     Systems" filed on July 31, 1995;
 | 
			
		||||
17.) U.S. Pat. No. 6,336,188 entitled "Authenticated Key Agreement" issued 
 | 
			
		||||
     on January 1, 2002;
 | 
			
		||||
18.) U.S. Pat. No. 6,487,661 entitled "Key Agreement and Transport Protocol" 
 | 
			
		||||
     issued on November 26, 2002;
 | 
			
		||||
19.) Can. Pat. Appl. Ser. No. 2174260 entitled "Key Agreement and Transport 
 | 
			
		||||
     Protocol" filed on April 16, 1996;
 | 
			
		||||
20.) E.P. Pat. Appl. Ser. No. 96105921.9 entitled "Key Agreement and 
 | 
			
		||||
     Transport Protocol" filed on April 21, 1996;
 | 
			
		||||
21.) U.S. Pat. No. 6,563,928 entitled "Strengthened Public Key Protocol" 
 | 
			
		||||
     issued on May 13, 2003;
 | 
			
		||||
22.) U.S. Pat. No. 6,618,483 entitled "Elliptic Curve Encryption Systems" 
 | 
			
		||||
     issued September 9, 2003;
 | 
			
		||||
23.) U.S. Pat. Appl. Ser. No. 09/434,247 entitled "Digital Signatures on a 
 | 
			
		||||
     Smartcard" filed on November 5, 1999;
 | 
			
		||||
24.) U.S. Pat. Appl. Ser. No. 09/558,256 entitled "Key Agreement and 
 | 
			
		||||
     Transport Protocol with Implicit Signatures" filed on April 25, 2000;
 | 
			
		||||
25.) U.S. Pat. Appl. Ser. No. 09/942,492 entitled "Digital Signatures on a 
 | 
			
		||||
     Smartcard" filed on August 29, 2001 and published on July 18, 2002; and,
 | 
			
		||||
26.) U.S. Pat. Appl. Ser. No. 10/185,735 entitled "Strengthened Public Key 
 | 
			
		||||
     Protocol" filed on July 1, 2000.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										130
									
								
								README.FIPS
									
									
									
									
									
								
							
							
						
						
									
										130
									
								
								README.FIPS
									
									
									
									
									
								
							@@ -1,130 +0,0 @@
 | 
			
		||||
Preliminary status and build information for FIPS module v2.0 
 | 
			
		||||
 | 
			
		||||
NB: if you are cross compiling you now need to use the latest "incore" script
 | 
			
		||||
this can be found at util/incore in the tarballs.
 | 
			
		||||
 | 
			
		||||
If you have any object files from a previous build do:
 | 
			
		||||
 | 
			
		||||
make clean
 | 
			
		||||
 | 
			
		||||
To build the module do:
 | 
			
		||||
 | 
			
		||||
./config fipscanisteronly
 | 
			
		||||
make
 | 
			
		||||
 | 
			
		||||
Build should complete without errors.
 | 
			
		||||
 | 
			
		||||
Build test utilities:
 | 
			
		||||
 | 
			
		||||
make build_tests
 | 
			
		||||
 | 
			
		||||
Run test suite:
 | 
			
		||||
 | 
			
		||||
test/fips_test_suite
 | 
			
		||||
 | 
			
		||||
again should complete without errors.
 | 
			
		||||
 | 
			
		||||
Run test vectors: 
 | 
			
		||||
 | 
			
		||||
1. Download an appropriate set of testvectors from www.openssl.org/docs/fips
 | 
			
		||||
   only the fips-2.0 testvector files are usable for complete tests.
 | 
			
		||||
 | 
			
		||||
2. Extract the files to a suitable directory.
 | 
			
		||||
 | 
			
		||||
3. Run the test vector perl script, for example:
 | 
			
		||||
 | 
			
		||||
   cd fips
 | 
			
		||||
   perl fipsalgtest.pl --dir=/wherever/stuff/was/extracted
 | 
			
		||||
 | 
			
		||||
4. It should say "passed all tests" at the end. Report full details of any
 | 
			
		||||
   failures.
 | 
			
		||||
 | 
			
		||||
If you wish to use the older 1.2.x testvectors (for example those from 2007)
 | 
			
		||||
you need the command line switch --disable-v2 to fipsalgtest.pl
 | 
			
		||||
 | 
			
		||||
Examine the external symbols in fips/fipscanister.o they should all begin
 | 
			
		||||
with FIPS or fips. One way to check with GNU nm is:
 | 
			
		||||
 | 
			
		||||
	nm -g --defined-only fips/fipscanister.o | grep -v -i fips
 | 
			
		||||
 | 
			
		||||
If you get *any* output at all from this test (i.e. symbols not starting with
 | 
			
		||||
fips or FIPS) please report it.
 | 
			
		||||
 | 
			
		||||
Restricted tarball tests.
 | 
			
		||||
 | 
			
		||||
The validated module will have its own tarball containing sufficient code to
 | 
			
		||||
build fipscanister.o and the associated algorithm tests. You can create a
 | 
			
		||||
similar tarball yourself for testing purposes using the commands below.
 | 
			
		||||
 | 
			
		||||
Standard restricted tarball:
 | 
			
		||||
 | 
			
		||||
make -f Makefile.fips dist
 | 
			
		||||
 | 
			
		||||
Prime field field only ECC tarball:
 | 
			
		||||
 | 
			
		||||
make NOEC2M=1 -f Makefile.fips dist
 | 
			
		||||
 | 
			
		||||
Once you've created the tarball extract into a fresh directory and do:
 | 
			
		||||
 | 
			
		||||
./config
 | 
			
		||||
make
 | 
			
		||||
 | 
			
		||||
You can then run the algorithm tests as above. This build automatically uses
 | 
			
		||||
fipscanisterbuild and no-ec2m as appropriate.
 | 
			
		||||
 | 
			
		||||
FIPS capable OpenSSL test: WARNING PRELIMINARY INSTRUCTIONS, SUBJECT TO CHANGE.
 | 
			
		||||
 | 
			
		||||
At least initially the test module and FIPS capable OpenSSL may change and
 | 
			
		||||
by out of sync. You are advised to check for any changes and pull the latest
 | 
			
		||||
source from CVS if you have problems. See anon CVS and rsync instructions at:
 | 
			
		||||
 | 
			
		||||
http://www.openssl.org/source/repos.html
 | 
			
		||||
 | 
			
		||||
Make or download a restricted tarball from ftp://ftp.openssl.org/snapshot/
 | 
			
		||||
 | 
			
		||||
If required set the environment variable FIPSDIR to an appropriate location
 | 
			
		||||
to install the test module. If cross compiling set other environment
 | 
			
		||||
variables too.
 | 
			
		||||
 | 
			
		||||
In this restricted tarball on a Linux or U*ix like system run:
 | 
			
		||||
 | 
			
		||||
./config
 | 
			
		||||
make
 | 
			
		||||
make install
 | 
			
		||||
 | 
			
		||||
On Windows from a VC++ environment do:
 | 
			
		||||
 | 
			
		||||
ms\do_fips
 | 
			
		||||
 | 
			
		||||
This will build and install the test module and some associated files.
 | 
			
		||||
 | 
			
		||||
Now download the latest version of the OpenSSL 1.0.1 branch from either a
 | 
			
		||||
snapshot or preferably CVS. For Linux do:
 | 
			
		||||
 | 
			
		||||
./config fips [other args]
 | 
			
		||||
make
 | 
			
		||||
 | 
			
		||||
For Windows:
 | 
			
		||||
 | 
			
		||||
perl Configure VC-WIN32 fips [other args]
 | 
			
		||||
ms\do_nasm
 | 
			
		||||
nmake -f ms\ntdll.mak
 | 
			
		||||
 | 
			
		||||
(or ms\nt.mak for a static build).
 | 
			
		||||
 | 
			
		||||
Where [other args] can be any other arguments you use for an OpenSSL build
 | 
			
		||||
such as "shared" or "zlib".
 | 
			
		||||
 | 
			
		||||
This will build the fips capable OpenSSL and link it to the test module. You
 | 
			
		||||
can now try linking and testing applications against the FIPS capable OpenSSL.
 | 
			
		||||
 | 
			
		||||
Please report any problems to either the openssl-dev mailing list or directly
 | 
			
		||||
to me steve@openssl.org . Check the mailing lists regularly to avoid duplicate
 | 
			
		||||
reports.
 | 
			
		||||
 | 
			
		||||
Known issues:
 | 
			
		||||
 | 
			
		||||
Code needs extensively reviewing to ensure it builds correctly on 
 | 
			
		||||
supported platforms and is compliant with FIPS 140-2.
 | 
			
		||||
The "FIPS capable OpenSSL" is still largely untested, it builds and runs
 | 
			
		||||
some simple tests OK on some systems but needs far more "real world" testing.
 | 
			
		||||
							
								
								
									
										148
									
								
								STATUS
									
									
									
									
									
								
							
							
						
						
									
										148
									
								
								STATUS
									
									
									
									
									
								
							@@ -1,148 +0,0 @@
 | 
			
		||||
 | 
			
		||||
  OpenSSL STATUS                           Last modified at
 | 
			
		||||
  ______________                           $Date: 2011/02/08 17:48:56 $
 | 
			
		||||
 | 
			
		||||
  DEVELOPMENT STATE
 | 
			
		||||
 | 
			
		||||
    o  OpenSSL 1.1.0:  Under development...
 | 
			
		||||
    o  OpenSSL 1.0.1:  Under development...
 | 
			
		||||
    o  OpenSSL 1.0.0d: Released on February   8nd, 2011
 | 
			
		||||
    o  OpenSSL 1.0.0c: Released on December   2nd, 2010
 | 
			
		||||
    o  OpenSSL 1.0.0b: Released on November  16th, 2010
 | 
			
		||||
    o  OpenSSL 1.0.0a: Released on June      1st,  2010
 | 
			
		||||
    o  OpenSSL 1.0.0:  Released on March     29th, 2010
 | 
			
		||||
    o  OpenSSL 0.9.8r: Released on February   8nd, 2011
 | 
			
		||||
    o  OpenSSL 0.9.8q: Released on December   2nd, 2010
 | 
			
		||||
    o  OpenSSL 0.9.8p: Released on November  16th, 2010
 | 
			
		||||
    o  OpenSSL 0.9.8o: Released on June       1st, 2010
 | 
			
		||||
    o  OpenSSL 0.9.8n: Released on March     24th, 2010
 | 
			
		||||
    o  OpenSSL 0.9.8m: Released on February  25th, 2010
 | 
			
		||||
    o  OpenSSL 0.9.8l: Released on November   5th, 2009
 | 
			
		||||
    o  OpenSSL 0.9.8k: Released on March     25th, 2009
 | 
			
		||||
    o  OpenSSL 0.9.8j: Released on January    7th, 2009
 | 
			
		||||
    o  OpenSSL 0.9.8i: Released on September 15th, 2008
 | 
			
		||||
    o  OpenSSL 0.9.8h: Released on May       28th, 2008
 | 
			
		||||
    o  OpenSSL 0.9.8g: Released on October   19th, 2007
 | 
			
		||||
    o  OpenSSL 0.9.8f: Released on October   11th, 2007
 | 
			
		||||
    o  OpenSSL 0.9.8e: Released on February  23rd, 2007
 | 
			
		||||
    o  OpenSSL 0.9.8d: Released on September 28th, 2006
 | 
			
		||||
    o  OpenSSL 0.9.8c: Released on September  5th, 2006
 | 
			
		||||
    o  OpenSSL 0.9.8b: Released on May        4th, 2006
 | 
			
		||||
    o  OpenSSL 0.9.8a: Released on October   11th, 2005
 | 
			
		||||
    o  OpenSSL 0.9.8:  Released on July       5th, 2005
 | 
			
		||||
    o  OpenSSL 0.9.7m: Released on February  23rd, 2007
 | 
			
		||||
    o  OpenSSL 0.9.7l: Released on September 28th, 2006
 | 
			
		||||
    o  OpenSSL 0.9.7k: Released on September  5th, 2006
 | 
			
		||||
    o  OpenSSL 0.9.7j: Released on May        4th, 2006
 | 
			
		||||
    o  OpenSSL 0.9.7i: Released on October   14th, 2005
 | 
			
		||||
    o  OpenSSL 0.9.7h: Released on October   11th, 2005
 | 
			
		||||
    o  OpenSSL 0.9.7g: Released on April     11th, 2005
 | 
			
		||||
    o  OpenSSL 0.9.7f: Released on March     22nd, 2005
 | 
			
		||||
    o  OpenSSL 0.9.7e: Released on October   25th, 2004
 | 
			
		||||
    o  OpenSSL 0.9.7d: Released on March     17th, 2004
 | 
			
		||||
    o  OpenSSL 0.9.7c: Released on September 30th, 2003
 | 
			
		||||
    o  OpenSSL 0.9.7b: Released on April     10th, 2003
 | 
			
		||||
    o  OpenSSL 0.9.7a: Released on February  19th, 2003
 | 
			
		||||
    o  OpenSSL 0.9.7:  Released on December  31st, 2002
 | 
			
		||||
    o  OpenSSL 0.9.6m: Released on March     17th, 2004
 | 
			
		||||
    o  OpenSSL 0.9.6l: Released on November   4th, 2003
 | 
			
		||||
    o  OpenSSL 0.9.6k: Released on September 30th, 2003
 | 
			
		||||
    o  OpenSSL 0.9.6j: Released on April     10th, 2003
 | 
			
		||||
    o  OpenSSL 0.9.6i: Released on February  19th, 2003
 | 
			
		||||
    o  OpenSSL 0.9.6h: Released on December   5th, 2002
 | 
			
		||||
    o  OpenSSL 0.9.6g: Released on August     9th, 2002
 | 
			
		||||
    o  OpenSSL 0.9.6f: Released on August     8th, 2002
 | 
			
		||||
    o  OpenSSL 0.9.6e: Released on July      30th, 2002
 | 
			
		||||
    o  OpenSSL 0.9.6d: Released on May        9th, 2002
 | 
			
		||||
    o  OpenSSL 0.9.6c: Released on December  21st, 2001
 | 
			
		||||
    o  OpenSSL 0.9.6b: Released on July       9th, 2001
 | 
			
		||||
    o  OpenSSL 0.9.6a: Released on April      5th, 2001
 | 
			
		||||
    o  OpenSSL 0.9.6:  Released on September 24th, 2000
 | 
			
		||||
    o  OpenSSL 0.9.5a: Released on April      1st, 2000
 | 
			
		||||
    o  OpenSSL 0.9.5:  Released on February  28th, 2000
 | 
			
		||||
    o  OpenSSL 0.9.4:  Released on August    09th, 1999
 | 
			
		||||
    o  OpenSSL 0.9.3a: Released on May       29th, 1999
 | 
			
		||||
    o  OpenSSL 0.9.3:  Released on May       25th, 1999
 | 
			
		||||
    o  OpenSSL 0.9.2b: Released on March     22th, 1999
 | 
			
		||||
    o  OpenSSL 0.9.1c: Released on December  23th, 1998
 | 
			
		||||
 | 
			
		||||
  [See also http://www.openssl.org/support/rt.html]
 | 
			
		||||
 | 
			
		||||
  RELEASE SHOWSTOPPERS
 | 
			
		||||
 | 
			
		||||
    o The Makefiles fail with some SysV makes.
 | 
			
		||||
    o 
 | 
			
		||||
 | 
			
		||||
  AVAILABLE PATCHES
 | 
			
		||||
 | 
			
		||||
    o 
 | 
			
		||||
 | 
			
		||||
  IN PROGRESS
 | 
			
		||||
 | 
			
		||||
    o Steve is currently working on (in no particular order):
 | 
			
		||||
        ASN1 code redesign, butchery, replacement.
 | 
			
		||||
        OCSP
 | 
			
		||||
        EVP cipher enhancement.
 | 
			
		||||
        Enhanced certificate chain verification.
 | 
			
		||||
	Private key, certificate and CRL API and implementation.
 | 
			
		||||
	Developing and bugfixing PKCS#7 (S/MIME code).
 | 
			
		||||
        Various X509 issues: character sets, certificate request extensions.
 | 
			
		||||
    o Richard is currently working on:
 | 
			
		||||
	Constification
 | 
			
		||||
	Attribute Certificate support
 | 
			
		||||
	Certificate Pair support
 | 
			
		||||
	Storage Engines (primarly an LDAP storage engine)
 | 
			
		||||
	Certificate chain validation with full RFC 3280 compatibility
 | 
			
		||||
 | 
			
		||||
  NEEDS PATCH
 | 
			
		||||
 | 
			
		||||
    o  0.9.8-dev: COMPLEMENTOFALL and COMPLEMENTOFDEFAULT do not
 | 
			
		||||
       handle ECCdraft cipher suites correctly.
 | 
			
		||||
 | 
			
		||||
    o  apps/ca.c: "Sign the certificate?" - "n" creates empty certificate file
 | 
			
		||||
 | 
			
		||||
    o  "OpenSSL STATUS" is never up-to-date.
 | 
			
		||||
 | 
			
		||||
  OPEN ISSUES
 | 
			
		||||
 | 
			
		||||
    o  The Makefile hierarchy and build mechanism is still not a round thing:
 | 
			
		||||
 | 
			
		||||
       1. The config vs. Configure scripts
 | 
			
		||||
          It's the same nasty situation as for Apache with APACI vs.
 | 
			
		||||
          src/Configure. It confuses.
 | 
			
		||||
          Suggestion: Merge Configure and config into a single configure
 | 
			
		||||
                      script with a Autoconf style interface ;-) and remove
 | 
			
		||||
                      Configure and config. Or even let us use GNU Autoconf
 | 
			
		||||
                      itself. Then we can avoid a lot of those platform checks
 | 
			
		||||
                      which are currently in Configure.
 | 
			
		||||
 | 
			
		||||
    o  Support for Shared Libraries has to be added at least
 | 
			
		||||
       for the major Unix platforms. The details we can rip from the stuff
 | 
			
		||||
       Ralf has done for the Apache src/Configure script. Ben wants the
 | 
			
		||||
       solution to be really simple.
 | 
			
		||||
 | 
			
		||||
       Status: Ralf will look how we can easily incorporate the
 | 
			
		||||
               compiler PIC and linker DSO flags from Apache
 | 
			
		||||
               into the OpenSSL Configure script.
 | 
			
		||||
 | 
			
		||||
               Ulf: +1 for using GNU autoconf and libtool (but not automake,
 | 
			
		||||
                    which apparently is not flexible enough to generate
 | 
			
		||||
                    libcrypto)
 | 
			
		||||
 | 
			
		||||
  WISHES
 | 
			
		||||
 | 
			
		||||
    o  Add variants of DH_generate_parameters() and BN_generate_prime() [etc?]
 | 
			
		||||
       where the callback function can request that the function be aborted.
 | 
			
		||||
       [Gregory Stark <ghstark@pobox.com>, <rayyang2000@yahoo.com>]
 | 
			
		||||
 | 
			
		||||
    o  SRP in TLS.
 | 
			
		||||
       [wished by:
 | 
			
		||||
        Dj <derek@yo.net>, Tom Wu <tom@arcot.com>,
 | 
			
		||||
        Tom Holroyd <tomh@po.crl.go.jp>]
 | 
			
		||||
 | 
			
		||||
       See http://search.ietf.org/internet-drafts/draft-ietf-tls-srp-00.txt
 | 
			
		||||
       as well as http://www-cs-students.stanford.edu/~tjw/srp/.
 | 
			
		||||
 | 
			
		||||
       Tom Holroyd tells us there is a SRP patch for OpenSSH at
 | 
			
		||||
       http://members.tripod.com/professor_tom/archives/, that could
 | 
			
		||||
       be useful.
 | 
			
		||||
@@ -6,6 +6,7 @@ $! P2: Zlib object library path (optional).
 | 
			
		||||
$!
 | 
			
		||||
$! Input:	[.UTIL]LIBEAY.NUM,[.xxx.EXE.CRYPTO]SSL_LIBCRYPTO[32].OLB
 | 
			
		||||
$!		[.UTIL]SSLEAY.NUM,[.xxx.EXE.SSL]SSL_LIBSSL[32].OLB
 | 
			
		||||
$!		[.CRYPTO.xxx]OPENSSLCONF.H
 | 
			
		||||
$! Output:	[.xxx.EXE.CRYPTO]SSL_LIBCRYPTO_SHR[32].OPT,.MAP,.EXE
 | 
			
		||||
$!		[.xxx.EXE.SSL]SSL_LIBSSL_SRH[32].OPT,.MAP,.EXE
 | 
			
		||||
$!
 | 
			
		||||
@@ -70,6 +71,9 @@ $     endif
 | 
			
		||||
$   endif
 | 
			
		||||
$ endif
 | 
			
		||||
$!
 | 
			
		||||
$! ----- Prepare info for processing: disabled algorithms info
 | 
			
		||||
$ gosub read_disabled_algorithms_info
 | 
			
		||||
$!
 | 
			
		||||
$ ZLIB = p2
 | 
			
		||||
$ zlib_lib = ""
 | 
			
		||||
$ if (ZLIB .nes. "")
 | 
			
		||||
@@ -384,8 +388,7 @@ $	alg_i = alg_i + 1
 | 
			
		||||
$       if alg_entry .eqs. "" then goto loop2
 | 
			
		||||
$       if alg_entry .nes. ","
 | 
			
		||||
$       then
 | 
			
		||||
$         if alg_entry .eqs. "KRB5" then goto loop ! Special for now
 | 
			
		||||
$	  if alg_entry .eqs. "STATIC_ENGINE" then goto loop ! Special for now
 | 
			
		||||
$	  if disabled_algorithms - ("," + alg_entry + ",") .nes disabled_algorithms then goto loop
 | 
			
		||||
$         if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop
 | 
			
		||||
$	  goto loop2
 | 
			
		||||
$       endif
 | 
			
		||||
@@ -452,3 +455,22 @@ $     endif
 | 
			
		||||
$   endloop_rvi:
 | 
			
		||||
$   close vf
 | 
			
		||||
$   return
 | 
			
		||||
$
 | 
			
		||||
$! The disabled algorithms reader
 | 
			
		||||
$ read_disabled_algorithms_info:
 | 
			
		||||
$   disabled_algorithms = ","
 | 
			
		||||
$   open /read cf [.CRYPTO.'ARCH']OPENSSLCONF.H
 | 
			
		||||
$   loop_rci:
 | 
			
		||||
$     read/err=endloop_rci/end=endloop_rci cf rci_line
 | 
			
		||||
$     rci_line = f$edit(rci_line,"TRIM,COMPRESS")
 | 
			
		||||
$     rci_ei = 0
 | 
			
		||||
$     if f$extract(0,9,rci_line) .eqs. "# define " then rci_ei = 2
 | 
			
		||||
$     if f$extract(0,8,rci_line) .eqs. "#define " then rci_ei = 1
 | 
			
		||||
$     if rci_ei .eq. 0 then goto loop_rci
 | 
			
		||||
$     rci_e = f$element(rci_ei," ",rci_line)
 | 
			
		||||
$     if f$extract(0,11,rci_e) .nes. "OPENSSL_NO_" then goto loop_rci
 | 
			
		||||
$     disabled_algorithms = disabled_algorithms + f$extract(11,999,rci_e) + ","
 | 
			
		||||
$     goto loop_rci
 | 
			
		||||
$   endloop_rci:
 | 
			
		||||
$   close cf
 | 
			
		||||
$   return
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										159
									
								
								apps/Makefile
									
									
									
									
									
								
							
							
						
						
									
										159
									
								
								apps/Makefile
									
									
									
									
									
								
							@@ -153,6 +153,8 @@ $(EXE): progs.h $(E_OBJ) $(PROGRAM).o $(DLIBCRYPTO) $(DLIBSSL)
 | 
			
		||||
	$(RM) $(EXE)
 | 
			
		||||
	shlib_target=; if [ -n "$(SHARED_LIBS)" ]; then \
 | 
			
		||||
		shlib_target="$(SHLIB_TARGET)"; \
 | 
			
		||||
	elif [ -n "$(FIPSCANLIB)" ]; then \
 | 
			
		||||
	  FIPSLD_CC="$(CC)"; CC=$(FIPSDIR)/bin/fipsld; export CC FIPSLD_CC; \
 | 
			
		||||
	fi; \
 | 
			
		||||
	LIBRARIES="$(LIBSSL) $(LIBKRB5) $(LIBCRYPTO)" ; \
 | 
			
		||||
	$(MAKE) -f $(TOP)/Makefile.shared -e \
 | 
			
		||||
@@ -245,13 +247,13 @@ ciphers.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
ciphers.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
 | 
			
		||||
ciphers.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
 | 
			
		||||
ciphers.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h
 | 
			
		||||
ciphers.o: ../include/openssl/sha.h ../include/openssl/ssl.h
 | 
			
		||||
ciphers.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
ciphers.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
ciphers.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
ciphers.o: ../include/openssl/txt_db.h ../include/openssl/x509.h
 | 
			
		||||
ciphers.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h
 | 
			
		||||
ciphers.o: ciphers.c
 | 
			
		||||
ciphers.o: ../include/openssl/sha.h ../include/openssl/srtp.h
 | 
			
		||||
ciphers.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
ciphers.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
ciphers.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
ciphers.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
ciphers.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
ciphers.o: ../include/openssl/x509v3.h apps.h ciphers.c
 | 
			
		||||
cms.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
cms.o: ../include/openssl/buffer.h ../include/openssl/cms.h
 | 
			
		||||
cms.o: ../include/openssl/conf.h ../include/openssl/crypto.h
 | 
			
		||||
@@ -427,13 +429,13 @@ engine.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
engine.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
 | 
			
		||||
engine.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
 | 
			
		||||
engine.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h
 | 
			
		||||
engine.o: ../include/openssl/sha.h ../include/openssl/ssl.h
 | 
			
		||||
engine.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
engine.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
engine.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
engine.o: ../include/openssl/txt_db.h ../include/openssl/x509.h
 | 
			
		||||
engine.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h
 | 
			
		||||
engine.o: engine.c
 | 
			
		||||
engine.o: ../include/openssl/sha.h ../include/openssl/srtp.h
 | 
			
		||||
engine.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
engine.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
engine.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
engine.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
engine.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
engine.o: ../include/openssl/x509v3.h apps.h engine.c
 | 
			
		||||
errstr.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
errstr.o: ../include/openssl/buffer.h ../include/openssl/comp.h
 | 
			
		||||
errstr.o: ../include/openssl/conf.h ../include/openssl/crypto.h
 | 
			
		||||
@@ -448,13 +450,13 @@ errstr.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
errstr.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
 | 
			
		||||
errstr.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
 | 
			
		||||
errstr.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h
 | 
			
		||||
errstr.o: ../include/openssl/sha.h ../include/openssl/ssl.h
 | 
			
		||||
errstr.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
errstr.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
errstr.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
errstr.o: ../include/openssl/txt_db.h ../include/openssl/x509.h
 | 
			
		||||
errstr.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h
 | 
			
		||||
errstr.o: errstr.c
 | 
			
		||||
errstr.o: ../include/openssl/sha.h ../include/openssl/srtp.h
 | 
			
		||||
errstr.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
errstr.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
errstr.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
errstr.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
errstr.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
errstr.o: ../include/openssl/x509v3.h apps.h errstr.c
 | 
			
		||||
gendh.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
gendh.o: ../include/openssl/bn.h ../include/openssl/buffer.h
 | 
			
		||||
gendh.o: ../include/openssl/conf.h ../include/openssl/crypto.h
 | 
			
		||||
@@ -556,12 +558,12 @@ ocsp.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h
 | 
			
		||||
ocsp.o: ../include/openssl/pem.h ../include/openssl/pem2.h
 | 
			
		||||
ocsp.o: ../include/openssl/pkcs7.h ../include/openssl/pqueue.h
 | 
			
		||||
ocsp.o: ../include/openssl/safestack.h ../include/openssl/sha.h
 | 
			
		||||
ocsp.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
ocsp.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
ocsp.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
ocsp.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
ocsp.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
ocsp.o: ../include/openssl/x509v3.h apps.h ocsp.c
 | 
			
		||||
ocsp.o: ../include/openssl/srtp.h ../include/openssl/ssl.h
 | 
			
		||||
ocsp.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
ocsp.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
ocsp.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
ocsp.o: ../include/openssl/txt_db.h ../include/openssl/x509.h
 | 
			
		||||
ocsp.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h ocsp.c
 | 
			
		||||
openssl.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
openssl.o: ../include/openssl/buffer.h ../include/openssl/comp.h
 | 
			
		||||
openssl.o: ../include/openssl/conf.h ../include/openssl/crypto.h
 | 
			
		||||
@@ -575,8 +577,9 @@ openssl.o: ../include/openssl/objects.h ../include/openssl/ocsp.h
 | 
			
		||||
openssl.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
openssl.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
 | 
			
		||||
openssl.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
 | 
			
		||||
openssl.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h
 | 
			
		||||
openssl.o: ../include/openssl/sha.h ../include/openssl/ssl.h
 | 
			
		||||
openssl.o: ../include/openssl/pqueue.h ../include/openssl/rand.h
 | 
			
		||||
openssl.o: ../include/openssl/safestack.h ../include/openssl/sha.h
 | 
			
		||||
openssl.o: ../include/openssl/srtp.h ../include/openssl/ssl.h
 | 
			
		||||
openssl.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
openssl.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
openssl.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
@@ -791,12 +794,13 @@ s_cb.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
 | 
			
		||||
s_cb.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
 | 
			
		||||
s_cb.o: ../include/openssl/pqueue.h ../include/openssl/rand.h
 | 
			
		||||
s_cb.o: ../include/openssl/safestack.h ../include/openssl/sha.h
 | 
			
		||||
s_cb.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
s_cb.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
s_cb.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
s_cb.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
s_cb.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
s_cb.o: ../include/openssl/x509v3.h apps.h s_apps.h s_cb.c
 | 
			
		||||
s_cb.o: ../include/openssl/srtp.h ../include/openssl/ssl.h
 | 
			
		||||
s_cb.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
s_cb.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
s_cb.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
s_cb.o: ../include/openssl/txt_db.h ../include/openssl/x509.h
 | 
			
		||||
s_cb.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h
 | 
			
		||||
s_cb.o: s_apps.h s_cb.c
 | 
			
		||||
s_client.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
s_client.o: ../include/openssl/bn.h ../include/openssl/buffer.h
 | 
			
		||||
s_client.o: ../include/openssl/comp.h ../include/openssl/conf.h
 | 
			
		||||
@@ -813,12 +817,13 @@ s_client.o: ../include/openssl/pem.h ../include/openssl/pem2.h
 | 
			
		||||
s_client.o: ../include/openssl/pkcs7.h ../include/openssl/pqueue.h
 | 
			
		||||
s_client.o: ../include/openssl/rand.h ../include/openssl/safestack.h
 | 
			
		||||
s_client.o: ../include/openssl/sha.h ../include/openssl/srp.h
 | 
			
		||||
s_client.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
s_client.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
s_client.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
s_client.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
s_client.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
s_client.o: ../include/openssl/x509v3.h apps.h s_apps.h s_client.c timeouts.h
 | 
			
		||||
s_client.o: ../include/openssl/srtp.h ../include/openssl/ssl.h
 | 
			
		||||
s_client.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
s_client.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
s_client.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
s_client.o: ../include/openssl/txt_db.h ../include/openssl/x509.h
 | 
			
		||||
s_client.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h
 | 
			
		||||
s_client.o: s_apps.h s_client.c timeouts.h
 | 
			
		||||
s_server.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
s_server.o: ../include/openssl/bn.h ../include/openssl/buffer.h
 | 
			
		||||
s_server.o: ../include/openssl/comp.h ../include/openssl/conf.h
 | 
			
		||||
@@ -836,27 +841,29 @@ s_server.o: ../include/openssl/pem.h ../include/openssl/pem2.h
 | 
			
		||||
s_server.o: ../include/openssl/pkcs7.h ../include/openssl/pqueue.h
 | 
			
		||||
s_server.o: ../include/openssl/rand.h ../include/openssl/rsa.h
 | 
			
		||||
s_server.o: ../include/openssl/safestack.h ../include/openssl/sha.h
 | 
			
		||||
s_server.o: ../include/openssl/srp.h ../include/openssl/ssl.h
 | 
			
		||||
s_server.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
s_server.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
s_server.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
s_server.o: ../include/openssl/txt_db.h ../include/openssl/ui.h
 | 
			
		||||
s_server.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
s_server.o: ../include/openssl/x509v3.h apps.h s_apps.h s_server.c timeouts.h
 | 
			
		||||
s_socket.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
s_socket.o: ../include/openssl/buffer.h ../include/openssl/comp.h
 | 
			
		||||
s_socket.o: ../include/openssl/conf.h ../include/openssl/crypto.h
 | 
			
		||||
s_socket.o: ../include/openssl/dtls1.h ../include/openssl/e_os2.h
 | 
			
		||||
s_socket.o: ../include/openssl/ec.h ../include/openssl/ecdh.h
 | 
			
		||||
s_socket.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h
 | 
			
		||||
s_socket.o: ../include/openssl/evp.h ../include/openssl/hmac.h
 | 
			
		||||
s_socket.o: ../include/openssl/kssl.h ../include/openssl/lhash.h
 | 
			
		||||
s_socket.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h
 | 
			
		||||
s_socket.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h
 | 
			
		||||
s_socket.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h
 | 
			
		||||
s_socket.o: ../include/openssl/pem.h ../include/openssl/pem2.h
 | 
			
		||||
s_socket.o: ../include/openssl/pkcs7.h ../include/openssl/pqueue.h
 | 
			
		||||
s_socket.o: ../include/openssl/safestack.h ../include/openssl/sha.h
 | 
			
		||||
s_server.o: ../include/openssl/srp.h ../include/openssl/srtp.h
 | 
			
		||||
s_server.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
s_server.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
s_server.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
s_server.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
s_server.o: ../include/openssl/ui.h ../include/openssl/x509.h
 | 
			
		||||
s_server.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h
 | 
			
		||||
s_server.o: s_apps.h s_server.c timeouts.h
 | 
			
		||||
s_socket.o: ../e_os.h ../e_os2.h ../include/openssl/asn1.h
 | 
			
		||||
s_socket.o: ../include/openssl/bio.h ../include/openssl/buffer.h
 | 
			
		||||
s_socket.o: ../include/openssl/comp.h ../include/openssl/conf.h
 | 
			
		||||
s_socket.o: ../include/openssl/crypto.h ../include/openssl/dtls1.h
 | 
			
		||||
s_socket.o: ../include/openssl/e_os2.h ../include/openssl/ec.h
 | 
			
		||||
s_socket.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h
 | 
			
		||||
s_socket.o: ../include/openssl/engine.h ../include/openssl/evp.h
 | 
			
		||||
s_socket.o: ../include/openssl/hmac.h ../include/openssl/kssl.h
 | 
			
		||||
s_socket.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h
 | 
			
		||||
s_socket.o: ../include/openssl/objects.h ../include/openssl/ocsp.h
 | 
			
		||||
s_socket.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
s_socket.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
 | 
			
		||||
s_socket.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
 | 
			
		||||
s_socket.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h
 | 
			
		||||
s_socket.o: ../include/openssl/sha.h ../include/openssl/srtp.h
 | 
			
		||||
s_socket.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
s_socket.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
s_socket.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
@@ -877,13 +884,13 @@ s_time.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
s_time.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
 | 
			
		||||
s_time.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
 | 
			
		||||
s_time.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h
 | 
			
		||||
s_time.o: ../include/openssl/sha.h ../include/openssl/ssl.h
 | 
			
		||||
s_time.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
s_time.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
s_time.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
s_time.o: ../include/openssl/txt_db.h ../include/openssl/x509.h
 | 
			
		||||
s_time.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h
 | 
			
		||||
s_time.o: s_apps.h s_time.c
 | 
			
		||||
s_time.o: ../include/openssl/sha.h ../include/openssl/srtp.h
 | 
			
		||||
s_time.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
s_time.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
s_time.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
s_time.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
s_time.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
s_time.o: ../include/openssl/x509v3.h apps.h s_apps.h s_time.c
 | 
			
		||||
sess_id.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
sess_id.o: ../include/openssl/buffer.h ../include/openssl/comp.h
 | 
			
		||||
sess_id.o: ../include/openssl/conf.h ../include/openssl/crypto.h
 | 
			
		||||
@@ -898,13 +905,13 @@ sess_id.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
sess_id.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
 | 
			
		||||
sess_id.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h
 | 
			
		||||
sess_id.o: ../include/openssl/pqueue.h ../include/openssl/safestack.h
 | 
			
		||||
sess_id.o: ../include/openssl/sha.h ../include/openssl/ssl.h
 | 
			
		||||
sess_id.o: ../include/openssl/ssl2.h ../include/openssl/ssl23.h
 | 
			
		||||
sess_id.o: ../include/openssl/ssl3.h ../include/openssl/stack.h
 | 
			
		||||
sess_id.o: ../include/openssl/symhacks.h ../include/openssl/tls1.h
 | 
			
		||||
sess_id.o: ../include/openssl/txt_db.h ../include/openssl/x509.h
 | 
			
		||||
sess_id.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.h
 | 
			
		||||
sess_id.o: sess_id.c
 | 
			
		||||
sess_id.o: ../include/openssl/sha.h ../include/openssl/srtp.h
 | 
			
		||||
sess_id.o: ../include/openssl/ssl.h ../include/openssl/ssl2.h
 | 
			
		||||
sess_id.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
 | 
			
		||||
sess_id.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
 | 
			
		||||
sess_id.o: ../include/openssl/tls1.h ../include/openssl/txt_db.h
 | 
			
		||||
sess_id.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
 | 
			
		||||
sess_id.o: ../include/openssl/x509v3.h apps.h sess_id.c
 | 
			
		||||
smime.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
 | 
			
		||||
smime.o: ../include/openssl/buffer.h ../include/openssl/conf.h
 | 
			
		||||
smime.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										417
									
								
								apps/apps.c
									
									
									
									
									
								
							
							
						
						
									
										417
									
								
								apps/apps.c
									
									
									
									
									
								
							@@ -109,7 +109,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _POSIX_C_SOURCE
 | 
			
		||||
#if !defined(_POSIX_C_SOURCE) && defined(OPENSSL_SYS_VMS)
 | 
			
		||||
#define _POSIX_C_SOURCE 2	/* On VMS, you need to define this to get
 | 
			
		||||
				   the declaration of fileno().  The value
 | 
			
		||||
				   2 is to make sure no function defined
 | 
			
		||||
@@ -118,7 +118,7 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#if !defined(OPENSSL_SYSNAME_WIN32) && !defined(NETWARE_CLIB)
 | 
			
		||||
#if !defined(OPENSSL_SYSNAME_WIN32) && !defined(OPENSSL_SYSNAME_WINCE) && !defined(NETWARE_CLIB)
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
@@ -275,6 +275,8 @@ int str2fmt(char *s)
 | 
			
		||||
		return(FORMAT_PKCS12);
 | 
			
		||||
	else if ((*s == 'E') || (*s == 'e'))
 | 
			
		||||
		return(FORMAT_ENGINE);
 | 
			
		||||
	else if ((*s == 'H') || (*s == 'h'))
 | 
			
		||||
		return FORMAT_HTTP;
 | 
			
		||||
	else if ((*s == 'P') || (*s == 'p'))
 | 
			
		||||
 		{
 | 
			
		||||
 		if (s[1] == 'V' || s[1] == 'v')
 | 
			
		||||
@@ -783,12 +785,80 @@ static int load_pkcs12(BIO *err, BIO *in, const char *desc,
 | 
			
		||||
	return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
int load_cert_crl_http(const char *url, BIO *err,
 | 
			
		||||
					X509 **pcert, X509_CRL **pcrl)
 | 
			
		||||
	{
 | 
			
		||||
	char *host = NULL, *port = NULL, *path = NULL;
 | 
			
		||||
	BIO *bio = NULL;
 | 
			
		||||
	OCSP_REQ_CTX *rctx = NULL;
 | 
			
		||||
	int use_ssl, rv = 0;
 | 
			
		||||
	if (!OCSP_parse_url(url, &host, &port, &path, &use_ssl))
 | 
			
		||||
		goto err;
 | 
			
		||||
	if (use_ssl)
 | 
			
		||||
		{
 | 
			
		||||
		if (err)
 | 
			
		||||
			BIO_puts(err, "https not supported\n");
 | 
			
		||||
		goto err;
 | 
			
		||||
		}
 | 
			
		||||
	bio = BIO_new_connect(host);
 | 
			
		||||
	if (!bio || !BIO_set_conn_port(bio, port))
 | 
			
		||||
		goto err;
 | 
			
		||||
	rctx = OCSP_REQ_CTX_new(bio, 1024);
 | 
			
		||||
	if (!rctx)
 | 
			
		||||
		goto err;
 | 
			
		||||
	if (!OCSP_REQ_CTX_http(rctx, "GET", path))
 | 
			
		||||
		goto err;
 | 
			
		||||
	if (!OCSP_REQ_CTX_add1_header(rctx, "Host", host))
 | 
			
		||||
		goto err;
 | 
			
		||||
	if (pcert)
 | 
			
		||||
		{
 | 
			
		||||
		do
 | 
			
		||||
			{
 | 
			
		||||
			rv = X509_http_nbio(rctx, pcert);
 | 
			
		||||
			}
 | 
			
		||||
		while (rv == -1);
 | 
			
		||||
		}
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		do
 | 
			
		||||
			{
 | 
			
		||||
			rv = X509_CRL_http_nbio(rctx, pcrl);
 | 
			
		||||
			} while (rv == -1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	err:
 | 
			
		||||
	if (host)
 | 
			
		||||
		OPENSSL_free(host);
 | 
			
		||||
	if (path)
 | 
			
		||||
		OPENSSL_free(path);
 | 
			
		||||
	if (port)
 | 
			
		||||
		OPENSSL_free(port);
 | 
			
		||||
	if (bio)
 | 
			
		||||
		BIO_free_all(bio);
 | 
			
		||||
	if (rctx)
 | 
			
		||||
		OCSP_REQ_CTX_free(rctx);
 | 
			
		||||
	if (rv != 1)
 | 
			
		||||
		{
 | 
			
		||||
		if (bio && err)
 | 
			
		||||
			BIO_printf(bio_err, "Error loading %s from %s\n",
 | 
			
		||||
					pcert ? "certificate" : "CRL", url);
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
		}
 | 
			
		||||
	return rv;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
X509 *load_cert(BIO *err, const char *file, int format,
 | 
			
		||||
	const char *pass, ENGINE *e, const char *cert_descrip)
 | 
			
		||||
	{
 | 
			
		||||
	X509 *x=NULL;
 | 
			
		||||
	BIO *cert;
 | 
			
		||||
 | 
			
		||||
	if (format == FORMAT_HTTP)
 | 
			
		||||
		{
 | 
			
		||||
		load_cert_crl_http(file, err, &x, NULL);
 | 
			
		||||
		return x;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if ((cert=BIO_new(BIO_s_file())) == NULL)
 | 
			
		||||
		{
 | 
			
		||||
		ERR_print_errors(err);
 | 
			
		||||
@@ -859,6 +929,55 @@ end:
 | 
			
		||||
	return(x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
X509_CRL *load_crl(const char *infile, int format)
 | 
			
		||||
	{
 | 
			
		||||
	X509_CRL *x=NULL;
 | 
			
		||||
	BIO *in=NULL;
 | 
			
		||||
 | 
			
		||||
	if (format == FORMAT_HTTP)
 | 
			
		||||
		{
 | 
			
		||||
		load_cert_crl_http(infile, bio_err, NULL, &x);
 | 
			
		||||
		return x;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	in=BIO_new(BIO_s_file());
 | 
			
		||||
	if (in == NULL)
 | 
			
		||||
		{
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (infile == NULL)
 | 
			
		||||
		BIO_set_fp(in,stdin,BIO_NOCLOSE);
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		if (BIO_read_filename(in,infile) <= 0)
 | 
			
		||||
			{
 | 
			
		||||
			perror(infile);
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	if 	(format == FORMAT_ASN1)
 | 
			
		||||
		x=d2i_X509_CRL_bio(in,NULL);
 | 
			
		||||
	else if (format == FORMAT_PEM)
 | 
			
		||||
		x=PEM_read_bio_X509_CRL(in,NULL,NULL,NULL);
 | 
			
		||||
	else	{
 | 
			
		||||
		BIO_printf(bio_err,"bad input format specified for input crl\n");
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
	if (x == NULL)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err,"unable to load CRL\n");
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
end:
 | 
			
		||||
	BIO_free(in);
 | 
			
		||||
	return(x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin,
 | 
			
		||||
	const char *pass, ENGINE *e, const char *key_descrip)
 | 
			
		||||
	{
 | 
			
		||||
@@ -1215,7 +1334,8 @@ STACK_OF(X509) *load_certs(BIO *err, const char *file, int format,
 | 
			
		||||
	const char *pass, ENGINE *e, const char *desc)
 | 
			
		||||
	{
 | 
			
		||||
	STACK_OF(X509) *certs;
 | 
			
		||||
	load_certs_crls(err, file, format, pass, e, desc, &certs, NULL);
 | 
			
		||||
	if (!load_certs_crls(err, file, format, pass, e, desc, &certs, NULL))
 | 
			
		||||
		return NULL;
 | 
			
		||||
	return certs;
 | 
			
		||||
	}	
 | 
			
		||||
 | 
			
		||||
@@ -1223,7 +1343,8 @@ STACK_OF(X509_CRL) *load_crls(BIO *err, const char *file, int format,
 | 
			
		||||
	const char *pass, ENGINE *e, const char *desc)
 | 
			
		||||
	{
 | 
			
		||||
	STACK_OF(X509_CRL) *crls;
 | 
			
		||||
	load_certs_crls(err, file, format, pass, e, desc, NULL, &crls);
 | 
			
		||||
	if (!load_certs_crls(err, file, format, pass, e, desc, NULL, &crls))
 | 
			
		||||
		return NULL;
 | 
			
		||||
	return crls;
 | 
			
		||||
	}	
 | 
			
		||||
 | 
			
		||||
@@ -2130,7 +2251,7 @@ X509_NAME *parse_name(char *subject, long chtype, int multirdn)
 | 
			
		||||
	X509_NAME *n = NULL;
 | 
			
		||||
	int nid;
 | 
			
		||||
 | 
			
		||||
	if (!buf || !ne_types || !ne_values)
 | 
			
		||||
	if (!buf || !ne_types || !ne_values || !mval)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err, "malloc error\n");
 | 
			
		||||
		goto error;
 | 
			
		||||
@@ -2234,6 +2355,7 @@ X509_NAME *parse_name(char *subject, long chtype, int multirdn)
 | 
			
		||||
	OPENSSL_free(ne_values);
 | 
			
		||||
	OPENSSL_free(ne_types);
 | 
			
		||||
	OPENSSL_free(buf);
 | 
			
		||||
	OPENSSL_free(mval);
 | 
			
		||||
	return n;
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
@@ -2242,6 +2364,8 @@ error:
 | 
			
		||||
		OPENSSL_free(ne_values);
 | 
			
		||||
	if (ne_types)
 | 
			
		||||
		OPENSSL_free(ne_types);
 | 
			
		||||
	if (mval)
 | 
			
		||||
		OPENSSL_free(mval);
 | 
			
		||||
	if (buf)
 | 
			
		||||
		OPENSSL_free(buf);
 | 
			
		||||
	return NULL;
 | 
			
		||||
@@ -2256,7 +2380,9 @@ int args_verify(char ***pargs, int *pargc,
 | 
			
		||||
	int purpose = 0, depth = -1;
 | 
			
		||||
	char **oldargs = *pargs;
 | 
			
		||||
	char *arg = **pargs, *argn = (*pargs)[1];
 | 
			
		||||
	const X509_VERIFY_PARAM *vpm = NULL;
 | 
			
		||||
	time_t at_time = 0;
 | 
			
		||||
	const unsigned char *hostname = NULL, *email = NULL;
 | 
			
		||||
	char *ipasc = NULL;
 | 
			
		||||
	if (!strcmp(arg, "-policy"))
 | 
			
		||||
		{
 | 
			
		||||
		if (!argn)
 | 
			
		||||
@@ -2294,21 +2420,6 @@ int args_verify(char ***pargs, int *pargc,
 | 
			
		||||
			}
 | 
			
		||||
		(*pargs)++;
 | 
			
		||||
		}
 | 
			
		||||
	else if (strcmp(arg,"-verify_name") == 0)
 | 
			
		||||
		{
 | 
			
		||||
		if (!argn)
 | 
			
		||||
			*badarg = 1;
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
			vpm = X509_VERIFY_PARAM_lookup(argn);
 | 
			
		||||
			if(!vpm)
 | 
			
		||||
				{
 | 
			
		||||
				BIO_printf(err, "unrecognized verify name\n");
 | 
			
		||||
				*badarg = 1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		(*pargs)++;
 | 
			
		||||
		}
 | 
			
		||||
	else if (strcmp(arg,"-verify_depth") == 0)
 | 
			
		||||
		{
 | 
			
		||||
		if (!argn)
 | 
			
		||||
@@ -2324,6 +2435,48 @@ int args_verify(char ***pargs, int *pargc,
 | 
			
		||||
			}
 | 
			
		||||
		(*pargs)++;
 | 
			
		||||
		}
 | 
			
		||||
	else if (strcmp(arg,"-attime") == 0)
 | 
			
		||||
		{
 | 
			
		||||
		if (!argn)
 | 
			
		||||
			*badarg = 1;
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
			long timestamp;
 | 
			
		||||
			/* interpret the -attime argument as seconds since
 | 
			
		||||
			 * Epoch */
 | 
			
		||||
			if (sscanf(argn, "%li", ×tamp) != 1)
 | 
			
		||||
				{
 | 
			
		||||
				BIO_printf(bio_err,
 | 
			
		||||
						"Error parsing timestamp %s\n",
 | 
			
		||||
					   	argn);
 | 
			
		||||
				*badarg = 1;
 | 
			
		||||
				}
 | 
			
		||||
			/* on some platforms time_t may be a float */
 | 
			
		||||
			at_time = (time_t) timestamp;
 | 
			
		||||
			}
 | 
			
		||||
		(*pargs)++;
 | 
			
		||||
		}
 | 
			
		||||
	else if (strcmp(arg,"-verify_hostname") == 0)
 | 
			
		||||
		{
 | 
			
		||||
		if (!argn)
 | 
			
		||||
			*badarg = 1;
 | 
			
		||||
		hostname = (unsigned char *)argn;
 | 
			
		||||
		(*pargs)++;
 | 
			
		||||
		}
 | 
			
		||||
	else if (strcmp(arg,"-verify_email") == 0)
 | 
			
		||||
		{
 | 
			
		||||
		if (!argn)
 | 
			
		||||
			*badarg = 1;
 | 
			
		||||
		email = (unsigned char *)argn;
 | 
			
		||||
		(*pargs)++;
 | 
			
		||||
		}
 | 
			
		||||
	else if (strcmp(arg,"-verify_ip") == 0)
 | 
			
		||||
		{
 | 
			
		||||
		if (!argn)
 | 
			
		||||
			*badarg = 1;
 | 
			
		||||
		ipasc = argn;
 | 
			
		||||
		(*pargs)++;
 | 
			
		||||
		}
 | 
			
		||||
	else if (!strcmp(arg, "-ignore_critical"))
 | 
			
		||||
		flags |= X509_V_FLAG_IGNORE_CRITICAL;
 | 
			
		||||
	else if (!strcmp(arg, "-issuer_checks"))
 | 
			
		||||
@@ -2352,6 +2505,14 @@ int args_verify(char ***pargs, int *pargc,
 | 
			
		||||
		flags |= X509_V_FLAG_CHECK_SS_SIGNATURE;
 | 
			
		||||
	else if (!strcmp(arg, "-trusted_first"))
 | 
			
		||||
		flags |= X509_V_FLAG_TRUSTED_FIRST;
 | 
			
		||||
	else if (!strcmp(arg, "-suiteB_128_only"))
 | 
			
		||||
		flags |= X509_V_FLAG_SUITEB_128_LOS_ONLY;
 | 
			
		||||
	else if (!strcmp(arg, "-suiteB_128"))
 | 
			
		||||
		flags |= X509_V_FLAG_SUITEB_128_LOS;
 | 
			
		||||
	else if (!strcmp(arg, "-suiteB_192"))
 | 
			
		||||
		flags |= X509_V_FLAG_SUITEB_192_LOS;
 | 
			
		||||
	else if (!strcmp(arg, "-partial_chain"))
 | 
			
		||||
		flags |= X509_V_FLAG_PARTIAL_CHAIN;
 | 
			
		||||
	else
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
@@ -2369,9 +2530,6 @@ int args_verify(char ***pargs, int *pargc,
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (vpm)
 | 
			
		||||
		X509_VERIFY_PARAM_set1(*pm, vpm);
 | 
			
		||||
 | 
			
		||||
	if (otmp)
 | 
			
		||||
		X509_VERIFY_PARAM_add0_policy(*pm, otmp);
 | 
			
		||||
	if (flags)
 | 
			
		||||
@@ -2383,6 +2541,18 @@ int args_verify(char ***pargs, int *pargc,
 | 
			
		||||
	if (depth >= 0)
 | 
			
		||||
		X509_VERIFY_PARAM_set_depth(*pm, depth);
 | 
			
		||||
 | 
			
		||||
	if (at_time) 
 | 
			
		||||
		X509_VERIFY_PARAM_set_time(*pm, at_time);
 | 
			
		||||
 | 
			
		||||
	if (hostname && !X509_VERIFY_PARAM_set1_host(*pm, hostname, 0))
 | 
			
		||||
		*badarg = 1;
 | 
			
		||||
 | 
			
		||||
	if (email && !X509_VERIFY_PARAM_set1_email(*pm, email, 0))
 | 
			
		||||
		*badarg = 1;
 | 
			
		||||
 | 
			
		||||
	if (ipasc && !X509_VERIFY_PARAM_set1_ip_asc(*pm, ipasc))
 | 
			
		||||
		*badarg = 1;
 | 
			
		||||
 | 
			
		||||
	end:
 | 
			
		||||
 | 
			
		||||
	(*pargs)++;
 | 
			
		||||
@@ -2675,6 +2845,9 @@ void jpake_client_auth(BIO *out, BIO *conn, const char *secret)
 | 
			
		||||
 | 
			
		||||
	BIO_puts(out, "JPAKE authentication succeeded, setting PSK\n");
 | 
			
		||||
 | 
			
		||||
	if (psk_key)
 | 
			
		||||
		OPENSSL_free(psk_key);
 | 
			
		||||
 | 
			
		||||
	psk_key = BN_bn2hex(JPAKE_get_shared_key(ctx));
 | 
			
		||||
 | 
			
		||||
	BIO_pop(bconn);
 | 
			
		||||
@@ -2704,6 +2877,9 @@ void jpake_server_auth(BIO *out, BIO *conn, const char *secret)
 | 
			
		||||
 | 
			
		||||
	BIO_puts(out, "JPAKE authentication succeeded, setting PSK\n");
 | 
			
		||||
 | 
			
		||||
	if (psk_key)
 | 
			
		||||
		OPENSSL_free(psk_key);
 | 
			
		||||
 | 
			
		||||
	psk_key = BN_bn2hex(JPAKE_get_shared_key(ctx));
 | 
			
		||||
 | 
			
		||||
	BIO_pop(bconn);
 | 
			
		||||
@@ -2714,6 +2890,156 @@ void jpake_server_auth(BIO *out, BIO *conn, const char *secret)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
/* next_protos_parse parses a comma separated list of strings into a string
 | 
			
		||||
 * in a format suitable for passing to SSL_CTX_set_next_protos_advertised.
 | 
			
		||||
 *   outlen: (output) set to the length of the resulting buffer on success.
 | 
			
		||||
 *   err: (maybe NULL) on failure, an error message line is written to this BIO.
 | 
			
		||||
 *   in: a NUL termianted string like "abc,def,ghi"
 | 
			
		||||
 *
 | 
			
		||||
 *   returns: a malloced buffer or NULL on failure.
 | 
			
		||||
 */
 | 
			
		||||
unsigned char *next_protos_parse(unsigned short *outlen, const char *in)
 | 
			
		||||
	{
 | 
			
		||||
	size_t len;
 | 
			
		||||
	unsigned char *out;
 | 
			
		||||
	size_t i, start = 0;
 | 
			
		||||
 | 
			
		||||
	len = strlen(in);
 | 
			
		||||
	if (len >= 65535)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	out = OPENSSL_malloc(strlen(in) + 1);
 | 
			
		||||
	if (!out)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i <= len; ++i)
 | 
			
		||||
		{
 | 
			
		||||
		if (i == len || in[i] == ',')
 | 
			
		||||
			{
 | 
			
		||||
			if (i - start > 255)
 | 
			
		||||
				{
 | 
			
		||||
				OPENSSL_free(out);
 | 
			
		||||
				return NULL;
 | 
			
		||||
				}
 | 
			
		||||
			out[start] = i - start;
 | 
			
		||||
			start = i + 1;
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			out[i+1] = in[i];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	*outlen = len + 1;
 | 
			
		||||
	return out;
 | 
			
		||||
	}
 | 
			
		||||
#endif  /* ndef OPENSSL_NO_TLSEXT */
 | 
			
		||||
 | 
			
		||||
void print_cert_checks(BIO *bio, X509 *x,
 | 
			
		||||
				const unsigned char *checkhost,
 | 
			
		||||
				const unsigned char *checkemail,
 | 
			
		||||
				const char *checkip)
 | 
			
		||||
	{
 | 
			
		||||
	if (x == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
	if (checkhost)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio, "Hostname %s does%s match certificate\n",
 | 
			
		||||
				checkhost, X509_check_host(x, checkhost, 0, 0)
 | 
			
		||||
						? "" : " NOT");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (checkemail)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio, "Email %s does%s match certificate\n",
 | 
			
		||||
				checkemail, X509_check_email(x, checkemail, 0,
 | 
			
		||||
						0) ? "" : " NOT");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (checkip)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio, "IP %s does%s match certificate\n",
 | 
			
		||||
				checkip, X509_check_ip_asc(x, checkip,
 | 
			
		||||
						0) ? "" : " NOT");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
/* Get first http URL from a DIST_POINT structure */
 | 
			
		||||
 | 
			
		||||
static const char *get_dp_url(DIST_POINT *dp)
 | 
			
		||||
	{
 | 
			
		||||
	GENERAL_NAMES *gens;
 | 
			
		||||
	GENERAL_NAME *gen;
 | 
			
		||||
	int i, gtype;
 | 
			
		||||
	ASN1_STRING *uri;
 | 
			
		||||
	if (!dp->distpoint || dp->distpoint->type != 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	gens = dp->distpoint->name.fullname;
 | 
			
		||||
	for (i = 0; i < sk_GENERAL_NAME_num(gens); i++)
 | 
			
		||||
		{
 | 
			
		||||
		gen = sk_GENERAL_NAME_value(gens, i);
 | 
			
		||||
		uri = GENERAL_NAME_get0_value(gen, >ype);
 | 
			
		||||
		if (gtype == GEN_URI && ASN1_STRING_length(uri) > 6)
 | 
			
		||||
			{
 | 
			
		||||
			char *uptr = (char *)ASN1_STRING_data(uri);
 | 
			
		||||
			if (!strncmp(uptr, "http://", 7))
 | 
			
		||||
				return uptr;
 | 
			
		||||
			}
 | 
			
		||||
		}		
 | 
			
		||||
	return NULL;
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
/* Look through a CRLDP structure and attempt to find an http URL to downloads
 | 
			
		||||
 * a CRL from.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static X509_CRL *load_crl_crldp(STACK_OF(DIST_POINT) *crldp)
 | 
			
		||||
	{
 | 
			
		||||
	int i;
 | 
			
		||||
	const char *urlptr = NULL;
 | 
			
		||||
	for (i = 0; i < sk_DIST_POINT_num(crldp); i++)
 | 
			
		||||
		{
 | 
			
		||||
		DIST_POINT *dp = sk_DIST_POINT_value(crldp, i);
 | 
			
		||||
		urlptr = get_dp_url(dp);
 | 
			
		||||
		if (urlptr)
 | 
			
		||||
			return load_crl(urlptr, FORMAT_HTTP);
 | 
			
		||||
		}
 | 
			
		||||
	return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
/* Example of downloading CRLs from CRLDP: not usable for real world
 | 
			
		||||
 * as it always downloads, doesn't support non-blocking I/O and doesn't
 | 
			
		||||
 * cache anything.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static STACK_OF(X509_CRL) *crls_http_cb(X509_STORE_CTX *ctx, X509_NAME *nm)
 | 
			
		||||
	{
 | 
			
		||||
	X509 *x;
 | 
			
		||||
	STACK_OF(X509_CRL) *crls = NULL;
 | 
			
		||||
	X509_CRL *crl;
 | 
			
		||||
	STACK_OF(DIST_POINT) *crldp;
 | 
			
		||||
	x = X509_STORE_CTX_get_current_cert(ctx);
 | 
			
		||||
	crldp = X509_get_ext_d2i(x, NID_crl_distribution_points, NULL, NULL);
 | 
			
		||||
	crl = load_crl_crldp(crldp);
 | 
			
		||||
	sk_DIST_POINT_pop_free(crldp, DIST_POINT_free);
 | 
			
		||||
	if (!crl)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	crls = sk_X509_CRL_new_null();
 | 
			
		||||
	sk_X509_CRL_push(crls, crl);
 | 
			
		||||
	/* Try to download delta CRL */
 | 
			
		||||
	crldp = X509_get_ext_d2i(x, NID_freshest_crl, NULL, NULL);
 | 
			
		||||
	crl = load_crl_crldp(crldp);
 | 
			
		||||
	sk_DIST_POINT_pop_free(crldp, DIST_POINT_free);
 | 
			
		||||
	if (crl)
 | 
			
		||||
		sk_X509_CRL_push(crls, crl);
 | 
			
		||||
	return crls;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
void store_setup_crl_download(X509_STORE *st)
 | 
			
		||||
	{
 | 
			
		||||
	X509_STORE_set_lookup_crls_cb(st, crls_http_cb);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Platform-specific sections
 | 
			
		||||
 */
 | 
			
		||||
@@ -3039,46 +3365,3 @@ int raw_write_stdout(const void *buf,int siz)
 | 
			
		||||
int raw_write_stdout(const void *buf,int siz)
 | 
			
		||||
	{	return write(fileno(stdout),buf,siz);	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
 | 
			
		||||
/* next_protos_parse parses a comma separated list of strings into a string
 | 
			
		||||
 * in a format suitable for passing to SSL_CTX_set_next_protos_advertised.
 | 
			
		||||
 *   outlen: (output) set to the length of the resulting buffer on success.
 | 
			
		||||
 *   in: a NUL termianted string like "abc,def,ghi"
 | 
			
		||||
 *
 | 
			
		||||
 *   returns: a malloced buffer or NULL on failure.
 | 
			
		||||
 */
 | 
			
		||||
unsigned char *next_protos_parse(unsigned short *outlen, const char *in)
 | 
			
		||||
	{
 | 
			
		||||
	size_t len;
 | 
			
		||||
	unsigned char *out;
 | 
			
		||||
	size_t i, start = 0;
 | 
			
		||||
 | 
			
		||||
	len = strlen(in);
 | 
			
		||||
	if (len >= 65535)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	out = OPENSSL_malloc(strlen(in) + 1);
 | 
			
		||||
	if (!out)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i <= len; ++i)
 | 
			
		||||
		{
 | 
			
		||||
		if (i == len || in[i] == ',')
 | 
			
		||||
			{
 | 
			
		||||
			if (i - start > 255)
 | 
			
		||||
				{
 | 
			
		||||
				OPENSSL_free(out);
 | 
			
		||||
				return NULL;
 | 
			
		||||
				}
 | 
			
		||||
			out[start] = i - start;
 | 
			
		||||
			start = i + 1;
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			out[i+1] = in[i];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	*outlen = len + 1;
 | 
			
		||||
	return out;
 | 
			
		||||
	}
 | 
			
		||||
#endif  /* !OPENSSL_NO_TLSEXT && !OPENSSL_NO_NEXTPROTONEG */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								apps/apps.h
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								apps/apps.h
									
									
									
									
									
								
							@@ -188,6 +188,7 @@ extern BIO *bio_err;
 | 
			
		||||
			do { CONF_modules_unload(1); destroy_ui_method(); \
 | 
			
		||||
			OBJ_cleanup(); EVP_cleanup(); ENGINE_cleanup(); \
 | 
			
		||||
			CRYPTO_cleanup_all_ex_data(); ERR_remove_thread_state(NULL); \
 | 
			
		||||
			RAND_cleanup(); \
 | 
			
		||||
			ERR_free_strings(); zlib_cleanup();} while(0)
 | 
			
		||||
#  else
 | 
			
		||||
#    define apps_startup() \
 | 
			
		||||
@@ -198,11 +199,12 @@ extern BIO *bio_err;
 | 
			
		||||
			do { CONF_modules_unload(1); destroy_ui_method(); \
 | 
			
		||||
			OBJ_cleanup(); EVP_cleanup(); \
 | 
			
		||||
			CRYPTO_cleanup_all_ex_data(); ERR_remove_thread_state(NULL); \
 | 
			
		||||
			RAND_cleanup(); \
 | 
			
		||||
			ERR_free_strings(); zlib_cleanup(); } while(0)
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef OPENSSL_SYSNAME_WIN32
 | 
			
		||||
#if defined(OPENSSL_SYSNAME_WIN32) || defined(OPENSSL_SYSNAME_WINCE)
 | 
			
		||||
#  define openssl_fdset(a,b) FD_SET((unsigned int)a, b)
 | 
			
		||||
#else
 | 
			
		||||
#  define openssl_fdset(a,b) FD_SET(a, b)
 | 
			
		||||
@@ -245,6 +247,9 @@ int app_passwd(BIO *err, char *arg1, char *arg2, char **pass1, char **pass2);
 | 
			
		||||
int add_oid_section(BIO *err, CONF *conf);
 | 
			
		||||
X509 *load_cert(BIO *err, const char *file, int format,
 | 
			
		||||
	const char *pass, ENGINE *e, const char *cert_descrip);
 | 
			
		||||
X509_CRL *load_crl(const char *infile, int format);
 | 
			
		||||
int load_cert_crl_http(const char *url, BIO *err,
 | 
			
		||||
					X509 **pcert, X509_CRL **pcrl);
 | 
			
		||||
EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin,
 | 
			
		||||
	const char *pass, ENGINE *e, const char *key_descrip);
 | 
			
		||||
EVP_PKEY *load_pubkey(BIO *err, const char *file, int format, int maybe_stdin,
 | 
			
		||||
@@ -260,8 +265,9 @@ ENGINE *setup_engine(BIO *err, const char *engine, int debug);
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_OCSP
 | 
			
		||||
OCSP_RESPONSE *process_responder(BIO *err, OCSP_REQUEST *req,
 | 
			
		||||
			char *host, char *path, char *port, int use_ssl,
 | 
			
		||||
			STACK_OF(CONF_VALUE) *headers,
 | 
			
		||||
				 const char *host, const char *path,
 | 
			
		||||
				 const char *port, int use_ssl,
 | 
			
		||||
				 const STACK_OF(CONF_VALUE) *headers,
 | 
			
		||||
				 int req_timeout);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -331,6 +337,17 @@ void jpake_client_auth(BIO *out, BIO *conn, const char *secret);
 | 
			
		||||
void jpake_server_auth(BIO *out, BIO *conn, const char *secret);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
unsigned char *next_protos_parse(unsigned short *outlen, const char *in);
 | 
			
		||||
#endif  /* ndef OPENSSL_NO_TLSEXT */
 | 
			
		||||
 | 
			
		||||
void print_cert_checks(BIO *bio, X509 *x,
 | 
			
		||||
				const unsigned char *checkhost,
 | 
			
		||||
				const unsigned char *checkemail,
 | 
			
		||||
				const char *checkip);
 | 
			
		||||
 | 
			
		||||
void store_setup_crl_download(X509_STORE *st);
 | 
			
		||||
 | 
			
		||||
#define FORMAT_UNDEF    0
 | 
			
		||||
#define FORMAT_ASN1     1
 | 
			
		||||
#define FORMAT_TEXT     2
 | 
			
		||||
@@ -345,6 +362,7 @@ void jpake_server_auth(BIO *out, BIO *conn, const char *secret);
 | 
			
		||||
#define FORMAT_ASN1RSA	10	/* DER RSAPubicKey format */
 | 
			
		||||
#define FORMAT_MSBLOB	11	/* MS Key blob format */
 | 
			
		||||
#define FORMAT_PVK	12	/* MS PVK file format */
 | 
			
		||||
#define FORMAT_HTTP	13	/* Download using HTTP */
 | 
			
		||||
 | 
			
		||||
#define EXT_COPY_NONE	0
 | 
			
		||||
#define EXT_COPY_ADD	1
 | 
			
		||||
@@ -363,10 +381,7 @@ int raw_write_stdout(const void *,int);
 | 
			
		||||
#define TM_START	0
 | 
			
		||||
#define TM_STOP		1
 | 
			
		||||
double app_tminterval (int stop,int usertime);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define OPENSSL_NO_SSL_INTERN
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_NEXTPROTONEG
 | 
			
		||||
unsigned char *next_protos_parse(unsigned short *outlen, const char *in);
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								apps/ca.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								apps/ca.c
									
									
									
									
									
								
							@@ -501,6 +501,12 @@ EF_ALIGNMENT=0;
 | 
			
		||||
			infile= *(++argv);
 | 
			
		||||
			dorevoke=1;
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-valid") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			infile= *(++argv);
 | 
			
		||||
			dorevoke=2;
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-extensions") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
@@ -1523,6 +1529,8 @@ bad:
 | 
			
		||||
				NULL, e, infile);
 | 
			
		||||
			if (revcert == NULL)
 | 
			
		||||
				goto err;
 | 
			
		||||
			if (dorevoke == 2)
 | 
			
		||||
				rev_type = -1;
 | 
			
		||||
			j=do_revoke(revcert,db, rev_type, rev_arg);
 | 
			
		||||
			if (j <= 0) goto err;
 | 
			
		||||
			X509_free(revcert);
 | 
			
		||||
@@ -2044,7 +2052,13 @@ again2:
 | 
			
		||||
 | 
			
		||||
	if (enddate == NULL)
 | 
			
		||||
		X509_time_adj_ex(X509_get_notAfter(ret),days, 0, NULL);
 | 
			
		||||
	else ASN1_TIME_set_string(X509_get_notAfter(ret),enddate);
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		int tdays;
 | 
			
		||||
		ASN1_TIME_set_string(X509_get_notAfter(ret),enddate);
 | 
			
		||||
		ASN1_TIME_diff(&tdays, NULL, NULL, X509_get_notAfter(ret));
 | 
			
		||||
		days = tdays;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (!X509_set_subject_name(ret,subject)) goto err;
 | 
			
		||||
 | 
			
		||||
@@ -2486,6 +2500,9 @@ static int do_revoke(X509 *x509, CA_DB *db, int type, char *value)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		/* Revoke Certificate */
 | 
			
		||||
		if (type == -1)
 | 
			
		||||
			ok = 1;
 | 
			
		||||
		else
 | 
			
		||||
			ok = do_revoke(x509,db, type, value);
 | 
			
		||||
 | 
			
		||||
		goto err;
 | 
			
		||||
@@ -2497,6 +2514,12 @@ static int do_revoke(X509 *x509, CA_DB *db, int type, char *value)
 | 
			
		||||
			   row[DB_name]);
 | 
			
		||||
		goto err;
 | 
			
		||||
		}
 | 
			
		||||
	else if (type == -1)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err,"ERROR:Already present, serial number %s\n",
 | 
			
		||||
			   row[DB_serial]);
 | 
			
		||||
		goto err;
 | 
			
		||||
		}
 | 
			
		||||
	else if (rrow[DB_type][0]=='R')
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err,"ERROR:Already revoked, serial number %s\n",
 | 
			
		||||
@@ -2561,7 +2584,7 @@ static int get_certificate_status(const char *serial, CA_DB *db)
 | 
			
		||||
			
 | 
			
		||||
	/* Make it Upper Case */
 | 
			
		||||
	for (i=0; row[DB_serial][i] != '\0'; i++)
 | 
			
		||||
		row[DB_serial][i] = toupper(row[DB_serial][i]);
 | 
			
		||||
		row[DB_serial][i] = toupper((unsigned char)row[DB_serial][i]);
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	ok=1;
 | 
			
		||||
 
 | 
			
		||||
@@ -85,6 +85,9 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	{
 | 
			
		||||
	int ret=1,i;
 | 
			
		||||
	int verbose=0,Verbose=0;
 | 
			
		||||
#ifndef OPENSSL_NO_SSL_TRACE
 | 
			
		||||
	int stdname = 0;
 | 
			
		||||
#endif
 | 
			
		||||
	const char **pp;
 | 
			
		||||
	const char *p;
 | 
			
		||||
	int badops=0;
 | 
			
		||||
@@ -126,6 +129,10 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			verbose=1;
 | 
			
		||||
		else if (strcmp(*argv,"-V") == 0)
 | 
			
		||||
			verbose=Verbose=1;
 | 
			
		||||
#ifndef OPENSSL_NO_SSL_TRACE
 | 
			
		||||
		else if (strcmp(*argv,"-stdname") == 0)
 | 
			
		||||
			stdname=verbose=1;
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_SSL2
 | 
			
		||||
		else if (strcmp(*argv,"-ssl2") == 0)
 | 
			
		||||
			meth=SSLv2_client_method();
 | 
			
		||||
@@ -209,7 +216,15 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
				else
 | 
			
		||||
					BIO_printf(STDout, "0x%02X,0x%02X,0x%02X,0x%02X - ", id0, id1, id2, id3); /* whatever */
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_SSL_TRACE
 | 
			
		||||
			if (stdname)
 | 
			
		||||
				{
 | 
			
		||||
				const char *nm = SSL_CIPHER_standard_name(c);
 | 
			
		||||
				if (nm == NULL)
 | 
			
		||||
					nm = "UNKNOWN";
 | 
			
		||||
				BIO_printf(STDout, "%s - ", nm);
 | 
			
		||||
				}
 | 
			
		||||
#endif
 | 
			
		||||
			BIO_puts(STDout,SSL_CIPHER_description(c,buf,sizeof buf));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,52 @@
 | 
			
		||||
issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit)
 | 
			
		||||
subject=/C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Client test cert (512 bit)
 | 
			
		||||
subject= C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = Test Client Cert
 | 
			
		||||
issuer= C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = OpenSSL Test Intermediate CA
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIB6TCCAVICAQIwDQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCQVUxEzARBgNV
 | 
			
		||||
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRswGQYD
 | 
			
		||||
VQQDExJUZXN0IENBICgxMDI0IGJpdCkwHhcNOTcwNjA5MTM1NzU2WhcNOTgwNjA5
 | 
			
		||||
MTM1NzU2WjBjMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDEaMBgG
 | 
			
		||||
A1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxIzAhBgNVBAMTGkNsaWVudCB0ZXN0IGNl
 | 
			
		||||
cnQgKDUxMiBiaXQpMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALtv55QyzG6i2Plw
 | 
			
		||||
Z1pah7++Gv8L5j6Hnyr/uTZE1NLG0ABDDexmq/R4KedLjFEIYjocDui+IXs62NNt
 | 
			
		||||
XrT8odkCAwEAATANBgkqhkiG9w0BAQQFAAOBgQBwtMmI7oGUG8nKmftQssATViH5
 | 
			
		||||
NRRtoEw07DxJp/LfatHdrhqQB73eGdL5WILZJXk46Xz2e9WMSUjVCSYhdKxtflU3
 | 
			
		||||
UR2Ajv1Oo0sTNdfz0wDqJNirLNtzyhhsaq8qMTrLwXrCP31VxBiigFSQSUFnZyTE
 | 
			
		||||
9TKwhS4GlwbtCfxSKQ==
 | 
			
		||||
MIID5zCCAs+gAwIBAgIJALnu1NlVpZ6yMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV
 | 
			
		||||
BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMSIwIAYDVQQLDBlGT1IgVEVT
 | 
			
		||||
VElORyBQVVJQT1NFUyBPTkxZMSUwIwYDVQQDDBxPcGVuU1NMIFRlc3QgSW50ZXJt
 | 
			
		||||
ZWRpYXRlIENBMB4XDTExMTIwODE0MDE0OFoXDTIxMTAxNjE0MDE0OFowZDELMAkG
 | 
			
		||||
A1UEBhMCVUsxFjAUBgNVBAoMDU9wZW5TU0wgR3JvdXAxIjAgBgNVBAsMGUZPUiBU
 | 
			
		||||
RVNUSU5HIFBVUlBPU0VTIE9OTFkxGTAXBgNVBAMMEFRlc3QgQ2xpZW50IENlcnQw
 | 
			
		||||
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0ranbHRLcLVqN+0BzcZpY
 | 
			
		||||
+yOLqxzDWT1LD9eW1stC4NzXX9/DCtSIVyN7YIHdGLrIPr64IDdXXaMRzgZ2rOKs
 | 
			
		||||
lmHCAiFpO/ja99gGCJRxH0xwQatqAULfJVHeUhs7OEGOZc2nWifjqKvGfNTilP7D
 | 
			
		||||
nwi69ipQFq9oS19FmhwVHk2wg7KZGHI1qDyG04UrfCZMRitvS9+UVhPpIPjuiBi2
 | 
			
		||||
x3/FZIpL5gXJvvFK6xHY63oq2asyzBATntBgnP4qJFWWcvRx24wF1PnZabxuVoL2
 | 
			
		||||
bPnQ/KvONDrw3IdqkKhYNTul7jEcu3OlcZIMw+7DiaKJLAzKb/bBF5gm/pwW6As9
 | 
			
		||||
AgMBAAGjgY8wgYwwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAwLAYJYIZI
 | 
			
		||||
AYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQW
 | 
			
		||||
BBSZHKyLoTh7Mb409Zn/mK1ceSDAjDAfBgNVHSMEGDAWgBQ2w2yI55X+sL3szj49
 | 
			
		||||
hqshgYfa2jANBgkqhkiG9w0BAQUFAAOCAQEAD0mL7PtPYgCEuDyOQSbLpeND5hVS
 | 
			
		||||
curxQdGnrJ6Acrhodb7E9ccATokeb0PLx6HBLQUicxhTZIQ9FbO43YkQcOU6C3BB
 | 
			
		||||
IlwskqmtN6+VmrQzNolHCDzvxNZs9lYL2VbGPGqVRyjZeHpoAlf9cQr8PgDb4d4b
 | 
			
		||||
vUx2KAhHQvV2nkmYvKyXcgnRuHggumF87mkxidriGAEFwH4qfOqetUg64WyxP7P2
 | 
			
		||||
QLipm04SyQa7ONtIApfVXgHcE42Py4/f4arzCzMjKe3VyhGkS7nsT55X/fWgTaRm
 | 
			
		||||
CQPkO+H94P958WTvQDt77bQ+D3IvYaVvfil8n6HJMOJfFT0LJuSUbpSXJg==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIIBOwIBAAJBALtv55QyzG6i2PlwZ1pah7++Gv8L5j6Hnyr/uTZE1NLG0ABDDexm
 | 
			
		||||
q/R4KedLjFEIYjocDui+IXs62NNtXrT8odkCAwEAAQJAbwXq0vJ/+uyEvsNgxLko
 | 
			
		||||
/V86mGXQ/KrSkeKlL0r4ENxjcyeMAGoKu6J9yMY7+X9+Zm4nxShNfTsf/+Freoe1
 | 
			
		||||
HQIhAPOSm5Q1YI+KIsII2GeVJx1U69+wnd71OasIPakS1L1XAiEAxQAW+J3/JWE0
 | 
			
		||||
ftEYakbhUOKL8tD1OaFZS71/5GdG7E8CIQCefUMmySSvwd6kC0VlATSWbW+d+jp/
 | 
			
		||||
nWmM1KvqnAo5uQIhALqEADu5U1Wvt8UN8UDGBRPQulHWNycuNV45d3nnskWPAiAw
 | 
			
		||||
ueTyr6WsZ5+SD8g/Hy3xuvF3nPmJRH+rwvVihlcFOg==
 | 
			
		||||
MIIEpQIBAAKCAQEAtK2p2x0S3C1ajftAc3GaWPsji6scw1k9Sw/XltbLQuDc11/f
 | 
			
		||||
wwrUiFcje2CB3Ri6yD6+uCA3V12jEc4GdqzirJZhwgIhaTv42vfYBgiUcR9McEGr
 | 
			
		||||
agFC3yVR3lIbOzhBjmXNp1on46irxnzU4pT+w58IuvYqUBavaEtfRZocFR5NsIOy
 | 
			
		||||
mRhyNag8htOFK3wmTEYrb0vflFYT6SD47ogYtsd/xWSKS+YFyb7xSusR2Ot6Ktmr
 | 
			
		||||
MswQE57QYJz+KiRVlnL0cduMBdT52Wm8blaC9mz50PyrzjQ68NyHapCoWDU7pe4x
 | 
			
		||||
HLtzpXGSDMPuw4miiSwMym/2wReYJv6cFugLPQIDAQABAoIBAAZOyc9MhIwLSU4L
 | 
			
		||||
p4RgQvM4UVVe8/Id+3XTZ8NsXExJbWxXfIhiqGjaIfL8u4vsgRjcl+v1s/jo2/iT
 | 
			
		||||
KMab4o4D8gXD7UavQVDjtjb/ta79WL3SjRl2Uc9YjjMkyq6WmDNQeo2NKDdafCTB
 | 
			
		||||
1uzSJtLNipB8Z53ELPuHJhxX9QMHrMnuha49riQgXZ7buP9iQrHJFhImBjSzbxJx
 | 
			
		||||
L+TI6rkyLSf9Wi0Pd3L27Ob3QWNfNRYNSeTE+08eSRChkur5W0RuXAcuAICdQlCl
 | 
			
		||||
LBvWO/LmmvbzCqiDcgy/TliSb6CGGwgiNG7LJZmlkYNj8laGwalNlYZs3UrVv6NO
 | 
			
		||||
Br2loAECgYEA2kvCvPGj0Dg/6g7WhXDvAkEbcaL1tSeCxBbNH+6HS2UWMWvyTtCn
 | 
			
		||||
/bbD519QIdkvayy1QjEf32GV/UjUVmlULMLBcDy0DGjtL3+XpIhLKWDNxN1v1/ai
 | 
			
		||||
1oz23ZJCOgnk6K4qtFtlRS1XtynjA+rBetvYvLP9SKeFrnpzCgaA2r0CgYEA0+KX
 | 
			
		||||
1ACXDTNH5ySX3kMjSS9xdINf+OOw4CvPHFwbtc9aqk2HePlEsBTz5I/W3rKwXva3
 | 
			
		||||
NqZ/bRqVVeZB/hHKFywgdUQk2Uc5z/S7Lw70/w1HubNTXGU06Ngb6zOFAo/o/TwZ
 | 
			
		||||
zTP1BMIKSOB6PAZPS3l+aLO4FRIRotfFhgRHOoECgYEAmiZbqt8cJaJDB/5YYDzC
 | 
			
		||||
mp3tSk6gIb936Q6M5VqkMYp9pIKsxhk0N8aDCnTU+kIK6SzWBpr3/d9Ecmqmfyq7
 | 
			
		||||
5SvWO3KyVf0WWK9KH0abhOm2BKm2HBQvI0DB5u8sUx2/hsvOnjPYDISbZ11t0MtK
 | 
			
		||||
u35Zy89yMYcSsIYJjG/ROCUCgYEAgI2P9G5PNxEP5OtMwOsW84Y3Xat/hPAQFlI+
 | 
			
		||||
HES+AzbFGWJkeT8zL2nm95tVkFP1sggZ7Kxjz3w7cpx7GX0NkbWSE9O+T51pNASV
 | 
			
		||||
tN1sQ3p5M+/a+cnlqgfEGJVvc7iAcXQPa3LEi5h2yPR49QYXAgG6cifn3dDSpmwn
 | 
			
		||||
SUI7PQECgYEApGCIIpSRPLAEHTGmP87RBL1smurhwmy2s/pghkvUkWehtxg0sGHh
 | 
			
		||||
kuaqDWcskogv+QC0sVdytiLSz8G0DwcEcsHK1Fkyb8A+ayiw6jWJDo2m9+IF4Fww
 | 
			
		||||
1Te6jFPYDESnbhq7+TLGgHGhtwcu5cnb4vSuYXGXKupZGzoLOBbv1Zw=
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										168
									
								
								apps/cms.c
									
									
									
									
									
								
							
							
						
						
									
										168
									
								
								apps/cms.c
									
									
									
									
									
								
							@@ -74,6 +74,8 @@ static void receipt_request_print(BIO *out, CMS_ContentInfo *cms);
 | 
			
		||||
static CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to,
 | 
			
		||||
						int rr_allorfirst,
 | 
			
		||||
					STACK_OF(OPENSSL_STRING) *rr_from);
 | 
			
		||||
static int cms_set_pkey_param(EVP_PKEY_CTX *pctx,
 | 
			
		||||
			STACK_OF(OPENSSL_STRING) *param);
 | 
			
		||||
 | 
			
		||||
#define SMIME_OP	0x10
 | 
			
		||||
#define SMIME_IP	0x20
 | 
			
		||||
@@ -97,6 +99,15 @@ static CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to,
 | 
			
		||||
 | 
			
		||||
int verify_err = 0;
 | 
			
		||||
 | 
			
		||||
typedef struct cms_key_param_st cms_key_param;
 | 
			
		||||
 | 
			
		||||
struct cms_key_param_st
 | 
			
		||||
	{
 | 
			
		||||
	int idx;
 | 
			
		||||
	STACK_OF(OPENSSL_STRING)*param;
 | 
			
		||||
	cms_key_param *next;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
int MAIN(int, char **);
 | 
			
		||||
 | 
			
		||||
int MAIN(int argc, char **argv)
 | 
			
		||||
@@ -111,7 +122,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	STACK_OF(OPENSSL_STRING) *sksigners = NULL, *skkeys = NULL;
 | 
			
		||||
	char *certfile = NULL, *keyfile = NULL, *contfile=NULL;
 | 
			
		||||
	char *certsoutfile = NULL;
 | 
			
		||||
	const EVP_CIPHER *cipher = NULL;
 | 
			
		||||
	const EVP_CIPHER *cipher = NULL, *wrap_cipher = NULL;
 | 
			
		||||
	CMS_ContentInfo *cms = NULL, *rcms = NULL;
 | 
			
		||||
	X509_STORE *store = NULL;
 | 
			
		||||
	X509 *cert = NULL, *recip = NULL, *signer = NULL;
 | 
			
		||||
@@ -139,6 +150,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	unsigned char *pwri_pass = NULL, *pwri_tmp = NULL;
 | 
			
		||||
	size_t secret_keylen = 0, secret_keyidlen = 0;
 | 
			
		||||
 | 
			
		||||
	cms_key_param *key_first = NULL, *key_param = NULL;
 | 
			
		||||
 | 
			
		||||
	ASN1_OBJECT *econtent_type = NULL;
 | 
			
		||||
 | 
			
		||||
	X509_VERIFY_PARAM *vpm = NULL;
 | 
			
		||||
@@ -204,6 +217,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
				cipher = EVP_des_ede3_cbc();
 | 
			
		||||
		else if (!strcmp (*args, "-des")) 
 | 
			
		||||
				cipher = EVP_des_cbc();
 | 
			
		||||
		else if (!strcmp (*args, "-des3-wrap")) 
 | 
			
		||||
				wrap_cipher = EVP_des_ede3_wrap();
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_SEED
 | 
			
		||||
		else if (!strcmp (*args, "-seed")) 
 | 
			
		||||
@@ -224,6 +239,12 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
				cipher = EVP_aes_192_cbc();
 | 
			
		||||
		else if (!strcmp(*args,"-aes256"))
 | 
			
		||||
				cipher = EVP_aes_256_cbc();
 | 
			
		||||
		else if (!strcmp(*args,"-aes128-wrap"))
 | 
			
		||||
				wrap_cipher = EVP_aes_128_wrap();
 | 
			
		||||
		else if (!strcmp(*args,"-aes192-wrap"))
 | 
			
		||||
				wrap_cipher = EVP_aes_192_wrap();
 | 
			
		||||
		else if (!strcmp(*args,"-aes256-wrap"))
 | 
			
		||||
				wrap_cipher = EVP_aes_256_wrap();
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_CAMELLIA
 | 
			
		||||
		else if (!strcmp(*args,"-camellia128"))
 | 
			
		||||
@@ -233,6 +254,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		else if (!strcmp(*args,"-camellia256"))
 | 
			
		||||
				cipher = EVP_camellia_256_cbc();
 | 
			
		||||
#endif
 | 
			
		||||
		else if (!strcmp (*args, "-debug_decrypt")) 
 | 
			
		||||
				flags |= CMS_DEBUG_DECRYPT;
 | 
			
		||||
		else if (!strcmp (*args, "-text")) 
 | 
			
		||||
				flags |= CMS_TEXT;
 | 
			
		||||
		else if (!strcmp (*args, "-nointern")) 
 | 
			
		||||
@@ -410,6 +433,19 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			{
 | 
			
		||||
			if (!args[1])
 | 
			
		||||
				goto argerr;
 | 
			
		||||
			if (operation == SMIME_ENCRYPT)
 | 
			
		||||
				{
 | 
			
		||||
				if (!encerts)
 | 
			
		||||
					encerts = sk_X509_new_null();
 | 
			
		||||
				cert = load_cert(bio_err,*++args,FORMAT_PEM,
 | 
			
		||||
						NULL, e,
 | 
			
		||||
						"recipient certificate file");
 | 
			
		||||
				if (!cert)
 | 
			
		||||
					goto end;
 | 
			
		||||
				sk_X509_push(encerts, cert);
 | 
			
		||||
				cert = NULL;
 | 
			
		||||
				}
 | 
			
		||||
			else	
 | 
			
		||||
				recipfile = *++args;
 | 
			
		||||
			}
 | 
			
		||||
		else if (!strcmp (*args, "-certsout"))
 | 
			
		||||
@@ -458,6 +494,43 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
				goto argerr;
 | 
			
		||||
			keyform = str2fmt(*++args);
 | 
			
		||||
			}
 | 
			
		||||
		else if (!strcmp (*args, "-keyopt"))
 | 
			
		||||
			{
 | 
			
		||||
			int keyidx = -1;
 | 
			
		||||
			if (!args[1])
 | 
			
		||||
				goto argerr;
 | 
			
		||||
			if (operation == SMIME_ENCRYPT)
 | 
			
		||||
				{
 | 
			
		||||
				if (encerts)
 | 
			
		||||
					keyidx += sk_X509_num(encerts);
 | 
			
		||||
				}
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				if (keyfile || signerfile)
 | 
			
		||||
					keyidx++;
 | 
			
		||||
				if (skkeys)
 | 
			
		||||
					keyidx += sk_OPENSSL_STRING_num(skkeys);
 | 
			
		||||
				}
 | 
			
		||||
			if (keyidx < 0)
 | 
			
		||||
				{
 | 
			
		||||
				BIO_printf(bio_err, "No key specified\n");
 | 
			
		||||
				goto argerr;
 | 
			
		||||
				}
 | 
			
		||||
			if (key_param == NULL || key_param->idx != keyidx)
 | 
			
		||||
				{
 | 
			
		||||
				cms_key_param *nparam;
 | 
			
		||||
				nparam = OPENSSL_malloc(sizeof(cms_key_param));
 | 
			
		||||
				nparam->idx = keyidx;
 | 
			
		||||
				nparam->param = sk_OPENSSL_STRING_new_null();
 | 
			
		||||
				nparam->next = NULL;
 | 
			
		||||
				if (key_first == NULL)
 | 
			
		||||
					key_first = nparam;
 | 
			
		||||
				else
 | 
			
		||||
					key_param->next = nparam;
 | 
			
		||||
				key_param = nparam;
 | 
			
		||||
				}
 | 
			
		||||
			sk_OPENSSL_STRING_push(key_param->param, *++args);
 | 
			
		||||
			}
 | 
			
		||||
		else if (!strcmp (*args, "-rctform"))
 | 
			
		||||
			{
 | 
			
		||||
			if (!args[1])
 | 
			
		||||
@@ -575,7 +648,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		}
 | 
			
		||||
	else if (operation == SMIME_ENCRYPT)
 | 
			
		||||
		{
 | 
			
		||||
		if (!*args && !secret_key && !pwri_pass)
 | 
			
		||||
		if (!*args && !secret_key && !pwri_pass && !encerts)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n");
 | 
			
		||||
			badarg = 1;
 | 
			
		||||
@@ -631,6 +704,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		BIO_printf (bio_err, "-inform arg    input format SMIME (default), PEM or DER\n");
 | 
			
		||||
		BIO_printf (bio_err, "-inkey file    input private key (if not signer or recipient)\n");
 | 
			
		||||
		BIO_printf (bio_err, "-keyform arg   input private key format (PEM or ENGINE)\n");
 | 
			
		||||
		BIO_printf (bio_err, "-keyopt nm:v   set public key parameters\n");
 | 
			
		||||
		BIO_printf (bio_err, "-out file      output file\n");
 | 
			
		||||
		BIO_printf (bio_err, "-outform arg   output format SMIME (default), PEM or DER\n");
 | 
			
		||||
		BIO_printf (bio_err, "-content file  supply or override content for detached signature\n");
 | 
			
		||||
@@ -716,7 +790,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		if (*args)
 | 
			
		||||
		if (*args && !encerts)
 | 
			
		||||
			encerts = sk_X509_new_null();
 | 
			
		||||
		while (*args)
 | 
			
		||||
			{
 | 
			
		||||
@@ -910,10 +984,45 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		}
 | 
			
		||||
	else if (operation == SMIME_ENCRYPT)
 | 
			
		||||
		{
 | 
			
		||||
		int i;
 | 
			
		||||
		flags |= CMS_PARTIAL;
 | 
			
		||||
		cms = CMS_encrypt(encerts, in, cipher, flags);
 | 
			
		||||
		cms = CMS_encrypt(NULL, in, cipher, flags);
 | 
			
		||||
		if (!cms)
 | 
			
		||||
			goto end;
 | 
			
		||||
		for (i = 0; i < sk_X509_num(encerts); i++)
 | 
			
		||||
			{
 | 
			
		||||
			CMS_RecipientInfo *ri;
 | 
			
		||||
			cms_key_param *kparam;
 | 
			
		||||
			int tflags = flags;
 | 
			
		||||
			X509 *x = sk_X509_value(encerts, i);
 | 
			
		||||
			for(kparam = key_first; kparam; kparam = kparam->next)
 | 
			
		||||
				{
 | 
			
		||||
				if(kparam->idx == i)
 | 
			
		||||
					{
 | 
			
		||||
					tflags |= CMS_KEY_PARAM;
 | 
			
		||||
					break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			ri = CMS_add1_recipient_cert(cms, x, tflags);
 | 
			
		||||
			if (!ri)
 | 
			
		||||
				goto end;
 | 
			
		||||
			if (kparam)
 | 
			
		||||
				{
 | 
			
		||||
				EVP_PKEY_CTX *pctx;
 | 
			
		||||
				pctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
 | 
			
		||||
				if (!cms_set_pkey_param(pctx, kparam->param))
 | 
			
		||||
					goto end;
 | 
			
		||||
				}
 | 
			
		||||
			if (CMS_RecipientInfo_type(ri) == CMS_RECIPINFO_AGREE
 | 
			
		||||
				&& wrap_cipher)
 | 
			
		||||
				{
 | 
			
		||||
				EVP_CIPHER_CTX *wctx;
 | 
			
		||||
				wctx = CMS_RecipientInfo_kari_get0_ctx(ri);
 | 
			
		||||
				EVP_EncryptInit_ex(wctx, wrap_cipher,
 | 
			
		||||
							NULL, NULL, NULL);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		if (secret_key)
 | 
			
		||||
			{
 | 
			
		||||
			if (!CMS_add0_recipient_key(cms, NID_undef, 
 | 
			
		||||
@@ -1002,8 +1111,11 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++)
 | 
			
		||||
			{
 | 
			
		||||
			CMS_SignerInfo *si;
 | 
			
		||||
			cms_key_param *kparam;
 | 
			
		||||
			int tflags = flags;
 | 
			
		||||
			signerfile = sk_OPENSSL_STRING_value(sksigners, i);
 | 
			
		||||
			keyfile = sk_OPENSSL_STRING_value(skkeys, i);
 | 
			
		||||
 | 
			
		||||
			signer = load_cert(bio_err, signerfile,FORMAT_PEM, NULL,
 | 
			
		||||
					e, "signer certificate");
 | 
			
		||||
			if (!signer)
 | 
			
		||||
@@ -1012,9 +1124,24 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			       "signing key file");
 | 
			
		||||
			if (!key)
 | 
			
		||||
				goto end;
 | 
			
		||||
			si = CMS_add1_signer(cms, signer, key, sign_md, flags);
 | 
			
		||||
			for(kparam = key_first; kparam; kparam = kparam->next)
 | 
			
		||||
				{
 | 
			
		||||
				if(kparam->idx == i)
 | 
			
		||||
					{
 | 
			
		||||
					tflags |= CMS_KEY_PARAM;
 | 
			
		||||
					break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			si = CMS_add1_signer(cms, signer, key, sign_md, tflags);
 | 
			
		||||
			if (!si)
 | 
			
		||||
				goto end;
 | 
			
		||||
			if (kparam)
 | 
			
		||||
				{
 | 
			
		||||
				EVP_PKEY_CTX *pctx;
 | 
			
		||||
				pctx = CMS_SignerInfo_get0_pkey_ctx(si);
 | 
			
		||||
				if (!cms_set_pkey_param(pctx, kparam->param))
 | 
			
		||||
					goto end;
 | 
			
		||||
				}
 | 
			
		||||
			if (rr && !CMS_add1_ReceiptRequest(si, rr))
 | 
			
		||||
				goto end;
 | 
			
		||||
			X509_free(signer);
 | 
			
		||||
@@ -1039,6 +1166,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	ret = 4;
 | 
			
		||||
	if (operation == SMIME_DECRYPT)
 | 
			
		||||
		{
 | 
			
		||||
		if (flags & CMS_DEBUG_DECRYPT)
 | 
			
		||||
			CMS_decrypt(cms, NULL, NULL, NULL, NULL, flags);
 | 
			
		||||
 | 
			
		||||
		if (secret_key)
 | 
			
		||||
			{
 | 
			
		||||
@@ -1206,6 +1335,14 @@ end:
 | 
			
		||||
		sk_OPENSSL_STRING_free(rr_to);
 | 
			
		||||
	if (rr_from)
 | 
			
		||||
		sk_OPENSSL_STRING_free(rr_from);
 | 
			
		||||
	for(key_param = key_first; key_param;)
 | 
			
		||||
		{
 | 
			
		||||
		cms_key_param *tparam;
 | 
			
		||||
		sk_OPENSSL_STRING_free(key_param->param);
 | 
			
		||||
		tparam = key_param->next;
 | 
			
		||||
		OPENSSL_free(key_param);
 | 
			
		||||
		key_param = tparam;
 | 
			
		||||
		}
 | 
			
		||||
	X509_STORE_free(store);
 | 
			
		||||
	X509_free(cert);
 | 
			
		||||
	X509_free(recip);
 | 
			
		||||
@@ -1390,4 +1527,25 @@ static CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to,
 | 
			
		||||
	return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int cms_set_pkey_param(EVP_PKEY_CTX *pctx,
 | 
			
		||||
			STACK_OF(OPENSSL_STRING) *param)
 | 
			
		||||
	{
 | 
			
		||||
	char *keyopt;
 | 
			
		||||
	int i;
 | 
			
		||||
	if (sk_OPENSSL_STRING_num(param) <= 0)
 | 
			
		||||
		return 1;
 | 
			
		||||
	for (i = 0; i < sk_OPENSSL_STRING_num(param); i++)
 | 
			
		||||
		{
 | 
			
		||||
		keyopt = sk_OPENSSL_STRING_value(param, i);
 | 
			
		||||
		if (pkey_ctrl_string(pctx, keyopt) <= 0)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err, "parameter error \"%s\"\n",
 | 
			
		||||
						keyopt);
 | 
			
		||||
			ERR_print_errors(bio_err);
 | 
			
		||||
			return 0;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										106
									
								
								apps/crl.c
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								apps/crl.c
									
									
									
									
									
								
							@@ -93,7 +93,6 @@ static const char *crl_usage[]={
 | 
			
		||||
NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static X509_CRL *load_crl(char *file, int format);
 | 
			
		||||
static BIO *bio_out=NULL;
 | 
			
		||||
 | 
			
		||||
int MAIN(int, char **);
 | 
			
		||||
@@ -103,10 +102,10 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	unsigned long nmflag = 0;
 | 
			
		||||
	X509_CRL *x=NULL;
 | 
			
		||||
	char *CAfile = NULL, *CApath = NULL;
 | 
			
		||||
	int ret=1,i,num,badops=0;
 | 
			
		||||
	int ret=1,i,num,badops=0,badsig=0;
 | 
			
		||||
	BIO *out=NULL;
 | 
			
		||||
	int informat,outformat;
 | 
			
		||||
	char *infile=NULL,*outfile=NULL;
 | 
			
		||||
	int informat,outformat, keyformat;
 | 
			
		||||
	char *infile=NULL,*outfile=NULL, *crldiff = NULL, *keyfile = NULL;
 | 
			
		||||
	int hash=0,issuer=0,lastupdate=0,nextupdate=0,noout=0,text=0;
 | 
			
		||||
	int fingerprint = 0, crlnumber = 0;
 | 
			
		||||
	const char **pp;
 | 
			
		||||
@@ -141,6 +140,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
	informat=FORMAT_PEM;
 | 
			
		||||
	outformat=FORMAT_PEM;
 | 
			
		||||
	keyformat=FORMAT_PEM;
 | 
			
		||||
 | 
			
		||||
	argc--;
 | 
			
		||||
	argv++;
 | 
			
		||||
@@ -169,6 +169,21 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			infile= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-gendelta") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			crldiff= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-key") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			keyfile= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-keyform") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			keyformat=str2fmt(*(++argv));
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-out") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
@@ -209,6 +224,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			fingerprint= ++num;
 | 
			
		||||
		else if (strcmp(*argv,"-crlnumber") == 0)
 | 
			
		||||
			crlnumber= ++num;
 | 
			
		||||
		else if (strcmp(*argv,"-badsig") == 0)
 | 
			
		||||
			badsig = 1;
 | 
			
		||||
		else if ((md_alg=EVP_get_digestbyname(*argv + 1)))
 | 
			
		||||
			{
 | 
			
		||||
			/* ok */
 | 
			
		||||
@@ -276,6 +293,39 @@ bad:
 | 
			
		||||
		else BIO_printf(bio_err, "verify OK\n");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (crldiff)
 | 
			
		||||
		{
 | 
			
		||||
		X509_CRL *newcrl, *delta;
 | 
			
		||||
		if (!keyfile)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_puts(bio_err, "Missing CRL signing key\n");
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		newcrl = load_crl(crldiff,informat);
 | 
			
		||||
		if (!newcrl)
 | 
			
		||||
			goto end;
 | 
			
		||||
		pkey = load_key(bio_err, keyfile, keyformat, 0, NULL, NULL,
 | 
			
		||||
					"CRL signing key");
 | 
			
		||||
		if (!pkey)
 | 
			
		||||
			{
 | 
			
		||||
			X509_CRL_free(newcrl);
 | 
			
		||||
			goto end;
 | 
			
		||||
			}	
 | 
			
		||||
		delta = X509_CRL_diff(x, newcrl, pkey, digest, 0);
 | 
			
		||||
		X509_CRL_free(newcrl);
 | 
			
		||||
		EVP_PKEY_free(pkey);
 | 
			
		||||
		if (delta)
 | 
			
		||||
			{
 | 
			
		||||
			X509_CRL_free(x);
 | 
			
		||||
			x = delta;
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
			BIO_puts(bio_err, "Error creating delta CRL\n");
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (num)
 | 
			
		||||
		{
 | 
			
		||||
		for (i=1; i<=num; i++)
 | 
			
		||||
@@ -378,6 +428,9 @@ bad:
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (badsig)
 | 
			
		||||
		x->signature->data[x->signature->length - 1] ^= 0x1;
 | 
			
		||||
 | 
			
		||||
	if 	(outformat == FORMAT_ASN1)
 | 
			
		||||
		i=(int)i2d_X509_CRL_bio(out,x);
 | 
			
		||||
	else if (outformat == FORMAT_PEM)
 | 
			
		||||
@@ -390,6 +443,8 @@ bad:
 | 
			
		||||
	if (!i) { BIO_printf(bio_err,"unable to write CRL\n"); goto end; }
 | 
			
		||||
	ret=0;
 | 
			
		||||
end:
 | 
			
		||||
	if (ret != 0)
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
	BIO_free_all(out);
 | 
			
		||||
	BIO_free_all(bio_out);
 | 
			
		||||
	bio_out=NULL;
 | 
			
		||||
@@ -401,46 +456,3 @@ end:
 | 
			
		||||
	apps_shutdown();
 | 
			
		||||
	OPENSSL_EXIT(ret);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static X509_CRL *load_crl(char *infile, int format)
 | 
			
		||||
	{
 | 
			
		||||
	X509_CRL *x=NULL;
 | 
			
		||||
	BIO *in=NULL;
 | 
			
		||||
 | 
			
		||||
	in=BIO_new(BIO_s_file());
 | 
			
		||||
	if (in == NULL)
 | 
			
		||||
		{
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (infile == NULL)
 | 
			
		||||
		BIO_set_fp(in,stdin,BIO_NOCLOSE);
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		if (BIO_read_filename(in,infile) <= 0)
 | 
			
		||||
			{
 | 
			
		||||
			perror(infile);
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	if 	(format == FORMAT_ASN1)
 | 
			
		||||
		x=d2i_X509_CRL_bio(in,NULL);
 | 
			
		||||
	else if (format == FORMAT_PEM)
 | 
			
		||||
		x=PEM_read_bio_X509_CRL(in,NULL,NULL,NULL);
 | 
			
		||||
	else	{
 | 
			
		||||
		BIO_printf(bio_err,"bad input format specified for input crl\n");
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
	if (x == NULL)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err,"unable to load CRL\n");
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
end:
 | 
			
		||||
	BIO_free(in);
 | 
			
		||||
	return(x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								apps/dgst.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								apps/dgst.c
									
									
									
									
									
								
							@@ -128,6 +128,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
#endif
 | 
			
		||||
	char *hmac_key=NULL;
 | 
			
		||||
	char *mac_name=NULL;
 | 
			
		||||
	int non_fips_allow = 0;
 | 
			
		||||
	STACK_OF(OPENSSL_STRING) *sigopts = NULL, *macopts = NULL;
 | 
			
		||||
 | 
			
		||||
	apps_startup();
 | 
			
		||||
@@ -220,6 +221,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			debug=1;
 | 
			
		||||
		else if (!strcmp(*argv,"-fips-fingerprint"))
 | 
			
		||||
			hmac_key = "etaonrishdlcupfm";
 | 
			
		||||
		else if (strcmp(*argv,"-non-fips-allow") == 0)
 | 
			
		||||
			non_fips_allow=1;
 | 
			
		||||
		else if (!strcmp(*argv,"-hmac"))
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1)
 | 
			
		||||
@@ -405,6 +408,13 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (non_fips_allow)
 | 
			
		||||
		{
 | 
			
		||||
		EVP_MD_CTX *md_ctx;
 | 
			
		||||
		BIO_get_md_ctx(bmd,&md_ctx);
 | 
			
		||||
		EVP_MD_CTX_set_flags(md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (hmac_key)
 | 
			
		||||
		{
 | 
			
		||||
		sigkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, impl,
 | 
			
		||||
 
 | 
			
		||||
@@ -332,7 +332,6 @@ bad:
 | 
			
		||||
			BIO_printf(bio_err,"This is going to take a long time\n");
 | 
			
		||||
			if(!dh || !DH_generate_parameters_ex(dh, num, g, &cb))
 | 
			
		||||
				{
 | 
			
		||||
				if(dh) DH_free(dh);
 | 
			
		||||
				ERR_print_errors(bio_err);
 | 
			
		||||
				goto end;
 | 
			
		||||
				}
 | 
			
		||||
@@ -513,7 +512,12 @@ bad:
 | 
			
		||||
		if 	(outformat == FORMAT_ASN1)
 | 
			
		||||
			i=i2d_DHparams_bio(out,dh);
 | 
			
		||||
		else if (outformat == FORMAT_PEM)
 | 
			
		||||
			{
 | 
			
		||||
			if (dh->q)
 | 
			
		||||
				i=PEM_write_bio_DHxparams(out,dh);
 | 
			
		||||
			else
 | 
			
		||||
				i=PEM_write_bio_DHparams(out,dh);
 | 
			
		||||
			}
 | 
			
		||||
		else	{
 | 
			
		||||
			BIO_printf(bio_err,"bad output format specified for outfile\n");
 | 
			
		||||
			goto end;
 | 
			
		||||
 
 | 
			
		||||
@@ -118,7 +118,6 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	char *infile,*outfile,*prog,*inrand=NULL;
 | 
			
		||||
	int numbits= -1,num,genkey=0;
 | 
			
		||||
	int need_rand=0;
 | 
			
		||||
	int non_fips_allow = 0;
 | 
			
		||||
#ifndef OPENSSL_NO_ENGINE
 | 
			
		||||
	char *engine=NULL;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -196,8 +195,6 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-noout") == 0)
 | 
			
		||||
			noout=1;
 | 
			
		||||
		else if (strcmp(*argv,"-non-fips-allow") == 0)
 | 
			
		||||
			non_fips_allow = 1;
 | 
			
		||||
		else if (sscanf(*argv,"%d",&num) == 1)
 | 
			
		||||
			{
 | 
			
		||||
			/* generate a key */
 | 
			
		||||
@@ -300,8 +297,6 @@ bad:
 | 
			
		||||
			BIO_printf(bio_err,"Error allocating DSA object\n");
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		if (non_fips_allow)
 | 
			
		||||
			dsa->flags |= DSA_FLAG_NON_FIPS_ALLOW;
 | 
			
		||||
		BIO_printf(bio_err,"Generating DSA parameters, %d bit long prime\n",num);
 | 
			
		||||
	        BIO_printf(bio_err,"This could take some time\n");
 | 
			
		||||
#ifdef GENCB_TEST
 | 
			
		||||
@@ -435,8 +430,6 @@ bad:
 | 
			
		||||
 | 
			
		||||
		assert(need_rand);
 | 
			
		||||
		if ((dsakey=DSAparams_dup(dsa)) == NULL) goto end;
 | 
			
		||||
		if (non_fips_allow)
 | 
			
		||||
			dsakey->flags |= DSA_FLAG_NON_FIPS_ALLOW;
 | 
			
		||||
		if (!DSA_generate_key(dsakey))
 | 
			
		||||
			{
 | 
			
		||||
			ERR_print_errors(bio_err);
 | 
			
		||||
 
 | 
			
		||||
@@ -105,7 +105,7 @@
 | 
			
		||||
 *                    in the asn1 der encoding
 | 
			
		||||
 *                    possible values: named_curve (default)
 | 
			
		||||
 *                                     explicit
 | 
			
		||||
 * -no_seed         - if 'explicit' parameters are choosen do not use the seed
 | 
			
		||||
 * -no_seed         - if 'explicit' parameters are chosen do not use the seed
 | 
			
		||||
 * -genkey          - generate ec key
 | 
			
		||||
 * -rand file       - files to use for random number input
 | 
			
		||||
 * -engine e        - use engine e, possibly a hardware device
 | 
			
		||||
@@ -286,7 +286,7 @@ bad:
 | 
			
		||||
		BIO_printf(bio_err, "                                   "
 | 
			
		||||
				" explicit\n");
 | 
			
		||||
		BIO_printf(bio_err, " -no_seed          if 'explicit'"
 | 
			
		||||
				" parameters are choosen do not"
 | 
			
		||||
				" parameters are chosen do not"
 | 
			
		||||
				" use the seed\n");
 | 
			
		||||
		BIO_printf(bio_err, " -genkey           generate ec"
 | 
			
		||||
				" key\n");
 | 
			
		||||
@@ -403,6 +403,9 @@ bad:
 | 
			
		||||
		else
 | 
			
		||||
			nid = OBJ_sn2nid(curve_name);
 | 
			
		||||
 | 
			
		||||
		if (nid == 0)
 | 
			
		||||
			nid = EC_curve_nist2nid(curve_name);
 | 
			
		||||
	
 | 
			
		||||
		if (nid == 0)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err, "unknown curve name (%s)\n", 
 | 
			
		||||
 
 | 
			
		||||
@@ -129,6 +129,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	char *engine = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
	const EVP_MD *dgst=NULL;
 | 
			
		||||
	int non_fips_allow = 0;
 | 
			
		||||
 | 
			
		||||
	apps_startup();
 | 
			
		||||
 | 
			
		||||
@@ -281,6 +282,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			md= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-non-fips-allow") == 0)
 | 
			
		||||
			non_fips_allow = 1;
 | 
			
		||||
		else if	((argv[0][0] == '-') &&
 | 
			
		||||
			((c=EVP_get_cipherbyname(&(argv[0][1]))) != NULL))
 | 
			
		||||
			{
 | 
			
		||||
@@ -589,6 +592,11 @@ bad:
 | 
			
		||||
		 */
 | 
			
		||||
 | 
			
		||||
		BIO_get_cipher_ctx(benc, &ctx);
 | 
			
		||||
 | 
			
		||||
		if (non_fips_allow)
 | 
			
		||||
			EVP_CIPHER_CTX_set_flags(ctx,
 | 
			
		||||
				EVP_CIPH_FLAG_NON_FIPS_ALLOW);
 | 
			
		||||
 | 
			
		||||
		if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc))
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err, "Error setting cipher %s\n",
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,7 @@
 | 
			
		||||
#include <openssl/pem.h>
 | 
			
		||||
#include <openssl/rand.h>
 | 
			
		||||
 | 
			
		||||
#define DEFBITS	512
 | 
			
		||||
#define DEFBITS	1024
 | 
			
		||||
#undef PROG
 | 
			
		||||
#define PROG genrsa_main
 | 
			
		||||
 | 
			
		||||
@@ -93,7 +93,6 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	ENGINE *e = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
	int ret=1;
 | 
			
		||||
	int non_fips_allow = 0;
 | 
			
		||||
	int i,num=DEFBITS;
 | 
			
		||||
	long l;
 | 
			
		||||
	const EVP_CIPHER *enc=NULL;
 | 
			
		||||
@@ -186,8 +185,6 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			passargout= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-non-fips-allow") == 0)
 | 
			
		||||
			non_fips_allow = 1;
 | 
			
		||||
		else
 | 
			
		||||
			break;
 | 
			
		||||
		argv++;
 | 
			
		||||
@@ -276,9 +273,6 @@ bad:
 | 
			
		||||
	if (!rsa)
 | 
			
		||||
		goto err;
 | 
			
		||||
 | 
			
		||||
	if (non_fips_allow)
 | 
			
		||||
		rsa->flags |= RSA_FLAG_NON_FIPS_ALLOW;
 | 
			
		||||
 | 
			
		||||
	if(!BN_set_word(bn, f4) || !RSA_generate_key_ex(rsa, num, bn, &cb))
 | 
			
		||||
		goto err;
 | 
			
		||||
		
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										95
									
								
								apps/ocsp.c
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								apps/ocsp.c
									
									
									
									
									
								
							@@ -105,16 +105,16 @@ static int print_ocsp_summary(BIO *out, OCSP_BASICRESP *bs, OCSP_REQUEST *req,
 | 
			
		||||
			      long maxage);
 | 
			
		||||
 | 
			
		||||
static int make_ocsp_response(OCSP_RESPONSE **resp, OCSP_REQUEST *req, CA_DB *db,
 | 
			
		||||
			X509 *ca, X509 *rcert, EVP_PKEY *rkey,
 | 
			
		||||
			X509 *ca, X509 *rcert, EVP_PKEY *rkey, const EVP_MD *md,
 | 
			
		||||
			STACK_OF(X509) *rother, unsigned long flags,
 | 
			
		||||
			int nmin, int ndays);
 | 
			
		||||
			int nmin, int ndays, int badsig);
 | 
			
		||||
 | 
			
		||||
static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser);
 | 
			
		||||
static BIO *init_responder(char *port);
 | 
			
		||||
static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, char *port);
 | 
			
		||||
static BIO *init_responder(const char *port);
 | 
			
		||||
static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, const char *port);
 | 
			
		||||
static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp);
 | 
			
		||||
static OCSP_RESPONSE *query_responder(BIO *err, BIO *cbio, char *path,
 | 
			
		||||
				STACK_OF(CONF_VALUE) *headers,
 | 
			
		||||
static OCSP_RESPONSE *query_responder(BIO *err, BIO *cbio, const char *path,
 | 
			
		||||
				      const STACK_OF(CONF_VALUE) *headers,
 | 
			
		||||
				      OCSP_REQUEST *req, int req_timeout);
 | 
			
		||||
 | 
			
		||||
#undef PROG
 | 
			
		||||
@@ -148,12 +148,14 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	long nsec = MAX_VALIDITY_PERIOD, maxage = -1;
 | 
			
		||||
	char *CAfile = NULL, *CApath = NULL;
 | 
			
		||||
	X509_STORE *store = NULL;
 | 
			
		||||
	X509_VERIFY_PARAM *vpm = NULL;
 | 
			
		||||
	STACK_OF(X509) *sign_other = NULL, *verify_other = NULL, *rother = NULL;
 | 
			
		||||
	char *sign_certfile = NULL, *verify_certfile = NULL, *rcertfile = NULL;
 | 
			
		||||
	unsigned long sign_flags = 0, verify_flags = 0, rflags = 0;
 | 
			
		||||
	int ret = 1;
 | 
			
		||||
	int accept_count = -1;
 | 
			
		||||
	int badarg = 0;
 | 
			
		||||
	int badsig = 0;
 | 
			
		||||
	int i;
 | 
			
		||||
	int ignore_err = 0;
 | 
			
		||||
	STACK_OF(OPENSSL_STRING) *reqnames = NULL;
 | 
			
		||||
@@ -164,7 +166,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	char *rca_filename = NULL;
 | 
			
		||||
	CA_DB *rdb = NULL;
 | 
			
		||||
	int nmin = 0, ndays = -1;
 | 
			
		||||
	const EVP_MD *cert_id_md = NULL;
 | 
			
		||||
	const EVP_MD *cert_id_md = NULL, *rsign_md = NULL;
 | 
			
		||||
 | 
			
		||||
	if (bio_err == NULL) bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
 | 
			
		||||
 | 
			
		||||
@@ -271,6 +273,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			verify_flags |= OCSP_TRUSTOTHER;
 | 
			
		||||
		else if (!strcmp(*args, "-no_intern"))
 | 
			
		||||
			verify_flags |= OCSP_NOINTERN;
 | 
			
		||||
		else if (!strcmp(*args, "-badsig"))
 | 
			
		||||
			badsig = 1;
 | 
			
		||||
		else if (!strcmp(*args, "-text"))
 | 
			
		||||
			{
 | 
			
		||||
			req_text = 1;
 | 
			
		||||
@@ -353,6 +357,12 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
				}
 | 
			
		||||
			else badarg = 1;
 | 
			
		||||
			}
 | 
			
		||||
		else if (args_verify(&args, NULL, &badarg, bio_err, &vpm))
 | 
			
		||||
			{
 | 
			
		||||
			if (badarg)
 | 
			
		||||
				goto end;
 | 
			
		||||
			continue;
 | 
			
		||||
			}
 | 
			
		||||
		else if (!strcmp (*args, "-validity_period"))
 | 
			
		||||
			{
 | 
			
		||||
			if (args[1])
 | 
			
		||||
@@ -558,6 +568,17 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
				}
 | 
			
		||||
			else badarg = 1;
 | 
			
		||||
			}
 | 
			
		||||
		else if (!strcmp(*args, "-rmd"))
 | 
			
		||||
			{
 | 
			
		||||
			if (args[1])
 | 
			
		||||
				{
 | 
			
		||||
				args++;
 | 
			
		||||
				rsign_md = EVP_get_digestbyname(*args);
 | 
			
		||||
				if (!rsign_md)
 | 
			
		||||
					badarg = 1;
 | 
			
		||||
				}
 | 
			
		||||
			else badarg = 1;
 | 
			
		||||
			}
 | 
			
		||||
		else if ((cert_id_md = EVP_get_digestbyname((*args)+1))==NULL)
 | 
			
		||||
			{
 | 
			
		||||
			badarg = 1;
 | 
			
		||||
@@ -617,7 +638,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		BIO_printf (bio_err, "-ndays n	 	 number of days before next update\n");
 | 
			
		||||
		BIO_printf (bio_err, "-resp_key_id       identify reponse by signing certificate key ID\n");
 | 
			
		||||
		BIO_printf (bio_err, "-nrequest n        number of requests to accept (default unlimited)\n");
 | 
			
		||||
		BIO_printf (bio_err, "-<dgst alg>     use specified digest in the request");
 | 
			
		||||
		BIO_printf (bio_err, "-<dgst alg>     use specified digest in the request\n");
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -634,6 +655,9 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
	if (!req && reqin)
 | 
			
		||||
		{
 | 
			
		||||
		if (!strcmp(reqin, "-"))
 | 
			
		||||
			derbio = BIO_new_fp(stdin, BIO_NOCLOSE);
 | 
			
		||||
		else
 | 
			
		||||
			derbio = BIO_new_file(reqin, "rb");
 | 
			
		||||
		if (!derbio)
 | 
			
		||||
			{
 | 
			
		||||
@@ -736,6 +760,9 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
	if (reqout)
 | 
			
		||||
		{
 | 
			
		||||
		if (!strcmp(reqout, "-"))
 | 
			
		||||
			derbio = BIO_new_fp(stdout, BIO_NOCLOSE);
 | 
			
		||||
		else
 | 
			
		||||
			derbio = BIO_new_file(reqout, "wb");
 | 
			
		||||
		if(!derbio)
 | 
			
		||||
			{
 | 
			
		||||
@@ -761,7 +788,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
	if (rdb)
 | 
			
		||||
		{
 | 
			
		||||
		i = make_ocsp_response(&resp, req, rdb, rca_cert, rsigner, rkey, rother, rflags, nmin, ndays);
 | 
			
		||||
		i = make_ocsp_response(&resp, req, rdb, rca_cert, rsigner, rkey,rsign_md, rother, rflags, nmin, ndays, badsig);
 | 
			
		||||
		if (cbio)
 | 
			
		||||
			send_ocsp_response(cbio, resp);
 | 
			
		||||
		}
 | 
			
		||||
@@ -779,6 +806,9 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		}
 | 
			
		||||
	else if (respin)
 | 
			
		||||
		{
 | 
			
		||||
		if (!strcmp(respin, "-"))
 | 
			
		||||
			derbio = BIO_new_fp(stdin, BIO_NOCLOSE);
 | 
			
		||||
		else
 | 
			
		||||
			derbio = BIO_new_file(respin, "rb");
 | 
			
		||||
		if (!derbio)
 | 
			
		||||
			{
 | 
			
		||||
@@ -804,6 +834,9 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
	if (respout)
 | 
			
		||||
		{
 | 
			
		||||
		if (!strcmp(respout, "-"))
 | 
			
		||||
			derbio = BIO_new_fp(stdout, BIO_NOCLOSE);
 | 
			
		||||
		else
 | 
			
		||||
			derbio = BIO_new_file(respout, "wb");
 | 
			
		||||
		if(!derbio)
 | 
			
		||||
			{
 | 
			
		||||
@@ -844,6 +877,12 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			resp = NULL;
 | 
			
		||||
			goto redo_accept;
 | 
			
		||||
			}
 | 
			
		||||
		ret = 0;
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
	else if (ridx_filename)
 | 
			
		||||
		{
 | 
			
		||||
		ret = 0;
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -851,6 +890,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		store = setup_verify(bio_err, CAfile, CApath);
 | 
			
		||||
	if (!store)
 | 
			
		||||
		goto end;
 | 
			
		||||
	if (vpm)
 | 
			
		||||
		X509_STORE_set1_param(store, vpm);
 | 
			
		||||
	if (verify_certfile)
 | 
			
		||||
		{
 | 
			
		||||
		verify_other = load_certs(bio_err, verify_certfile, FORMAT_PEM,
 | 
			
		||||
@@ -866,6 +907,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ret = 0;
 | 
			
		||||
 | 
			
		||||
	if (!noverify)
 | 
			
		||||
		{
 | 
			
		||||
		if (req && ((i = OCSP_check_nonce(req, bs)) <= 0))
 | 
			
		||||
@@ -875,17 +918,17 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				BIO_printf(bio_err, "Nonce Verify error\n");
 | 
			
		||||
				ret = 1;
 | 
			
		||||
				goto end;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		i = OCSP_basic_verify(bs, verify_other, store, verify_flags);
 | 
			
		||||
                if (i < 0) i = OCSP_basic_verify(bs, NULL, store, 0);
 | 
			
		||||
 | 
			
		||||
		if(i <= 0)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err, "Response Verify Failure\n");
 | 
			
		||||
			ERR_print_errors(bio_err);
 | 
			
		||||
			ret = 1;
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			BIO_printf(bio_err, "Response verify OK\n");
 | 
			
		||||
@@ -893,14 +936,14 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (!print_ocsp_summary(out, bs, req, reqnames, ids, nsec, maxage))
 | 
			
		||||
		goto end;
 | 
			
		||||
 | 
			
		||||
	ret = 0;
 | 
			
		||||
		ret = 1;
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
	ERR_print_errors(bio_err);
 | 
			
		||||
	X509_free(signer);
 | 
			
		||||
	X509_STORE_free(store);
 | 
			
		||||
	if (vpm)
 | 
			
		||||
		X509_VERIFY_PARAM_free(vpm);
 | 
			
		||||
	EVP_PKEY_free(key);
 | 
			
		||||
	EVP_PKEY_free(rkey);
 | 
			
		||||
	X509_free(issuer);
 | 
			
		||||
@@ -1051,9 +1094,10 @@ static int print_ocsp_summary(BIO *out, OCSP_BASICRESP *bs, OCSP_REQUEST *req,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int make_ocsp_response(OCSP_RESPONSE **resp, OCSP_REQUEST *req, CA_DB *db,
 | 
			
		||||
			X509 *ca, X509 *rcert, EVP_PKEY *rkey,
 | 
			
		||||
			X509 *ca, X509 *rcert,
 | 
			
		||||
			EVP_PKEY *rkey, const EVP_MD *rmd,
 | 
			
		||||
			STACK_OF(X509) *rother, unsigned long flags,
 | 
			
		||||
			int nmin, int ndays)
 | 
			
		||||
			int nmin, int ndays, int badsig)
 | 
			
		||||
	{
 | 
			
		||||
	ASN1_TIME *thisupd = NULL, *nextupd = NULL;
 | 
			
		||||
	OCSP_CERTID *cid, *ca_id = NULL;
 | 
			
		||||
@@ -1142,7 +1186,10 @@ static int make_ocsp_response(OCSP_RESPONSE **resp, OCSP_REQUEST *req, CA_DB *db
 | 
			
		||||
 | 
			
		||||
	OCSP_copy_nonce(bs, req);
 | 
			
		||||
	
 | 
			
		||||
	OCSP_basic_sign(bs, rcert, rkey, NULL, rother, flags);
 | 
			
		||||
	OCSP_basic_sign(bs, rcert, rkey, rmd, rother, flags);
 | 
			
		||||
 | 
			
		||||
	if (badsig)
 | 
			
		||||
		bs->signature->data[bs->signature->length -1] ^= 0x1;
 | 
			
		||||
 | 
			
		||||
	*resp = OCSP_response_create(OCSP_RESPONSE_STATUS_SUCCESSFUL, bs);
 | 
			
		||||
 | 
			
		||||
@@ -1176,7 +1223,7 @@ static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser)
 | 
			
		||||
 | 
			
		||||
/* Quick and dirty OCSP server: read in and parse input request */
 | 
			
		||||
 | 
			
		||||
static BIO *init_responder(char *port)
 | 
			
		||||
static BIO *init_responder(const char *port)
 | 
			
		||||
	{
 | 
			
		||||
	BIO *acbio = NULL, *bufbio = NULL;
 | 
			
		||||
	bufbio = BIO_new(BIO_f_buffer());
 | 
			
		||||
@@ -1207,7 +1254,8 @@ static BIO *init_responder(char *port)
 | 
			
		||||
	return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, char *port)
 | 
			
		||||
static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio,
 | 
			
		||||
			const char *port)
 | 
			
		||||
	{
 | 
			
		||||
	int have_post = 0, len;
 | 
			
		||||
	OCSP_REQUEST *req = NULL;
 | 
			
		||||
@@ -1273,8 +1321,8 @@ static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp)
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static OCSP_RESPONSE *query_responder(BIO *err, BIO *cbio, char *path,
 | 
			
		||||
				STACK_OF(CONF_VALUE) *headers,
 | 
			
		||||
static OCSP_RESPONSE *query_responder(BIO *err, BIO *cbio, const char *path,
 | 
			
		||||
				      const STACK_OF(CONF_VALUE) *headers,
 | 
			
		||||
				      OCSP_REQUEST *req, int req_timeout)
 | 
			
		||||
	{
 | 
			
		||||
	int fd;
 | 
			
		||||
@@ -1371,8 +1419,9 @@ static OCSP_RESPONSE *query_responder(BIO *err, BIO *cbio, char *path,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
OCSP_RESPONSE *process_responder(BIO *err, OCSP_REQUEST *req,
 | 
			
		||||
			char *host, char *path, char *port, int use_ssl,
 | 
			
		||||
			STACK_OF(CONF_VALUE) *headers,
 | 
			
		||||
				 const char *host, const char *path,
 | 
			
		||||
				 const char *port, int use_ssl,
 | 
			
		||||
				 const STACK_OF(CONF_VALUE) *headers,
 | 
			
		||||
				 int req_timeout)
 | 
			
		||||
	{
 | 
			
		||||
	BIO *cbio = NULL;
 | 
			
		||||
 
 | 
			
		||||
@@ -145,7 +145,7 @@ localityName			= Locality Name (eg, city)
 | 
			
		||||
organizationalUnitName		= Organizational Unit Name (eg, section)
 | 
			
		||||
#organizationalUnitName_default	=
 | 
			
		||||
 | 
			
		||||
commonName			= Common Name (eg, YOUR name)
 | 
			
		||||
commonName			= Common Name (e.g. server FQDN or YOUR name)
 | 
			
		||||
commonName_max			= 64
 | 
			
		||||
 | 
			
		||||
emailAddress			= Email Address
 | 
			
		||||
 
 | 
			
		||||
@@ -117,6 +117,7 @@
 | 
			
		||||
#include "apps.h"
 | 
			
		||||
#include <openssl/bio.h>
 | 
			
		||||
#include <openssl/crypto.h>
 | 
			
		||||
#include <openssl/rand.h>
 | 
			
		||||
#include <openssl/lhash.h>
 | 
			
		||||
#include <openssl/conf.h>
 | 
			
		||||
#include <openssl/x509.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -145,7 +145,7 @@ localityName			= Locality Name (eg, city)
 | 
			
		||||
organizationalUnitName		= Organizational Unit Name (eg, section)
 | 
			
		||||
#organizationalUnitName_default	=
 | 
			
		||||
 | 
			
		||||
commonName			= Common Name (eg, YOUR name)
 | 
			
		||||
commonName			= Common Name (e.g. server FQDN or YOUR name)
 | 
			
		||||
commonName_max			= 64
 | 
			
		||||
 | 
			
		||||
emailAddress			= Email Address
 | 
			
		||||
 
 | 
			
		||||
@@ -112,7 +112,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
    int maciter = PKCS12_DEFAULT_ITER;
 | 
			
		||||
    int twopass = 0;
 | 
			
		||||
    int keytype = 0;
 | 
			
		||||
    int cert_pbe = NID_pbe_WithSHA1And40BitRC2_CBC;
 | 
			
		||||
    int cert_pbe;
 | 
			
		||||
    int key_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC;
 | 
			
		||||
    int ret = 1;
 | 
			
		||||
    int macver = 1;
 | 
			
		||||
@@ -130,6 +130,13 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
    apps_startup();
 | 
			
		||||
 | 
			
		||||
#ifdef OPENSSL_FIPS
 | 
			
		||||
    if (FIPS_mode())
 | 
			
		||||
	cert_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC;
 | 
			
		||||
    else
 | 
			
		||||
#endif
 | 
			
		||||
    cert_pbe = NID_pbe_WithSHA1And40BitRC2_CBC;
 | 
			
		||||
 | 
			
		||||
    enc = EVP_des_ede3_cbc();
 | 
			
		||||
    if (bio_err == NULL ) bio_err = BIO_new_fp (stderr, BIO_NOCLOSE);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,18 @@
 | 
			
		||||
-----BEGIN PRIVATE KEY-----
 | 
			
		||||
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMo7DFNMqywUA1O/
 | 
			
		||||
qvWqCOm6rGrUAcR+dKsSXw6y2qiKO7APDDyotc0b4Mxwqjga98npex2RBIwUoCGJ
 | 
			
		||||
iEmMXo/a8RbXVUZ+ZwcAX7PC+XeXVC5qoajaBBkd2MvYmib/2PqnNrgvhHsUL5dO
 | 
			
		||||
xhC7cRqxLM/g45k3Yyw+nGa+WkTdAgMBAAECgYBMBT5w4dVG0I8foGFnz+9hzWab
 | 
			
		||||
Ee9IKjE5TcKmB93ilXQyjrWO5+zPmbc7ou6aAKk9IaPCTY1kCyzW7pho7Xdt+RFq
 | 
			
		||||
TgVXGZZfqtixO7f2/5oqZAkd00eOn9ZrhBpVMu4yXbbDvhDyFe4/oy0HGDjRUhxa
 | 
			
		||||
Lf6ZlBuTherxm4eFkQJBAPBQwRs9UtqaMAQlagA9pV5UsQjV1WT4IxDURMPfXgCd
 | 
			
		||||
ETNkB6pP0SmxQm5xhv9N2HY1UtoWpug9s0OU5IJB15sCQQDXbfbjiujNbuOxCFNw
 | 
			
		||||
68JZaCFVdNovyOWORkpenQLNEjVkmTCS9OayK09ADEYtsdpUGKeF+2EYBNkFr5px
 | 
			
		||||
CajnAkBMYI4PNz1HBuwt1SpMa0tMoMQnV7bbwVV7usskKbC5pzHZUHhzM6z5gEHp
 | 
			
		||||
0iEisT4Ty7zKXZqsgzefSgoaMAzzAkEAoCIaUhtwXzwdPfvNYnOs3J6doJMimECB
 | 
			
		||||
+lbfcyLM8TimvadtRt+KGEg/OYGmLNM2UiqdY+duzdbUpvhYGcwvYwJAQvaoi9z2
 | 
			
		||||
CkiwSs/PFrLaNlfLJmXRsUBzmiWYoh6+IQJJorEXz7ewI72ee9RBO4s746cgUFwH
 | 
			
		||||
Ri+qO+HhZFUBqQ==
 | 
			
		||||
-----END PRIVATE KEY-----
 | 
			
		||||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
Proc-Type: 4,ENCRYPTED
 | 
			
		||||
DEK-Info: DES-EDE3-CBC,BA26229A1653B7FF
 | 
			
		||||
 | 
			
		||||
6nhWG8PKhTPO/s3ZvjUa6226NlKdvPDZFsNXOOoSUs9ejxpb/aj5huhs6qRYzsz9
 | 
			
		||||
Year47uaAZYhGD0vAagnNiBnYmjWEpN9G/wQxG7pgZThK1ZxDi63qn8aQ8UjuGHo
 | 
			
		||||
F6RpnnBQIAnWTWqr/Qsybtc5EoNkrj/Cpx0OfbSr6gZsFBCxwX1R1hT3/mhJ45f3
 | 
			
		||||
XMofY32Vdfx9/vtw1O7HmlHXQnXaqnbd9/nn1EpvFJG9+UjPoW7gV4jCOLuR4deE
 | 
			
		||||
jS8hm+cpkwXmFtk3VGjT9tQXPpMv3JpYfBqgGQoMAJ5Toq0DWcHi6Wg08PsD8lgy
 | 
			
		||||
vmTioPsRg+JGkJkJ8GnusgLpQdlQJbjzd7wGE6ElUFLfOxLo8bLlRHoriHNdWYhh
 | 
			
		||||
JjY0LyeTkovcmWxVjImc6ZyBz5Ly4t0BYf1gq3OkjsV91Q1taBxnhiavfizqMCAf
 | 
			
		||||
PPB3sLQnlXG77TOXkNxpqbZfEYrVZW2Nsqqdn8s07Uj4IMONZyq2odYKWFPMJBiM
 | 
			
		||||
POYwXjMAOcmFMTHYsVlhcUJuV6LOuipw/FEbTtPH/MYMxLe4zx65dYo1rb4iLKLS
 | 
			
		||||
gMtB0o/Wl4Xno3ZXh1ucicYnV2J7NpVcjVq+3SFiCRu2SrSkZHZ23EPS13Ec6fcz
 | 
			
		||||
8X/YGA2vTJ8MAOozAzQUwHQYvLk7bIoQVekqDq4p0AZQbhdspHpArCk0Ifqqzg/v
 | 
			
		||||
Uyky/zZiQYanzDenTSRVI/8wac3olxpU8QvbySxYqmbkgq6bTpXJfYFQfnAttEsC
 | 
			
		||||
dA4S5UFgyOPZluxCAM4yaJF3Ft6neutNwftuJQMbgCUi9vYg2tGdSw==
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
 
 | 
			
		||||
@@ -44,9 +44,9 @@ extern int smime_main(int argc,char *argv[]);
 | 
			
		||||
extern int rand_main(int argc,char *argv[]);
 | 
			
		||||
extern int engine_main(int argc,char *argv[]);
 | 
			
		||||
extern int ocsp_main(int argc,char *argv[]);
 | 
			
		||||
extern int srp_main(int argc,char *argv[]);
 | 
			
		||||
extern int prime_main(int argc,char *argv[]);
 | 
			
		||||
extern int ts_main(int argc,char *argv[]);
 | 
			
		||||
extern int srp_main(int argc,char *argv[]);
 | 
			
		||||
 | 
			
		||||
#define FUNC_TYPE_GENERAL	1
 | 
			
		||||
#define FUNC_TYPE_MD		2
 | 
			
		||||
@@ -146,11 +146,11 @@ FUNCTION functions[] = {
 | 
			
		||||
#ifndef OPENSSL_NO_OCSP
 | 
			
		||||
	{FUNC_TYPE_GENERAL,"ocsp",ocsp_main},
 | 
			
		||||
#endif
 | 
			
		||||
	{FUNC_TYPE_GENERAL,"prime",prime_main},
 | 
			
		||||
	{FUNC_TYPE_GENERAL,"ts",ts_main},
 | 
			
		||||
#ifndef OPENSSL_NO_SRP
 | 
			
		||||
	{FUNC_TYPE_GENERAL,"srp",srp_main},
 | 
			
		||||
#endif
 | 
			
		||||
	{FUNC_TYPE_GENERAL,"prime",prime_main},
 | 
			
		||||
	{FUNC_TYPE_GENERAL,"ts",ts_main},
 | 
			
		||||
#ifndef OPENSSL_NO_MD2
 | 
			
		||||
	{FUNC_TYPE_MD,"md2",dgst_main},
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -51,6 +51,8 @@ foreach (@ARGV)
 | 
			
		||||
		{ print "#ifndef OPENSSL_NO_CMS\n${str}#endif\n"; }
 | 
			
		||||
	elsif ( ($_ =~ /^ocsp$/))
 | 
			
		||||
		{ print "#ifndef OPENSSL_NO_OCSP\n${str}#endif\n"; }
 | 
			
		||||
	elsif ( ($_ =~ /^srp$/))
 | 
			
		||||
		{ print "#ifndef OPENSSL_NO_SRP\n${str}#endif\n"; }
 | 
			
		||||
	else
 | 
			
		||||
		{ print $str; }
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								apps/req.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								apps/req.c
									
									
									
									
									
								
							@@ -644,6 +644,11 @@ bad:
 | 
			
		||||
		if (inrand)
 | 
			
		||||
			app_RAND_load_files(inrand);
 | 
			
		||||
 | 
			
		||||
		if (!NCONF_get_number(req_conf,SECTION,BITS, &newkey))
 | 
			
		||||
			{
 | 
			
		||||
			newkey=DEFAULT_KEY_LENGTH;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		if (keyalg)
 | 
			
		||||
			{
 | 
			
		||||
			genctx = set_keygen_ctx(bio_err, keyalg, &pkey_type, &newkey,
 | 
			
		||||
@@ -652,12 +657,6 @@ bad:
 | 
			
		||||
				goto end;
 | 
			
		||||
			}
 | 
			
		||||
	
 | 
			
		||||
		if (newkey <= 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (!NCONF_get_number(req_conf,SECTION,BITS, &newkey))
 | 
			
		||||
				newkey=DEFAULT_KEY_LENGTH;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		if (newkey < MIN_KEY_LENGTH && (pkey_type == EVP_PKEY_RSA || pkey_type == EVP_PKEY_DSA))
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err,"private key length is too short,\n");
 | 
			
		||||
@@ -1649,6 +1648,8 @@ static EVP_PKEY_CTX *set_keygen_ctx(BIO *err, const char *gstr, int *pkey_type,
 | 
			
		||||
				keylen = atol(p + 1);
 | 
			
		||||
				*pkeylen = keylen;
 | 
			
		||||
				}
 | 
			
		||||
			else
 | 
			
		||||
				keylen = *pkeylen;
 | 
			
		||||
			}
 | 
			
		||||
		else if (p)
 | 
			
		||||
			paramfile = p + 1;
 | 
			
		||||
 
 | 
			
		||||
@@ -148,14 +148,19 @@ typedef fd_mask fd_set;
 | 
			
		||||
#define PORT_STR        "4433"
 | 
			
		||||
#define PROTOCOL        "tcp"
 | 
			
		||||
 | 
			
		||||
int do_server(int port, int type, int *ret, int (*cb) (char *hostname, int s, unsigned char *context), unsigned char *context);
 | 
			
		||||
int do_server(int port, int type, int *ret, int (*cb) (char *hostname, int s, int stype, unsigned char *context), unsigned char *context, int naccept);
 | 
			
		||||
#ifdef HEADER_X509_H
 | 
			
		||||
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HEADER_SSL_H
 | 
			
		||||
int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file);
 | 
			
		||||
int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key);
 | 
			
		||||
int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key,
 | 
			
		||||
					STACK_OF(X509) *chain, int build_chain);
 | 
			
		||||
int ssl_print_sigalgs(BIO *out, SSL *s);
 | 
			
		||||
int ssl_print_point_formats(BIO *out, SSL *s);
 | 
			
		||||
int ssl_print_curves(BIO *out, SSL *s, int noshared);
 | 
			
		||||
#endif
 | 
			
		||||
int ssl_print_tmp_key(BIO *out, SSL *s);
 | 
			
		||||
int init_client(int *sock, char *server, int port, int type);
 | 
			
		||||
int should_retry(int i);
 | 
			
		||||
int extract_port(char *str, short *port_ptr);
 | 
			
		||||
@@ -174,3 +179,23 @@ void MS_CALLBACK tlsext_cb(SSL *s, int client_server, int type,
 | 
			
		||||
 | 
			
		||||
int MS_CALLBACK generate_cookie_callback(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len);
 | 
			
		||||
int MS_CALLBACK verify_cookie_callback(SSL *ssl, unsigned char *cookie, unsigned int cookie_len);
 | 
			
		||||
 | 
			
		||||
typedef struct ssl_excert_st SSL_EXCERT;
 | 
			
		||||
 | 
			
		||||
void ssl_ctx_set_excert(SSL_CTX *ctx, SSL_EXCERT *exc);
 | 
			
		||||
void ssl_excert_free(SSL_EXCERT *exc);
 | 
			
		||||
int args_excert(char ***pargs, int *pargc,
 | 
			
		||||
			int *badarg, BIO *err, SSL_EXCERT **pexc);
 | 
			
		||||
int load_excert(SSL_EXCERT **pexc, BIO *err);
 | 
			
		||||
void print_ssl_summary(BIO *bio, SSL *s);
 | 
			
		||||
#ifdef HEADER_SSL_H
 | 
			
		||||
int args_ssl(char ***pargs, int *pargc, SSL_CONF_CTX *cctx,
 | 
			
		||||
			int *badarg, BIO *err, STACK_OF(OPENSSL_STRING) **pstr);
 | 
			
		||||
int args_ssl_call(SSL_CTX *ctx, BIO *err, SSL_CONF_CTX *cctx,
 | 
			
		||||
		STACK_OF(OPENSSL_STRING) *str, int no_ecdhe, int no_jpake);
 | 
			
		||||
int ssl_ctx_add_crls(SSL_CTX *ctx, STACK_OF(X509_CRL) *crls, int crl_download);
 | 
			
		||||
int ssl_load_stores(SSL_CTX *ctx,
 | 
			
		||||
			const char *vfyCApath, const char *vfyCAfile,
 | 
			
		||||
			const char *chCApath, const char *chCAfile,
 | 
			
		||||
			STACK_OF(X509_CRL) *crls, int crl_download);
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										909
									
								
								apps/s_cb.c
									
									
									
									
									
								
							
							
						
						
									
										909
									
								
								apps/s_cb.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										623
									
								
								apps/s_client.c
									
									
									
									
									
								
							
							
						
						
									
										623
									
								
								apps/s_client.c
									
									
									
									
									
								
							@@ -193,6 +193,7 @@ typedef unsigned int u_int;
 | 
			
		||||
extern int verify_depth;
 | 
			
		||||
extern int verify_error;
 | 
			
		||||
extern int verify_return_error;
 | 
			
		||||
extern int verify_quiet;
 | 
			
		||||
 | 
			
		||||
#ifdef FIONBIO
 | 
			
		||||
static int c_nbio=0;
 | 
			
		||||
@@ -206,14 +207,52 @@ static int c_status_req=0;
 | 
			
		||||
static int c_msg=0;
 | 
			
		||||
static int c_showcerts=0;
 | 
			
		||||
 | 
			
		||||
static char *keymatexportlabel=NULL;
 | 
			
		||||
static int keymatexportlen=20;
 | 
			
		||||
 | 
			
		||||
static void sc_usage(void);
 | 
			
		||||
static void print_stuff(BIO *berr,SSL *con,int full);
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
static int ocsp_resp_cb(SSL *s, void *arg);
 | 
			
		||||
static int c_auth = 0;
 | 
			
		||||
static int c_auth_require_reneg = 0;
 | 
			
		||||
#endif
 | 
			
		||||
static BIO *bio_c_out=NULL;
 | 
			
		||||
static BIO *bio_c_msg=NULL;
 | 
			
		||||
static int c_quiet=0;
 | 
			
		||||
static int c_ign_eof=0;
 | 
			
		||||
static int c_brief=0;
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
 | 
			
		||||
static unsigned char *generated_supp_data = NULL;
 | 
			
		||||
 | 
			
		||||
static const unsigned char *most_recent_supplemental_data = NULL;
 | 
			
		||||
static size_t most_recent_supplemental_data_length = 0;
 | 
			
		||||
 | 
			
		||||
static int server_provided_server_authz = 0;
 | 
			
		||||
static int server_provided_client_authz = 0;
 | 
			
		||||
 | 
			
		||||
static const unsigned char auth_ext_data[]={TLSEXT_AUTHZDATAFORMAT_dtcp};
 | 
			
		||||
 | 
			
		||||
static int suppdata_cb(SSL *s, unsigned short supp_data_type,
 | 
			
		||||
		       const unsigned char *in,
 | 
			
		||||
		       unsigned short inlen, int *al,
 | 
			
		||||
		       void *arg);
 | 
			
		||||
 | 
			
		||||
static int auth_suppdata_generate_cb(SSL *s, unsigned short supp_data_type,
 | 
			
		||||
				     const unsigned char **out,
 | 
			
		||||
				     unsigned short *outlen, int *al, void *arg);
 | 
			
		||||
 | 
			
		||||
static int authz_tlsext_generate_cb(SSL *s, unsigned short ext_type,
 | 
			
		||||
				    const unsigned char **out, unsigned short *outlen,
 | 
			
		||||
				    int *al, void *arg);
 | 
			
		||||
 | 
			
		||||
static int authz_tlsext_cb(SSL *s, unsigned short ext_type,
 | 
			
		||||
			   const unsigned char *in,
 | 
			
		||||
			   unsigned short inlen, int *al,
 | 
			
		||||
			   void *arg);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_PSK
 | 
			
		||||
/* Default PSK identity and key */
 | 
			
		||||
@@ -285,6 +324,9 @@ static void sc_usage(void)
 | 
			
		||||
	BIO_printf(bio_err," -host host     - use -connect instead\n");
 | 
			
		||||
	BIO_printf(bio_err," -port port     - use -connect instead\n");
 | 
			
		||||
	BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
 | 
			
		||||
	BIO_printf(bio_err," -checkhost host - check peer certificate matches \"host\"\n");
 | 
			
		||||
	BIO_printf(bio_err," -checkemail email - check peer certificate matches \"email\"\n");
 | 
			
		||||
	BIO_printf(bio_err," -checkip ipaddr - check peer certificate matches \"ipaddr\"\n");
 | 
			
		||||
 | 
			
		||||
	BIO_printf(bio_err," -verify arg   - turn on peer certificate verification\n");
 | 
			
		||||
	BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
 | 
			
		||||
@@ -354,11 +396,18 @@ static void sc_usage(void)
 | 
			
		||||
	BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
 | 
			
		||||
	BIO_printf(bio_err," -status           - request certificate status from server\n");
 | 
			
		||||
	BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
 | 
			
		||||
	BIO_printf(bio_err," -serverinfo types - send empty ClientHello extensions (comma-separated numbers)\n");
 | 
			
		||||
	BIO_printf(bio_err," -auth               - send and receive RFC 5878 TLS auth extensions and supplemental data\n");
 | 
			
		||||
	BIO_printf(bio_err," -auth_require_reneg - Do not send TLS auth extensions until renegotiation\n");
 | 
			
		||||
#endif
 | 
			
		||||
# ifndef OPENSSL_NO_NEXTPROTONEG
 | 
			
		||||
	BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
	BIO_printf(bio_err," -alpn arg         - enable ALPN extension, considering named protocols supported (comma-separated list)\n");
 | 
			
		||||
	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
 | 
			
		||||
	BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
 | 
			
		||||
 	BIO_printf(bio_err," -keymatexport label   - Export keying material using label\n");
 | 
			
		||||
 	BIO_printf(bio_err," -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
@@ -397,18 +446,18 @@ typedef struct srp_arg_st
 | 
			
		||||
 | 
			
		||||
#define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
 | 
			
		||||
 | 
			
		||||
static int SRP_Verify_N_and_g(const BIGNUM *N, const BIGNUM *g)
 | 
			
		||||
static int srp_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
 | 
			
		||||
	{
 | 
			
		||||
	BN_CTX *bn_ctx = BN_CTX_new();
 | 
			
		||||
	BIGNUM *p = BN_new();
 | 
			
		||||
	BIGNUM *r = BN_new();
 | 
			
		||||
	int ret =
 | 
			
		||||
		g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
 | 
			
		||||
		BN_is_prime_ex(N,SRP_NUMBER_ITERATIONS_FOR_PRIME,bn_ctx,NULL) &&
 | 
			
		||||
		BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
 | 
			
		||||
		p != NULL && BN_rshift1(p, N) &&
 | 
			
		||||
 | 
			
		||||
		/* p = (N-1)/2 */
 | 
			
		||||
		BN_is_prime_ex(p,SRP_NUMBER_ITERATIONS_FOR_PRIME,bn_ctx,NULL) &&
 | 
			
		||||
		BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
 | 
			
		||||
		r != NULL &&
 | 
			
		||||
 | 
			
		||||
		/* verify g^((N-1)/2) == -1 (mod N) */
 | 
			
		||||
@@ -425,6 +474,21 @@ static int SRP_Verify_N_and_g(const BIGNUM *N, const BIGNUM *g)
 | 
			
		||||
	return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
/* This callback is used here for two purposes:
 | 
			
		||||
   - extended debugging
 | 
			
		||||
   - making some primality tests for unknown groups
 | 
			
		||||
   The callback is only called for a non default group.
 | 
			
		||||
 | 
			
		||||
   An application does not need the call back at all if
 | 
			
		||||
   only the stanard groups are used.  In real life situations, 
 | 
			
		||||
   client and server already share well known groups, 
 | 
			
		||||
   thus there is no need to verify them. 
 | 
			
		||||
   Furthermore, in case that a server actually proposes a group that
 | 
			
		||||
   is not one of those defined in RFC 5054, it is more appropriate 
 | 
			
		||||
   to add the group to a static list and then compare since 
 | 
			
		||||
   primality tests are rather cpu consuming.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
 | 
			
		||||
	{
 | 
			
		||||
	SRP_ARG *srp_arg = (SRP_ARG *)arg;
 | 
			
		||||
@@ -447,11 +511,11 @@ static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
 | 
			
		||||
		if (srp_arg->debug)
 | 
			
		||||
			BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
 | 
			
		||||
 | 
			
		||||
/* The srp_moregroups must be used with caution, testing primes costs time. 
 | 
			
		||||
/* The srp_moregroups is a real debugging feature.
 | 
			
		||||
   Implementors should rather add the value to the known ones.
 | 
			
		||||
   The minimal size has already been tested.
 | 
			
		||||
*/
 | 
			
		||||
		if (BN_num_bits(g) <= BN_BITS && SRP_Verify_N_and_g(N,g))
 | 
			
		||||
		if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
 | 
			
		||||
			return 1;
 | 
			
		||||
		}	
 | 
			
		||||
	BIO_printf(bio_err, "SRP param N and g rejected.\n");
 | 
			
		||||
@@ -480,13 +544,8 @@ static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
 | 
			
		||||
	return pass;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static char * MS_CALLBACK missing_srp_username_callback(SSL *s, void *arg)
 | 
			
		||||
	{
 | 
			
		||||
	SRP_ARG *srp_arg = (SRP_ARG *)arg;
 | 
			
		||||
	return BUF_strdup(srp_arg->srplogin);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
	char *srtp_profiles = NULL;
 | 
			
		||||
 | 
			
		||||
# ifndef OPENSSL_NO_NEXTPROTONEG
 | 
			
		||||
/* This the context that we pass to next_proto_cb */
 | 
			
		||||
@@ -521,6 +580,27 @@ static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, con
 | 
			
		||||
	return SSL_TLSEXT_ERR_OK;
 | 
			
		||||
	}
 | 
			
		||||
# endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
 | 
			
		||||
 | 
			
		||||
static int serverinfo_cli_cb(SSL* s, unsigned short ext_type,
 | 
			
		||||
			     const unsigned char* in, unsigned short inlen, 
 | 
			
		||||
			     int* al, void* arg)
 | 
			
		||||
	{
 | 
			
		||||
	char pem_name[100];
 | 
			
		||||
	unsigned char ext_buf[4 + 65536];
 | 
			
		||||
 | 
			
		||||
	/* Reconstruct the type/len fields prior to extension data */
 | 
			
		||||
	ext_buf[0] = ext_type >> 8;
 | 
			
		||||
	ext_buf[1] = ext_type & 0xFF;
 | 
			
		||||
	ext_buf[2] = inlen >> 8;
 | 
			
		||||
	ext_buf[3] = inlen & 0xFF;
 | 
			
		||||
	memcpy(ext_buf+4, in, inlen);
 | 
			
		||||
 | 
			
		||||
	BIO_snprintf(pem_name, sizeof(pem_name), "SERVERINFO FOR EXTENSION %d",
 | 
			
		||||
		     ext_type);
 | 
			
		||||
	PEM_write_bio(bio_c_out, pem_name, "", ext_buf, 4 + inlen);
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
@@ -537,7 +617,7 @@ int MAIN(int, char **);
 | 
			
		||||
 | 
			
		||||
int MAIN(int argc, char **argv)
 | 
			
		||||
	{
 | 
			
		||||
	unsigned int off=0, clr=0;
 | 
			
		||||
	int build_chain = 0;
 | 
			
		||||
	SSL *con=NULL;
 | 
			
		||||
#ifndef OPENSSL_NO_KRB5
 | 
			
		||||
	KSSL_CTX *kctx;
 | 
			
		||||
@@ -550,13 +630,16 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	short port=PORT;
 | 
			
		||||
	int full_log=1;
 | 
			
		||||
	char *host=SSL_HOST_NAME;
 | 
			
		||||
	char *cert_file=NULL,*key_file=NULL;
 | 
			
		||||
	char *cert_file=NULL,*key_file=NULL,*chain_file=NULL;
 | 
			
		||||
	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
 | 
			
		||||
	char *passarg = NULL, *pass = NULL;
 | 
			
		||||
	X509 *cert = NULL;
 | 
			
		||||
	EVP_PKEY *key = NULL;
 | 
			
		||||
	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
 | 
			
		||||
	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
 | 
			
		||||
	STACK_OF(X509) *chain = NULL;
 | 
			
		||||
	char *CApath=NULL,*CAfile=NULL;
 | 
			
		||||
	char *chCApath=NULL,*chCAfile=NULL;
 | 
			
		||||
	char *vfyCApath=NULL,*vfyCAfile=NULL;
 | 
			
		||||
	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE;
 | 
			
		||||
	int crlf=0;
 | 
			
		||||
	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
 | 
			
		||||
	SSL_CTX *ctx=NULL;
 | 
			
		||||
@@ -590,6 +673,10 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
# ifndef OPENSSL_NO_NEXTPROTONEG
 | 
			
		||||
	const char *next_proto_neg_in = NULL;
 | 
			
		||||
# endif
 | 
			
		||||
	const char *alpn_in = NULL;
 | 
			
		||||
# define MAX_SI_TYPES 100
 | 
			
		||||
	unsigned short serverinfo_types[MAX_SI_TYPES];
 | 
			
		||||
	int serverinfo_types_count = 0;
 | 
			
		||||
#endif
 | 
			
		||||
	char *sess_in = NULL;
 | 
			
		||||
	char *sess_out = NULL;
 | 
			
		||||
@@ -598,21 +685,27 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	int enable_timeouts = 0 ;
 | 
			
		||||
	long socket_mtu = 0;
 | 
			
		||||
#ifndef OPENSSL_NO_JPAKE
 | 
			
		||||
	char *jpake_secret = NULL;
 | 
			
		||||
static char *jpake_secret = NULL;
 | 
			
		||||
#define no_jpake !jpake_secret
 | 
			
		||||
#else
 | 
			
		||||
#define no_jpake 1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_SRP
 | 
			
		||||
	char * srppass = NULL;
 | 
			
		||||
	int srp_lateuser = 0;
 | 
			
		||||
	SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
 | 
			
		||||
#endif
 | 
			
		||||
	SSL_EXCERT *exc = NULL;
 | 
			
		||||
 | 
			
		||||
	SSL_CONF_CTX *cctx = NULL;
 | 
			
		||||
	STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
 | 
			
		||||
 | 
			
		||||
	char *crl_file = NULL;
 | 
			
		||||
	int crl_format = FORMAT_PEM;
 | 
			
		||||
	int crl_download = 0;
 | 
			
		||||
	STACK_OF(X509_CRL) *crls = NULL;
 | 
			
		||||
 | 
			
		||||
#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
 | 
			
		||||
	meth=SSLv23_client_method();
 | 
			
		||||
#elif !defined(OPENSSL_NO_SSL3)
 | 
			
		||||
	meth=SSLv3_client_method();
 | 
			
		||||
#elif !defined(OPENSSL_NO_SSL2)
 | 
			
		||||
	meth=SSLv2_client_method();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	apps_startup();
 | 
			
		||||
	c_Pause=0;
 | 
			
		||||
@@ -628,6 +721,12 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	if (!load_config(bio_err, NULL))
 | 
			
		||||
		goto end;
 | 
			
		||||
 | 
			
		||||
	cctx = SSL_CONF_CTX_new();
 | 
			
		||||
	if (!cctx)
 | 
			
		||||
		goto end;
 | 
			
		||||
	SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT);
 | 
			
		||||
	SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
 | 
			
		||||
 | 
			
		||||
	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
 | 
			
		||||
		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
 | 
			
		||||
		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
 | 
			
		||||
@@ -668,6 +767,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			verify=SSL_VERIFY_PEER;
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			verify_depth=atoi(*(++argv));
 | 
			
		||||
			if (!c_quiet)
 | 
			
		||||
				BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-cert") == 0)
 | 
			
		||||
@@ -675,6 +775,13 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			cert_file= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-CRL") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			crl_file= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-crl_download") == 0)
 | 
			
		||||
			crl_download = 1;
 | 
			
		||||
		else if	(strcmp(*argv,"-sess_out") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
@@ -690,6 +797,11 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			cert_format = str2fmt(*(++argv));
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-CRLform") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			crl_format = str2fmt(*(++argv));
 | 
			
		||||
			}
 | 
			
		||||
		else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
 | 
			
		||||
			{
 | 
			
		||||
			if (badarg)
 | 
			
		||||
@@ -698,6 +810,26 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-verify_return_error") == 0)
 | 
			
		||||
			verify_return_error = 1;
 | 
			
		||||
		else if (strcmp(*argv,"-verify_quiet") == 0)
 | 
			
		||||
			verify_quiet = 1;
 | 
			
		||||
		else if (strcmp(*argv,"-brief") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			c_brief = 1;
 | 
			
		||||
			verify_quiet = 1;
 | 
			
		||||
			c_quiet = 1;
 | 
			
		||||
			}
 | 
			
		||||
		else if (args_excert(&argv, &argc, &badarg, bio_err, &exc))
 | 
			
		||||
			{
 | 
			
		||||
			if (badarg)
 | 
			
		||||
				goto bad;
 | 
			
		||||
			continue;
 | 
			
		||||
			}
 | 
			
		||||
		else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args))
 | 
			
		||||
			{
 | 
			
		||||
			if (badarg)
 | 
			
		||||
				goto bad;
 | 
			
		||||
			continue;
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-prexit") == 0)
 | 
			
		||||
			prexit=1;
 | 
			
		||||
		else if	(strcmp(*argv,"-crlf") == 0)
 | 
			
		||||
@@ -720,6 +852,10 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			c_tlsextdebug=1;
 | 
			
		||||
		else if	(strcmp(*argv,"-status") == 0)
 | 
			
		||||
			c_status_req=1;
 | 
			
		||||
		else if	(strcmp(*argv,"-auth") == 0)
 | 
			
		||||
			c_auth = 1;
 | 
			
		||||
		else if	(strcmp(*argv,"-auth_require_reneg") == 0)
 | 
			
		||||
			c_auth_require_reneg = 1;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef WATT32
 | 
			
		||||
		else if (strcmp(*argv,"-wdebug") == 0)
 | 
			
		||||
@@ -727,6 +863,15 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
#endif
 | 
			
		||||
		else if	(strcmp(*argv,"-msg") == 0)
 | 
			
		||||
			c_msg=1;
 | 
			
		||||
		else if	(strcmp(*argv,"-msgfile") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			bio_c_msg = BIO_new_file(*(++argv), "w");
 | 
			
		||||
			}
 | 
			
		||||
#ifndef OPENSSL_NO_SSL_TRACE
 | 
			
		||||
		else if	(strcmp(*argv,"-trace") == 0)
 | 
			
		||||
			c_msg=2;
 | 
			
		||||
#endif
 | 
			
		||||
		else if	(strcmp(*argv,"-showcerts") == 0)
 | 
			
		||||
			c_showcerts=1;
 | 
			
		||||
		else if	(strcmp(*argv,"-nbio_test") == 0)
 | 
			
		||||
@@ -747,7 +892,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			psk_key=*(++argv);
 | 
			
		||||
			for (j = 0; j < strlen(psk_key); j++)
 | 
			
		||||
                                {
 | 
			
		||||
                                if (isxdigit((int)psk_key[j]))
 | 
			
		||||
                                if (isxdigit((unsigned char)psk_key[j]))
 | 
			
		||||
                                        continue;
 | 
			
		||||
                                BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
 | 
			
		||||
                                goto bad;
 | 
			
		||||
@@ -802,11 +947,21 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			meth=TLSv1_client_method();
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_DTLS1
 | 
			
		||||
		else if	(strcmp(*argv,"-dtls") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			meth=DTLS_client_method();
 | 
			
		||||
			socket_type=SOCK_DGRAM;
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-dtls1") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			meth=DTLSv1_client_method();
 | 
			
		||||
			socket_type=SOCK_DGRAM;
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-dtls1_2") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			meth=DTLSv1_2_client_method();
 | 
			
		||||
			socket_type=SOCK_DGRAM;
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-timeout") == 0)
 | 
			
		||||
			enable_timeouts=1;
 | 
			
		||||
		else if (strcmp(*argv,"-mtu") == 0)
 | 
			
		||||
@@ -815,8 +970,6 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			socket_mtu = atol(*(++argv));
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
		else if (strcmp(*argv,"-bugs") == 0)
 | 
			
		||||
			bugs=1;
 | 
			
		||||
		else if	(strcmp(*argv,"-keyform") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
@@ -827,6 +980,11 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			passarg = *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-cert_chain") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			chain_file= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-key") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
@@ -841,26 +999,34 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			CApath= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-chainCApath") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			chCApath= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-verifyCApath") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			vfyCApath= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-build_chain") == 0)
 | 
			
		||||
			build_chain = 1;
 | 
			
		||||
		else if	(strcmp(*argv,"-CAfile") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			CAfile= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-no_tls1_2") == 0)
 | 
			
		||||
			off|=SSL_OP_NO_TLSv1_2;
 | 
			
		||||
		else if (strcmp(*argv,"-no_tls1_1") == 0)
 | 
			
		||||
			off|=SSL_OP_NO_TLSv1_1;
 | 
			
		||||
		else if (strcmp(*argv,"-no_tls1") == 0)
 | 
			
		||||
			off|=SSL_OP_NO_TLSv1;
 | 
			
		||||
		else if (strcmp(*argv,"-no_ssl3") == 0)
 | 
			
		||||
			off|=SSL_OP_NO_SSLv3;
 | 
			
		||||
		else if (strcmp(*argv,"-no_ssl2") == 0)
 | 
			
		||||
			off|=SSL_OP_NO_SSLv2;
 | 
			
		||||
		else if	(strcmp(*argv,"-no_comp") == 0)
 | 
			
		||||
			{ off|=SSL_OP_NO_COMPRESSION; }
 | 
			
		||||
		else if	(strcmp(*argv,"-chainCAfile") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			chCAfile= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if	(strcmp(*argv,"-verifyCAfile") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			vfyCAfile= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
		else if	(strcmp(*argv,"-no_ticket") == 0)
 | 
			
		||||
			{ off|=SSL_OP_NO_TICKET; }
 | 
			
		||||
# ifndef OPENSSL_NO_NEXTPROTONEG
 | 
			
		||||
		else if (strcmp(*argv,"-nextprotoneg") == 0)
 | 
			
		||||
			{
 | 
			
		||||
@@ -868,20 +1034,35 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			next_proto_neg_in = *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
		else if (strcmp(*argv,"-serverpref") == 0)
 | 
			
		||||
			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
 | 
			
		||||
		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
 | 
			
		||||
			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
 | 
			
		||||
		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
 | 
			
		||||
			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
 | 
			
		||||
		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
 | 
			
		||||
			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
 | 
			
		||||
		else if	(strcmp(*argv,"-cipher") == 0)
 | 
			
		||||
		else if (strcmp(*argv,"-alpn") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			cipher= *(++argv);
 | 
			
		||||
			alpn_in = *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-serverinfo") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			char *c;
 | 
			
		||||
			int start = 0;
 | 
			
		||||
			int len;
 | 
			
		||||
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			c = *(++argv);
 | 
			
		||||
			serverinfo_types_count = 0;
 | 
			
		||||
			len = strlen(c);
 | 
			
		||||
			for (i = 0; i <= len; ++i)
 | 
			
		||||
				{
 | 
			
		||||
				if (i == len || c[i] == ',')
 | 
			
		||||
					{
 | 
			
		||||
					serverinfo_types[serverinfo_types_count]
 | 
			
		||||
					    = atoi(c+start);
 | 
			
		||||
					serverinfo_types_count++;
 | 
			
		||||
					start = i+1;
 | 
			
		||||
					}
 | 
			
		||||
				if (serverinfo_types_count == MAX_SI_TYPES)
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef FIONBIO
 | 
			
		||||
		else if (strcmp(*argv,"-nbio") == 0)
 | 
			
		||||
			{ c_nbio=1; }
 | 
			
		||||
@@ -935,6 +1116,22 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			jpake_secret = *++argv;
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
		else if (strcmp(*argv,"-use_srtp") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			srtp_profiles = *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-keymatexport") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			keymatexportlabel= *(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-keymatexportlen") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			keymatexportlen=atoi(*(++argv));
 | 
			
		||||
			if (keymatexportlen == 0) goto bad;
 | 
			
		||||
			}
 | 
			
		||||
                else
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err,"unknown option %s\n",*argv);
 | 
			
		||||
@@ -962,13 +1159,6 @@ bad:
 | 
			
		||||
			}
 | 
			
		||||
		psk_identity = "JPAKE";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (cipher)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
	cipher = "PSK";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	OpenSSL_add_ssl_algorithms();
 | 
			
		||||
@@ -1040,6 +1230,37 @@ bad:
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (chain_file)
 | 
			
		||||
		{
 | 
			
		||||
		chain = load_certs(bio_err, chain_file,FORMAT_PEM,
 | 
			
		||||
					NULL, e, "client certificate chain");
 | 
			
		||||
		if (!chain)
 | 
			
		||||
			goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (crl_file)
 | 
			
		||||
		{
 | 
			
		||||
		X509_CRL *crl;
 | 
			
		||||
		crl = load_crl(crl_file, crl_format);
 | 
			
		||||
		if (!crl)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_puts(bio_err, "Error loading CRL\n");
 | 
			
		||||
			ERR_print_errors(bio_err);
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		crls = sk_X509_CRL_new_null();
 | 
			
		||||
		if (!crls || !sk_X509_CRL_push(crls, crl))
 | 
			
		||||
			{
 | 
			
		||||
			BIO_puts(bio_err, "Error adding CRL\n");
 | 
			
		||||
			ERR_print_errors(bio_err);
 | 
			
		||||
			X509_CRL_free(crl);
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (!load_excert(&exc, bio_err))
 | 
			
		||||
		goto end;
 | 
			
		||||
 | 
			
		||||
	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
 | 
			
		||||
		&& !RAND_status())
 | 
			
		||||
		{
 | 
			
		||||
@@ -1051,9 +1272,11 @@ bad:
 | 
			
		||||
 | 
			
		||||
	if (bio_c_out == NULL)
 | 
			
		||||
		{
 | 
			
		||||
		if (c_quiet && !c_debug && !c_msg)
 | 
			
		||||
		if (c_quiet && !c_debug)
 | 
			
		||||
			{
 | 
			
		||||
			bio_c_out=BIO_new(BIO_s_null());
 | 
			
		||||
			if (c_msg && !bio_c_msg)
 | 
			
		||||
				bio_c_msg=BIO_new_fp(stdout,BIO_NOCLOSE);
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
@@ -1080,6 +1303,20 @@ bad:
 | 
			
		||||
	if (vpm)
 | 
			
		||||
		SSL_CTX_set1_param(ctx, vpm);
 | 
			
		||||
 | 
			
		||||
	if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, 1, no_jpake))
 | 
			
		||||
		{
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile,
 | 
			
		||||
						crls, crl_download))
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err, "Error loading store locations\n");
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_ENGINE
 | 
			
		||||
	if (ssl_client_engine)
 | 
			
		||||
		{
 | 
			
		||||
@@ -1105,39 +1342,55 @@ bad:
 | 
			
		||||
			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
 | 
			
		||||
		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
 | 
			
		||||
		}
 | 
			
		||||
	if (srtp_profiles != NULL)
 | 
			
		||||
		SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
 | 
			
		||||
#endif
 | 
			
		||||
	if (bugs)
 | 
			
		||||
		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
 | 
			
		||||
	else
 | 
			
		||||
		SSL_CTX_set_options(ctx,off);
 | 
			
		||||
 | 
			
		||||
	if (clr)
 | 
			
		||||
		SSL_CTX_clear_options(ctx, clr);
 | 
			
		||||
	if (exc) ssl_ctx_set_excert(ctx, exc);
 | 
			
		||||
	/* DTLS: partial reads end up discarding unread UDP bytes :-( 
 | 
			
		||||
	 * Setting read ahead solves this problem.
 | 
			
		||||
	 */
 | 
			
		||||
	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
 | 
			
		||||
 | 
			
		||||
#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
 | 
			
		||||
#if !defined(OPENSSL_NO_TLSEXT)
 | 
			
		||||
# if !defined(OPENSSL_NO_NEXTPROTONEG)
 | 
			
		||||
	if (next_proto.data)
 | 
			
		||||
		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
 | 
			
		||||
# endif
 | 
			
		||||
	if (alpn_in)
 | 
			
		||||
		{
 | 
			
		||||
		unsigned short alpn_len;
 | 
			
		||||
		unsigned char *alpn = next_protos_parse(&alpn_len, alpn_in);
 | 
			
		||||
 | 
			
		||||
		if (alpn == NULL)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err, "Error parsing -alpn argument\n");
 | 
			
		||||
			goto end;
 | 
			
		||||
			}
 | 
			
		||||
		SSL_CTX_set_alpn_protos(ctx, alpn, alpn_len);
 | 
			
		||||
		OPENSSL_free(alpn);
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
		if (serverinfo_types_count)
 | 
			
		||||
			{
 | 
			
		||||
			for (i = 0; i < serverinfo_types_count; i++)
 | 
			
		||||
				{
 | 
			
		||||
				SSL_CTX_set_custom_cli_ext(ctx,
 | 
			
		||||
							   serverinfo_types[i],
 | 
			
		||||
							   NULL, 
 | 
			
		||||
							   serverinfo_cli_cb,
 | 
			
		||||
							   NULL);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
 | 
			
		||||
	if (cipher != NULL)
 | 
			
		||||
		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
 | 
			
		||||
		BIO_printf(bio_err,"error setting cipher list\n");
 | 
			
		||||
		ERR_print_errors(bio_err);
 | 
			
		||||
		goto end;
 | 
			
		||||
	}
 | 
			
		||||
#if 0
 | 
			
		||||
	else
 | 
			
		||||
		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	SSL_CTX_set_verify(ctx,verify,verify_callback);
 | 
			
		||||
	if (!set_cert_key_stuff(ctx,cert,key))
 | 
			
		||||
		goto end;
 | 
			
		||||
 | 
			
		||||
	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
 | 
			
		||||
		(!SSL_CTX_set_default_verify_paths(ctx)))
 | 
			
		||||
@@ -1147,6 +1400,10 @@ bad:
 | 
			
		||||
		/* goto end; */
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ssl_ctx_add_crls(ctx, crls, crl_download);
 | 
			
		||||
	if (!set_cert_key_stuff(ctx,cert,key,chain,build_chain))
 | 
			
		||||
		goto end;
 | 
			
		||||
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
	if (servername != NULL)
 | 
			
		||||
		{
 | 
			
		||||
@@ -1157,9 +1414,7 @@ bad:
 | 
			
		||||
#ifndef OPENSSL_NO_SRP
 | 
			
		||||
        if (srp_arg.srplogin)
 | 
			
		||||
		{
 | 
			
		||||
		if (srp_lateuser) 
 | 
			
		||||
			SSL_CTX_set_srp_missing_srp_username_callback(ctx,missing_srp_username_callback);
 | 
			
		||||
		else if (!SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
 | 
			
		||||
		if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err,"Unable to set SRP username\n");
 | 
			
		||||
			goto end;
 | 
			
		||||
@@ -1174,6 +1429,12 @@ bad:
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
	if (c_auth)
 | 
			
		||||
		{
 | 
			
		||||
		SSL_CTX_set_custom_cli_ext(ctx, TLSEXT_TYPE_client_authz, authz_tlsext_generate_cb, authz_tlsext_cb, bio_err);
 | 
			
		||||
		SSL_CTX_set_custom_cli_ext(ctx, TLSEXT_TYPE_server_authz, authz_tlsext_generate_cb, authz_tlsext_cb, bio_err);
 | 
			
		||||
		SSL_CTX_set_cli_supp_data(ctx, TLSEXT_SUPPLEMENTALDATATYPE_authz_data, suppdata_cb, auth_suppdata_generate_cb, bio_err);
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	con=SSL_new(ctx);
 | 
			
		||||
@@ -1200,6 +1461,9 @@ bad:
 | 
			
		||||
		SSL_set_session(con, sess);
 | 
			
		||||
		SSL_SESSION_free(sess);
 | 
			
		||||
		}
 | 
			
		||||
#ifndef OPENSSL_NO_DANE
 | 
			
		||||
	SSL_pull_tlsa_record(con,host,port);
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
	if (servername != NULL)
 | 
			
		||||
		{
 | 
			
		||||
@@ -1249,7 +1513,7 @@ re_start:
 | 
			
		||||
#endif                                              
 | 
			
		||||
	if (c_Pause & 0x01) SSL_set_debug(con, 1);
 | 
			
		||||
 | 
			
		||||
	if ( SSL_version(con) == DTLS1_VERSION)
 | 
			
		||||
	if (socket_type == SOCK_DGRAM)
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
 | 
			
		||||
@@ -1302,8 +1566,13 @@ re_start:
 | 
			
		||||
		}
 | 
			
		||||
	if (c_msg)
 | 
			
		||||
		{
 | 
			
		||||
#ifndef OPENSSL_NO_SSL_TRACE
 | 
			
		||||
		if (c_msg == 2)
 | 
			
		||||
			SSL_set_msg_callback(con, SSL_trace);
 | 
			
		||||
		else
 | 
			
		||||
#endif
 | 
			
		||||
			SSL_set_msg_callback(con, msg_cb);
 | 
			
		||||
		SSL_set_msg_callback_arg(con, bio_c_out);
 | 
			
		||||
		SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out);
 | 
			
		||||
		}
 | 
			
		||||
#ifndef OPENSSL_NO_TLSEXT
 | 
			
		||||
	if (c_tlsextdebug)
 | 
			
		||||
@@ -1503,6 +1772,19 @@ SSL_set_tlsext_status_ids(con, ids);
 | 
			
		||||
					else 
 | 
			
		||||
						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
 | 
			
		||||
					}
 | 
			
		||||
				if (c_brief)
 | 
			
		||||
					{
 | 
			
		||||
					BIO_puts(bio_err,
 | 
			
		||||
						"CONNECTION ESTABLISHED\n");
 | 
			
		||||
					print_ssl_summary(bio_err, con);
 | 
			
		||||
					}
 | 
			
		||||
				/*handshake is complete - free the generated supp data allocated in the callback */
 | 
			
		||||
				if (generated_supp_data)
 | 
			
		||||
					{
 | 
			
		||||
					OPENSSL_free(generated_supp_data);
 | 
			
		||||
					generated_supp_data = NULL;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
				print_stuff(bio_c_out,con,full_log);
 | 
			
		||||
				if (full_log > 0) full_log--;
 | 
			
		||||
 | 
			
		||||
@@ -1765,6 +2047,9 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
 | 
			
		||||
				break;
 | 
			
		||||
			case SSL_ERROR_SYSCALL:
 | 
			
		||||
				ret=get_last_socket_error();
 | 
			
		||||
				if (c_brief)
 | 
			
		||||
					BIO_puts(bio_err, "CONNECTION CLOSED BY SERVER\n");
 | 
			
		||||
				else
 | 
			
		||||
					BIO_printf(bio_err,"read:errno=%d\n",ret);
 | 
			
		||||
				goto shut;
 | 
			
		||||
			case SSL_ERROR_ZERO_RETURN:
 | 
			
		||||
@@ -1830,6 +2115,14 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
 | 
			
		||||
				SSL_renegotiate(con);
 | 
			
		||||
				cbuf_len=0;
 | 
			
		||||
				}
 | 
			
		||||
#ifndef OPENSSL_NO_HEARTBEATS
 | 
			
		||||
			else if ((!c_ign_eof) && (cbuf[0] == 'B'))
 | 
			
		||||
 				{
 | 
			
		||||
				BIO_printf(bio_err,"HEARTBEATING\n");
 | 
			
		||||
				SSL_heartbeat(con);
 | 
			
		||||
				cbuf_len=0;
 | 
			
		||||
				}
 | 
			
		||||
#endif
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				cbuf_len=i;
 | 
			
		||||
@@ -1857,13 +2150,32 @@ end:
 | 
			
		||||
			print_stuff(bio_c_out,con,1);
 | 
			
		||||
		SSL_free(con);
 | 
			
		||||
		}
 | 
			
		||||
#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
 | 
			
		||||
	if (next_proto.data)
 | 
			
		||||
		OPENSSL_free(next_proto.data);
 | 
			
		||||
#endif
 | 
			
		||||
	if (ctx != NULL) SSL_CTX_free(ctx);
 | 
			
		||||
	if (cert)
 | 
			
		||||
		X509_free(cert);
 | 
			
		||||
	if (crls)
 | 
			
		||||
		sk_X509_CRL_pop_free(crls, X509_CRL_free);
 | 
			
		||||
	if (key)
 | 
			
		||||
		EVP_PKEY_free(key);
 | 
			
		||||
	if (chain)
 | 
			
		||||
		sk_X509_pop_free(chain, X509_free);
 | 
			
		||||
	if (pass)
 | 
			
		||||
		OPENSSL_free(pass);
 | 
			
		||||
	if (vpm)
 | 
			
		||||
		X509_VERIFY_PARAM_free(vpm);
 | 
			
		||||
	ssl_excert_free(exc);
 | 
			
		||||
	if (ssl_args)
 | 
			
		||||
		sk_OPENSSL_STRING_free(ssl_args);
 | 
			
		||||
	if (cctx)
 | 
			
		||||
		SSL_CONF_CTX_free(cctx);
 | 
			
		||||
#ifndef OPENSSL_NO_JPAKE
 | 
			
		||||
	if (jpake_secret && psk_key)
 | 
			
		||||
		OPENSSL_free(psk_key);
 | 
			
		||||
#endif
 | 
			
		||||
	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
 | 
			
		||||
	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
 | 
			
		||||
	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
 | 
			
		||||
@@ -1872,6 +2184,11 @@ end:
 | 
			
		||||
		BIO_free(bio_c_out);
 | 
			
		||||
		bio_c_out=NULL;
 | 
			
		||||
		}
 | 
			
		||||
	if (bio_c_msg != NULL)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_free(bio_c_msg);
 | 
			
		||||
		bio_c_msg=NULL;
 | 
			
		||||
		}
 | 
			
		||||
	apps_shutdown();
 | 
			
		||||
	OPENSSL_EXIT(ret);
 | 
			
		||||
	}
 | 
			
		||||
@@ -1891,6 +2208,7 @@ static void print_stuff(BIO *bio, SSL *s, int full)
 | 
			
		||||
#ifndef OPENSSL_NO_COMP
 | 
			
		||||
	const COMP_METHOD *comp, *expansion;
 | 
			
		||||
#endif
 | 
			
		||||
	unsigned char *exportedkeymat;
 | 
			
		||||
 | 
			
		||||
	if (full)
 | 
			
		||||
		{
 | 
			
		||||
@@ -1977,6 +2295,9 @@ static void print_stuff(BIO *bio, SSL *s, int full)
 | 
			
		||||
			BIO_write(bio,"\n",1);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		ssl_print_sigalgs(bio, s);
 | 
			
		||||
		ssl_print_tmp_key(bio, s);
 | 
			
		||||
 | 
			
		||||
		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
 | 
			
		||||
			BIO_number_read(SSL_get_rbio(s)),
 | 
			
		||||
			BIO_number_written(SSL_get_wbio(s)));
 | 
			
		||||
@@ -2004,17 +2325,6 @@ static void print_stuff(BIO *bio, SSL *s, int full)
 | 
			
		||||
		expansion ? SSL_COMP_get_name(expansion) : "NONE");
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
 | 
			
		||||
	if (next_proto.status != -1) {
 | 
			
		||||
		const unsigned char *proto;
 | 
			
		||||
		unsigned int proto_len;
 | 
			
		||||
		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
 | 
			
		||||
		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
 | 
			
		||||
		BIO_write(bio, proto, proto_len);
 | 
			
		||||
		BIO_write(bio, "\n", 1);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SSL_DEBUG
 | 
			
		||||
	{
 | 
			
		||||
	/* Print out local port of connection: useful for debugging */
 | 
			
		||||
@@ -2027,7 +2337,68 @@ static void print_stuff(BIO *bio, SSL *s, int full)
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(OPENSSL_NO_TLSEXT)
 | 
			
		||||
# if !defined(OPENSSL_NO_NEXTPROTONEG)
 | 
			
		||||
	if (next_proto.status != -1) {
 | 
			
		||||
		const unsigned char *proto;
 | 
			
		||||
		unsigned int proto_len;
 | 
			
		||||
		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
 | 
			
		||||
		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
 | 
			
		||||
		BIO_write(bio, proto, proto_len);
 | 
			
		||||
		BIO_write(bio, "\n", 1);
 | 
			
		||||
	}
 | 
			
		||||
# endif
 | 
			
		||||
	{
 | 
			
		||||
		const unsigned char *proto;
 | 
			
		||||
		unsigned int proto_len;
 | 
			
		||||
		SSL_get0_alpn_selected(s, &proto, &proto_len);
 | 
			
		||||
		if (proto_len > 0)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio, "ALPN protocol: ");
 | 
			
		||||
			BIO_write(bio, proto, proto_len);
 | 
			
		||||
			BIO_write(bio, "\n", 1);
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			BIO_printf(bio, "No ALPN negotiated\n");
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 	{
 | 
			
		||||
 	SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
 | 
			
		||||
 
 | 
			
		||||
	if(srtp_profile)
 | 
			
		||||
		BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
 | 
			
		||||
			   srtp_profile->name);
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
	SSL_SESSION_print(bio,SSL_get_session(s));
 | 
			
		||||
	if (keymatexportlabel != NULL)
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio, "Keying material exporter:\n");
 | 
			
		||||
		BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
 | 
			
		||||
		BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
 | 
			
		||||
		exportedkeymat = OPENSSL_malloc(keymatexportlen);
 | 
			
		||||
		if (exportedkeymat != NULL)
 | 
			
		||||
			{
 | 
			
		||||
			if (!SSL_export_keying_material(s, exportedkeymat,
 | 
			
		||||
						        keymatexportlen,
 | 
			
		||||
						        keymatexportlabel,
 | 
			
		||||
						        strlen(keymatexportlabel),
 | 
			
		||||
						        NULL, 0, 0))
 | 
			
		||||
				{
 | 
			
		||||
				BIO_printf(bio, "    Error\n");
 | 
			
		||||
				}
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				BIO_printf(bio, "    Keying material: ");
 | 
			
		||||
				for (i=0; i<keymatexportlen; i++)
 | 
			
		||||
					BIO_printf(bio, "%02X",
 | 
			
		||||
						   exportedkeymat[i]);
 | 
			
		||||
				BIO_printf(bio, "\n");
 | 
			
		||||
				}
 | 
			
		||||
			OPENSSL_free(exportedkeymat);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	BIO_printf(bio,"---\n");
 | 
			
		||||
	if (peer != NULL)
 | 
			
		||||
		X509_free(peer);
 | 
			
		||||
@@ -2063,4 +2434,74 @@ static int ocsp_resp_cb(SSL *s, void *arg)
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int authz_tlsext_cb(SSL *s, unsigned short ext_type,
 | 
			
		||||
			   const unsigned char *in,
 | 
			
		||||
			   unsigned short inlen, int *al,
 | 
			
		||||
			   void *arg)
 | 
			
		||||
	{
 | 
			
		||||
	if (TLSEXT_TYPE_server_authz == ext_type)
 | 
			
		||||
		server_provided_server_authz
 | 
			
		||||
		  = (memchr(in, TLSEXT_AUTHZDATAFORMAT_dtcp, inlen) != NULL);
 | 
			
		||||
 | 
			
		||||
	if (TLSEXT_TYPE_client_authz == ext_type)
 | 
			
		||||
		server_provided_client_authz
 | 
			
		||||
		  = (memchr(in, TLSEXT_AUTHZDATAFORMAT_dtcp, inlen) != NULL);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int authz_tlsext_generate_cb(SSL *s, unsigned short ext_type,
 | 
			
		||||
				    const unsigned char **out, unsigned short *outlen,
 | 
			
		||||
				    int *al, void *arg)
 | 
			
		||||
	{
 | 
			
		||||
	if (c_auth)
 | 
			
		||||
		{
 | 
			
		||||
		/*if auth_require_reneg flag is set, only send extensions if
 | 
			
		||||
		  renegotiation has occurred */
 | 
			
		||||
		if (!c_auth_require_reneg || (c_auth_require_reneg && SSL_num_renegotiations(s)))
 | 
			
		||||
			{
 | 
			
		||||
			*out = auth_ext_data;
 | 
			
		||||
			*outlen = 1;
 | 
			
		||||
			return 1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	/* no auth extension to send */
 | 
			
		||||
	return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int suppdata_cb(SSL *s, unsigned short supp_data_type,
 | 
			
		||||
		       const unsigned char *in,
 | 
			
		||||
		       unsigned short inlen, int *al,
 | 
			
		||||
		       void *arg)
 | 
			
		||||
	{
 | 
			
		||||
	if (supp_data_type == TLSEXT_SUPPLEMENTALDATATYPE_authz_data)
 | 
			
		||||
		{
 | 
			
		||||
		most_recent_supplemental_data = in;
 | 
			
		||||
		most_recent_supplemental_data_length = inlen;
 | 
			
		||||
		}
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int auth_suppdata_generate_cb(SSL *s, unsigned short supp_data_type,
 | 
			
		||||
				     const unsigned char **out,
 | 
			
		||||
				     unsigned short *outlen, int *al, void *arg)
 | 
			
		||||
	{
 | 
			
		||||
	if (c_auth && server_provided_client_authz && server_provided_server_authz)
 | 
			
		||||
		{
 | 
			
		||||
		/*if auth_require_reneg flag is set, only send supplemental data if
 | 
			
		||||
		  renegotiation has occurred */
 | 
			
		||||
		if (!c_auth_require_reneg
 | 
			
		||||
		    || (c_auth_require_reneg && SSL_num_renegotiations(s)))
 | 
			
		||||
			{
 | 
			
		||||
			generated_supp_data = OPENSSL_malloc(10);
 | 
			
		||||
			memcpy(generated_supp_data, "5432154321", 10);
 | 
			
		||||
			*out = generated_supp_data;
 | 
			
		||||
			*outlen = 10;
 | 
			
		||||
			return 1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	/* no supplemental data to send */
 | 
			
		||||
	return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1053
									
								
								apps/s_server.c
									
									
									
									
									
								
							
							
						
						
									
										1053
									
								
								apps/s_server.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -62,6 +62,12 @@
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
 | 
			
		||||
#ifdef FLAT_INC
 | 
			
		||||
#include "e_os2.h"
 | 
			
		||||
#else
 | 
			
		||||
#include "../e_os2.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* With IPv6, it looks like Digital has mixed up the proper order of
 | 
			
		||||
   recursive header file inclusion, resulting in the compiler complaining
 | 
			
		||||
   that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
 | 
			
		||||
@@ -96,8 +102,7 @@ static struct hostent *GetHostByName(char *name);
 | 
			
		||||
static void ssl_sock_cleanup(void);
 | 
			
		||||
#endif
 | 
			
		||||
static int ssl_sock_init(void);
 | 
			
		||||
static int init_client_ip(int *sock, const unsigned char ip[4], int port,
 | 
			
		||||
			  int type);
 | 
			
		||||
static int init_client_ip(int *sock,unsigned char ip[4], int port, int type);
 | 
			
		||||
static int init_server(int *sock, int port, int type);
 | 
			
		||||
static int init_server_long(int *sock, int port,char *ip, int type);
 | 
			
		||||
static int do_accept(int acc_sock, int *sock, char **host);
 | 
			
		||||
@@ -233,16 +238,13 @@ int init_client(int *sock, char *host, int port, int type)
 | 
			
		||||
	{
 | 
			
		||||
	unsigned char ip[4];
 | 
			
		||||
 | 
			
		||||
	ip[0] = ip[1] = ip[2] = ip[3] = 0;
 | 
			
		||||
	memset(ip, '\0', sizeof ip);
 | 
			
		||||
	if (!host_ip(host,&(ip[0])))
 | 
			
		||||
		{
 | 
			
		||||
		return(0);
 | 
			
		||||
		}
 | 
			
		||||
	return(init_client_ip(sock,ip,port,type));
 | 
			
		||||
		return 0;
 | 
			
		||||
	return init_client_ip(sock,ip,port,type);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int init_client_ip(int *sock, const unsigned char ip[4], int port,
 | 
			
		||||
			  int type)
 | 
			
		||||
static int init_client_ip(int *sock, unsigned char ip[4], int port, int type)
 | 
			
		||||
	{
 | 
			
		||||
	unsigned long addr;
 | 
			
		||||
	struct sockaddr_in them;
 | 
			
		||||
@@ -282,7 +284,7 @@ static int init_client_ip(int *sock, const unsigned char ip[4], int port,
 | 
			
		||||
	return(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
int do_server(int port, int type, int *ret, int (*cb)(char *hostname, int s, unsigned char *context), unsigned char *context)
 | 
			
		||||
int do_server(int port, int type, int *ret, int (*cb)(char *hostname, int s, int stype, unsigned char *context), unsigned char *context, int naccept)
 | 
			
		||||
	{
 | 
			
		||||
	int sock;
 | 
			
		||||
	char *name = NULL;
 | 
			
		||||
@@ -308,11 +310,13 @@ int do_server(int port, int type, int *ret, int (*cb)(char *hostname, int s, uns
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			sock = accept_socket;
 | 
			
		||||
		i=(*cb)(name,sock, context);
 | 
			
		||||
		i=(*cb)(name,sock, type, context);
 | 
			
		||||
		if (name != NULL) OPENSSL_free(name);
 | 
			
		||||
		if (type==SOCK_STREAM)
 | 
			
		||||
			SHUTDOWN2(sock);
 | 
			
		||||
		if (i < 0)
 | 
			
		||||
		if (naccept != -1)
 | 
			
		||||
			naccept--;
 | 
			
		||||
		if (i < 0 || naccept == 0)
 | 
			
		||||
			{
 | 
			
		||||
			SHUTDOWN2(accept_socket);
 | 
			
		||||
			return(i);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										413
									
								
								apps/server.pem
									
									
									
									
									
								
							
							
						
						
									
										413
									
								
								apps/server.pem
									
									
									
									
									
								
							@@ -1,369 +1,52 @@
 | 
			
		||||
issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit)
 | 
			
		||||
subject= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Server test cert (512 bit)
 | 
			
		||||
subject= C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = Test Server Cert
 | 
			
		||||
issuer= C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = OpenSSL Test Intermediate CA
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIB6TCCAVICAQYwDQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCQVUxEzARBgNV
 | 
			
		||||
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRswGQYD
 | 
			
		||||
VQQDExJUZXN0IENBICgxMDI0IGJpdCkwHhcNMDAxMDE2MjIzMTAzWhcNMDMwMTE0
 | 
			
		||||
MjIzMTAzWjBjMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDEaMBgG
 | 
			
		||||
A1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxIzAhBgNVBAMTGlNlcnZlciB0ZXN0IGNl
 | 
			
		||||
cnQgKDUxMiBiaXQpMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ+zw4Qnlf8SMVIP
 | 
			
		||||
Fe9GEcStgOY2Ww/dgNdhjeD8ckUJNP5VZkVDTGiXav6ooKXfX3j/7tdkuD8Ey2//
 | 
			
		||||
Kv7+ue0CAwEAATANBgkqhkiG9w0BAQQFAAOBgQCT0grFQeZaqYb5EYfk20XixZV4
 | 
			
		||||
GmyAbXMftG1Eo7qGiMhYzRwGNWxEYojf5PZkYZXvSqZ/ZXHXa4g59jK/rJNnaVGM
 | 
			
		||||
k+xIX8mxQvlV0n5O9PIha5BX5teZnkHKgL8aKKLKW1BK7YTngsfSzzaeame5iKfz
 | 
			
		||||
itAE+OjGF+PFKbwX8Q==
 | 
			
		||||
MIID5zCCAs+gAwIBAgIJALnu1NlVpZ6zMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV
 | 
			
		||||
BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMSIwIAYDVQQLDBlGT1IgVEVT
 | 
			
		||||
VElORyBQVVJQT1NFUyBPTkxZMSUwIwYDVQQDDBxPcGVuU1NMIFRlc3QgSW50ZXJt
 | 
			
		||||
ZWRpYXRlIENBMB4XDTExMTIwODE0MDE0OFoXDTIxMTAxNjE0MDE0OFowZDELMAkG
 | 
			
		||||
A1UEBhMCVUsxFjAUBgNVBAoMDU9wZW5TU0wgR3JvdXAxIjAgBgNVBAsMGUZPUiBU
 | 
			
		||||
RVNUSU5HIFBVUlBPU0VTIE9OTFkxGTAXBgNVBAMMEFRlc3QgU2VydmVyIENlcnQw
 | 
			
		||||
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDzhPOSNtyyRspmeuUpxfNJ
 | 
			
		||||
KCLTuf7g3uQ4zu4iHOmRO5TQci+HhVlLZrHF9XqFXcIP0y4pWDbMSGuiorUmzmfi
 | 
			
		||||
R7bfSdI/+qIQt8KXRH6HNG1t8ou0VSvWId5TS5Dq/er5ODUr9OaaDva7EquHIcMv
 | 
			
		||||
vPQGuI+OEAcnleVCy9HVEIySrO4P3CNIicnGkwwiAud05yUAq/gPXBC1hTtmlPD7
 | 
			
		||||
TVcGVSEiJdvzqqlgv02qedGrkki6GY4S7GjZxrrf7Foc2EP+51LJzwLQx3/JfrCU
 | 
			
		||||
41NEWAsu/Sl0tQabXESN+zJ1pDqoZ3uHMgpQjeGiE0olr+YcsSW/tJmiU9OiAr8R
 | 
			
		||||
AgMBAAGjgY8wgYwwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAwLAYJYIZI
 | 
			
		||||
AYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQW
 | 
			
		||||
BBSCvM8AABPR9zklmifnr9LvIBturDAfBgNVHSMEGDAWgBQ2w2yI55X+sL3szj49
 | 
			
		||||
hqshgYfa2jANBgkqhkiG9w0BAQUFAAOCAQEAqb1NV0B0/pbpK9Z4/bNjzPQLTRLK
 | 
			
		||||
WnSNm/Jh5v0GEUOE/Beg7GNjNrmeNmqxAlpqWz9qoeoFZax+QBpIZYjROU3TS3fp
 | 
			
		||||
yLsrnlr0CDQ5R7kCCDGa8dkXxemmpZZLbUCpW2Uoy8sAA4JjN9OtsZY7dvUXFgJ7
 | 
			
		||||
vVNTRnI01ghknbtD+2SxSQd3CWF6QhcRMAzZJ1z1cbbwGDDzfvGFPzJ+Sq+zEPds
 | 
			
		||||
xoVLLSetCiBc+40ZcDS5dV98h9XD7JMTQfxzA7mNGv73JoZJA6nFgj+ADSlJsY/t
 | 
			
		||||
JBv+z1iQRueoh9Qeee+ZbRifPouCB8FDx+AltvHTANdAq0t/K3o+pplMVA==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIIBPAIBAAJBAJ+zw4Qnlf8SMVIPFe9GEcStgOY2Ww/dgNdhjeD8ckUJNP5VZkVD
 | 
			
		||||
TGiXav6ooKXfX3j/7tdkuD8Ey2//Kv7+ue0CAwEAAQJAN6W31vDEP2DjdqhzCDDu
 | 
			
		||||
OA4NACqoiFqyblo7yc2tM4h4xMbC3Yx5UKMN9ZkCtX0gzrz6DyF47bdKcWBzNWCj
 | 
			
		||||
gQIhANEoojVt7hq+SQ6MCN6FTAysGgQf56Q3TYoJMoWvdiXVAiEAw3e3rc+VJpOz
 | 
			
		||||
rHuDo6bgpjUAAXM+v3fcpsfZSNO6V7kCIQCtbVjanpUwvZkMI9by02oUk9taki3b
 | 
			
		||||
PzPfAfNPYAbCJQIhAJXNQDWyqwn/lGmR11cqY2y9nZ1+5w3yHGatLrcDnQHxAiEA
 | 
			
		||||
vnlEGo8K85u+KwIOimM48ZG8oTk7iFdkqLJR1utT3aU=
 | 
			
		||||
MIIEpAIBAAKCAQEA84TzkjbcskbKZnrlKcXzSSgi07n+4N7kOM7uIhzpkTuU0HIv
 | 
			
		||||
h4VZS2axxfV6hV3CD9MuKVg2zEhroqK1Js5n4ke230nSP/qiELfCl0R+hzRtbfKL
 | 
			
		||||
tFUr1iHeU0uQ6v3q+Tg1K/Tmmg72uxKrhyHDL7z0BriPjhAHJ5XlQsvR1RCMkqzu
 | 
			
		||||
D9wjSInJxpMMIgLndOclAKv4D1wQtYU7ZpTw+01XBlUhIiXb86qpYL9NqnnRq5JI
 | 
			
		||||
uhmOEuxo2ca63+xaHNhD/udSyc8C0Md/yX6wlONTRFgLLv0pdLUGm1xEjfsydaQ6
 | 
			
		||||
qGd7hzIKUI3hohNKJa/mHLElv7SZolPTogK/EQIDAQABAoIBAADq9FwNtuE5IRQn
 | 
			
		||||
zGtO4q7Y5uCzZ8GDNYr9RKp+P2cbuWDbvVAecYq2NV9QoIiWJOAYZKklOvekIju3
 | 
			
		||||
r0UZLA0PRiIrTg6NrESx3JrjWDK8QNlUO7CPTZ39/K+FrmMkV9lem9yxjJjyC34D
 | 
			
		||||
AQB+YRTx+l14HppjdxNwHjAVQpIx/uO2F5xAMuk32+3K+pq9CZUtrofe1q4Agj9R
 | 
			
		||||
5s8mSy9pbRo9kW9wl5xdEotz1LivFOEiqPUJTUq5J5PeMKao3vdK726XI4Z455Nm
 | 
			
		||||
W2/MA0YV0ug2FYinHcZdvKM6dimH8GLfa3X8xKRfzjGjTiMSwsdjgMa4awY3tEHH
 | 
			
		||||
674jhAECgYEA/zqMrc0zsbNk83sjgaYIug5kzEpN4ic020rSZsmQxSCerJTgNhmg
 | 
			
		||||
utKSCt0Re09Jt3LqG48msahX8ycqDsHNvlEGPQSbMu9IYeO3Wr3fAm75GEtFWePY
 | 
			
		||||
BhM73I7gkRt4s8bUiUepMG/wY45c5tRF23xi8foReHFFe9MDzh8fJFECgYEA9EFX
 | 
			
		||||
4qAik1pOJGNei9BMwmx0I0gfVEIgu0tzeVqT45vcxbxr7RkTEaDoAG6PlbWP6D9a
 | 
			
		||||
WQNLp4gsgRM90ZXOJ4up5DsAWDluvaF4/omabMA+MJJ5kGZ0gCj5rbZbKqUws7x8
 | 
			
		||||
bp+6iBfUPJUbcqNqFmi/08Yt7vrDnMnyMw2A/sECgYEAiiuRMxnuzVm34hQcsbhH
 | 
			
		||||
6ymVqf7j0PW2qK0F4H1ocT9qhzWFd+RB3kHWrCjnqODQoI6GbGr/4JepHUpre1ex
 | 
			
		||||
4UEN5oSS3G0ru0rC3U4C59dZ5KwDHFm7ffZ1pr52ljfQDUsrjjIMRtuiwNK2OoRa
 | 
			
		||||
WSsqiaL+SDzSB+nBmpnAizECgYBdt/y6rerWUx4MhDwwtTnel7JwHyo2MDFS6/5g
 | 
			
		||||
n8qC2Lj6/fMDRE22w+CA2esp7EJNQJGv+b27iFpbJEDh+/Lf5YzIT4MwVskQ5bYB
 | 
			
		||||
JFcmRxUVmf4e09D7o705U/DjCgMH09iCsbLmqQ38ONIRSHZaJtMDtNTHD1yi+jF+
 | 
			
		||||
OT43gQKBgQC/2OHZoko6iRlNOAQ/tMVFNq7fL81GivoQ9F1U0Qr+DH3ZfaH8eIkX
 | 
			
		||||
xT0ToMPJUzWAn8pZv0snA0um6SIgvkCuxO84OkANCVbttzXImIsL7pFzfcwV/ERK
 | 
			
		||||
UM6j0ZuSMFOCr/lGPAoOQU0fskidGEHi1/kW+suSr28TqsyYZpwBDQ==
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
subject=/C=US/O=AT&T Bell Laboratories/OU=Prototype Research CA
 | 
			
		||||
issuer= /C=US/O=AT&T Bell Laboratories/OU=Prototype Research CA
 | 
			
		||||
notBefore=950413210656Z
 | 
			
		||||
notAfter =970412210656Z
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
MIICCDCCAXECAQAwDQYJKoZIhvcNAQEEBQAwTjELMAkGA1UEBhMCVVMxHzAdBgNV
 | 
			
		||||
BAoUFkFUJlQgQmVsbCBMYWJvcmF0b3JpZXMxHjAcBgNVBAsUFVByb3RvdHlwZSBS
 | 
			
		||||
ZXNlYXJjaCBDQTAeFw05NTA0MTMyMTA2NTZaFw05NzA0MTIyMTA2NTZaME4xCzAJ
 | 
			
		||||
BgNVBAYTAlVTMR8wHQYDVQQKFBZBVCZUIEJlbGwgTGFib3JhdG9yaWVzMR4wHAYD
 | 
			
		||||
VQQLFBVQcm90b3R5cGUgUmVzZWFyY2ggQ0EwgZwwDQYJKoZIhvcNAQEBBQADgYoA
 | 
			
		||||
MIGGAoGAebOmgtSCl+wCYZc86UGYeTLY8cjmW2P0FN8ToT/u2pECCoFdrlycX0OR
 | 
			
		||||
3wt0ZhpFXLVNeDnHwEE9veNUih7pCL2ZBFqoIoQkB1lZmXRiVtjGonz8BLm/qrFM
 | 
			
		||||
YHb0lme/Ol+s118mwKVxnn6bSAeI/OXKhLaVdYZWk+aEaxEDkVkCAQ8wDQYJKoZI
 | 
			
		||||
hvcNAQEEBQADgYEAAZMG14lZmZ8bahkaHaTV9dQf4p2FZiQTFwHP9ZyGsXPC+LT5
 | 
			
		||||
dG5iTaRmyjNIJdPWohZDl97kAci79aBndvuEvRKOjLHs3WRGBIwERnAcnY9Mz8u/
 | 
			
		||||
zIHK23PjYVxGGaZd669OJwD0CYyqH22HH9nFUGaoJdsv39ChW0NRdLE9+y8=
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test PCA (1024 bit)
 | 
			
		||||
subject=/C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit)
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICJjCCAY8CAQAwDQYJKoZIhvcNAQEEBQAwXDELMAkGA1UEBhMCQVUxEzARBgNV
 | 
			
		||||
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYD
 | 
			
		||||
VQQDExNUZXN0IFBDQSAoMTAyNCBiaXQpMB4XDTk3MDYwOTEzNTc0M1oXDTAxMDYw
 | 
			
		||||
OTEzNTc0M1owWzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY
 | 
			
		||||
BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRswGQYDVQQDExJUZXN0IENBICgxMDI0
 | 
			
		||||
IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKO7o8t116VP6cgybTsZ
 | 
			
		||||
DCZhr95nYlZuya3aCi1IKoztqwWnjbmDFIriOqGFPrZQ+moMETC9D59iRW/dFXSv
 | 
			
		||||
1F65ka/XY2hLh9exCCo7XuUcDs53Qp3bI3AmMqHjgzE8oO3ajyJAzJkTTOUecQU2
 | 
			
		||||
mw/gI4tMM0LqWMQS7luTy4+xAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAM7achv3v
 | 
			
		||||
hLQJcv/65eGEpBXM40ZDVoFQFFJWaY5p883HTqLB1x4FdzsXHH0QKBTcKpWwqyu4
 | 
			
		||||
YDm3fb8oDugw72bCzfyZK/zVZPR/hVlqI/fvU109Qoc+7oPvIXWky71HfcK6ZBCA
 | 
			
		||||
q30KIqGM/uoM60INq97qjDmCJapagcNBGQs=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIICXQIBAAKBgQCju6PLddelT+nIMm07GQwmYa/eZ2JWbsmt2gotSCqM7asFp425
 | 
			
		||||
gxSK4jqhhT62UPpqDBEwvQ+fYkVv3RV0r9ReuZGv12NoS4fXsQgqO17lHA7Od0Kd
 | 
			
		||||
2yNwJjKh44MxPKDt2o8iQMyZE0zlHnEFNpsP4COLTDNC6ljEEu5bk8uPsQIDAQAB
 | 
			
		||||
AoGAVZmpFZsDZfr0l2S9tLLwpjRWNOlKATQkno6q2WesT0eGLQufTciY+c8ypfU6
 | 
			
		||||
hyio8r5iUl/VhhdjhAtKx1mRpiotftHo/eYf8rtsrnprOnWG0bWjLjtIoMbcxGn2
 | 
			
		||||
J3bN6LJmbJMjDs0eJ3KnTu646F3nDUw2oGAwmpzKXA1KAP0CQQDRvQhxk2D3Pehs
 | 
			
		||||
HvG665u2pB5ipYQngEFlZO7RHJZzJOZEWSLuuMqaF/7pTfA5jiBvWqCgJeCRRInL
 | 
			
		||||
21ru4dlPAkEAx9jj7BgKn5TYnMoBSSe0afjsV9oApVpN1Nacb1YDtCwy+scp3++s
 | 
			
		||||
nFxlv98wxIlSdpwMUn+AUWfjiWR7Tu/G/wJBAJ/KjwZIrFVxewP0x2ILYsTRYLzz
 | 
			
		||||
MS4PDsO7FB+I0i7DbBOifXS2oNSpd3I0CNMwrxFnUHzynpbOStVfN3ZL5w0CQQCa
 | 
			
		||||
pwFahxBRhkJKsxhjoFJBX9yl75JoY4Wvm5Tbo9ih6UJaRx3kqfkN14L2BKYcsZgb
 | 
			
		||||
KY9vmDOYy6iNfjDeWTfJAkBkfPUb8oTJ/nSP5zN6sqGxSY4krc4xLxpRmxoJ8HL2
 | 
			
		||||
XfhqXkTzbU13RX9JJ/NZ8vQN9Vm2NhxRGJocQkmcdVtJ
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
MIICYDCCAiACAgEoMAkGBSsOAwINBQAwfDELMAkGA1UEBhMCVVMxNjA0BgNVBAoT
 | 
			
		||||
LU5hdGlvbmFsIEFlcm9uYXV0aWNzIGFuZCBTcGFjZSBBZG1pbmlzdHJhdGlvbjEZ
 | 
			
		||||
MBcGA1UECxMQVGVzdCBFbnZpcm9ubWVudDEaMBgGA1UECxMRRFNTLU5BU0EtUGls
 | 
			
		||||
b3QtQ0EwHhcNOTYwMjI2MTYzMjQ1WhcNOTcwMjI1MTYzMjQ1WjB8MQswCQYDVQQG
 | 
			
		||||
EwJVUzE2MDQGA1UEChMtTmF0aW9uYWwgQWVyb25hdXRpY3MgYW5kIFNwYWNlIEFk
 | 
			
		||||
bWluaXN0cmF0aW9uMRkwFwYDVQQLExBUZXN0IEVudmlyb25tZW50MRowGAYDVQQL
 | 
			
		||||
ExFEU1MtTkFTQS1QaWxvdC1DQTCB8jAJBgUrDgMCDAUAA4HkADCB4AJBAMA/ssKb
 | 
			
		||||
hPNUG7ZlASfVwEJU21O5OyF/iyBzgHI1O8eOhJGUYO8cc8wDMjR508Mr9cp6Uhl/
 | 
			
		||||
ZB7FV5GkLNEnRHYCQQDUEaSg45P2qrDwixTRhFhmWz5Nvc4lRFQ/42XPcchiJBLb
 | 
			
		||||
bn3QK74T2IxY1yY+kCNq8XrIqf5fJJzIH0J/xUP3AhUAsg2wsQHfDGYk/BOSulX3
 | 
			
		||||
fVd0geUCQQCzCFUQAh+ZkEmp5804cs6ZWBhrUAfnra8lJItYo9xPcXgdIfLfibcX
 | 
			
		||||
R71UsyO77MRD7B0+Ag2tq794IleCVcEEMAkGBSsOAwINBQADLwAwLAIUUayDfreR
 | 
			
		||||
Yh2WeU86/pHNdkUC1IgCFEfxe1f0oMpxJyrJ5XIxTi7vGdoK
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
MIICGTCCAdgCAwCqTDAJBgUrDgMCDQUAMHwxCzAJBgNVBAYTAlVTMTYwNAYDVQQK
 | 
			
		||||
Ey1OYXRpb25hbCBBZXJvbmF1dGljcyBhbmQgU3BhY2UgQWRtaW5pc3RyYXRpb24x
 | 
			
		||||
GTAXBgNVBAsTEFRlc3QgRW52aXJvbm1lbnQxGjAYBgNVBAsTEURTUy1OQVNBLVBp
 | 
			
		||||
bG90LUNBMB4XDTk2MDUxNDE3MDE0MVoXDTk3MDUxNDE3MDE0MVowMzELMAkGA1UE
 | 
			
		||||
BhMCQVUxDzANBgNVBAoTBk1pbmNvbTETMBEGA1UEAxMKRXJpYyBZb3VuZzCB8jAJ
 | 
			
		||||
BgUrDgMCDAUAA4HkADCB4AJBAKbfHz6vE6pXXMTpswtGUec2tvnfLJUsoxE9qs4+
 | 
			
		||||
ObZX7LmLvragNPUeiTJx7UOWZ5DfBj6bXLc8eYne0lP1g3ACQQDUEaSg45P2qrDw
 | 
			
		||||
ixTRhFhmWz5Nvc4lRFQ/42XPcchiJBLbbn3QK74T2IxY1yY+kCNq8XrIqf5fJJzI
 | 
			
		||||
H0J/xUP3AhUAsg2wsQHfDGYk/BOSulX3fVd0geUCQQCzCFUQAh+ZkEmp5804cs6Z
 | 
			
		||||
WBhrUAfnra8lJItYo9xPcXgdIfLfibcXR71UsyO77MRD7B0+Ag2tq794IleCVcEE
 | 
			
		||||
MAkGBSsOAwINBQADMAAwLQIUWsuuJRE3VT4ueWkWMAJMJaZjj1ECFQCYY0zX4bzM
 | 
			
		||||
LC7obsrHD8XAHG+ZRG==
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICTTCCAbagAwIBAgIBADANBgkqhkiG9w0BAQQFADBMMQswCQYDVQQGEwJHQjEM
 | 
			
		||||
MAoGA1UEChMDVUNMMRgwFgYDVQQLEw9JQ0UtVEVMIFByb2plY3QxFTATBgNVBAMT
 | 
			
		||||
DFRydXN0RmFjdG9yeTAeFw05NzA0MjIxNDM5MTRaFw05ODA0MjIxNDM5MTRaMEwx
 | 
			
		||||
CzAJBgNVBAYTAkdCMQwwCgYDVQQKEwNVQ0wxGDAWBgNVBAsTD0lDRS1URUwgUHJv
 | 
			
		||||
amVjdDEVMBMGA1UEAxMMVHJ1c3RGYWN0b3J5MIGcMAoGBFUIAQECAgQAA4GNADCB
 | 
			
		||||
iQKBgQCEieR8NcXkUW1f0G6aC6u0i8q/98JqS6RxK5YmHIGKCkuTWAUjzLfUa4dt
 | 
			
		||||
U9igGCjTuxaDqlzEim+t/02pmiBZT9HaX++35MjQPUWmsChcYU5WyzGErXi+rQaw
 | 
			
		||||
zlwS73zM8qiPj/97lXYycWhgL0VaiDSPxRXEUdWoaGruom4mNQIDAQABo0IwQDAd
 | 
			
		||||
BgNVHQ4EFgQUHal1LZr7oVg5z6lYzrhTgZRCmcUwDgYDVR0PAQH/BAQDAgH2MA8G
 | 
			
		||||
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAfaggfl6FZoioecjv0dq8
 | 
			
		||||
/DXo/u11iMZvXn08gjX/zl2b4wtPbShOSY5FhkSm8GeySasz+/Nwb/uzfnIhokWi
 | 
			
		||||
lfPZHtlCWtXbIy/TN51eJyq04ceDCQDWvLC2enVg9KB+GJ34b5c5VaPRzq8MBxsA
 | 
			
		||||
S7ELuYGtmYgYm9NZOIr7yU0=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIB6jCCAZQCAgEtMA0GCSqGSIb3DQEBBAUAMIGAMQswCQYDVQQGEwJVUzE2MDQG
 | 
			
		||||
A1UEChMtTmF0aW9uYWwgQWVyb25hdXRpY3MgYW5kIFNwYWNlIEFkbWluaXN0cmF0
 | 
			
		||||
aW9uMRkwFwYDVQQLExBUZXN0IEVudmlyb25tZW50MR4wHAYDVQQLExVNRDUtUlNB
 | 
			
		||||
LU5BU0EtUGlsb3QtQ0EwHhcNOTYwNDMwMjIwNTAwWhcNOTcwNDMwMjIwNTAwWjCB
 | 
			
		||||
gDELMAkGA1UEBhMCVVMxNjA0BgNVBAoTLU5hdGlvbmFsIEFlcm9uYXV0aWNzIGFu
 | 
			
		||||
ZCBTcGFjZSBBZG1pbmlzdHJhdGlvbjEZMBcGA1UECxMQVGVzdCBFbnZpcm9ubWVu
 | 
			
		||||
dDEeMBwGA1UECxMVTUQ1LVJTQS1OQVNBLVBpbG90LUNBMFkwCgYEVQgBAQICAgAD
 | 
			
		||||
SwAwSAJBALmmX5+GqAvcrWK13rfDrNX9UfeA7f+ijyBgeFQjYUoDpFqapw4nzQBL
 | 
			
		||||
bAXug8pKkRwa2Zh8YODhXsRWu2F/UckCAwEAATANBgkqhkiG9w0BAQQFAANBAH9a
 | 
			
		||||
OBA+QCsjxXgnSqHx04gcU8S49DVUb1f2XVoLnHlIb8RnX0k5O6mpHT5eti9bLkiW
 | 
			
		||||
GJNMJ4L0AJ/ac+SmHZc=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICajCCAdMCBDGA0QUwDQYJKoZIhvcNAQEEBQAwfTELMAkGA1UEBhMCQ2ExDzAN
 | 
			
		||||
BgNVBAcTBk5lcGVhbjEeMBwGA1UECxMVTm8gTGlhYmlsaXR5IEFjY2VwdGVkMR8w
 | 
			
		||||
HQYDVQQKExZGb3IgRGVtbyBQdXJwb3NlcyBPbmx5MRwwGgYDVQQDExNFbnRydXN0
 | 
			
		||||
IERlbW8gV2ViIENBMB4XDTk2MDQyNjEzMzUwMVoXDTA2MDQyNjEzMzUwMVowfTEL
 | 
			
		||||
MAkGA1UEBhMCQ2ExDzANBgNVBAcTBk5lcGVhbjEeMBwGA1UECxMVTm8gTGlhYmls
 | 
			
		||||
aXR5IEFjY2VwdGVkMR8wHQYDVQQKExZGb3IgRGVtbyBQdXJwb3NlcyBPbmx5MRww
 | 
			
		||||
GgYDVQQDExNFbnRydXN0IERlbW8gV2ViIENBMIGdMA0GCSqGSIb3DQEBAQUAA4GL
 | 
			
		||||
ADCBhwKBgQCaroS7O1DA0hm4IefNYU1cx/nqOmzEnk291d1XqznDeF4wEgakbkCc
 | 
			
		||||
zTKxK791yNpXG5RmngqH7cygDRTHZJ6mfCRn0wGC+AI00F2vYTGqPGRQL1N3lZT0
 | 
			
		||||
YDKFC0SQeMMjFIZ1aeQigroFQnHo0VB3zWIMpNkka8PY9lxHZAmWwQIBAzANBgkq
 | 
			
		||||
hkiG9w0BAQQFAAOBgQBAx0UMVA1s54lMQyXjMX5kj99FJN5itb8bK1Rk+cegPQPF
 | 
			
		||||
cWO9SEWyEjjBjIkjjzAwBkaEszFsNGxemxtXvwjIm1xEUMTVlPEWTs2qnDvAUA9W
 | 
			
		||||
YqhWbhH0toGT36236QAsqCZ76rbTRVSSX2BHyJwJMG2tCRv7kRJ//NIgxj3H4w==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test PCA (1024 bit)
 | 
			
		||||
subject=/C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test PCA (1024 bit)
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICJzCCAZACAQAwDQYJKoZIhvcNAQEEBQAwXDELMAkGA1UEBhMCQVUxEzARBgNV
 | 
			
		||||
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYD
 | 
			
		||||
VQQDExNUZXN0IFBDQSAoMTAyNCBiaXQpMB4XDTk3MDYwOTEzNTczN1oXDTAxMDYw
 | 
			
		||||
OTEzNTczN1owXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY
 | 
			
		||||
BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy
 | 
			
		||||
NCBiaXQpMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdoWk/3+WcMlfjIrkg
 | 
			
		||||
40ketmnQaEogQe1LLcuOJV6rKfUSAsPgwgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp
 | 
			
		||||
22Jp85PmemiDzyUIStwk72qhp1imbANZvlmlCFKiQrjUyuDfu4TABmn+kkt3vR1Y
 | 
			
		||||
BEOGt+IFye1UBVSATVdRJ2UVhwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABNA1u/S
 | 
			
		||||
Cg/LJZWb7GliiKJsvuhxlE4E5JxQF2zMub/CSNbF97//tYSyj96sxeFQxZXbcjm9
 | 
			
		||||
xt6mr/xNLA4szNQMJ4P+L7b5e/jC5DSqlwS+CUYJgaFs/SP+qJoCSu1bR3IM9XWO
 | 
			
		||||
cRBpDmcBbYLkSyB92WURvsZ1LtjEcn+cdQVI
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg
 | 
			
		||||
wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ
 | 
			
		||||
vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB
 | 
			
		||||
AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc
 | 
			
		||||
z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz
 | 
			
		||||
xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7
 | 
			
		||||
HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD
 | 
			
		||||
yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS
 | 
			
		||||
xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj
 | 
			
		||||
7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG
 | 
			
		||||
h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL
 | 
			
		||||
QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q
 | 
			
		||||
hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc=
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
subject=/C=US/O=RSA Data Security, Inc./OU=Commercial Certification Authority
 | 
			
		||||
issuer= /C=US/O=RSA Data Security, Inc./OU=Commercial Certification Authority
 | 
			
		||||
notBefore=941104185834Z
 | 
			
		||||
notAfter =991103185834Z
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
MIICIzCCAZACBQJBAAAWMA0GCSqGSIb3DQEBAgUAMFwxCzAJBgNVBAYTAlVTMSAw
 | 
			
		||||
HgYDVQQKExdSU0EgRGF0YSBTZWN1cml0eSwgSW5jLjErMCkGA1UECxMiQ29tbWVy
 | 
			
		||||
Y2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NDExMDQxODU4MzRaFw05
 | 
			
		||||
OTExMDMxODU4MzRaMFwxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdSU0EgRGF0YSBT
 | 
			
		||||
ZWN1cml0eSwgSW5jLjErMCkGA1UECxMiQ29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9u
 | 
			
		||||
IEF1dGhvcml0eTCBmzANBgkqhkiG9w0BAQEFAAOBiQAwgYUCfgCk+4Fie84QJ93o
 | 
			
		||||
975sbsZwmdu41QUDaSiCnHJ/lj+O7Kwpkj+KFPhCdr69XQO5kNTQvAayUTNfxMK/
 | 
			
		||||
touPmbZiImDd298ggrTKoi8tUO2UMt7gVY3UaOLgTNLNBRYulWZcYVI4HlGogqHE
 | 
			
		||||
7yXpCuaLK44xZtn42f29O2nZ6wIDAQABMA0GCSqGSIb3DQEBAgUAA34AdrW2EP4j
 | 
			
		||||
9/dZYkuwX5zBaLxJu7NJbyFHXSudVMQAKD+YufKKg5tgf+tQx6sFEC097TgCwaVI
 | 
			
		||||
0v5loMC86qYjFmZsGySp8+x5NRhPJsjjr1BKx6cxa9B8GJ1Qv6km+iYrRpwUqbtb
 | 
			
		||||
MJhCKLVLU7tDCZJAuqiqWqTGtotXTcU=
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
subject=/C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
 | 
			
		||||
issuer= /C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
 | 
			
		||||
notBefore=941109235417Z
 | 
			
		||||
notAfter =991231235417Z
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
MIICKTCCAZYCBQJBAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMSAw
 | 
			
		||||
HgYDVQQKExdSU0EgRGF0YSBTZWN1cml0eSwgSW5jLjEuMCwGA1UECxMlU2VjdXJl
 | 
			
		||||
IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NDExMDkyMzU0MTda
 | 
			
		||||
Fw05OTEyMzEyMzU0MTdaMF8xCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdSU0EgRGF0
 | 
			
		||||
YSBTZWN1cml0eSwgSW5jLjEuMCwGA1UECxMlU2VjdXJlIFNlcnZlciBDZXJ0aWZp
 | 
			
		||||
Y2F0aW9uIEF1dGhvcml0eTCBmzANBgkqhkiG9w0BAQEFAAOBiQAwgYUCfgCSznrB
 | 
			
		||||
roM+WqqJg1esJQF2DK2ujiw3zus1eGRUA+WEQFHJv48I4oqCCNIWhjdV6bEhAq12
 | 
			
		||||
aIGaBaJLyUslZiJWbIgHj/eBWW2EB2VwE3F2Ppt3TONQiVaYSLkdpykaEy5KEVmc
 | 
			
		||||
HhXVSVQsczppgrGXOZxtcGdI5d0t1sgeewIDAQABMA0GCSqGSIb3DQEBAgUAA34A
 | 
			
		||||
iNHReSHO4ovo+MF9NFM/YYPZtgs4F7boviGNjwC4i1N+RGceIr2XJ+CchcxK9oU7
 | 
			
		||||
suK+ktPlDemvXA4MRpX/oRxePug2WHpzpgr4IhFrwwk4fia7c+8AvQKk8xQNMD9h
 | 
			
		||||
cHsg/jKjn7P0Z1LctO6EjJY2IN6BCINxIYoPnqk=
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
subject=/C=ZA/SP=Western Cape/L=Cape Town/O=Thawte Consulting cc
 | 
			
		||||
	/OU=Certification Services Division/CN=Thawte Server CA
 | 
			
		||||
	/Email=server-certs@thawte.com
 | 
			
		||||
issuer= /C=ZA/SP=Western Cape/L=Cape Town/O=Thawte Consulting cc
 | 
			
		||||
	/OU=Certification Services Division/CN=Thawte Server CA
 | 
			
		||||
	/Email=server-certs@thawte.com
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIC+TCCAmICAQAwDQYJKoZIhvcNAQEEBQAwgcQxCzAJBgNVBAYTAlpBMRUwEwYD
 | 
			
		||||
VQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
 | 
			
		||||
VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
 | 
			
		||||
dmljZXMgRGl2aXNpb24xGTAXBgNVBAMTEFRoYXd0ZSBTZXJ2ZXIgQ0ExJjAkBgkq
 | 
			
		||||
hkiG9w0BCQEWF3NlcnZlci1jZXJ0c0B0aGF3dGUuY29tMB4XDTk2MDcyNzE4MDc1
 | 
			
		||||
N1oXDTk4MDcyNzE4MDc1N1owgcQxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0
 | 
			
		||||
ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENv
 | 
			
		||||
bnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
 | 
			
		||||
aXNpb24xGTAXBgNVBAMTEFRoYXd0ZSBTZXJ2ZXIgQ0ExJjAkBgkqhkiG9w0BCQEW
 | 
			
		||||
F3NlcnZlci1jZXJ0c0B0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
 | 
			
		||||
iQKBgQDTpFBuyP9Wa+bPXbbqDGh1R6KqwtqEJfyo9EdR2oW1IHSUhh4PdcnpCGH1
 | 
			
		||||
Bm0wbhUZAulSwGLbTZme4moMRDjN/r7jZAlwxf6xaym2L0nIO9QnBCUQly/nkG3A
 | 
			
		||||
KEKZ10xD3sP1IW1Un13DWOHA5NlbsLjctHvfNjrCtWYiEtaHDQIDAQABMA0GCSqG
 | 
			
		||||
SIb3DQEBBAUAA4GBAIsvn7ifX3RUIrvYXtpI4DOfARkTogwm6o7OwVdl93yFhDcX
 | 
			
		||||
7h5t0XZ11MUAMziKdde3rmTvzUYIUCYoY5b032IwGMTvdiclK+STN6NP2m5nvFAM
 | 
			
		||||
qJT5gC5O+j/jBuZRQ4i0AMYQr5F4lT8oBJnhgafw6PL8aDY2vMHGSPl9+7uf
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIDDTCCAnYCAQAwDQYJKoZIhvcNAQEEBQAwgc4xCzAJBgNVBAYTAlpBMRUwEwYD
 | 
			
		||||
VQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
 | 
			
		||||
VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
 | 
			
		||||
dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBD
 | 
			
		||||
QTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTAeFw05
 | 
			
		||||
NjA3MjcxODA3MTRaFw05ODA3MjcxODA3MTRaMIHOMQswCQYDVQQGEwJaQTEVMBMG
 | 
			
		||||
A1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xHTAbBgNVBAoT
 | 
			
		||||
FFRoYXd0ZSBDb25zdWx0aW5nIGNjMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNl
 | 
			
		||||
cnZpY2VzIERpdmlzaW9uMSEwHwYDVQQDExhUaGF3dGUgUHJlbWl1bSBTZXJ2ZXIg
 | 
			
		||||
Q0ExKDAmBgkqhkiG9w0BCQEWGXByZW1pdW0tc2VydmVyQHRoYXd0ZS5jb20wgZ8w
 | 
			
		||||
DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANI2NmqL18JbntqBQWKPOO5JBFXW0O8c
 | 
			
		||||
G5UWR+8YSDU6UvQragaPOy/qVuOvho2eF/eetGV1Ak3vywmiIVHYm9Bn0LoNkgYU
 | 
			
		||||
c9STy5cqAJxcTgy8+hVS/PJEbtoRSm4Iny8t4/mqOoZztkZTWMiJBb2DEbhzP6oH
 | 
			
		||||
jfRCTedAnRw3AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAutFIgTRZVYerIZfL9lvR
 | 
			
		||||
w9Eifvvo5KTZ3h+Bj+VzNnyw4Qc/IyXkPOu6SIiH9LQ3sCmWBdxpe+qr4l77rLj2
 | 
			
		||||
GYuMtESFfn1XVALzkYgC7JcPuTOjMfIiMByt+uFf8AV8x0IW/Qkuv+hEQcyM9vxK
 | 
			
		||||
3VZdLbCVIhNoEsysrxCpxcI=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
Tims test GCI CA
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIB8DCCAZoCAQAwDQYJKoZIhvcNAQEEBQAwgYIxCzAJBgNVBAYTAkFVMRMwEQYD
 | 
			
		||||
VQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5
 | 
			
		||||
cHRTb2Z0IFB0eSBMdGQxFDASBgNVBAsTC2RldmVsb3BtZW50MRkwFwYDVQQDExBD
 | 
			
		||||
cnlwdFNvZnQgRGV2IENBMB4XDTk3MDMyMjEzMzQwNFoXDTk4MDMyMjEzMzQwNFow
 | 
			
		||||
gYIxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhC
 | 
			
		||||
cmlzYmFuZTEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxFDASBgNVBAsTC2Rl
 | 
			
		||||
dmVsb3BtZW50MRkwFwYDVQQDExBDcnlwdFNvZnQgRGV2IENBMFwwDQYJKoZIhvcN
 | 
			
		||||
AQEBBQADSwAwSAJBAOAOAqogG5QwAmLhzyO4CoRnx/wVy4NZP4dxJy83O1EnL0rw
 | 
			
		||||
OdsamJKvPOLHgSXo3gDu9uVyvCf/QJmZAmC5ml8CAwEAATANBgkqhkiG9w0BAQQF
 | 
			
		||||
AANBADRRS/GVdd7rAqRW6SdmgLJduOU2yq3avBu99kRqbp9A/dLu6r6jU+eP4oOA
 | 
			
		||||
TfdbFZtAAD2Hx9jUtY3tfdrJOb8= 
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICVjCCAgACAQAwDQYJKoZIhvcNAQEEBQAwgbUxCzAJBgNVBAYTAkFVMRMwEQYD
 | 
			
		||||
VQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5
 | 
			
		||||
cHRTb2Z0IFB0eSBMdGQxLDAqBgNVBAsTI1dPUlRITEVTUyBDRVJUSUZJQ0FUSU9O
 | 
			
		||||
IEFVVEhPUklUSUVTMTQwMgYDVQQDEytaRVJPIFZBTFVFIENBIC0gREVNT05TVFJB
 | 
			
		||||
VElPTiBQVVJQT1NFUyBPTkxZMB4XDTk3MDQwMzEzMjI1NFoXDTk4MDQwMzEzMjI1
 | 
			
		||||
NFowgbUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQH
 | 
			
		||||
EwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxLDAqBgNVBAsT
 | 
			
		||||
I1dPUlRITEVTUyBDRVJUSUZJQ0FUSU9OIEFVVEhPUklUSUVTMTQwMgYDVQQDEyta
 | 
			
		||||
RVJPIFZBTFVFIENBIC0gREVNT05TVFJBVElPTiBQVVJQT1NFUyBPTkxZMFwwDQYJ
 | 
			
		||||
KoZIhvcNAQEBBQADSwAwSAJBAOZ7T7yqP/tyspcko3yPY1y0Cm2EmwNvzW4QgVXR
 | 
			
		||||
Fjs3HmJ4xtSpXdo6mwcGezL3Abt/aQXaxv9PU8xt+Jr0OFUCAwEAATANBgkqhkiG
 | 
			
		||||
9w0BAQQFAANBAOQpYmGgyCqCy1OljgJhCqQOu627oVlHzK1L+t9vBaMfn40AVUR4
 | 
			
		||||
WzQVWO31KTgi5vTK1U+3h46fgUWqQ0h+6rU=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIAwgKADAgECAgEAMA0GCSqGSIb3DQEBBAUAMGIxETAPBgNVBAcTCEludGVybmV0
 | 
			
		||||
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xh
 | 
			
		||||
c3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjAeFw05NjA0MDgxMDIwMjda
 | 
			
		||||
Fw05NzA0MDgxMDIwMjdaMGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5W
 | 
			
		||||
ZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIElu
 | 
			
		||||
ZGl2aWR1YWwgU3Vic2NyaWJlcjCAMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2
 | 
			
		||||
FKbPTdAFDdjKI9BvqrQpkmOOLPhvltcunXZLEbE2jVfJw/0cxrr+Hgi6M8qV6r7j
 | 
			
		||||
W80GqLd5HUQq7XPysVKDaBBwZJHXPmv5912dFEObbpdFmIFH0S3L3bty10w/cari
 | 
			
		||||
QPJUObwW7s987LrbP2wqsxaxhhKdrpM01bjV0Pc+qQIDAQABAAAAADANBgkqhkiG
 | 
			
		||||
9w0BAQQFAAOBgQA+1nJryNt8VBRjRr07ArDAV/3jAH7GjDc9jsrxZS68ost9v06C
 | 
			
		||||
TvTNKGL+LISNmFLXl+JXhgGB0JZ9fvyYzNgHQ46HBUng1H6voalfJgS2KdEo50wW
 | 
			
		||||
8EFZYMDkT1k4uynwJqkVN2QJK/2q4/A/VCov5h6SlM8Affg2W+1TLqvqkwAA
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
 subject=/L=Internet/O=VeriSign, Inc./OU=VeriSign Class 2 CA - Individual Subscriber
 | 
			
		||||
 issuer= /L=Internet/O=VeriSign, Inc./OU=VeriSign Class 2 CA - Individual Subscriber
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIEkzCCA/ygAwIBAgIRANDTUpSRL3nTFeMrMayFSPAwDQYJKoZIhvcNAQECBQAw
 | 
			
		||||
YjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQw
 | 
			
		||||
MgYDVQQLEytWZXJpU2lnbiBDbGFzcyAyIENBIC0gSW5kaXZpZHVhbCBTdWJzY3Jp
 | 
			
		||||
YmVyMB4XDTk2MDYwNDAwMDAwMFoXDTk4MDYwNDIzNTk1OVowYjERMA8GA1UEBxMI
 | 
			
		||||
SW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJp
 | 
			
		||||
U2lnbiBDbGFzcyAyIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyMIGfMA0GCSqG
 | 
			
		||||
SIb3DQEBAQUAA4GNADCBiQKBgQC6A+2czKGRcYMfm8gdnk+0de99TDDzsqo0v5nb
 | 
			
		||||
RsbUmMcdRQ7nsMbRWe0SAb/9QoLTZ/cJ0iOBqdrkz7UpqqKarVoTSdlSMVM92tWp
 | 
			
		||||
3bJncZHQD1t4xd6lQVdI1/T6R+5J0T1ukOdsI9Jmf+F28S6g3R3L1SFwiHKeZKZv
 | 
			
		||||
z+793wIDAQABo4ICRzCCAkMwggIpBgNVHQMBAf8EggIdMIICGTCCAhUwggIRBgtg
 | 
			
		||||
hkgBhvhFAQcBATCCAgAWggGrVGhpcyBjZXJ0aWZpY2F0ZSBpbmNvcnBvcmF0ZXMg
 | 
			
		||||
YnkgcmVmZXJlbmNlLCBhbmQgaXRzIHVzZSBpcyBzdHJpY3RseSBzdWJqZWN0IHRv
 | 
			
		||||
LCB0aGUgVmVyaVNpZ24gQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQg
 | 
			
		||||
KENQUyksIGF2YWlsYWJsZSBhdDogaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL0NQ
 | 
			
		||||
Uy0xLjA7IGJ5IEUtbWFpbCBhdCBDUFMtcmVxdWVzdHNAdmVyaXNpZ24uY29tOyBv
 | 
			
		||||
ciBieSBtYWlsIGF0IFZlcmlTaWduLCBJbmMuLCAyNTkzIENvYXN0IEF2ZS4sIE1v
 | 
			
		||||
dW50YWluIFZpZXcsIENBIDk0MDQzIFVTQSBUZWwuICsxICg0MTUpIDk2MS04ODMw
 | 
			
		||||
IENvcHlyaWdodCAoYykgMTk5NiBWZXJpU2lnbiwgSW5jLiAgQWxsIFJpZ2h0cyBS
 | 
			
		||||
ZXNlcnZlZC4gQ0VSVEFJTiBXQVJSQU5USUVTIERJU0NMQUlNRUQgYW5kIExJQUJJ
 | 
			
		||||
TElUWSBMSU1JVEVELqAOBgxghkgBhvhFAQcBAQGhDgYMYIZIAYb4RQEHAQECMC8w
 | 
			
		||||
LRYraHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BTLTEuMDAU
 | 
			
		||||
BglghkgBhvhCAQEBAf8EBAMCAgQwDQYJKoZIhvcNAQECBQADgYEApRJRkNBqLLgs
 | 
			
		||||
53IR/d18ODdLOWMTZ+QOOxBrq460iBEdUwgF8vmPRX1ku7UiDeNzaLlurE6eFqHq
 | 
			
		||||
2zPyK5j60zfTLVJMWKcQWwTJLjHtXrW8pxhNtFc6Fdvy5ZkHnC/9NIl7/t4U6WqB
 | 
			
		||||
p4y+p7SdMIkEwIZfds0VbnQyX5MRUJY=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
 subject=/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
 | 
			
		||||
 issuer= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICMTCCAZoCBQKhAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMRcw
 | 
			
		||||
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMg
 | 
			
		||||
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBa
 | 
			
		||||
Fw05OTEyMzEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
 | 
			
		||||
biwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp
 | 
			
		||||
Y2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyVxZ
 | 
			
		||||
nvIbigEUtBDfBEDb41evakVAj4QMC9Ez2dkRz+4CWB8l9yqoRAWq7AMfeH+ek7ma
 | 
			
		||||
AKojfdashaJjRcdyJ8z0TMZ1cdI5709C8HXfCpDGjiBvmA/4rCNfcCk2pMmG57Ga
 | 
			
		||||
IMtTpYXnPb59mv4kRTPcdhXtD6JxZExlLoFoRacCAwEAATANBgkqhkiG9w0BAQIF
 | 
			
		||||
AAOBgQB1Zmw+0c2B27X4LzZRtvdCvM1Cr9wO+hVs+GeTVzrrtpLotgHKjLeOQ7RJ
 | 
			
		||||
Zfk+7r11Ri7J/CVdqMcvi5uPaM+0nJcYwE3vH9mvgrPmZLiEXIqaB1JDYft0nls6
 | 
			
		||||
NvxMsvwaPxUupVs8G5DsiCnkWRb5zget7Ond2tIxik/W2O8XjQ==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 subject=/C=US/O=VeriSign, Inc./OU=Class 4 Public Primary Certification Authority
 | 
			
		||||
 issuer= /C=US/O=VeriSign, Inc./OU=Class 4 Public Primary Certification Authority
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICMTCCAZoCBQKmAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMRcw
 | 
			
		||||
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgNCBQdWJsaWMg
 | 
			
		||||
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBa
 | 
			
		||||
Fw05OTEyMzEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
 | 
			
		||||
biwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp
 | 
			
		||||
Y2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0LJ1
 | 
			
		||||
9njQrlpQ9OlQqZ+M1++RlHDo0iSQdomF1t+s5gEXMoDwnZNHvJplnR+Xrr/phnVj
 | 
			
		||||
IIm9gFidBAydqMEk6QvlMXi9/C0MN2qeeIDpRnX57aP7E3vIwUzSo+/1PLBij0pd
 | 
			
		||||
O92VZ48TucE81qcmm+zDO3rZTbxtm+gVAePwR6kCAwEAATANBgkqhkiG9w0BAQIF
 | 
			
		||||
AAOBgQBT3dPwnCR+QKri/AAa19oM/DJhuBUNlvP6Vxt/M3yv6ZiaYch6s7f/sdyZ
 | 
			
		||||
g9ysEvxwyR84Qu1E9oAuW2szaayc01znX1oYx7EteQSWQZGZQbE8DbqEOcY7l/Am
 | 
			
		||||
yY7uvcxClf8exwI/VAx49byqYHwCaejcrOICdmHEPgPq0ook0Q==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										420
									
								
								apps/server2.pem
									
									
									
									
									
								
							
							
						
						
									
										420
									
								
								apps/server2.pem
									
									
									
									
									
								
							@@ -1,376 +1,52 @@
 | 
			
		||||
issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit)
 | 
			
		||||
subject=/C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Server test cert (1024 bit)
 | 
			
		||||
subject= C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = Test Server Cert #2
 | 
			
		||||
issuer= C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = OpenSSL Test Intermediate CA
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICLjCCAZcCAQEwDQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCQVUxEzARBgNV
 | 
			
		||||
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRswGQYD
 | 
			
		||||
VQQDExJUZXN0IENBICgxMDI0IGJpdCkwHhcNOTcwNjA5MTM1NzU0WhcNOTgwNjA5
 | 
			
		||||
MTM1NzU0WjBkMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDEaMBgG
 | 
			
		||||
A1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxJDAiBgNVBAMTG1NlcnZlciB0ZXN0IGNl
 | 
			
		||||
cnQgKDEwMjQgYml0KTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsxH1PBPm
 | 
			
		||||
RkxrR11eV4bzNi4N9n11CI8nV29+ARlT1+qDe/mjVUvXlmsr1v/vf71G9GgqopSa
 | 
			
		||||
6RXrICLVdk/FYYYzhPvl1M+OrjaXDFO8BzBAF1Lnz6c7aRZvGRJNrRSr2nZEkqDf
 | 
			
		||||
JW9dY7r2VZEpD5QeuaRYUnuECkqeieB65GMCAwEAATANBgkqhkiG9w0BAQQFAAOB
 | 
			
		||||
gQCWsOta6C0wiVzXz8wPmJKyTrurMlgUss2iSuW9366iwofZddsNg7FXniMzkIf6
 | 
			
		||||
dp7jnmWZwKZ9cXsNUS2o4OL07qOk2HOywC0YsNZQsOBu1CBTYYkIefDiKFL1zQHh
 | 
			
		||||
8lwwNd4NP+OE3NzUNkCfh4DnFfg9WHkXUlD5UpxNRJ4gJA==
 | 
			
		||||
MIID6jCCAtKgAwIBAgIJALnu1NlVpZ60MA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV
 | 
			
		||||
BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMSIwIAYDVQQLDBlGT1IgVEVT
 | 
			
		||||
VElORyBQVVJQT1NFUyBPTkxZMSUwIwYDVQQDDBxPcGVuU1NMIFRlc3QgSW50ZXJt
 | 
			
		||||
ZWRpYXRlIENBMB4XDTExMTIwODE0MDE0OFoXDTIxMTAxNjE0MDE0OFowZzELMAkG
 | 
			
		||||
A1UEBhMCVUsxFjAUBgNVBAoMDU9wZW5TU0wgR3JvdXAxIjAgBgNVBAsMGUZPUiBU
 | 
			
		||||
RVNUSU5HIFBVUlBPU0VTIE9OTFkxHDAaBgNVBAMME1Rlc3QgU2VydmVyIENlcnQg
 | 
			
		||||
IzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDrdi7j9yctG+L4EjBy
 | 
			
		||||
gjPmEqZzOJEQba26MoQGzglU7e5Xf59Rb/hgVQuKAoiZe7/R8rK4zJ4W7iXdXw0L
 | 
			
		||||
qBpyG8B5aGKeI32w+A9TcBApoXXL2CrYQEQjZwUIpLlYBIi2NkJj3nVkq5dgl1gO
 | 
			
		||||
ALiQ+W8jg3kzg5Ec9rimp9r93N8wsSL3awsafurmYCvOf7leHaMP1WJ/zDRGUNHG
 | 
			
		||||
/WtDjXc8ZUG1+6EXU9Jc2Fs+2Omf7fcN0l00AK/wPg8OaNS0rKyGq9JdIT9FRGV1
 | 
			
		||||
bXe/rx58FaE5CItdwCSYhJvF/O95LWQoxJXye5bCFLmvDTEyVq9FMSCptfsmbXjE
 | 
			
		||||
ZGsXAgMBAAGjgY8wgYwwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAwLAYJ
 | 
			
		||||
YIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1Ud
 | 
			
		||||
DgQWBBR52UaWWTKzZGDH/X4mWNcuqeQVazAfBgNVHSMEGDAWgBQ2w2yI55X+sL3s
 | 
			
		||||
zj49hqshgYfa2jANBgkqhkiG9w0BAQUFAAOCAQEANBW+XYLlHBqVY/31ie+3gRlS
 | 
			
		||||
LPfy4SIqn0t3RJjagT29MXprblBO2cbMO8VGjkQdKGpmMXjxbht2arOOUXRHX4n/
 | 
			
		||||
XTyn/QHEf0bcwIITMReO3DZUPAEw8hSjn9xEOM0IRVOCP+mH5fi74QzzQaZVCyYg
 | 
			
		||||
5VtLKdww/+sc0nCbKl2KWgDluriH0nfVx95qgW3mg9dhXRr0zmf1w2zkBHYpARYL
 | 
			
		||||
Dew6Z8EE4tS3HJu8/qM6meWzNtrfonQ3eiiMxjZBxzV46jchBwa2z9XYhP6AmpPb
 | 
			
		||||
oeTSzcQNbWsxaGYzWo46oLDUZmJOwSBawbS31bZNMCoPIY6ukoesCzFSsUKZww==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIICXgIBAAKBgQCzEfU8E+ZGTGtHXV5XhvM2Lg32fXUIjydXb34BGVPX6oN7+aNV
 | 
			
		||||
S9eWayvW/+9/vUb0aCqilJrpFesgItV2T8VhhjOE++XUz46uNpcMU7wHMEAXUufP
 | 
			
		||||
pztpFm8ZEk2tFKvadkSSoN8lb11juvZVkSkPlB65pFhSe4QKSp6J4HrkYwIDAQAB
 | 
			
		||||
AoGBAKy8jvb0Lzby8q11yNLf7+78wCVdYi7ugMHcYA1JVFK8+zb1WfSm44FLQo/0
 | 
			
		||||
dSChAjgz36TTexeLODPYxleJndjVcOMVzsLJjSM8dLpXsTS4FCeMbhw2s2u+xqKY
 | 
			
		||||
bbPWfk+HOTyJjfnkcC5Nbg44eOmruq0gSmBeUXVM5UntlTnxAkEA7TGCA3h7kx5E
 | 
			
		||||
Bl4zl2pc3gPAGt+dyfk5Po9mGJUUXhF5p2zueGmYWW74TmOWB1kzt4QRdYMzFePq
 | 
			
		||||
zfDNXEa1CwJBAMFErdY0xp0UJ13WwBbUTk8rujqQdHtjw0klhpbuKkjxu2hN0wwM
 | 
			
		||||
6p0D9qxF7JHaghqVRI0fAW/EE0OzdHMR9QkCQQDNR26dMFXKsoPu+vItljj/UEGf
 | 
			
		||||
QG7gERiQ4yxaFBPHgdpGo0kT31eh9x9hQGDkxTe0GNG/YSgCRvm8+C3TMcKXAkBD
 | 
			
		||||
dhGn36wkUFCddMSAM4NSJ1VN8/Z0y5HzCmI8dM3VwGtGMUQlxKxwOl30LEQzdS5M
 | 
			
		||||
0SWojNYXiT2gOBfBwtbhAkEAhafl5QEOIgUz+XazS/IlZ8goNKdDVfYgK3mHHjvv
 | 
			
		||||
nY5G+AuGebdNkXJr4KSWxDcN+C2i47zuj4QXA16MAOandA==
 | 
			
		||||
MIIEowIBAAKCAQEA63Yu4/cnLRvi+BIwcoIz5hKmcziREG2tujKEBs4JVO3uV3+f
 | 
			
		||||
UW/4YFULigKImXu/0fKyuMyeFu4l3V8NC6gachvAeWhiniN9sPgPU3AQKaF1y9gq
 | 
			
		||||
2EBEI2cFCKS5WASItjZCY951ZKuXYJdYDgC4kPlvI4N5M4ORHPa4pqfa/dzfMLEi
 | 
			
		||||
92sLGn7q5mArzn+5Xh2jD9Vif8w0RlDRxv1rQ413PGVBtfuhF1PSXNhbPtjpn+33
 | 
			
		||||
DdJdNACv8D4PDmjUtKyshqvSXSE/RURldW13v68efBWhOQiLXcAkmISbxfzveS1k
 | 
			
		||||
KMSV8nuWwhS5rw0xMlavRTEgqbX7Jm14xGRrFwIDAQABAoIBAHLsTPihIfLnYIE5
 | 
			
		||||
x4GsQQ5zXeBw5ITDM37ktwHnQDC+rIzyUl1aLD1AZRBoKinXd4lOTqLZ4/NHKx4A
 | 
			
		||||
DYr58mZtWyUmqLOMmQVuHXTZBlp7XtYuXMMNovQwjQlp9LicBeoBU6gQ5PVMtubD
 | 
			
		||||
F4xGF89Sn0cTHW3iMkqTtQ5KcR1j57OcJO0FEb1vPvk2MXI5ZyAatUYE7YacbEzd
 | 
			
		||||
rg02uIwx3FqNSkuSI79uz4hMdV5TPtuhxx9nTwj9aLUhXFeZ0mn2PVgVzEnnMoJb
 | 
			
		||||
+znlsZDgzDlJqdaD744YGWh8Z3OEssB35KfzFcdOeO6yH8lmv2Zfznk7pNPT7LTb
 | 
			
		||||
Lae9VgkCgYEA92p1qnAB3NtJtNcaW53i0S5WJgS1hxWKvUDx3lTB9s8X9fHpqL1a
 | 
			
		||||
E94fDfWzp/hax6FefUKIvBOukPLQ6bYjTMiFoOHzVirghAIuIUoMI5VtLhwD1hKs
 | 
			
		||||
Lr7l/dptMgKb1nZHyXoKHRBthsy3K4+udsPi8TzMvYElgEqyQIe/Rk0CgYEA86GL
 | 
			
		||||
8HC6zLszzKERDPBxrboRmoFvVUCTQDhsfj1M8aR3nQ8V5LkdIJc7Wqm/Ggfk9QRf
 | 
			
		||||
rJ8M2WUMlU5CNnCn/KCrKzCNZIReze3fV+HnKdbcXGLvgbHPrhnz8yYehUFG+RGq
 | 
			
		||||
bVyDWRU94T38izy2s5qMYrMJWZEYyXncSPbfcPMCgYAtaXfxcZ+V5xYPQFARMtiX
 | 
			
		||||
5nZfggvDoJuXgx0h3tK/N2HBfcaSdzbaYLG4gTmZggc/jwnl2dl5E++9oSPhUdIG
 | 
			
		||||
3ONSFUbxsOsGr9PBvnKd8WZZyUCXAVRjPBzAzF+whzQNWCZy/5htnz9LN7YDI9s0
 | 
			
		||||
5113Q96cheDZPFydZY0hHQKBgQDVbEhNukM5xCiNcu+f2SaMnLp9EjQ4h5g3IvaP
 | 
			
		||||
5B16daw/Dw8LzcohWboqIxeAsze0GD/D1ZUJAEd0qBjC3g+a9BjefervCjKOzXng
 | 
			
		||||
38mEUm+6EwVjJSQcjSmycEs+Sr/kwr/8i5WYvU32+jk4tFgMoC+o6tQe/Uesf68k
 | 
			
		||||
z/dPVwKBgGbF7Vv1/3SmhlOy+zYyvJ0CrWtKxH9QP6tLIEgEpd8x7YTSuCH94yok
 | 
			
		||||
kToMXYA3sWNPt22GbRDZ+rcp4c7HkDx6I6vpdP9aQEwJTp0EPy0sgWr2XwYmreIQ
 | 
			
		||||
NFmkk8Itn9EY2R9VBaP7GLv5kvwxDdLAnmwGmzVtbmaVdxCaBwUk
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
subject=/C=US/O=AT&T Bell Laboratories/OU=Prototype Research CA
 | 
			
		||||
issuer= /C=US/O=AT&T Bell Laboratories/OU=Prototype Research CA
 | 
			
		||||
notBefore=950413210656Z
 | 
			
		||||
notAfter =970412210656Z
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
MIICCDCCAXECAQAwDQYJKoZIhvcNAQEEBQAwTjELMAkGA1UEBhMCVVMxHzAdBgNV
 | 
			
		||||
BAoUFkFUJlQgQmVsbCBMYWJvcmF0b3JpZXMxHjAcBgNVBAsUFVByb3RvdHlwZSBS
 | 
			
		||||
ZXNlYXJjaCBDQTAeFw05NTA0MTMyMTA2NTZaFw05NzA0MTIyMTA2NTZaME4xCzAJ
 | 
			
		||||
BgNVBAYTAlVTMR8wHQYDVQQKFBZBVCZUIEJlbGwgTGFib3JhdG9yaWVzMR4wHAYD
 | 
			
		||||
VQQLFBVQcm90b3R5cGUgUmVzZWFyY2ggQ0EwgZwwDQYJKoZIhvcNAQEBBQADgYoA
 | 
			
		||||
MIGGAoGAebOmgtSCl+wCYZc86UGYeTLY8cjmW2P0FN8ToT/u2pECCoFdrlycX0OR
 | 
			
		||||
3wt0ZhpFXLVNeDnHwEE9veNUih7pCL2ZBFqoIoQkB1lZmXRiVtjGonz8BLm/qrFM
 | 
			
		||||
YHb0lme/Ol+s118mwKVxnn6bSAeI/OXKhLaVdYZWk+aEaxEDkVkCAQ8wDQYJKoZI
 | 
			
		||||
hvcNAQEEBQADgYEAAZMG14lZmZ8bahkaHaTV9dQf4p2FZiQTFwHP9ZyGsXPC+LT5
 | 
			
		||||
dG5iTaRmyjNIJdPWohZDl97kAci79aBndvuEvRKOjLHs3WRGBIwERnAcnY9Mz8u/
 | 
			
		||||
zIHK23PjYVxGGaZd669OJwD0CYyqH22HH9nFUGaoJdsv39ChW0NRdLE9+y8=
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test PCA (1024 bit)
 | 
			
		||||
subject=/C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit)
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICJjCCAY8CAQAwDQYJKoZIhvcNAQEEBQAwXDELMAkGA1UEBhMCQVUxEzARBgNV
 | 
			
		||||
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYD
 | 
			
		||||
VQQDExNUZXN0IFBDQSAoMTAyNCBiaXQpMB4XDTk3MDYwOTEzNTc0M1oXDTAxMDYw
 | 
			
		||||
OTEzNTc0M1owWzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY
 | 
			
		||||
BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRswGQYDVQQDExJUZXN0IENBICgxMDI0
 | 
			
		||||
IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKO7o8t116VP6cgybTsZ
 | 
			
		||||
DCZhr95nYlZuya3aCi1IKoztqwWnjbmDFIriOqGFPrZQ+moMETC9D59iRW/dFXSv
 | 
			
		||||
1F65ka/XY2hLh9exCCo7XuUcDs53Qp3bI3AmMqHjgzE8oO3ajyJAzJkTTOUecQU2
 | 
			
		||||
mw/gI4tMM0LqWMQS7luTy4+xAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAM7achv3v
 | 
			
		||||
hLQJcv/65eGEpBXM40ZDVoFQFFJWaY5p883HTqLB1x4FdzsXHH0QKBTcKpWwqyu4
 | 
			
		||||
YDm3fb8oDugw72bCzfyZK/zVZPR/hVlqI/fvU109Qoc+7oPvIXWky71HfcK6ZBCA
 | 
			
		||||
q30KIqGM/uoM60INq97qjDmCJapagcNBGQs=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIICXQIBAAKBgQCju6PLddelT+nIMm07GQwmYa/eZ2JWbsmt2gotSCqM7asFp425
 | 
			
		||||
gxSK4jqhhT62UPpqDBEwvQ+fYkVv3RV0r9ReuZGv12NoS4fXsQgqO17lHA7Od0Kd
 | 
			
		||||
2yNwJjKh44MxPKDt2o8iQMyZE0zlHnEFNpsP4COLTDNC6ljEEu5bk8uPsQIDAQAB
 | 
			
		||||
AoGAVZmpFZsDZfr0l2S9tLLwpjRWNOlKATQkno6q2WesT0eGLQufTciY+c8ypfU6
 | 
			
		||||
hyio8r5iUl/VhhdjhAtKx1mRpiotftHo/eYf8rtsrnprOnWG0bWjLjtIoMbcxGn2
 | 
			
		||||
J3bN6LJmbJMjDs0eJ3KnTu646F3nDUw2oGAwmpzKXA1KAP0CQQDRvQhxk2D3Pehs
 | 
			
		||||
HvG665u2pB5ipYQngEFlZO7RHJZzJOZEWSLuuMqaF/7pTfA5jiBvWqCgJeCRRInL
 | 
			
		||||
21ru4dlPAkEAx9jj7BgKn5TYnMoBSSe0afjsV9oApVpN1Nacb1YDtCwy+scp3++s
 | 
			
		||||
nFxlv98wxIlSdpwMUn+AUWfjiWR7Tu/G/wJBAJ/KjwZIrFVxewP0x2ILYsTRYLzz
 | 
			
		||||
MS4PDsO7FB+I0i7DbBOifXS2oNSpd3I0CNMwrxFnUHzynpbOStVfN3ZL5w0CQQCa
 | 
			
		||||
pwFahxBRhkJKsxhjoFJBX9yl75JoY4Wvm5Tbo9ih6UJaRx3kqfkN14L2BKYcsZgb
 | 
			
		||||
KY9vmDOYy6iNfjDeWTfJAkBkfPUb8oTJ/nSP5zN6sqGxSY4krc4xLxpRmxoJ8HL2
 | 
			
		||||
XfhqXkTzbU13RX9JJ/NZ8vQN9Vm2NhxRGJocQkmcdVtJ
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
MIICYDCCAiACAgEoMAkGBSsOAwINBQAwfDELMAkGA1UEBhMCVVMxNjA0BgNVBAoT
 | 
			
		||||
LU5hdGlvbmFsIEFlcm9uYXV0aWNzIGFuZCBTcGFjZSBBZG1pbmlzdHJhdGlvbjEZ
 | 
			
		||||
MBcGA1UECxMQVGVzdCBFbnZpcm9ubWVudDEaMBgGA1UECxMRRFNTLU5BU0EtUGls
 | 
			
		||||
b3QtQ0EwHhcNOTYwMjI2MTYzMjQ1WhcNOTcwMjI1MTYzMjQ1WjB8MQswCQYDVQQG
 | 
			
		||||
EwJVUzE2MDQGA1UEChMtTmF0aW9uYWwgQWVyb25hdXRpY3MgYW5kIFNwYWNlIEFk
 | 
			
		||||
bWluaXN0cmF0aW9uMRkwFwYDVQQLExBUZXN0IEVudmlyb25tZW50MRowGAYDVQQL
 | 
			
		||||
ExFEU1MtTkFTQS1QaWxvdC1DQTCB8jAJBgUrDgMCDAUAA4HkADCB4AJBAMA/ssKb
 | 
			
		||||
hPNUG7ZlASfVwEJU21O5OyF/iyBzgHI1O8eOhJGUYO8cc8wDMjR508Mr9cp6Uhl/
 | 
			
		||||
ZB7FV5GkLNEnRHYCQQDUEaSg45P2qrDwixTRhFhmWz5Nvc4lRFQ/42XPcchiJBLb
 | 
			
		||||
bn3QK74T2IxY1yY+kCNq8XrIqf5fJJzIH0J/xUP3AhUAsg2wsQHfDGYk/BOSulX3
 | 
			
		||||
fVd0geUCQQCzCFUQAh+ZkEmp5804cs6ZWBhrUAfnra8lJItYo9xPcXgdIfLfibcX
 | 
			
		||||
R71UsyO77MRD7B0+Ag2tq794IleCVcEEMAkGBSsOAwINBQADLwAwLAIUUayDfreR
 | 
			
		||||
Yh2WeU86/pHNdkUC1IgCFEfxe1f0oMpxJyrJ5XIxTi7vGdoK
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
MIICGTCCAdgCAwCqTDAJBgUrDgMCDQUAMHwxCzAJBgNVBAYTAlVTMTYwNAYDVQQK
 | 
			
		||||
Ey1OYXRpb25hbCBBZXJvbmF1dGljcyBhbmQgU3BhY2UgQWRtaW5pc3RyYXRpb24x
 | 
			
		||||
GTAXBgNVBAsTEFRlc3QgRW52aXJvbm1lbnQxGjAYBgNVBAsTEURTUy1OQVNBLVBp
 | 
			
		||||
bG90LUNBMB4XDTk2MDUxNDE3MDE0MVoXDTk3MDUxNDE3MDE0MVowMzELMAkGA1UE
 | 
			
		||||
BhMCQVUxDzANBgNVBAoTBk1pbmNvbTETMBEGA1UEAxMKRXJpYyBZb3VuZzCB8jAJ
 | 
			
		||||
BgUrDgMCDAUAA4HkADCB4AJBAKbfHz6vE6pXXMTpswtGUec2tvnfLJUsoxE9qs4+
 | 
			
		||||
ObZX7LmLvragNPUeiTJx7UOWZ5DfBj6bXLc8eYne0lP1g3ACQQDUEaSg45P2qrDw
 | 
			
		||||
ixTRhFhmWz5Nvc4lRFQ/42XPcchiJBLbbn3QK74T2IxY1yY+kCNq8XrIqf5fJJzI
 | 
			
		||||
H0J/xUP3AhUAsg2wsQHfDGYk/BOSulX3fVd0geUCQQCzCFUQAh+ZkEmp5804cs6Z
 | 
			
		||||
WBhrUAfnra8lJItYo9xPcXgdIfLfibcXR71UsyO77MRD7B0+Ag2tq794IleCVcEE
 | 
			
		||||
MAkGBSsOAwINBQADMAAwLQIUWsuuJRE3VT4ueWkWMAJMJaZjj1ECFQCYY0zX4bzM
 | 
			
		||||
LC7obsrHD8XAHG+ZRG==
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICTTCCAbagAwIBAgIBADANBgkqhkiG9w0BAQQFADBMMQswCQYDVQQGEwJHQjEM
 | 
			
		||||
MAoGA1UEChMDVUNMMRgwFgYDVQQLEw9JQ0UtVEVMIFByb2plY3QxFTATBgNVBAMT
 | 
			
		||||
DFRydXN0RmFjdG9yeTAeFw05NzA0MjIxNDM5MTRaFw05ODA0MjIxNDM5MTRaMEwx
 | 
			
		||||
CzAJBgNVBAYTAkdCMQwwCgYDVQQKEwNVQ0wxGDAWBgNVBAsTD0lDRS1URUwgUHJv
 | 
			
		||||
amVjdDEVMBMGA1UEAxMMVHJ1c3RGYWN0b3J5MIGcMAoGBFUIAQECAgQAA4GNADCB
 | 
			
		||||
iQKBgQCEieR8NcXkUW1f0G6aC6u0i8q/98JqS6RxK5YmHIGKCkuTWAUjzLfUa4dt
 | 
			
		||||
U9igGCjTuxaDqlzEim+t/02pmiBZT9HaX++35MjQPUWmsChcYU5WyzGErXi+rQaw
 | 
			
		||||
zlwS73zM8qiPj/97lXYycWhgL0VaiDSPxRXEUdWoaGruom4mNQIDAQABo0IwQDAd
 | 
			
		||||
BgNVHQ4EFgQUHal1LZr7oVg5z6lYzrhTgZRCmcUwDgYDVR0PAQH/BAQDAgH2MA8G
 | 
			
		||||
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAfaggfl6FZoioecjv0dq8
 | 
			
		||||
/DXo/u11iMZvXn08gjX/zl2b4wtPbShOSY5FhkSm8GeySasz+/Nwb/uzfnIhokWi
 | 
			
		||||
lfPZHtlCWtXbIy/TN51eJyq04ceDCQDWvLC2enVg9KB+GJ34b5c5VaPRzq8MBxsA
 | 
			
		||||
S7ELuYGtmYgYm9NZOIr7yU0=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIB6jCCAZQCAgEtMA0GCSqGSIb3DQEBBAUAMIGAMQswCQYDVQQGEwJVUzE2MDQG
 | 
			
		||||
A1UEChMtTmF0aW9uYWwgQWVyb25hdXRpY3MgYW5kIFNwYWNlIEFkbWluaXN0cmF0
 | 
			
		||||
aW9uMRkwFwYDVQQLExBUZXN0IEVudmlyb25tZW50MR4wHAYDVQQLExVNRDUtUlNB
 | 
			
		||||
LU5BU0EtUGlsb3QtQ0EwHhcNOTYwNDMwMjIwNTAwWhcNOTcwNDMwMjIwNTAwWjCB
 | 
			
		||||
gDELMAkGA1UEBhMCVVMxNjA0BgNVBAoTLU5hdGlvbmFsIEFlcm9uYXV0aWNzIGFu
 | 
			
		||||
ZCBTcGFjZSBBZG1pbmlzdHJhdGlvbjEZMBcGA1UECxMQVGVzdCBFbnZpcm9ubWVu
 | 
			
		||||
dDEeMBwGA1UECxMVTUQ1LVJTQS1OQVNBLVBpbG90LUNBMFkwCgYEVQgBAQICAgAD
 | 
			
		||||
SwAwSAJBALmmX5+GqAvcrWK13rfDrNX9UfeA7f+ijyBgeFQjYUoDpFqapw4nzQBL
 | 
			
		||||
bAXug8pKkRwa2Zh8YODhXsRWu2F/UckCAwEAATANBgkqhkiG9w0BAQQFAANBAH9a
 | 
			
		||||
OBA+QCsjxXgnSqHx04gcU8S49DVUb1f2XVoLnHlIb8RnX0k5O6mpHT5eti9bLkiW
 | 
			
		||||
GJNMJ4L0AJ/ac+SmHZc=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICajCCAdMCBDGA0QUwDQYJKoZIhvcNAQEEBQAwfTELMAkGA1UEBhMCQ2ExDzAN
 | 
			
		||||
BgNVBAcTBk5lcGVhbjEeMBwGA1UECxMVTm8gTGlhYmlsaXR5IEFjY2VwdGVkMR8w
 | 
			
		||||
HQYDVQQKExZGb3IgRGVtbyBQdXJwb3NlcyBPbmx5MRwwGgYDVQQDExNFbnRydXN0
 | 
			
		||||
IERlbW8gV2ViIENBMB4XDTk2MDQyNjEzMzUwMVoXDTA2MDQyNjEzMzUwMVowfTEL
 | 
			
		||||
MAkGA1UEBhMCQ2ExDzANBgNVBAcTBk5lcGVhbjEeMBwGA1UECxMVTm8gTGlhYmls
 | 
			
		||||
aXR5IEFjY2VwdGVkMR8wHQYDVQQKExZGb3IgRGVtbyBQdXJwb3NlcyBPbmx5MRww
 | 
			
		||||
GgYDVQQDExNFbnRydXN0IERlbW8gV2ViIENBMIGdMA0GCSqGSIb3DQEBAQUAA4GL
 | 
			
		||||
ADCBhwKBgQCaroS7O1DA0hm4IefNYU1cx/nqOmzEnk291d1XqznDeF4wEgakbkCc
 | 
			
		||||
zTKxK791yNpXG5RmngqH7cygDRTHZJ6mfCRn0wGC+AI00F2vYTGqPGRQL1N3lZT0
 | 
			
		||||
YDKFC0SQeMMjFIZ1aeQigroFQnHo0VB3zWIMpNkka8PY9lxHZAmWwQIBAzANBgkq
 | 
			
		||||
hkiG9w0BAQQFAAOBgQBAx0UMVA1s54lMQyXjMX5kj99FJN5itb8bK1Rk+cegPQPF
 | 
			
		||||
cWO9SEWyEjjBjIkjjzAwBkaEszFsNGxemxtXvwjIm1xEUMTVlPEWTs2qnDvAUA9W
 | 
			
		||||
YqhWbhH0toGT36236QAsqCZ76rbTRVSSX2BHyJwJMG2tCRv7kRJ//NIgxj3H4w==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test PCA (1024 bit)
 | 
			
		||||
subject=/C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test PCA (1024 bit)
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICJzCCAZACAQAwDQYJKoZIhvcNAQEEBQAwXDELMAkGA1UEBhMCQVUxEzARBgNV
 | 
			
		||||
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYD
 | 
			
		||||
VQQDExNUZXN0IFBDQSAoMTAyNCBiaXQpMB4XDTk3MDYwOTEzNTczN1oXDTAxMDYw
 | 
			
		||||
OTEzNTczN1owXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY
 | 
			
		||||
BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy
 | 
			
		||||
NCBiaXQpMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdoWk/3+WcMlfjIrkg
 | 
			
		||||
40ketmnQaEogQe1LLcuOJV6rKfUSAsPgwgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp
 | 
			
		||||
22Jp85PmemiDzyUIStwk72qhp1imbANZvlmlCFKiQrjUyuDfu4TABmn+kkt3vR1Y
 | 
			
		||||
BEOGt+IFye1UBVSATVdRJ2UVhwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABNA1u/S
 | 
			
		||||
Cg/LJZWb7GliiKJsvuhxlE4E5JxQF2zMub/CSNbF97//tYSyj96sxeFQxZXbcjm9
 | 
			
		||||
xt6mr/xNLA4szNQMJ4P+L7b5e/jC5DSqlwS+CUYJgaFs/SP+qJoCSu1bR3IM9XWO
 | 
			
		||||
cRBpDmcBbYLkSyB92WURvsZ1LtjEcn+cdQVI
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN RSA PRIVATE KEY-----
 | 
			
		||||
MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg
 | 
			
		||||
wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ
 | 
			
		||||
vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB
 | 
			
		||||
AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc
 | 
			
		||||
z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz
 | 
			
		||||
xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7
 | 
			
		||||
HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD
 | 
			
		||||
yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS
 | 
			
		||||
xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj
 | 
			
		||||
7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG
 | 
			
		||||
h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL
 | 
			
		||||
QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q
 | 
			
		||||
hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc=
 | 
			
		||||
-----END RSA PRIVATE KEY-----
 | 
			
		||||
subject=/C=US/O=RSA Data Security, Inc./OU=Commercial Certification Authority
 | 
			
		||||
issuer= /C=US/O=RSA Data Security, Inc./OU=Commercial Certification Authority
 | 
			
		||||
notBefore=941104185834Z
 | 
			
		||||
notAfter =991103185834Z
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
MIICIzCCAZACBQJBAAAWMA0GCSqGSIb3DQEBAgUAMFwxCzAJBgNVBAYTAlVTMSAw
 | 
			
		||||
HgYDVQQKExdSU0EgRGF0YSBTZWN1cml0eSwgSW5jLjErMCkGA1UECxMiQ29tbWVy
 | 
			
		||||
Y2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NDExMDQxODU4MzRaFw05
 | 
			
		||||
OTExMDMxODU4MzRaMFwxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdSU0EgRGF0YSBT
 | 
			
		||||
ZWN1cml0eSwgSW5jLjErMCkGA1UECxMiQ29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9u
 | 
			
		||||
IEF1dGhvcml0eTCBmzANBgkqhkiG9w0BAQEFAAOBiQAwgYUCfgCk+4Fie84QJ93o
 | 
			
		||||
975sbsZwmdu41QUDaSiCnHJ/lj+O7Kwpkj+KFPhCdr69XQO5kNTQvAayUTNfxMK/
 | 
			
		||||
touPmbZiImDd298ggrTKoi8tUO2UMt7gVY3UaOLgTNLNBRYulWZcYVI4HlGogqHE
 | 
			
		||||
7yXpCuaLK44xZtn42f29O2nZ6wIDAQABMA0GCSqGSIb3DQEBAgUAA34AdrW2EP4j
 | 
			
		||||
9/dZYkuwX5zBaLxJu7NJbyFHXSudVMQAKD+YufKKg5tgf+tQx6sFEC097TgCwaVI
 | 
			
		||||
0v5loMC86qYjFmZsGySp8+x5NRhPJsjjr1BKx6cxa9B8GJ1Qv6km+iYrRpwUqbtb
 | 
			
		||||
MJhCKLVLU7tDCZJAuqiqWqTGtotXTcU=
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
subject=/C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
 | 
			
		||||
issuer= /C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
 | 
			
		||||
notBefore=941109235417Z
 | 
			
		||||
notAfter =991231235417Z
 | 
			
		||||
-----BEGIN X509 CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
MIICKTCCAZYCBQJBAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMSAw
 | 
			
		||||
HgYDVQQKExdSU0EgRGF0YSBTZWN1cml0eSwgSW5jLjEuMCwGA1UECxMlU2VjdXJl
 | 
			
		||||
IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NDExMDkyMzU0MTda
 | 
			
		||||
Fw05OTEyMzEyMzU0MTdaMF8xCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdSU0EgRGF0
 | 
			
		||||
YSBTZWN1cml0eSwgSW5jLjEuMCwGA1UECxMlU2VjdXJlIFNlcnZlciBDZXJ0aWZp
 | 
			
		||||
Y2F0aW9uIEF1dGhvcml0eTCBmzANBgkqhkiG9w0BAQEFAAOBiQAwgYUCfgCSznrB
 | 
			
		||||
roM+WqqJg1esJQF2DK2ujiw3zus1eGRUA+WEQFHJv48I4oqCCNIWhjdV6bEhAq12
 | 
			
		||||
aIGaBaJLyUslZiJWbIgHj/eBWW2EB2VwE3F2Ppt3TONQiVaYSLkdpykaEy5KEVmc
 | 
			
		||||
HhXVSVQsczppgrGXOZxtcGdI5d0t1sgeewIDAQABMA0GCSqGSIb3DQEBAgUAA34A
 | 
			
		||||
iNHReSHO4ovo+MF9NFM/YYPZtgs4F7boviGNjwC4i1N+RGceIr2XJ+CchcxK9oU7
 | 
			
		||||
suK+ktPlDemvXA4MRpX/oRxePug2WHpzpgr4IhFrwwk4fia7c+8AvQKk8xQNMD9h
 | 
			
		||||
cHsg/jKjn7P0Z1LctO6EjJY2IN6BCINxIYoPnqk=
 | 
			
		||||
-----END X509 CERTIFICATE-----
 | 
			
		||||
subject=/C=ZA/SP=Western Cape/L=Cape Town/O=Thawte Consulting cc
 | 
			
		||||
	/OU=Certification Services Division/CN=Thawte Server CA
 | 
			
		||||
	/Email=server-certs@thawte.com
 | 
			
		||||
issuer= /C=ZA/SP=Western Cape/L=Cape Town/O=Thawte Consulting cc
 | 
			
		||||
	/OU=Certification Services Division/CN=Thawte Server CA
 | 
			
		||||
	/Email=server-certs@thawte.com
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIC+TCCAmICAQAwDQYJKoZIhvcNAQEEBQAwgcQxCzAJBgNVBAYTAlpBMRUwEwYD
 | 
			
		||||
VQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
 | 
			
		||||
VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
 | 
			
		||||
dmljZXMgRGl2aXNpb24xGTAXBgNVBAMTEFRoYXd0ZSBTZXJ2ZXIgQ0ExJjAkBgkq
 | 
			
		||||
hkiG9w0BCQEWF3NlcnZlci1jZXJ0c0B0aGF3dGUuY29tMB4XDTk2MDcyNzE4MDc1
 | 
			
		||||
N1oXDTk4MDcyNzE4MDc1N1owgcQxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0
 | 
			
		||||
ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENv
 | 
			
		||||
bnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
 | 
			
		||||
aXNpb24xGTAXBgNVBAMTEFRoYXd0ZSBTZXJ2ZXIgQ0ExJjAkBgkqhkiG9w0BCQEW
 | 
			
		||||
F3NlcnZlci1jZXJ0c0B0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
 | 
			
		||||
iQKBgQDTpFBuyP9Wa+bPXbbqDGh1R6KqwtqEJfyo9EdR2oW1IHSUhh4PdcnpCGH1
 | 
			
		||||
Bm0wbhUZAulSwGLbTZme4moMRDjN/r7jZAlwxf6xaym2L0nIO9QnBCUQly/nkG3A
 | 
			
		||||
KEKZ10xD3sP1IW1Un13DWOHA5NlbsLjctHvfNjrCtWYiEtaHDQIDAQABMA0GCSqG
 | 
			
		||||
SIb3DQEBBAUAA4GBAIsvn7ifX3RUIrvYXtpI4DOfARkTogwm6o7OwVdl93yFhDcX
 | 
			
		||||
7h5t0XZ11MUAMziKdde3rmTvzUYIUCYoY5b032IwGMTvdiclK+STN6NP2m5nvFAM
 | 
			
		||||
qJT5gC5O+j/jBuZRQ4i0AMYQr5F4lT8oBJnhgafw6PL8aDY2vMHGSPl9+7uf
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIDDTCCAnYCAQAwDQYJKoZIhvcNAQEEBQAwgc4xCzAJBgNVBAYTAlpBMRUwEwYD
 | 
			
		||||
VQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
 | 
			
		||||
VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
 | 
			
		||||
dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBD
 | 
			
		||||
QTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTAeFw05
 | 
			
		||||
NjA3MjcxODA3MTRaFw05ODA3MjcxODA3MTRaMIHOMQswCQYDVQQGEwJaQTEVMBMG
 | 
			
		||||
A1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xHTAbBgNVBAoT
 | 
			
		||||
FFRoYXd0ZSBDb25zdWx0aW5nIGNjMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNl
 | 
			
		||||
cnZpY2VzIERpdmlzaW9uMSEwHwYDVQQDExhUaGF3dGUgUHJlbWl1bSBTZXJ2ZXIg
 | 
			
		||||
Q0ExKDAmBgkqhkiG9w0BCQEWGXByZW1pdW0tc2VydmVyQHRoYXd0ZS5jb20wgZ8w
 | 
			
		||||
DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANI2NmqL18JbntqBQWKPOO5JBFXW0O8c
 | 
			
		||||
G5UWR+8YSDU6UvQragaPOy/qVuOvho2eF/eetGV1Ak3vywmiIVHYm9Bn0LoNkgYU
 | 
			
		||||
c9STy5cqAJxcTgy8+hVS/PJEbtoRSm4Iny8t4/mqOoZztkZTWMiJBb2DEbhzP6oH
 | 
			
		||||
jfRCTedAnRw3AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAutFIgTRZVYerIZfL9lvR
 | 
			
		||||
w9Eifvvo5KTZ3h+Bj+VzNnyw4Qc/IyXkPOu6SIiH9LQ3sCmWBdxpe+qr4l77rLj2
 | 
			
		||||
GYuMtESFfn1XVALzkYgC7JcPuTOjMfIiMByt+uFf8AV8x0IW/Qkuv+hEQcyM9vxK
 | 
			
		||||
3VZdLbCVIhNoEsysrxCpxcI=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
Tims test GCI CA
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIB8DCCAZoCAQAwDQYJKoZIhvcNAQEEBQAwgYIxCzAJBgNVBAYTAkFVMRMwEQYD
 | 
			
		||||
VQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5
 | 
			
		||||
cHRTb2Z0IFB0eSBMdGQxFDASBgNVBAsTC2RldmVsb3BtZW50MRkwFwYDVQQDExBD
 | 
			
		||||
cnlwdFNvZnQgRGV2IENBMB4XDTk3MDMyMjEzMzQwNFoXDTk4MDMyMjEzMzQwNFow
 | 
			
		||||
gYIxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhC
 | 
			
		||||
cmlzYmFuZTEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxFDASBgNVBAsTC2Rl
 | 
			
		||||
dmVsb3BtZW50MRkwFwYDVQQDExBDcnlwdFNvZnQgRGV2IENBMFwwDQYJKoZIhvcN
 | 
			
		||||
AQEBBQADSwAwSAJBAOAOAqogG5QwAmLhzyO4CoRnx/wVy4NZP4dxJy83O1EnL0rw
 | 
			
		||||
OdsamJKvPOLHgSXo3gDu9uVyvCf/QJmZAmC5ml8CAwEAATANBgkqhkiG9w0BAQQF
 | 
			
		||||
AANBADRRS/GVdd7rAqRW6SdmgLJduOU2yq3avBu99kRqbp9A/dLu6r6jU+eP4oOA
 | 
			
		||||
TfdbFZtAAD2Hx9jUtY3tfdrJOb8= 
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICVjCCAgACAQAwDQYJKoZIhvcNAQEEBQAwgbUxCzAJBgNVBAYTAkFVMRMwEQYD
 | 
			
		||||
VQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5
 | 
			
		||||
cHRTb2Z0IFB0eSBMdGQxLDAqBgNVBAsTI1dPUlRITEVTUyBDRVJUSUZJQ0FUSU9O
 | 
			
		||||
IEFVVEhPUklUSUVTMTQwMgYDVQQDEytaRVJPIFZBTFVFIENBIC0gREVNT05TVFJB
 | 
			
		||||
VElPTiBQVVJQT1NFUyBPTkxZMB4XDTk3MDQwMzEzMjI1NFoXDTk4MDQwMzEzMjI1
 | 
			
		||||
NFowgbUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQH
 | 
			
		||||
EwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxLDAqBgNVBAsT
 | 
			
		||||
I1dPUlRITEVTUyBDRVJUSUZJQ0FUSU9OIEFVVEhPUklUSUVTMTQwMgYDVQQDEyta
 | 
			
		||||
RVJPIFZBTFVFIENBIC0gREVNT05TVFJBVElPTiBQVVJQT1NFUyBPTkxZMFwwDQYJ
 | 
			
		||||
KoZIhvcNAQEBBQADSwAwSAJBAOZ7T7yqP/tyspcko3yPY1y0Cm2EmwNvzW4QgVXR
 | 
			
		||||
Fjs3HmJ4xtSpXdo6mwcGezL3Abt/aQXaxv9PU8xt+Jr0OFUCAwEAATANBgkqhkiG
 | 
			
		||||
9w0BAQQFAANBAOQpYmGgyCqCy1OljgJhCqQOu627oVlHzK1L+t9vBaMfn40AVUR4
 | 
			
		||||
WzQVWO31KTgi5vTK1U+3h46fgUWqQ0h+6rU=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIAwgKADAgECAgEAMA0GCSqGSIb3DQEBBAUAMGIxETAPBgNVBAcTCEludGVybmV0
 | 
			
		||||
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xh
 | 
			
		||||
c3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjAeFw05NjA0MDgxMDIwMjda
 | 
			
		||||
Fw05NzA0MDgxMDIwMjdaMGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5W
 | 
			
		||||
ZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIElu
 | 
			
		||||
ZGl2aWR1YWwgU3Vic2NyaWJlcjCAMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2
 | 
			
		||||
FKbPTdAFDdjKI9BvqrQpkmOOLPhvltcunXZLEbE2jVfJw/0cxrr+Hgi6M8qV6r7j
 | 
			
		||||
W80GqLd5HUQq7XPysVKDaBBwZJHXPmv5912dFEObbpdFmIFH0S3L3bty10w/cari
 | 
			
		||||
QPJUObwW7s987LrbP2wqsxaxhhKdrpM01bjV0Pc+qQIDAQABAAAAADANBgkqhkiG
 | 
			
		||||
9w0BAQQFAAOBgQA+1nJryNt8VBRjRr07ArDAV/3jAH7GjDc9jsrxZS68ost9v06C
 | 
			
		||||
TvTNKGL+LISNmFLXl+JXhgGB0JZ9fvyYzNgHQ46HBUng1H6voalfJgS2KdEo50wW
 | 
			
		||||
8EFZYMDkT1k4uynwJqkVN2QJK/2q4/A/VCov5h6SlM8Affg2W+1TLqvqkwAA
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
 subject=/L=Internet/O=VeriSign, Inc./OU=VeriSign Class 2 CA - Individual Subscriber
 | 
			
		||||
 issuer= /L=Internet/O=VeriSign, Inc./OU=VeriSign Class 2 CA - Individual Subscriber
 | 
			
		||||
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIIEkzCCA/ygAwIBAgIRANDTUpSRL3nTFeMrMayFSPAwDQYJKoZIhvcNAQECBQAw
 | 
			
		||||
YjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQw
 | 
			
		||||
MgYDVQQLEytWZXJpU2lnbiBDbGFzcyAyIENBIC0gSW5kaXZpZHVhbCBTdWJzY3Jp
 | 
			
		||||
YmVyMB4XDTk2MDYwNDAwMDAwMFoXDTk4MDYwNDIzNTk1OVowYjERMA8GA1UEBxMI
 | 
			
		||||
SW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJp
 | 
			
		||||
U2lnbiBDbGFzcyAyIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyMIGfMA0GCSqG
 | 
			
		||||
SIb3DQEBAQUAA4GNADCBiQKBgQC6A+2czKGRcYMfm8gdnk+0de99TDDzsqo0v5nb
 | 
			
		||||
RsbUmMcdRQ7nsMbRWe0SAb/9QoLTZ/cJ0iOBqdrkz7UpqqKarVoTSdlSMVM92tWp
 | 
			
		||||
3bJncZHQD1t4xd6lQVdI1/T6R+5J0T1ukOdsI9Jmf+F28S6g3R3L1SFwiHKeZKZv
 | 
			
		||||
z+793wIDAQABo4ICRzCCAkMwggIpBgNVHQMBAf8EggIdMIICGTCCAhUwggIRBgtg
 | 
			
		||||
hkgBhvhFAQcBATCCAgAWggGrVGhpcyBjZXJ0aWZpY2F0ZSBpbmNvcnBvcmF0ZXMg
 | 
			
		||||
YnkgcmVmZXJlbmNlLCBhbmQgaXRzIHVzZSBpcyBzdHJpY3RseSBzdWJqZWN0IHRv
 | 
			
		||||
LCB0aGUgVmVyaVNpZ24gQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQg
 | 
			
		||||
KENQUyksIGF2YWlsYWJsZSBhdDogaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL0NQ
 | 
			
		||||
Uy0xLjA7IGJ5IEUtbWFpbCBhdCBDUFMtcmVxdWVzdHNAdmVyaXNpZ24uY29tOyBv
 | 
			
		||||
ciBieSBtYWlsIGF0IFZlcmlTaWduLCBJbmMuLCAyNTkzIENvYXN0IEF2ZS4sIE1v
 | 
			
		||||
dW50YWluIFZpZXcsIENBIDk0MDQzIFVTQSBUZWwuICsxICg0MTUpIDk2MS04ODMw
 | 
			
		||||
IENvcHlyaWdodCAoYykgMTk5NiBWZXJpU2lnbiwgSW5jLiAgQWxsIFJpZ2h0cyBS
 | 
			
		||||
ZXNlcnZlZC4gQ0VSVEFJTiBXQVJSQU5USUVTIERJU0NMQUlNRUQgYW5kIExJQUJJ
 | 
			
		||||
TElUWSBMSU1JVEVELqAOBgxghkgBhvhFAQcBAQGhDgYMYIZIAYb4RQEHAQECMC8w
 | 
			
		||||
LRYraHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BTLTEuMDAU
 | 
			
		||||
BglghkgBhvhCAQEBAf8EBAMCAgQwDQYJKoZIhvcNAQECBQADgYEApRJRkNBqLLgs
 | 
			
		||||
53IR/d18ODdLOWMTZ+QOOxBrq460iBEdUwgF8vmPRX1ku7UiDeNzaLlurE6eFqHq
 | 
			
		||||
2zPyK5j60zfTLVJMWKcQWwTJLjHtXrW8pxhNtFc6Fdvy5ZkHnC/9NIl7/t4U6WqB
 | 
			
		||||
p4y+p7SdMIkEwIZfds0VbnQyX5MRUJY=
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 | 
			
		||||
 subject=/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
 | 
			
		||||
 issuer= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICMTCCAZoCBQKhAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMRcw
 | 
			
		||||
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMg
 | 
			
		||||
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBa
 | 
			
		||||
Fw05OTEyMzEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
 | 
			
		||||
biwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp
 | 
			
		||||
Y2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyVxZ
 | 
			
		||||
nvIbigEUtBDfBEDb41evakVAj4QMC9Ez2dkRz+4CWB8l9yqoRAWq7AMfeH+ek7ma
 | 
			
		||||
AKojfdashaJjRcdyJ8z0TMZ1cdI5709C8HXfCpDGjiBvmA/4rCNfcCk2pMmG57Ga
 | 
			
		||||
IMtTpYXnPb59mv4kRTPcdhXtD6JxZExlLoFoRacCAwEAATANBgkqhkiG9w0BAQIF
 | 
			
		||||
AAOBgQB1Zmw+0c2B27X4LzZRtvdCvM1Cr9wO+hVs+GeTVzrrtpLotgHKjLeOQ7RJ
 | 
			
		||||
Zfk+7r11Ri7J/CVdqMcvi5uPaM+0nJcYwE3vH9mvgrPmZLiEXIqaB1JDYft0nls6
 | 
			
		||||
NvxMsvwaPxUupVs8G5DsiCnkWRb5zget7Ond2tIxik/W2O8XjQ==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 subject=/C=US/O=VeriSign, Inc./OU=Class 4 Public Primary Certification Authority
 | 
			
		||||
 issuer= /C=US/O=VeriSign, Inc./OU=Class 4 Public Primary Certification Authority
 | 
			
		||||
-----BEGIN CERTIFICATE-----
 | 
			
		||||
MIICMTCCAZoCBQKmAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMRcw
 | 
			
		||||
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgNCBQdWJsaWMg
 | 
			
		||||
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBa
 | 
			
		||||
Fw05OTEyMzEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
 | 
			
		||||
biwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp
 | 
			
		||||
Y2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0LJ1
 | 
			
		||||
9njQrlpQ9OlQqZ+M1++RlHDo0iSQdomF1t+s5gEXMoDwnZNHvJplnR+Xrr/phnVj
 | 
			
		||||
IIm9gFidBAydqMEk6QvlMXi9/C0MN2qeeIDpRnX57aP7E3vIwUzSo+/1PLBij0pd
 | 
			
		||||
O92VZ48TucE81qcmm+zDO3rZTbxtm+gVAePwR6kCAwEAATANBgkqhkiG9w0BAQIF
 | 
			
		||||
AAOBgQBT3dPwnCR+QKri/AAa19oM/DJhuBUNlvP6Vxt/M3yv6ZiaYch6s7f/sdyZ
 | 
			
		||||
g9ysEvxwyR84Qu1E9oAuW2szaayc01znX1oYx7EteQSWQZGZQbE8DbqEOcY7l/Am
 | 
			
		||||
yY7uvcxClf8exwI/VAx49byqYHwCaejcrOICdmHEPgPq0ook0Q==
 | 
			
		||||
-----END CERTIFICATE-----
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								apps/speed.c
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								apps/speed.c
									
									
									
									
									
								
							@@ -108,8 +108,14 @@
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#if defined(_WIN32) || defined(__CYGWIN__)
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
# if defined(__CYGWIN__) && !defined(_WIN32)
 | 
			
		||||
  /* <windows.h> should define _WIN32, which normally is mutually
 | 
			
		||||
   * exclusive with __CYGWIN__, but if it didn't... */
 | 
			
		||||
#  define _WIN32
 | 
			
		||||
  /* this is done because Cygwin alarm() fails sometimes. */
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <openssl/bn.h>
 | 
			
		||||
@@ -185,6 +191,24 @@
 | 
			
		||||
#endif
 | 
			
		||||
#include <openssl/modes.h>
 | 
			
		||||
 | 
			
		||||
#ifdef OPENSSL_FIPS
 | 
			
		||||
#ifdef OPENSSL_DOING_MAKEDEPEND
 | 
			
		||||
#undef AES_set_encrypt_key
 | 
			
		||||
#undef AES_set_decrypt_key
 | 
			
		||||
#undef DES_set_key_unchecked
 | 
			
		||||
#endif
 | 
			
		||||
#define BF_set_key	private_BF_set_key
 | 
			
		||||
#define CAST_set_key	private_CAST_set_key
 | 
			
		||||
#define idea_set_encrypt_key	private_idea_set_encrypt_key
 | 
			
		||||
#define SEED_set_key	private_SEED_set_key
 | 
			
		||||
#define RC2_set_key	private_RC2_set_key
 | 
			
		||||
#define RC4_set_key	private_RC4_set_key
 | 
			
		||||
#define DES_set_key_unchecked	private_DES_set_key_unchecked
 | 
			
		||||
#define AES_set_encrypt_key	private_AES_set_encrypt_key
 | 
			
		||||
#define AES_set_decrypt_key	private_AES_set_decrypt_key
 | 
			
		||||
#define Camellia_set_key	private_Camellia_set_key
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_FORK
 | 
			
		||||
# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
 | 
			
		||||
#  define HAVE_FORK 0
 | 
			
		||||
@@ -274,9 +298,12 @@ static SIGRETTYPE sig_done(int sig)
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
 | 
			
		||||
#define SIGALRM
 | 
			
		||||
#if !defined(SIGALRM)
 | 
			
		||||
# define SIGALRM
 | 
			
		||||
#endif
 | 
			
		||||
static unsigned int lapse,schlock;
 | 
			
		||||
static void alarm(unsigned int secs) { lapse = secs*1000; }
 | 
			
		||||
static void alarm_win32(unsigned int secs) { lapse = secs*1000; }
 | 
			
		||||
#define alarm alarm_win32
 | 
			
		||||
 | 
			
		||||
static DWORD WINAPI sleepy(VOID *arg)
 | 
			
		||||
	{
 | 
			
		||||
@@ -288,11 +315,9 @@ static DWORD WINAPI sleepy(VOID *arg)
 | 
			
		||||
 | 
			
		||||
static double Time_F(int s)
 | 
			
		||||
	{
 | 
			
		||||
	double ret;
 | 
			
		||||
	static HANDLE thr;
 | 
			
		||||
 | 
			
		||||
	if (s == START)
 | 
			
		||||
		{
 | 
			
		||||
		HANDLE	thr;
 | 
			
		||||
		schlock = 0;
 | 
			
		||||
		thr = CreateThread(NULL,4096,sleepy,NULL,0,NULL);
 | 
			
		||||
		if (thr==NULL)
 | 
			
		||||
@@ -301,25 +326,17 @@ static double Time_F(int s)
 | 
			
		||||
			BIO_printf(bio_err,"unable to CreateThread (%d)",ret);
 | 
			
		||||
			ExitProcess(ret);
 | 
			
		||||
			}
 | 
			
		||||
		CloseHandle(thr);		/* detach the thread	*/
 | 
			
		||||
		while (!schlock) Sleep(0);	/* scheduler spinlock	*/
 | 
			
		||||
		ret = app_tminterval(s,usertime);
 | 
			
		||||
		}
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		ret = app_tminterval(s,usertime);
 | 
			
		||||
		if (run) TerminateThread(thr,0);
 | 
			
		||||
		CloseHandle(thr);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
	return app_tminterval(s,usertime);
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
static double Time_F(int s)
 | 
			
		||||
	{
 | 
			
		||||
	double ret = app_tminterval(s,usertime);
 | 
			
		||||
	if (s == STOP) alarm(0);
 | 
			
		||||
	return ret;
 | 
			
		||||
	return app_tminterval(s,usertime);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -1574,11 +1591,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
 | 
			
		||||
			Time_F(START);
 | 
			
		||||
			for (count=0,run=1; COND(c[D_SHA1][j]); count++)
 | 
			
		||||
#if 0
 | 
			
		||||
				EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
 | 
			
		||||
#else
 | 
			
		||||
				SHA1(buf,lengths[j],sha);
 | 
			
		||||
#endif
 | 
			
		||||
			d=Time_F(STOP);
 | 
			
		||||
			print_result(D_SHA1,j,count,d);
 | 
			
		||||
			}
 | 
			
		||||
@@ -2584,7 +2597,7 @@ static void pkey_print_message(const char *str, const char *str2, long num,
 | 
			
		||||
	BIO_printf(bio_err,mr ? "+DTP:%d:%s:%s:%d\n"
 | 
			
		||||
			   : "Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
 | 
			
		||||
	(void)BIO_flush(bio_err);
 | 
			
		||||
	alarm(RSA_SECONDS);
 | 
			
		||||
	alarm(tm);
 | 
			
		||||
#else
 | 
			
		||||
	BIO_printf(bio_err,mr ? "+DNP:%ld:%d:%s:%s\n"
 | 
			
		||||
			   : "Doing %ld %d bit %s %s's: ",num,bits,str,str2);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										135
									
								
								apps/srp.c
									
									
									
									
									
								
							
							
						
						
									
										135
									
								
								apps/srp.c
									
									
									
									
									
								
							@@ -125,13 +125,13 @@ static int get_index(CA_DB *db, char* id, char type)
 | 
			
		||||
	if (type == DB_SRP_INDEX) 
 | 
			
		||||
	for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
 | 
			
		||||
		{
 | 
			
		||||
		pp=sk_OPENSSL_PSTRING_value(db->db->data,i);
 | 
			
		||||
		pp = sk_OPENSSL_PSTRING_value(db->db->data,i);
 | 
			
		||||
		if (pp[DB_srptype][0] == DB_SRP_INDEX  && !strcmp(id,pp[DB_srpid])) 
 | 
			
		||||
			return i;
 | 
			
		||||
		}
 | 
			
		||||
	else for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
 | 
			
		||||
		{
 | 
			
		||||
		pp=sk_OPENSSL_PSTRING_value(db->db->data,i);
 | 
			
		||||
		pp = sk_OPENSSL_PSTRING_value(db->db->data,i);
 | 
			
		||||
 | 
			
		||||
		if (pp[DB_srptype][0] != DB_SRP_INDEX && !strcmp(id,pp[DB_srpid])) 
 | 
			
		||||
			return i;
 | 
			
		||||
@@ -140,41 +140,41 @@ static int get_index(CA_DB *db, char* id, char type)
 | 
			
		||||
	return -1 ; 
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static void print_entry(CA_DB *db, BIO * bio, int indx, int verbose, char * s)
 | 
			
		||||
static void print_entry(CA_DB *db, BIO *bio, int indx, int verbose, char *s)
 | 
			
		||||
	{
 | 
			
		||||
	if (indx >= 0 && verbose)
 | 
			
		||||
		{
 | 
			
		||||
		int j;
 | 
			
		||||
		char **pp=sk_OPENSSL_PSTRING_value(db->db->data,indx);
 | 
			
		||||
		BIO_printf(bio,"%s \"%s\"\n",s,pp[DB_srpid]);
 | 
			
		||||
		char **pp = sk_OPENSSL_PSTRING_value(db->db->data, indx);
 | 
			
		||||
		BIO_printf(bio, "%s \"%s\"\n", s, pp[DB_srpid]);
 | 
			
		||||
		for (j = 0; j < DB_NUMBER; j++)
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio_err,"  %d = \"%s\"\n",j,pp[j]);
 | 
			
		||||
			BIO_printf(bio_err,"  %d = \"%s\"\n", j, pp[j]);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static void print_index(CA_DB *db, BIO * bio, int indexindex, int verbose)
 | 
			
		||||
static void print_index(CA_DB *db, BIO *bio, int indexindex, int verbose)
 | 
			
		||||
	{
 | 
			
		||||
	print_entry(db,bio,indexindex, verbose, "g N entry") ;
 | 
			
		||||
	print_entry(db, bio, indexindex, verbose, "g N entry") ;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static void print_user(CA_DB *db, BIO * bio, int userindex, int verbose)
 | 
			
		||||
static void print_user(CA_DB *db, BIO *bio, int userindex, int verbose)
 | 
			
		||||
	{
 | 
			
		||||
	if (verbose > 0)
 | 
			
		||||
		{
 | 
			
		||||
		char **pp= sk_OPENSSL_PSTRING_value(db->db->data,userindex);
 | 
			
		||||
		char **pp = sk_OPENSSL_PSTRING_value(db->db->data,userindex);
 | 
			
		||||
 | 
			
		||||
		if (pp[DB_srptype][0] != 'I')
 | 
			
		||||
			{
 | 
			
		||||
			print_entry(db,bio,userindex, verbose, "User entry");
 | 
			
		||||
			print_entry(db,bio,get_index(db, pp[DB_srpgN],'I'),verbose,"g N entry") ;
 | 
			
		||||
			print_entry(db, bio, userindex, verbose, "User entry");
 | 
			
		||||
			print_entry(db, bio, get_index(db, pp[DB_srpgN], 'I'), verbose, "g N entry");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int update_index(CA_DB *db, BIO * bio, char ** row)
 | 
			
		||||
static int update_index(CA_DB *db, BIO *bio, char **row)
 | 
			
		||||
	{
 | 
			
		||||
	char ** irow;
 | 
			
		||||
	int i;
 | 
			
		||||
@@ -202,16 +202,15 @@ static int update_index(CA_DB *db, BIO * bio, char ** row)
 | 
			
		||||
	return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static void lookup_fail(const char *name, const char *tag)
 | 
			
		||||
static void lookup_fail(const char *name, char *tag)
 | 
			
		||||
	{
 | 
			
		||||
	BIO_printf(bio_err,"variable lookup failed for %s::%s\n",name,tag);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static char *srp_verify_user(const char *user, const char *srp_verifier,
 | 
			
		||||
							 char *srp_usersalt, const char *g,
 | 
			
		||||
							 const char * N, const char *passin, BIO *bio,
 | 
			
		||||
							 int verbose)
 | 
			
		||||
			     char *srp_usersalt, const char *g, const char *N,
 | 
			
		||||
			     const char *passin, BIO *bio, int verbose)
 | 
			
		||||
	{
 | 
			
		||||
	char password[1024];
 | 
			
		||||
	PW_CB_DATA cb_tmp;
 | 
			
		||||
@@ -223,14 +222,12 @@ static char *srp_verify_user(const char *user, const char *srp_verifier,
 | 
			
		||||
 | 
			
		||||
 	if (password_callback(password, 1024, 0, &cb_tmp) >0)
 | 
			
		||||
		{
 | 
			
		||||
		VERBOSE BIO_printf(bio,"Validating\n   user=\"%s\"\n srp_verifier=\"%s\"\n srp_usersalt=\"%s\"\n g=\"%s\"\n N=\"%s\"\n",user,srp_verifier,srp_usersalt,g,N);
 | 
			
		||||
		BIO_printf(bio,"Pass %s\n",password);
 | 
			
		||||
		VERBOSE BIO_printf(bio,"Validating\n   user=\"%s\"\n srp_verifier=\"%s\"\n srp_usersalt=\"%s\"\n g=\"%s\"\n N=\"%s\"\n",user,srp_verifier,srp_usersalt, g, N);
 | 
			
		||||
		BIO_printf(bio, "Pass %s\n", password);
 | 
			
		||||
 | 
			
		||||
		OPENSSL_assert(srp_usersalt != NULL);
 | 
			
		||||
		if (!(gNid=SRP_create_verifier(user, password, &srp_usersalt, &verifier,
 | 
			
		||||
									   N, g)))
 | 
			
		||||
		if (!(gNid=SRP_create_verifier(user, password, &srp_usersalt, &verifier, N, g)))
 | 
			
		||||
			{
 | 
			
		||||
			BIO_printf(bio,"Internal error validating SRP verifier\n");
 | 
			
		||||
			BIO_printf(bio, "Internal error validating SRP verifier\n");
 | 
			
		||||
			}
 | 
			
		||||
		else
 | 
			
		||||
			{
 | 
			
		||||
@@ -242,8 +239,8 @@ static char *srp_verify_user(const char *user, const char *srp_verifier,
 | 
			
		||||
	return gNid;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static char *srp_create_user(char * user, char **srp_verifier,
 | 
			
		||||
							 char **srp_usersalt,char *g, char *N,
 | 
			
		||||
static char *srp_create_user(char *user, char **srp_verifier,
 | 
			
		||||
			     char **srp_usersalt, char *g, char *N,
 | 
			
		||||
			     char *passout, BIO *bio, int verbose)
 | 
			
		||||
	{
 | 
			
		||||
 	char password[1024];
 | 
			
		||||
@@ -518,9 +515,9 @@ bad:
 | 
			
		||||
	if (db == NULL) goto err;
 | 
			
		||||
 | 
			
		||||
	/* Lets check some fields */
 | 
			
		||||
	for (i=0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
 | 
			
		||||
	for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
 | 
			
		||||
		{
 | 
			
		||||
		pp=sk_OPENSSL_PSTRING_value(db->db->data, i);
 | 
			
		||||
		pp = sk_OPENSSL_PSTRING_value(db->db->data, i);
 | 
			
		||||
	
 | 
			
		||||
		if (pp[DB_srptype][0] == DB_SRP_INDEX)
 | 
			
		||||
			{
 | 
			
		||||
@@ -528,25 +525,25 @@ bad:
 | 
			
		||||
			if (gNindex < 0 && gN != NULL && !strcmp(gN, pp[DB_srpid]))
 | 
			
		||||
				gNindex = i;
 | 
			
		||||
 | 
			
		||||
			print_index(db, bio_err, i, verbose > 1) ;
 | 
			
		||||
			print_index(db, bio_err, i, verbose > 1);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
	VERBOSE BIO_printf(bio_err,"Database initialised\n");
 | 
			
		||||
	VERBOSE BIO_printf(bio_err, "Database initialised\n");
 | 
			
		||||
 | 
			
		||||
	if (gNindex >= 0)
 | 
			
		||||
		{
 | 
			
		||||
		gNrow=sk_OPENSSL_PSTRING_value(db->db->data,gNindex);
 | 
			
		||||
		print_entry(db,bio_err,gNindex,verbose>1,"Default g and N") ;
 | 
			
		||||
		gNrow = sk_OPENSSL_PSTRING_value(db->db->data,gNindex);
 | 
			
		||||
		print_entry(db, bio_err, gNindex, verbose > 1, "Default g and N");
 | 
			
		||||
		}
 | 
			
		||||
	else if (maxgN > 0 && !SRP_get_default_gN(gN))
 | 
			
		||||
		{
 | 
			
		||||
		BIO_printf(bio_err,"No g and N value for index \"%s\"\n",gN);
 | 
			
		||||
		BIO_printf(bio_err, "No g and N value for index \"%s\"\n", gN);
 | 
			
		||||
		goto err;
 | 
			
		||||
		}
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		VERBOSE BIO_printf(bio_err,"Database has no g N information.\n");
 | 
			
		||||
		VERBOSE BIO_printf(bio_err, "Database has no g N information.\n");
 | 
			
		||||
		gNrow = NULL;
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
@@ -560,10 +557,10 @@ bad:
 | 
			
		||||
		{
 | 
			
		||||
		int userindex = -1;
 | 
			
		||||
		if (user) 
 | 
			
		||||
			VVERBOSE BIO_printf(bio_err, "Processing user \"%s\"\n",user);
 | 
			
		||||
			VVERBOSE BIO_printf(bio_err, "Processing user \"%s\"\n", user);
 | 
			
		||||
		if ((userindex = get_index(db, user, 'U')) >= 0)
 | 
			
		||||
			{
 | 
			
		||||
			print_user(db,bio_err,userindex,(verbose > 0) || list_user) ;
 | 
			
		||||
			print_user(db, bio_err, userindex, (verbose > 0) || list_user);
 | 
			
		||||
			}
 | 
			
		||||
		
 | 
			
		||||
		if (list_user)
 | 
			
		||||
@@ -572,9 +569,9 @@ bad:
 | 
			
		||||
				{
 | 
			
		||||
				BIO_printf(bio_err,"List all users\n");
 | 
			
		||||
 | 
			
		||||
				for (i=0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
 | 
			
		||||
				for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
 | 
			
		||||
					{
 | 
			
		||||
					print_user(db,bio_err,i,1) ;
 | 
			
		||||
					print_user(db,bio_err, i, 1);
 | 
			
		||||
					}
 | 
			
		||||
				list_user = 0;
 | 
			
		||||
				}
 | 
			
		||||
@@ -591,21 +588,21 @@ bad:
 | 
			
		||||
				{
 | 
			
		||||
				/* reactivation of a new user */
 | 
			
		||||
				char **row = sk_OPENSSL_PSTRING_value(db->db->data, userindex);
 | 
			
		||||
				BIO_printf(bio_err,"user \"%s\" reactivated.\n", user);
 | 
			
		||||
				row[DB_srptype][0] = 'V' ;
 | 
			
		||||
				BIO_printf(bio_err, "user \"%s\" reactivated.\n", user);
 | 
			
		||||
				row[DB_srptype][0] = 'V';
 | 
			
		||||
 | 
			
		||||
				doupdatedb = 1;
 | 
			
		||||
				}
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				char *row[DB_NUMBER] ; char * gNid;
 | 
			
		||||
				char *row[DB_NUMBER] ; char *gNid;
 | 
			
		||||
				row[DB_srpverifier] = NULL;
 | 
			
		||||
				row[DB_srpsalt] = NULL;
 | 
			
		||||
				row[DB_srpinfo] = NULL;
 | 
			
		||||
				if (!(gNid = srp_create_user(user,&(row[DB_srpverifier]), &(row[DB_srpsalt]),gNrow?gNrow[DB_srpsalt]:gN,gNrow?gNrow[DB_srpverifier]:NULL, passout, bio_err,verbose)))
 | 
			
		||||
					{
 | 
			
		||||
						BIO_printf(bio_err,"Cannot create srp verifier for user \"%s\", operation abandoned .\n",user);
 | 
			
		||||
						errors++ ;
 | 
			
		||||
						BIO_printf(bio_err, "Cannot create srp verifier for user \"%s\", operation abandoned .\n", user);
 | 
			
		||||
						errors++;
 | 
			
		||||
						goto err;
 | 
			
		||||
					}
 | 
			
		||||
				row[DB_srpid] = BUF_strdup(user);
 | 
			
		||||
@@ -629,38 +626,37 @@ bad:
 | 
			
		||||
			}
 | 
			
		||||
		else if (modify_user)
 | 
			
		||||
			{
 | 
			
		||||
			if (userindex<0)
 | 
			
		||||
			if (userindex < 0)
 | 
			
		||||
				{
 | 
			
		||||
				BIO_printf(bio_err,"user \"%s\" does not exist, operation ignored.\n",user);
 | 
			
		||||
				errors++ ;
 | 
			
		||||
				errors++;
 | 
			
		||||
				}
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
 | 
			
		||||
				char **row=sk_OPENSSL_PSTRING_value(db->db->data, userindex);
 | 
			
		||||
				char type = row[DB_srptype][0] ;
 | 
			
		||||
				char **row = sk_OPENSSL_PSTRING_value(db->db->data, userindex);
 | 
			
		||||
				char type = row[DB_srptype][0];
 | 
			
		||||
				if (type == 'v')
 | 
			
		||||
					{
 | 
			
		||||
					BIO_printf(bio_err,"user \"%s\" already updated, operation ignored.\n",user);
 | 
			
		||||
					errors++ ;
 | 
			
		||||
					errors++;
 | 
			
		||||
					}
 | 
			
		||||
				else
 | 
			
		||||
					{
 | 
			
		||||
					char * gNid ;
 | 
			
		||||
					char *gNid;
 | 
			
		||||
 | 
			
		||||
					if (row[DB_srptype][0] == 'V')
 | 
			
		||||
						{
 | 
			
		||||
						int user_gN ;
 | 
			
		||||
						char ** irow = NULL;
 | 
			
		||||
						int user_gN;
 | 
			
		||||
						char **irow = NULL;
 | 
			
		||||
						VERBOSE BIO_printf(bio_err,"Verifying password for user \"%s\"\n",user);
 | 
			
		||||
						if ( (user_gN = get_index(db, row[DB_srpgN],DB_SRP_INDEX)) >= 0)
 | 
			
		||||
							irow = sk_OPENSSL_PSTRING_value(db->db->data,
 | 
			
		||||
															userindex);
 | 
			
		||||
						if ( (user_gN = get_index(db, row[DB_srpgN], DB_SRP_INDEX)) >= 0)
 | 
			
		||||
							irow = (char **)sk_OPENSSL_PSTRING_value(db->db->data, userindex);
 | 
			
		||||
 | 
			
		||||
 						if (!srp_verify_user(user,row[DB_srpverifier], row[DB_srpsalt],irow?irow[DB_srpsalt]:row[DB_srpgN], irow?irow[DB_srpverifier]:NULL, passin, bio_err,verbose))
 | 
			
		||||
 						if (!srp_verify_user(user, row[DB_srpverifier], row[DB_srpsalt], irow ? irow[DB_srpsalt] : row[DB_srpgN], irow ? irow[DB_srpverifier] : NULL, passin, bio_err, verbose))
 | 
			
		||||
							{
 | 
			
		||||
							BIO_printf(bio_err,"Invalid password for user \"%s\", operation abandoned.\n",user);
 | 
			
		||||
							errors++ ;
 | 
			
		||||
							BIO_printf(bio_err, "Invalid password for user \"%s\", operation abandoned.\n", user);
 | 
			
		||||
							errors++;
 | 
			
		||||
							goto err;
 | 
			
		||||
							}
 | 
			
		||||
						} 
 | 
			
		||||
@@ -668,10 +664,7 @@ bad:
 | 
			
		||||
 | 
			
		||||
					if (!(gNid=srp_create_user(user,&(row[DB_srpverifier]), &(row[DB_srpsalt]),gNrow?gNrow[DB_srpsalt]:NULL, gNrow?gNrow[DB_srpverifier]:NULL, passout, bio_err,verbose)))
 | 
			
		||||
						{
 | 
			
		||||
							BIO_printf(bio_err,
 | 
			
		||||
									   "Cannot create srp verifier for user "
 | 
			
		||||
									   "\"%s\", operation abandonned .\n",
 | 
			
		||||
									   user);
 | 
			
		||||
						BIO_printf(bio_err, "Cannot create srp verifier for user \"%s\", operation abandoned.\n", user);
 | 
			
		||||
						errors++;
 | 
			
		||||
						goto err;
 | 
			
		||||
						}
 | 
			
		||||
@@ -696,10 +689,10 @@ bad:
 | 
			
		||||
				}
 | 
			
		||||
			else
 | 
			
		||||
				{
 | 
			
		||||
				char ** xpp = sk_OPENSSL_PSTRING_value(db->db->data,userindex);
 | 
			
		||||
				BIO_printf(bio_err,"user \"%s\" revoked. t\n",user);
 | 
			
		||||
				char **xpp = sk_OPENSSL_PSTRING_value(db->db->data,userindex);
 | 
			
		||||
				BIO_printf(bio_err, "user \"%s\" revoked. t\n", user);
 | 
			
		||||
 | 
			
		||||
				xpp[DB_srptype][0] = 'R' ;
 | 
			
		||||
				xpp[DB_srptype][0] = 'R';
 | 
			
		||||
				
 | 
			
		||||
				doupdatedb = 1;
 | 
			
		||||
				}
 | 
			
		||||
@@ -719,24 +712,24 @@ bad:
 | 
			
		||||
	if (doupdatedb)
 | 
			
		||||
		{
 | 
			
		||||
		/* Lets check some fields */
 | 
			
		||||
		for (i=0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
 | 
			
		||||
		for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
 | 
			
		||||
			{
 | 
			
		||||
			pp=sk_OPENSSL_PSTRING_value(db->db->data,i);
 | 
			
		||||
			pp = sk_OPENSSL_PSTRING_value(db->db->data,i);
 | 
			
		||||
	
 | 
			
		||||
			if (pp[DB_srptype][0] == 'v')
 | 
			
		||||
				{
 | 
			
		||||
				pp[DB_srptype][0] = 'V';
 | 
			
		||||
				print_user(db,bio_err,i,verbose) ;
 | 
			
		||||
				print_user(db, bio_err, i, verbose);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		VERBOSE BIO_printf(bio_err,"Trying to update srpvfile.\n");
 | 
			
		||||
		if (!save_index(dbfile,"new",db)) goto err;
 | 
			
		||||
		VERBOSE BIO_printf(bio_err, "Trying to update srpvfile.\n");
 | 
			
		||||
		if (!save_index(dbfile, "new", db)) goto err;
 | 
			
		||||
				
 | 
			
		||||
		VERBOSE BIO_printf(bio_err,"Temporary srpvfile created.\n");
 | 
			
		||||
		if (!rotate_index(dbfile,"new","old")) goto err;
 | 
			
		||||
		VERBOSE BIO_printf(bio_err, "Temporary srpvfile created.\n");
 | 
			
		||||
		if (!rotate_index(dbfile, "new", "old")) goto err;
 | 
			
		||||
 | 
			
		||||
		VERBOSE BIO_printf(bio_err,"srpvfile updated.\n");
 | 
			
		||||
		VERBOSE BIO_printf(bio_err, "srpvfile updated.\n");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ret = (errors != 0);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#!/usr/bin/perl -w
 | 
			
		||||
# Written by Zoltan Glozik <zglozik@stones.com>.
 | 
			
		||||
# Copyright (c) 2002 The OpenTSA Project.  All rights reserved.
 | 
			
		||||
$::version = '$Id: tsget,v 1.3 2009/09/07 17:57:18 steve Exp $';
 | 
			
		||||
$::version = '$Id: tsget,v 1.1.2.2 2009/09/07 17:57:02 steve Exp $';
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use IO::Handle;
 | 
			
		||||
 
 | 
			
		||||
@@ -88,6 +88,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	X509_STORE *cert_ctx=NULL;
 | 
			
		||||
	X509_LOOKUP *lookup=NULL;
 | 
			
		||||
	X509_VERIFY_PARAM *vpm = NULL;
 | 
			
		||||
	int crl_download = 0;
 | 
			
		||||
#ifndef OPENSSL_NO_ENGINE
 | 
			
		||||
	char *engine=NULL;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -145,6 +146,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
				if (argc-- < 1) goto end;
 | 
			
		||||
				crlfile= *(++argv);
 | 
			
		||||
				}
 | 
			
		||||
			else if (strcmp(*argv,"-crl_download") == 0)
 | 
			
		||||
				crl_download = 1;
 | 
			
		||||
#ifndef OPENSSL_NO_ENGINE
 | 
			
		||||
			else if (strcmp(*argv,"-engine") == 0)
 | 
			
		||||
				{
 | 
			
		||||
@@ -222,14 +225,26 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (argc < 1) check(cert_ctx, NULL, untrusted, trusted, crls, e);
 | 
			
		||||
	ret = 0;
 | 
			
		||||
 | 
			
		||||
	if (crl_download)
 | 
			
		||||
		store_setup_crl_download(cert_ctx);
 | 
			
		||||
	if (argc < 1)
 | 
			
		||||
		{ 
 | 
			
		||||
		if (1 != check(cert_ctx, NULL, untrusted, trusted, crls, e))
 | 
			
		||||
			ret = -1;
 | 
			
		||||
		}
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		for (i=0; i<argc; i++)
 | 
			
		||||
			check(cert_ctx,argv[i], untrusted, trusted, crls, e);
 | 
			
		||||
	ret=0;
 | 
			
		||||
			if (1 != check(cert_ctx,argv[i], untrusted, trusted, crls, e))
 | 
			
		||||
				ret = -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
	if (ret == 1) {
 | 
			
		||||
		BIO_printf(bio_err,"usage: verify [-verbose] [-CApath path] [-CAfile file] [-purpose purpose] [-crl_check]");
 | 
			
		||||
		BIO_printf(bio_err," [-attime timestamp]");
 | 
			
		||||
#ifndef OPENSSL_NO_ENGINE
 | 
			
		||||
		BIO_printf(bio_err," [-engine e]");
 | 
			
		||||
#endif
 | 
			
		||||
@@ -244,16 +259,6 @@ end:
 | 
			
		||||
				   X509_PURPOSE_get0_sname(ptmp),
 | 
			
		||||
				   X509_PURPOSE_get0_name(ptmp));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		BIO_printf(bio_err,"recognized verify names:\n");
 | 
			
		||||
		for(i = 0; i < X509_VERIFY_PARAM_get_count(); i++)
 | 
			
		||||
			{
 | 
			
		||||
			const X509_VERIFY_PARAM *vptmp;
 | 
			
		||||
			vptmp = X509_VERIFY_PARAM_get0(i);
 | 
			
		||||
			BIO_printf(bio_err, "\t%-10s\n",
 | 
			
		||||
					X509_VERIFY_PARAM_get0_name(vptmp));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	if (vpm) X509_VERIFY_PARAM_free(vpm);
 | 
			
		||||
	if (cert_ctx != NULL) X509_STORE_free(cert_ctx);
 | 
			
		||||
@@ -261,7 +266,7 @@ end:
 | 
			
		||||
	sk_X509_pop_free(trusted, X509_free);
 | 
			
		||||
	sk_X509_CRL_pop_free(crls, X509_CRL_free);
 | 
			
		||||
	apps_shutdown();
 | 
			
		||||
	OPENSSL_EXIT(ret);
 | 
			
		||||
	OPENSSL_EXIT(ret < 0 ? 2 : ret);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static int check(X509_STORE *ctx, char *file,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										47
									
								
								apps/x509.c
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								apps/x509.c
									
									
									
									
									
								
							@@ -150,6 +150,9 @@ static const char *x509_usage[]={
 | 
			
		||||
" -engine e       - use engine e, possibly a hardware device.\n",
 | 
			
		||||
#endif
 | 
			
		||||
" -certopt arg    - various certificate text options\n",
 | 
			
		||||
" -checkhost host - check certificate matches \"host\"\n",
 | 
			
		||||
" -checkemail email - check certificate matches \"email\"\n",
 | 
			
		||||
" -checkip ipaddr - check certificate matches \"ipaddr\"\n",
 | 
			
		||||
NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -163,6 +166,9 @@ static int x509_certify (X509_STORE *ctx,char *CAfile,const EVP_MD *digest,
 | 
			
		||||
			 CONF *conf, char *section, ASN1_INTEGER *sno);
 | 
			
		||||
static int purpose_print(BIO *bio, X509 *cert, X509_PURPOSE *pt);
 | 
			
		||||
static int reqfile=0;
 | 
			
		||||
#ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
 | 
			
		||||
static int force_version=2;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int MAIN(int, char **);
 | 
			
		||||
 | 
			
		||||
@@ -176,7 +182,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	STACK_OF(OPENSSL_STRING) *sigopts = NULL;
 | 
			
		||||
	EVP_PKEY *Upkey=NULL,*CApkey=NULL, *fkey = NULL;
 | 
			
		||||
	ASN1_INTEGER *sno = NULL;
 | 
			
		||||
	int i,num,badops=0;
 | 
			
		||||
	int i,num,badops=0, badsig=0;
 | 
			
		||||
	BIO *out=NULL;
 | 
			
		||||
	BIO *STDout=NULL;
 | 
			
		||||
	STACK_OF(ASN1_OBJECT) *trust = NULL, *reject = NULL;
 | 
			
		||||
@@ -208,6 +214,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
	int need_rand = 0;
 | 
			
		||||
	int checkend=0,checkoffset=0;
 | 
			
		||||
	unsigned long nmflag = 0, certflag = 0;
 | 
			
		||||
	unsigned char *checkhost = NULL, *checkemail = NULL;
 | 
			
		||||
	char *checkip = NULL;
 | 
			
		||||
#ifndef OPENSSL_NO_ENGINE
 | 
			
		||||
	char *engine=NULL;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -283,6 +291,13 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, *(++argv)))
 | 
			
		||||
				goto bad;
 | 
			
		||||
			}
 | 
			
		||||
#ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
 | 
			
		||||
		else if (strcmp(*argv,"-force_version") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			force_version=atoi(*(++argv)) - 1;
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
		else if (strcmp(*argv,"-days") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
@@ -456,6 +471,21 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
			checkoffset=atoi(*(++argv));
 | 
			
		||||
			checkend=1;
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-checkhost") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			checkhost=(unsigned char *)*(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-checkemail") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			checkemail=(unsigned char *)*(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-checkip") == 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (--argc < 1) goto bad;
 | 
			
		||||
			checkip=*(++argv);
 | 
			
		||||
			}
 | 
			
		||||
		else if (strcmp(*argv,"-noout") == 0)
 | 
			
		||||
			noout= ++num;
 | 
			
		||||
		else if (strcmp(*argv,"-trustout") == 0)
 | 
			
		||||
@@ -479,6 +509,8 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
#endif
 | 
			
		||||
		else if (strcmp(*argv,"-ocspid") == 0)
 | 
			
		||||
			ocspid= ++num;
 | 
			
		||||
		else if (strcmp(*argv,"-badsig") == 0)
 | 
			
		||||
			badsig = 1;
 | 
			
		||||
		else if ((md_alg=EVP_get_digestbyname(*argv + 1)))
 | 
			
		||||
			{
 | 
			
		||||
			/* ok */
 | 
			
		||||
@@ -1061,12 +1093,17 @@ bad:
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	print_cert_checks(STDout, x, checkhost, checkemail, checkip);
 | 
			
		||||
 | 
			
		||||
	if (noout)
 | 
			
		||||
		{
 | 
			
		||||
		ret=0;
 | 
			
		||||
		goto end;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (badsig)
 | 
			
		||||
		x->signature->data[x->signature->length - 1] ^= 0x1;
 | 
			
		||||
 | 
			
		||||
	if 	(outformat == FORMAT_ASN1)
 | 
			
		||||
		i=i2d_X509_bio(out,x);
 | 
			
		||||
	else if (outformat == FORMAT_PEM)
 | 
			
		||||
@@ -1220,7 +1257,11 @@ static int x509_certify(X509_STORE *ctx, char *CAfile, const EVP_MD *digest,
 | 
			
		||||
	if (conf)
 | 
			
		||||
		{
 | 
			
		||||
		X509V3_CTX ctx2;
 | 
			
		||||
#ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
 | 
			
		||||
		X509_set_version(x, force_version);
 | 
			
		||||
#else
 | 
			
		||||
		X509_set_version(x,2); /* version 3 certificate */
 | 
			
		||||
#endif
 | 
			
		||||
                X509V3_set_ctx(&ctx2, xca, x, NULL, NULL, 0);
 | 
			
		||||
                X509V3_set_nconf(&ctx2, conf);
 | 
			
		||||
                if (!X509V3_EXT_add_nconf(conf, &ctx2, section, x)) goto end;
 | 
			
		||||
@@ -1298,7 +1339,11 @@ static int sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *dig
 | 
			
		||||
	if (conf)
 | 
			
		||||
		{
 | 
			
		||||
		X509V3_CTX ctx;
 | 
			
		||||
#ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
 | 
			
		||||
		X509_set_version(x, force_version);
 | 
			
		||||
#else
 | 
			
		||||
		X509_set_version(x,2); /* version 3 certificate */
 | 
			
		||||
#endif
 | 
			
		||||
                X509V3_set_ctx(&ctx, x, x, NULL, NULL, 0);
 | 
			
		||||
                X509V3_set_nconf(&ctx, conf);
 | 
			
		||||
                if (!X509V3_EXT_add_nconf(conf, &ctx, section, x)) goto err;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								config
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								config
									
									
									
									
									
								
							@@ -587,15 +587,33 @@ case "$GUESSOS" in
 | 
			
		||||
	fi
 | 
			
		||||
	;;
 | 
			
		||||
  ppc64-*-linux2)
 | 
			
		||||
	if [ -z "$KERNEL_BITS" ]; then
 | 
			
		||||
	    echo "WARNING! If you wish to build 64-bit library, then you have to"
 | 
			
		||||
	    echo "         invoke './Configure linux-ppc64' *manually*."
 | 
			
		||||
	    if [ "$TEST" = "false" -a -t 1 ]; then
 | 
			
		||||
		echo "         You have about 5 seconds to press Ctrl-C to abort."
 | 
			
		||||
		(trap "stty `stty -g`" 2 0; stty -icanon min 0 time 50; read waste) <&1
 | 
			
		||||
	    fi
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "$KERNEL_BITS" = "64" ]; then
 | 
			
		||||
	    OUT="linux-ppc64"
 | 
			
		||||
	else
 | 
			
		||||
	    OUT="linux-ppc"
 | 
			
		||||
	    (echo "__LP64__" | gcc -E -x c - 2>/dev/null | grep "^__LP64__" 2>&1 > /dev/null) || options="$options -m32"
 | 
			
		||||
	fi
 | 
			
		||||
	;;
 | 
			
		||||
  ppc64le-*-linux2) OUT="linux-ppc64le" ;;
 | 
			
		||||
  ppc-*-linux2) OUT="linux-ppc" ;;
 | 
			
		||||
  mips64*-*-linux2)
 | 
			
		||||
	echo "WARNING! If you wish to build 64-bit library, then you have to"
 | 
			
		||||
	echo "         invoke './Configure linux64-mips64' *manually*."
 | 
			
		||||
	if [ "$TEST" = "false" -a -t 1 ]; then
 | 
			
		||||
	    echo "         You have about 5 seconds to press Ctrl-C to abort."
 | 
			
		||||
	    (trap "stty `stty -g`" 2 0; stty -icanon min 0 time 50; read waste) <&1
 | 
			
		||||
	fi
 | 
			
		||||
	OUT="linux-mips64"
 | 
			
		||||
	;;
 | 
			
		||||
  mips*-*-linux2) OUT="linux-mips32" ;;
 | 
			
		||||
  ppc60x-*-vxworks*) OUT="vxworks-ppc60x" ;;
 | 
			
		||||
  ppcgen-*-vxworks*) OUT="vxworks-ppcgen" ;;
 | 
			
		||||
  pentium-*-vxworks*) OUT="vxworks-pentium" ;;
 | 
			
		||||
@@ -644,6 +662,7 @@ case "$GUESSOS" in
 | 
			
		||||
  armv[1-3]*-*-linux2) OUT="linux-generic32" ;;
 | 
			
		||||
  armv[7-9]*-*-linux2) OUT="linux-armv4"; options="$options -march=armv7-a" ;;
 | 
			
		||||
  arm*-*-linux2) OUT="linux-armv4" ;;
 | 
			
		||||
  aarch64-*-linux2) OUT="linux-generic64" ;;
 | 
			
		||||
  sh*b-*-linux2) OUT="linux-generic32"; options="$options -DB_ENDIAN" ;;
 | 
			
		||||
  sh*-*-linux2)  OUT="linux-generic32"; options="$options -DL_ENDIAN" ;;
 | 
			
		||||
  m68k*-*-linux2) OUT="linux-generic32"; options="$options -DB_ENDIAN" ;;
 | 
			
		||||
@@ -739,7 +758,7 @@ case "$GUESSOS" in
 | 
			
		||||
			    libc=/usr/lib/libc.so
 | 
			
		||||
			else					# OpenBSD
 | 
			
		||||
			    # ld searches for highest libc.so.* and so do we
 | 
			
		||||
			    libc=`(ls /usr/lib/libc.so.* | tail -1) 2>/dev/null`
 | 
			
		||||
			    libc=`(ls /usr/lib/libc.so.* /lib/libc.so.* | tail -1) 2>/dev/null`
 | 
			
		||||
			fi
 | 
			
		||||
			case "`(file -L $libc) 2>/dev/null`" in
 | 
			
		||||
			*ELF*)	OUT="BSD-x86-elf" ;;
 | 
			
		||||
@@ -857,10 +876,6 @@ esac
 | 
			
		||||
#  options="$options -DATALLA"
 | 
			
		||||
#fi
 | 
			
		||||
 | 
			
		||||
if [ -n "$CONFIG_OPTIONS" ]; then
 | 
			
		||||
  options="$options $CONFIG_OPTIONS"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if expr "$options" : '.*no\-asm' > /dev/null; then :; else
 | 
			
		||||
  sh -c "$CROSS_COMPILE${CC:-gcc} -Wa,--help -c -o /tmp/null.$$.o -x assembler /dev/null && rm /tmp/null.$$.o" 2>&1 | \
 | 
			
		||||
  grep \\--noexecstack >/dev/null && \
 | 
			
		||||
 
 | 
			
		||||
@@ -35,11 +35,9 @@ GENERAL=Makefile README crypto-lib.com install.com
 | 
			
		||||
LIB= $(TOP)/libcrypto.a
 | 
			
		||||
SHARED_LIB= libcrypto$(SHLIB_EXT)
 | 
			
		||||
LIBSRC=	cryptlib.c mem.c mem_clr.c mem_dbg.c cversion.c ex_data.c cpt_err.c \
 | 
			
		||||
	ebcdic.c uid.c o_time.c o_str.c o_dir.c thr_id.c lock.c fips_ers.c \
 | 
			
		||||
	o_init.c o_fips.c
 | 
			
		||||
LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o cpt_err.o \
 | 
			
		||||
	ebcdic.o uid.o o_time.o o_str.o o_dir.o thr_id.o lock.o fips_ers.o \
 | 
			
		||||
	o_init.o o_fips.o $(CPUID_OBJ)
 | 
			
		||||
	ebcdic.c uid.c o_time.c o_str.c o_dir.c o_fips.c o_init.c fips_ers.c
 | 
			
		||||
LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o cpt_err.o ebcdic.o \
 | 
			
		||||
	uid.o o_time.o o_str.o o_dir.o o_fips.o o_init.o fips_ers.o $(CPUID_OBJ)
 | 
			
		||||
 | 
			
		||||
SRC= $(LIBSRC)
 | 
			
		||||
 | 
			
		||||
@@ -54,13 +52,6 @@ top:
 | 
			
		||||
 | 
			
		||||
all: shared
 | 
			
		||||
 | 
			
		||||
fips: cryptlib.o thr_id.o uid.o $(CPUID_OBJ)
 | 
			
		||||
	[ -n "$(SDIRS)" ] && for i in $(SDIRS) ; do \
 | 
			
		||||
		    ( obj=`$(PERL) $(TOP)/util/fipsobj.pl $$i` && \
 | 
			
		||||
			cd $$i && echo "making fips in $(DIR)/$$i..." && \
 | 
			
		||||
		    $(MAKE) -e TOP=../.. DIR=$$i INCLUDES='$(INCLUDES)' $$obj ) || exit 1; \
 | 
			
		||||
		done;
 | 
			
		||||
 | 
			
		||||
buildinf.h: ../Makefile
 | 
			
		||||
	( echo "#ifndef MK1MF_BUILD"; \
 | 
			
		||||
	echo '  /* auto-generated by crypto/Makefile for crypto/cversion.c */'; \
 | 
			
		||||
@@ -86,13 +77,21 @@ ia64cpuid.s:	ia64cpuid.S;	$(CC) $(CFLAGS) -E ia64cpuid.S > $@
 | 
			
		||||
ppccpuid.s:	ppccpuid.pl;	$(PERL) ppccpuid.pl $(PERLASM_SCHEME) $@
 | 
			
		||||
pariscid.s:	pariscid.pl;	$(PERL) pariscid.pl $(PERLASM_SCHEME) $@
 | 
			
		||||
alphacpuid.s:	alphacpuid.pl
 | 
			
		||||
	$(PERL) $< | $(CC) -E - | tee $@ > /dev/null
 | 
			
		||||
	(preproc=/tmp/$$$$.$@; trap "rm $$preproc" INT; \
 | 
			
		||||
	$(PERL) alphacpuid.pl > $$preproc && \
 | 
			
		||||
	$(CC) -E $$preproc > $@ && rm $$preproc)
 | 
			
		||||
 | 
			
		||||
testapps:
 | 
			
		||||
	[ -z "$(THIS)" ] || (	if echo $(SDIRS) | fgrep ' des '; \
 | 
			
		||||
				then cd des && $(MAKE) -e des; fi )
 | 
			
		||||
	[ -z "$(THIS)" ] || ( cd pkcs7 && $(MAKE) -e testapps );
 | 
			
		||||
	@if [ -z "$(THIS)" ]; then $(MAKE) -f $(TOP)/Makefile reflect THIS=$@; fi
 | 
			
		||||
 | 
			
		||||
subdirs:
 | 
			
		||||
	@target=all; $(RECURSIVE_MAKE)
 | 
			
		||||
 | 
			
		||||
files:
 | 
			
		||||
	$(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO
 | 
			
		||||
	$(PERL) $(TOP)/util/files.pl "CPUID_OBJ=$(CPUID_OBJ)" Makefile >> $(TOP)/MINFO
 | 
			
		||||
	@target=files; $(RECURSIVE_MAKE)
 | 
			
		||||
 | 
			
		||||
links:
 | 
			
		||||
@@ -105,7 +104,8 @@ links:
 | 
			
		||||
lib:	$(LIB)
 | 
			
		||||
	@touch lib
 | 
			
		||||
$(LIB):	$(LIBOBJ)
 | 
			
		||||
	$(ARX) $(LIB) $(LIBOBJ)
 | 
			
		||||
	$(AR) $(LIB) $(LIBOBJ)
 | 
			
		||||
	[ -z "$(FIPSLIBDIR)" ] || $(AR) $(LIB) $(FIPSLIBDIR)fipscanister.o
 | 
			
		||||
	$(RANLIB) $(LIB) || echo Never mind.
 | 
			
		||||
 | 
			
		||||
shared: buildinf.h lib subdirs
 | 
			
		||||
@@ -176,13 +176,6 @@ ex_data.o: ../include/openssl/ossl_typ.h ../include/openssl/safestack.h
 | 
			
		||||
ex_data.o: ../include/openssl/stack.h ../include/openssl/symhacks.h cryptlib.h
 | 
			
		||||
ex_data.o: ex_data.c
 | 
			
		||||
fips_ers.o: ../include/openssl/opensslconf.h fips_ers.c
 | 
			
		||||
lock.o: ../e_os.h ../include/openssl/bio.h ../include/openssl/buffer.h
 | 
			
		||||
lock.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h
 | 
			
		||||
lock.o: ../include/openssl/err.h ../include/openssl/lhash.h
 | 
			
		||||
lock.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
lock.o: ../include/openssl/ossl_typ.h ../include/openssl/safestack.h
 | 
			
		||||
lock.o: ../include/openssl/stack.h ../include/openssl/symhacks.h cryptlib.h
 | 
			
		||||
lock.o: lock.c
 | 
			
		||||
mem.o: ../e_os.h ../include/openssl/bio.h ../include/openssl/buffer.h
 | 
			
		||||
mem.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h
 | 
			
		||||
mem.o: ../include/openssl/err.h ../include/openssl/lhash.h
 | 
			
		||||
@@ -220,13 +213,6 @@ o_str.o: ../e_os.h ../include/openssl/e_os2.h ../include/openssl/opensslconf.h
 | 
			
		||||
o_str.o: o_str.c o_str.h
 | 
			
		||||
o_time.o: ../include/openssl/e_os2.h ../include/openssl/opensslconf.h o_time.c
 | 
			
		||||
o_time.o: o_time.h
 | 
			
		||||
thr_id.o: ../e_os.h ../include/openssl/bio.h ../include/openssl/buffer.h
 | 
			
		||||
thr_id.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h
 | 
			
		||||
thr_id.o: ../include/openssl/err.h ../include/openssl/lhash.h
 | 
			
		||||
thr_id.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
thr_id.o: ../include/openssl/ossl_typ.h ../include/openssl/safestack.h
 | 
			
		||||
thr_id.o: ../include/openssl/stack.h ../include/openssl/symhacks.h cryptlib.h
 | 
			
		||||
thr_id.o: thr_id.c
 | 
			
		||||
uid.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h
 | 
			
		||||
uid.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
 | 
			
		||||
uid.o: ../include/openssl/ossl_typ.h ../include/openssl/safestack.h
 | 
			
		||||
 
 | 
			
		||||
@@ -3,3 +3,6 @@ Makefile.save
 | 
			
		||||
*.flc
 | 
			
		||||
semantic.cache
 | 
			
		||||
aes-*.s
 | 
			
		||||
aesni-*.s
 | 
			
		||||
bsaes-*.s
 | 
			
		||||
vpaes-*.s
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,8 @@ APPS=
 | 
			
		||||
 | 
			
		||||
LIB=$(TOP)/libcrypto.a
 | 
			
		||||
LIBSRC=aes_core.c aes_misc.c aes_ecb.c aes_cbc.c aes_cfb.c aes_ofb.c \
 | 
			
		||||
       aes_ige.c aes_wrap.c
 | 
			
		||||
LIBOBJ=aes_misc.o aes_ecb.o aes_cfb.o aes_ofb.o aes_ige.o aes_wrap.o \
 | 
			
		||||
       aes_ctr.c aes_ige.c aes_wrap.c
 | 
			
		||||
LIBOBJ=aes_misc.o aes_ecb.o aes_cfb.o aes_ofb.o aes_ctr.o aes_ige.o aes_wrap.o \
 | 
			
		||||
       $(AES_ENC)
 | 
			
		||||
 | 
			
		||||
SRC= $(LIBSRC)
 | 
			
		||||
@@ -41,7 +41,7 @@ top:
 | 
			
		||||
all:	lib
 | 
			
		||||
 | 
			
		||||
lib:	$(LIBOBJ)
 | 
			
		||||
	$(ARX) $(LIB) $(LIBOBJ)
 | 
			
		||||
	$(AR) $(LIB) $(LIBOBJ)
 | 
			
		||||
	$(RANLIB) $(LIB) || echo Never mind.
 | 
			
		||||
	@touch lib
 | 
			
		||||
 | 
			
		||||
@@ -65,12 +65,20 @@ aesni-x86_64.s: asm/aesni-x86_64.pl
 | 
			
		||||
	$(PERL) asm/aesni-x86_64.pl $(PERLASM_SCHEME) > $@
 | 
			
		||||
aesni-sha1-x86_64.s:	asm/aesni-sha1-x86_64.pl
 | 
			
		||||
	$(PERL) asm/aesni-sha1-x86_64.pl $(PERLASM_SCHEME) > $@
 | 
			
		||||
aesni-sha256-x86_64.s:	asm/aesni-sha256-x86_64.pl
 | 
			
		||||
	$(PERL) asm/aesni-sha256-x86_64.pl $(PERLASM_SCHEME) > $@
 | 
			
		||||
aesni-mb-x86_64.s:	asm/aesni-mb-x86_64.pl
 | 
			
		||||
	$(PERL) asm/aesni-mb-x86_64.pl $(PERLASM_SCHEME) > $@
 | 
			
		||||
 | 
			
		||||
aes-sparcv9.s: asm/aes-sparcv9.pl
 | 
			
		||||
	$(PERL) asm/aes-sparcv9.pl $(CFLAGS) > $@
 | 
			
		||||
aest4-sparcv9.s: asm/aest4-sparcv9.pl
 | 
			
		||||
	$(PERL) asm/aest4-sparcv9.pl $(CFLAGS) > $@
 | 
			
		||||
 | 
			
		||||
aes-ppc.s:	asm/aes-ppc.pl
 | 
			
		||||
	$(PERL) asm/aes-ppc.pl $(PERLASM_SCHEME) $@
 | 
			
		||||
vpaes-ppc.s:	asm/vpaes-ppc.pl
 | 
			
		||||
	$(PERL) asm/vpaes-ppc.pl $(PERLASM_SCHEME) $@
 | 
			
		||||
 | 
			
		||||
aes-parisc.s:	asm/aes-parisc.pl
 | 
			
		||||
	$(PERL) asm/aes-parisc.pl $(PERLASM_SCHEME) $@
 | 
			
		||||
@@ -79,11 +87,13 @@ aes-mips.S:	asm/aes-mips.pl
 | 
			
		||||
	$(PERL) asm/aes-mips.pl $(PERLASM_SCHEME) $@
 | 
			
		||||
 | 
			
		||||
# GNU make "catch all"
 | 
			
		||||
aes-%.S:	asm/aes-%.pl;	$(PERL) $< $(PERLASM_SCHEME) $@
 | 
			
		||||
aes-%.S:	asm/aes-%.pl;	$(PERL) $< $(PERLASM_SCHEME) > $@
 | 
			
		||||
aes-armv4.o:	aes-armv4.S
 | 
			
		||||
bsaes-%.S:	asm/bsaes-%.pl;	$(PERL) $< $(PERLASM_SCHEME) $@
 | 
			
		||||
bsaes-armv7.o:	bsaes-armv7.S
 | 
			
		||||
 | 
			
		||||
files:
 | 
			
		||||
	$(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO
 | 
			
		||||
	$(PERL) $(TOP)/util/files.pl "AES_ENC=$(AES_ENC)" Makefile >> $(TOP)/MINFO
 | 
			
		||||
 | 
			
		||||
links:
 | 
			
		||||
	@$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
 | 
			
		||||
@@ -119,28 +129,16 @@ clean:
 | 
			
		||||
 | 
			
		||||
# DO NOT DELETE THIS LINE -- make depend depends on it.
 | 
			
		||||
 | 
			
		||||
aes_cbc.o: ../../include/openssl/aes.h ../../include/openssl/crypto.h
 | 
			
		||||
aes_cbc.o: ../../include/openssl/e_os2.h ../../include/openssl/modes.h
 | 
			
		||||
aes_cbc.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
 | 
			
		||||
aes_cbc.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
 | 
			
		||||
aes_cbc.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
 | 
			
		||||
aes_cbc.o: aes_cbc.c
 | 
			
		||||
aes_cfb.o: ../../include/openssl/aes.h ../../include/openssl/crypto.h
 | 
			
		||||
aes_cfb.o: ../../include/openssl/e_os2.h ../../include/openssl/modes.h
 | 
			
		||||
aes_cfb.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
 | 
			
		||||
aes_cfb.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
 | 
			
		||||
aes_cfb.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
 | 
			
		||||
aes_cfb.o: aes_cfb.c
 | 
			
		||||
aes_core.o: ../../include/openssl/aes.h ../../include/openssl/crypto.h
 | 
			
		||||
aes_core.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h
 | 
			
		||||
aes_core.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
 | 
			
		||||
aes_core.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
 | 
			
		||||
aes_core.o: ../../include/openssl/symhacks.h aes_core.c aes_locl.h
 | 
			
		||||
aes_ecb.o: ../../include/openssl/aes.h ../../include/openssl/crypto.h
 | 
			
		||||
aes_ecb.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h
 | 
			
		||||
aes_ecb.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
 | 
			
		||||
aes_ecb.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
 | 
			
		||||
aes_ecb.o: ../../include/openssl/symhacks.h aes_ecb.c aes_locl.h
 | 
			
		||||
aes_cbc.o: ../../include/openssl/aes.h ../../include/openssl/modes.h
 | 
			
		||||
aes_cbc.o: ../../include/openssl/opensslconf.h aes_cbc.c
 | 
			
		||||
aes_cfb.o: ../../include/openssl/aes.h ../../include/openssl/modes.h
 | 
			
		||||
aes_cfb.o: ../../include/openssl/opensslconf.h aes_cfb.c
 | 
			
		||||
aes_core.o: ../../include/openssl/aes.h ../../include/openssl/e_os2.h
 | 
			
		||||
aes_core.o: ../../include/openssl/opensslconf.h aes_core.c aes_locl.h
 | 
			
		||||
aes_ctr.o: ../../include/openssl/aes.h ../../include/openssl/modes.h
 | 
			
		||||
aes_ctr.o: ../../include/openssl/opensslconf.h aes_ctr.c
 | 
			
		||||
aes_ecb.o: ../../include/openssl/aes.h ../../include/openssl/e_os2.h
 | 
			
		||||
aes_ecb.o: ../../include/openssl/opensslconf.h aes_ecb.c aes_locl.h
 | 
			
		||||
aes_ige.o: ../../e_os.h ../../include/openssl/aes.h ../../include/openssl/bio.h
 | 
			
		||||
aes_ige.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
 | 
			
		||||
aes_ige.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
 | 
			
		||||
@@ -148,20 +146,18 @@ aes_ige.o: ../../include/openssl/lhash.h ../../include/openssl/opensslconf.h
 | 
			
		||||
aes_ige.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
 | 
			
		||||
aes_ige.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
 | 
			
		||||
aes_ige.o: ../../include/openssl/symhacks.h ../cryptlib.h aes_ige.c aes_locl.h
 | 
			
		||||
aes_misc.o: ../../include/openssl/aes.h ../../include/openssl/e_os2.h
 | 
			
		||||
aes_misc.o: ../../include/openssl/opensslconf.h
 | 
			
		||||
aes_misc.o: ../../include/openssl/opensslv.h aes_locl.h aes_misc.c
 | 
			
		||||
aes_ofb.o: ../../include/openssl/aes.h ../../include/openssl/crypto.h
 | 
			
		||||
aes_ofb.o: ../../include/openssl/e_os2.h ../../include/openssl/modes.h
 | 
			
		||||
aes_ofb.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
 | 
			
		||||
aes_ofb.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
 | 
			
		||||
aes_ofb.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
 | 
			
		||||
aes_ofb.o: aes_ofb.c
 | 
			
		||||
aes_misc.o: ../../include/openssl/aes.h ../../include/openssl/crypto.h
 | 
			
		||||
aes_misc.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h
 | 
			
		||||
aes_misc.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
 | 
			
		||||
aes_misc.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
 | 
			
		||||
aes_misc.o: ../../include/openssl/symhacks.h aes_locl.h aes_misc.c
 | 
			
		||||
aes_ofb.o: ../../include/openssl/aes.h ../../include/openssl/modes.h
 | 
			
		||||
aes_ofb.o: ../../include/openssl/opensslconf.h aes_ofb.c
 | 
			
		||||
aes_wrap.o: ../../e_os.h ../../include/openssl/aes.h
 | 
			
		||||
aes_wrap.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
 | 
			
		||||
aes_wrap.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
 | 
			
		||||
aes_wrap.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
 | 
			
		||||
aes_wrap.o: ../../include/openssl/opensslconf.h
 | 
			
		||||
aes_wrap.o: ../../include/openssl/modes.h ../../include/openssl/opensslconf.h
 | 
			
		||||
aes_wrap.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
 | 
			
		||||
aes_wrap.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
 | 
			
		||||
aes_wrap.o: ../../include/openssl/symhacks.h ../cryptlib.h aes_wrap.c
 | 
			
		||||
 
 | 
			
		||||
@@ -90,6 +90,11 @@ int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
	AES_KEY *key);
 | 
			
		||||
 | 
			
		||||
int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
	AES_KEY *key);
 | 
			
		||||
int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
	AES_KEY *key);
 | 
			
		||||
 | 
			
		||||
void AES_encrypt(const unsigned char *in, unsigned char *out,
 | 
			
		||||
	const AES_KEY *key);
 | 
			
		||||
void AES_decrypt(const unsigned char *in, unsigned char *out,
 | 
			
		||||
@@ -112,13 +117,11 @@ void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,
 | 
			
		||||
void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out,
 | 
			
		||||
	size_t length, const AES_KEY *key,
 | 
			
		||||
	unsigned char *ivec, int *num);
 | 
			
		||||
#if 0
 | 
			
		||||
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
 | 
			
		||||
	size_t length, const AES_KEY *key,
 | 
			
		||||
	unsigned char ivec[AES_BLOCK_SIZE],
 | 
			
		||||
	unsigned char ecount_buf[AES_BLOCK_SIZE],
 | 
			
		||||
	unsigned int *num);
 | 
			
		||||
#endif
 | 
			
		||||
/* NB: the IV is _two_ blocks long */
 | 
			
		||||
void AES_ige_encrypt(const unsigned char *in, unsigned char *out,
 | 
			
		||||
		     size_t length, const AES_KEY *key,
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,6 @@
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <openssl/crypto.h>
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include <openssl/modes.h>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,6 @@
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <openssl/crypto.h>
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include <openssl/modes.h>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,6 @@
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <openssl/crypto.h>
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include "aes_locl.h"
 | 
			
		||||
 | 
			
		||||
@@ -54,7 +53,6 @@ Td3[x] = Si[x].[09, 0d, 0b, 0e];
 | 
			
		||||
Td4[x] = Si[x].[01];
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 Te0[256] = {
 | 
			
		||||
    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
 | 
			
		||||
    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
 | 
			
		||||
@@ -121,7 +119,6 @@ static const u32 Te0[256] = {
 | 
			
		||||
    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
 | 
			
		||||
    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
 | 
			
		||||
};
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 Te1[256] = {
 | 
			
		||||
    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
 | 
			
		||||
    0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
 | 
			
		||||
@@ -188,7 +185,6 @@ static const u32 Te1[256] = {
 | 
			
		||||
    0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
 | 
			
		||||
    0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
 | 
			
		||||
};
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 Te2[256] = {
 | 
			
		||||
    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
 | 
			
		||||
    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
 | 
			
		||||
@@ -255,7 +251,6 @@ static const u32 Te2[256] = {
 | 
			
		||||
    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
 | 
			
		||||
    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
 | 
			
		||||
};
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 Te3[256] = {
 | 
			
		||||
    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
 | 
			
		||||
    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
 | 
			
		||||
@@ -323,7 +318,6 @@ static const u32 Te3[256] = {
 | 
			
		||||
    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 Td0[256] = {
 | 
			
		||||
    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
 | 
			
		||||
    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
 | 
			
		||||
@@ -390,7 +384,6 @@ static const u32 Td0[256] = {
 | 
			
		||||
    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
 | 
			
		||||
    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
 | 
			
		||||
};
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 Td1[256] = {
 | 
			
		||||
    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
 | 
			
		||||
    0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
 | 
			
		||||
@@ -457,7 +450,6 @@ static const u32 Td1[256] = {
 | 
			
		||||
    0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
 | 
			
		||||
    0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
 | 
			
		||||
};
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 Td2[256] = {
 | 
			
		||||
    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
 | 
			
		||||
    0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
 | 
			
		||||
@@ -524,7 +516,6 @@ static const u32 Td2[256] = {
 | 
			
		||||
    0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
 | 
			
		||||
    0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
 | 
			
		||||
};
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 Td3[256] = {
 | 
			
		||||
    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
 | 
			
		||||
    0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
 | 
			
		||||
@@ -591,7 +582,6 @@ static const u32 Td3[256] = {
 | 
			
		||||
    0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
 | 
			
		||||
    0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
 | 
			
		||||
};
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u8 Td4[256] = {
 | 
			
		||||
    0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
 | 
			
		||||
    0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
 | 
			
		||||
@@ -626,7 +616,6 @@ static const u8 Td4[256] = {
 | 
			
		||||
    0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
 | 
			
		||||
    0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
 | 
			
		||||
};
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const u32 rcon[] = {
 | 
			
		||||
	0x01000000, 0x02000000, 0x04000000, 0x08000000,
 | 
			
		||||
	0x10000000, 0x20000000, 0x40000000, 0x80000000,
 | 
			
		||||
@@ -636,7 +625,7 @@ static const u32 rcon[] = {
 | 
			
		||||
/**
 | 
			
		||||
 * Expand the cipher key into the encryption key schedule.
 | 
			
		||||
 */
 | 
			
		||||
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
			AES_KEY *key) {
 | 
			
		||||
 | 
			
		||||
	u32 *rk;
 | 
			
		||||
@@ -737,7 +726,7 @@ int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
/**
 | 
			
		||||
 * Expand the cipher key into the decryption key schedule.
 | 
			
		||||
 */
 | 
			
		||||
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
			 AES_KEY *key) {
 | 
			
		||||
 | 
			
		||||
        u32 *rk;
 | 
			
		||||
@@ -745,7 +734,7 @@ int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
	u32 temp;
 | 
			
		||||
 | 
			
		||||
	/* first, start with an encryption schedule */
 | 
			
		||||
	status = AES_set_encrypt_key(userKey, bits, key);
 | 
			
		||||
	status = private_AES_set_encrypt_key(userKey, bits, key);
 | 
			
		||||
	if (status < 0)
 | 
			
		||||
		return status;
 | 
			
		||||
 | 
			
		||||
@@ -1212,7 +1201,7 @@ static const u32 rcon[] = {
 | 
			
		||||
/**
 | 
			
		||||
 * Expand the cipher key into the encryption key schedule.
 | 
			
		||||
 */
 | 
			
		||||
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
			AES_KEY *key) {
 | 
			
		||||
	u32 *rk;
 | 
			
		||||
   	int i = 0;
 | 
			
		||||
@@ -1312,7 +1301,7 @@ int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
/**
 | 
			
		||||
 * Expand the cipher key into the decryption key schedule.
 | 
			
		||||
 */
 | 
			
		||||
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
			 AES_KEY *key) {
 | 
			
		||||
 | 
			
		||||
        u32 *rk;
 | 
			
		||||
@@ -1320,7 +1309,7 @@ int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
	u32 temp;
 | 
			
		||||
 | 
			
		||||
	/* first, start with an encryption schedule */
 | 
			
		||||
	status = AES_set_encrypt_key(userKey, bits, key);
 | 
			
		||||
	status = private_AES_set_encrypt_key(userKey, bits, key);
 | 
			
		||||
	if (status < 0)
 | 
			
		||||
		return status;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
/* crypto/aes/aes_ctr.c -*- mode:C; c-file-style: "eay" -*- */
 | 
			
		||||
/* ====================================================================
 | 
			
		||||
 * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
 | 
			
		||||
 * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
@@ -44,51 +45,17 @@
 | 
			
		||||
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 | 
			
		||||
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 * ====================================================================
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define OPENSSL_FIPSAPI
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include <openssl/modes.h>
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <openssl/err.h>
 | 
			
		||||
#include <openssl/fips.h>
 | 
			
		||||
#include <openssl/evp.h>
 | 
			
		||||
#include <openssl/sha.h>
 | 
			
		||||
 | 
			
		||||
#ifdef OPENSSL_FIPS
 | 
			
		||||
static const unsigned char test[][60]=
 | 
			
		||||
    {
 | 
			
		||||
    "",
 | 
			
		||||
    "abc",
 | 
			
		||||
    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
__fips_constseg
 | 
			
		||||
static const unsigned char ret[][SHA_DIGEST_LENGTH]=
 | 
			
		||||
    {
 | 
			
		||||
    { 0xda,0x39,0xa3,0xee,0x5e,0x6b,0x4b,0x0d,0x32,0x55,
 | 
			
		||||
      0xbf,0xef,0x95,0x60,0x18,0x90,0xaf,0xd8,0x07,0x09 },
 | 
			
		||||
    { 0xa9,0x99,0x3e,0x36,0x47,0x06,0x81,0x6a,0xba,0x3e,
 | 
			
		||||
      0x25,0x71,0x78,0x50,0xc2,0x6c,0x9c,0xd0,0xd8,0x9d },
 | 
			
		||||
    { 0x84,0x98,0x3e,0x44,0x1c,0x3b,0xd2,0x6e,0xba,0xae,
 | 
			
		||||
      0x4a,0xa1,0xf9,0x51,0x29,0xe5,0xe5,0x46,0x70,0xf1 },
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
int FIPS_selftest_sha1()
 | 
			
		||||
	{
 | 
			
		||||
	int rv = 1;
 | 
			
		||||
	size_t i;
 | 
			
		||||
	
 | 
			
		||||
	for(i=0 ; i <sizeof(test)/sizeof(test[0]) ; i++)
 | 
			
		||||
		{
 | 
			
		||||
		if (!fips_pkey_signature_test(FIPS_TEST_DIGEST, NULL,
 | 
			
		||||
						test[i], 0,
 | 
			
		||||
						ret[i], 20,
 | 
			
		||||
						EVP_sha1(), 0,
 | 
			
		||||
						"SHA1 Digest"))
 | 
			
		||||
			rv = 0;
 | 
			
		||||
	    	}
 | 
			
		||||
    	return rv;
 | 
			
		||||
    	}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
 | 
			
		||||
			size_t length, const AES_KEY *key,
 | 
			
		||||
			unsigned char ivec[AES_BLOCK_SIZE],
 | 
			
		||||
			unsigned char ecount_buf[AES_BLOCK_SIZE],
 | 
			
		||||
			unsigned int *num) {
 | 
			
		||||
	CRYPTO_ctr128_encrypt(in,out,length,key,ivec,ecount_buf,num,(block128_f)AES_encrypt);
 | 
			
		||||
}
 | 
			
		||||
@@ -56,7 +56,6 @@
 | 
			
		||||
#endif
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include <openssl/crypto.h>
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include "aes_locl.h"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -50,6 +50,7 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <openssl/opensslv.h>
 | 
			
		||||
#include <openssl/crypto.h>
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include "aes_locl.h"
 | 
			
		||||
 | 
			
		||||
@@ -62,3 +63,23 @@ const char *AES_options(void) {
 | 
			
		||||
        return "aes(partial)";
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* FIPS wrapper functions to block low level AES calls in FIPS mode */
 | 
			
		||||
 | 
			
		||||
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
			AES_KEY *key)
 | 
			
		||||
	{
 | 
			
		||||
#ifdef OPENSSL_FIPS
 | 
			
		||||
	fips_cipher_abort(AES);
 | 
			
		||||
#endif
 | 
			
		||||
	return private_AES_set_encrypt_key(userKey, bits, key);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
			AES_KEY *key)
 | 
			
		||||
	{
 | 
			
		||||
#ifdef OPENSSL_FIPS
 | 
			
		||||
	fips_cipher_abort(AES);
 | 
			
		||||
#endif
 | 
			
		||||
	return private_AES_set_decrypt_key(userKey, bits, key);
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,6 @@
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <openssl/crypto.h>
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include <openssl/modes.h>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -53,207 +53,18 @@
 | 
			
		||||
 | 
			
		||||
#include "cryptlib.h"
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include <openssl/bio.h>
 | 
			
		||||
 | 
			
		||||
static const unsigned char default_iv[] = {
 | 
			
		||||
  0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,
 | 
			
		||||
};
 | 
			
		||||
#include <openssl/modes.h>
 | 
			
		||||
 | 
			
		||||
int AES_wrap_key(AES_KEY *key, const unsigned char *iv,
 | 
			
		||||
		unsigned char *out,
 | 
			
		||||
		const unsigned char *in, unsigned int inlen)
 | 
			
		||||
	{
 | 
			
		||||
	unsigned char *A, B[16], *R;
 | 
			
		||||
	unsigned int i, j, t;
 | 
			
		||||
	if ((inlen & 0x7) || (inlen < 8))
 | 
			
		||||
		return -1;
 | 
			
		||||
	A = B;
 | 
			
		||||
	t = 1;
 | 
			
		||||
	memcpy(out + 8, in, inlen);
 | 
			
		||||
	if (!iv)
 | 
			
		||||
		iv = default_iv;
 | 
			
		||||
 | 
			
		||||
	memcpy(A, iv, 8);
 | 
			
		||||
 | 
			
		||||
	for (j = 0; j < 6; j++)
 | 
			
		||||
		{
 | 
			
		||||
		R = out + 8;
 | 
			
		||||
		for (i = 0; i < inlen; i += 8, t++, R += 8)
 | 
			
		||||
			{
 | 
			
		||||
			memcpy(B + 8, R, 8);
 | 
			
		||||
			AES_encrypt(B, B, key);
 | 
			
		||||
			A[7] ^= (unsigned char)(t & 0xff);
 | 
			
		||||
			if (t > 0xff)	
 | 
			
		||||
				{
 | 
			
		||||
				A[6] ^= (unsigned char)((t >> 8) & 0xff);
 | 
			
		||||
				A[5] ^= (unsigned char)((t >> 16) & 0xff);
 | 
			
		||||
				A[4] ^= (unsigned char)((t >> 24) & 0xff);
 | 
			
		||||
				}
 | 
			
		||||
			memcpy(R, B + 8, 8);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	memcpy(out, A, 8);
 | 
			
		||||
	return inlen + 8;
 | 
			
		||||
	return CRYPTO_128_wrap(key, iv, out, in, inlen, (block128_f)AES_encrypt);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
int AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
 | 
			
		||||
		unsigned char *out,
 | 
			
		||||
		const unsigned char *in, unsigned int inlen)
 | 
			
		||||
	{
 | 
			
		||||
	unsigned char *A, B[16], *R;
 | 
			
		||||
	unsigned int i, j, t;
 | 
			
		||||
	inlen -= 8;
 | 
			
		||||
	if (inlen & 0x7)
 | 
			
		||||
		return -1;
 | 
			
		||||
	if (inlen < 8)
 | 
			
		||||
		return -1;
 | 
			
		||||
	A = B;
 | 
			
		||||
	t =  6 * (inlen >> 3);
 | 
			
		||||
	memcpy(A, in, 8);
 | 
			
		||||
	memcpy(out, in + 8, inlen);
 | 
			
		||||
	for (j = 0; j < 6; j++)
 | 
			
		||||
		{
 | 
			
		||||
		R = out + inlen - 8;
 | 
			
		||||
		for (i = 0; i < inlen; i += 8, t--, R -= 8)
 | 
			
		||||
			{
 | 
			
		||||
			A[7] ^= (unsigned char)(t & 0xff);
 | 
			
		||||
			if (t > 0xff)	
 | 
			
		||||
				{
 | 
			
		||||
				A[6] ^= (unsigned char)((t >> 8) & 0xff);
 | 
			
		||||
				A[5] ^= (unsigned char)((t >> 16) & 0xff);
 | 
			
		||||
				A[4] ^= (unsigned char)((t >> 24) & 0xff);
 | 
			
		||||
	return CRYPTO_128_unwrap(key, iv, out, in, inlen, (block128_f)AES_decrypt);
 | 
			
		||||
	}
 | 
			
		||||
			memcpy(B + 8, R, 8);
 | 
			
		||||
			AES_decrypt(B, B, key);
 | 
			
		||||
			memcpy(R, B + 8, 8);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	if (!iv)
 | 
			
		||||
		iv = default_iv;
 | 
			
		||||
	if (memcmp(A, iv, 8))
 | 
			
		||||
		{
 | 
			
		||||
		OPENSSL_cleanse(out, inlen);
 | 
			
		||||
		return 0;
 | 
			
		||||
		}
 | 
			
		||||
	return inlen;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifdef AES_WRAP_TEST
 | 
			
		||||
 | 
			
		||||
int AES_wrap_unwrap_test(const unsigned char *kek, int keybits,
 | 
			
		||||
			 const unsigned char *iv,
 | 
			
		||||
			 const unsigned char *eout,
 | 
			
		||||
			 const unsigned char *key, int keylen)
 | 
			
		||||
	{
 | 
			
		||||
	unsigned char *otmp = NULL, *ptmp = NULL;
 | 
			
		||||
	int r, ret = 0;
 | 
			
		||||
	AES_KEY wctx;
 | 
			
		||||
	otmp = OPENSSL_malloc(keylen + 8);
 | 
			
		||||
	ptmp = OPENSSL_malloc(keylen);
 | 
			
		||||
	if (!otmp || !ptmp)
 | 
			
		||||
		return 0;
 | 
			
		||||
	if (AES_set_encrypt_key(kek, keybits, &wctx))
 | 
			
		||||
		goto err;
 | 
			
		||||
	r = AES_wrap_key(&wctx, iv, otmp, key, keylen);
 | 
			
		||||
	if (r <= 0)
 | 
			
		||||
		goto err;
 | 
			
		||||
 | 
			
		||||
	if (eout && memcmp(eout, otmp, keylen))
 | 
			
		||||
		goto err;
 | 
			
		||||
		
 | 
			
		||||
	if (AES_set_decrypt_key(kek, keybits, &wctx))
 | 
			
		||||
		goto err;
 | 
			
		||||
	r = AES_unwrap_key(&wctx, iv, ptmp, otmp, r);
 | 
			
		||||
 | 
			
		||||
	if (memcmp(key, ptmp, keylen))
 | 
			
		||||
		goto err;
 | 
			
		||||
 | 
			
		||||
	ret = 1;
 | 
			
		||||
 | 
			
		||||
	err:
 | 
			
		||||
	if (otmp)
 | 
			
		||||
		OPENSSL_free(otmp);
 | 
			
		||||
	if (ptmp)
 | 
			
		||||
		OPENSSL_free(ptmp);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
static const unsigned char kek[] = {
 | 
			
		||||
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 | 
			
		||||
  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
 | 
			
		||||
  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
 | 
			
		||||
  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char key[] = {
 | 
			
		||||
  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
 | 
			
		||||
  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
 | 
			
		||||
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 | 
			
		||||
  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char e1[] = {
 | 
			
		||||
  0x1f, 0xa6, 0x8b, 0x0a, 0x81, 0x12, 0xb4, 0x47,
 | 
			
		||||
  0xae, 0xf3, 0x4b, 0xd8, 0xfb, 0x5a, 0x7b, 0x82,
 | 
			
		||||
  0x9d, 0x3e, 0x86, 0x23, 0x71, 0xd2, 0xcf, 0xe5
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char e2[] = {
 | 
			
		||||
  0x96, 0x77, 0x8b, 0x25, 0xae, 0x6c, 0xa4, 0x35,
 | 
			
		||||
  0xf9, 0x2b, 0x5b, 0x97, 0xc0, 0x50, 0xae, 0xd2,
 | 
			
		||||
  0x46, 0x8a, 0xb8, 0xa1, 0x7a, 0xd8, 0x4e, 0x5d
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char e3[] = {
 | 
			
		||||
  0x64, 0xe8, 0xc3, 0xf9, 0xce, 0x0f, 0x5b, 0xa2,
 | 
			
		||||
  0x63, 0xe9, 0x77, 0x79, 0x05, 0x81, 0x8a, 0x2a,
 | 
			
		||||
  0x93, 0xc8, 0x19, 0x1e, 0x7d, 0x6e, 0x8a, 0xe7
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char e4[] = {
 | 
			
		||||
  0x03, 0x1d, 0x33, 0x26, 0x4e, 0x15, 0xd3, 0x32,
 | 
			
		||||
  0x68, 0xf2, 0x4e, 0xc2, 0x60, 0x74, 0x3e, 0xdc,
 | 
			
		||||
  0xe1, 0xc6, 0xc7, 0xdd, 0xee, 0x72, 0x5a, 0x93,
 | 
			
		||||
  0x6b, 0xa8, 0x14, 0x91, 0x5c, 0x67, 0x62, 0xd2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char e5[] = {
 | 
			
		||||
  0xa8, 0xf9, 0xbc, 0x16, 0x12, 0xc6, 0x8b, 0x3f,
 | 
			
		||||
  0xf6, 0xe6, 0xf4, 0xfb, 0xe3, 0x0e, 0x71, 0xe4,
 | 
			
		||||
  0x76, 0x9c, 0x8b, 0x80, 0xa3, 0x2c, 0xb8, 0x95,
 | 
			
		||||
  0x8c, 0xd5, 0xd1, 0x7d, 0x6b, 0x25, 0x4d, 0xa1
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char e6[] = {
 | 
			
		||||
  0x28, 0xc9, 0xf4, 0x04, 0xc4, 0xb8, 0x10, 0xf4,
 | 
			
		||||
  0xcb, 0xcc, 0xb3, 0x5c, 0xfb, 0x87, 0xf8, 0x26,
 | 
			
		||||
  0x3f, 0x57, 0x86, 0xe2, 0xd8, 0x0e, 0xd3, 0x26,
 | 
			
		||||
  0xcb, 0xc7, 0xf0, 0xe7, 0x1a, 0x99, 0xf4, 0x3b,
 | 
			
		||||
  0xfb, 0x98, 0x8b, 0x9b, 0x7a, 0x02, 0xdd, 0x21
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
	AES_KEY wctx, xctx;
 | 
			
		||||
	int ret;
 | 
			
		||||
	ret = AES_wrap_unwrap_test(kek, 128, NULL, e1, key, 16);
 | 
			
		||||
	fprintf(stderr, "Key test result %d\n", ret);
 | 
			
		||||
	ret = AES_wrap_unwrap_test(kek, 192, NULL, e2, key, 16);
 | 
			
		||||
	fprintf(stderr, "Key test result %d\n", ret);
 | 
			
		||||
	ret = AES_wrap_unwrap_test(kek, 256, NULL, e3, key, 16);
 | 
			
		||||
	fprintf(stderr, "Key test result %d\n", ret);
 | 
			
		||||
	ret = AES_wrap_unwrap_test(kek, 192, NULL, e4, key, 24);
 | 
			
		||||
	fprintf(stderr, "Key test result %d\n", ret);
 | 
			
		||||
	ret = AES_wrap_unwrap_test(kek, 256, NULL, e5, key, 24);
 | 
			
		||||
	fprintf(stderr, "Key test result %d\n", ret);
 | 
			
		||||
	ret = AES_wrap_unwrap_test(kek, 256, NULL, e6, key, 32);
 | 
			
		||||
	fprintf(stderr, "Key test result %d\n", ret);
 | 
			
		||||
}
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,6 @@
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <crypto/aes.h>
 | 
			
		||||
#include <openssl/aes.h>
 | 
			
		||||
#include "aes_locl.h"
 | 
			
		||||
 | 
			
		||||
@@ -90,8 +89,10 @@ typedef unsigned long long u64;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef ROTATE
 | 
			
		||||
#if defined(_MSC_VER) || defined(__ICC)
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
# define ROTATE(a,n)	_lrotl(a,n)
 | 
			
		||||
#elif defined(__ICC)
 | 
			
		||||
# define ROTATE(a,n)	_rotl(a,n)
 | 
			
		||||
#elif defined(__GNUC__) && __GNUC__>=2
 | 
			
		||||
# if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
 | 
			
		||||
#   define ROTATE(a,n)	({ register unsigned int ret;	\
 | 
			
		||||
 
 | 
			
		||||
@@ -103,11 +103,12 @@
 | 
			
		||||
# byte for 128-bit key.
 | 
			
		||||
#
 | 
			
		||||
#		ECB encrypt	ECB decrypt	CBC large chunk
 | 
			
		||||
# P4		56[60]		84[100]		23
 | 
			
		||||
# AMD K8	48[44]		70[79]		18
 | 
			
		||||
# PIII		41[50]		61[91]		24
 | 
			
		||||
# Core 2	32[38]		45[70]		18.5
 | 
			
		||||
# Pentium	120		160		77
 | 
			
		||||
# P4		52[54]		83[95]		23
 | 
			
		||||
# AMD K8	46[41]		66[70]		18
 | 
			
		||||
# PIII		41[50]		60[77]		24
 | 
			
		||||
# Core 2	31[36]		45[64]		18.5
 | 
			
		||||
# Atom		76[100]		96[138]		60
 | 
			
		||||
# Pentium	115		150		77
 | 
			
		||||
#
 | 
			
		||||
# Version 4.1 switches to compact S-box even in key schedule setup.
 | 
			
		||||
#
 | 
			
		||||
@@ -242,7 +243,7 @@ $vertical_spin=0;	# shift "verticaly" defaults to 0, because of
 | 
			
		||||
 | 
			
		||||
sub encvert()
 | 
			
		||||
{ my ($te,@s) = @_;
 | 
			
		||||
  my $v0 = $acc, $v1 = $key;
 | 
			
		||||
  my ($v0,$v1) = ($acc,$key);
 | 
			
		||||
 | 
			
		||||
	&mov	($v0,$s[3]);				# copy s3
 | 
			
		||||
	&mov	(&DWP(4,"esp"),$s[2]);			# save s2
 | 
			
		||||
@@ -299,7 +300,7 @@ sub encvert()
 | 
			
		||||
# Another experimental routine, which features "horizontal spin," but
 | 
			
		||||
# eliminates one reference to stack. Strangely enough runs slower...
 | 
			
		||||
sub enchoriz()
 | 
			
		||||
{ my $v0 = $key, $v1 = $acc;
 | 
			
		||||
{ my ($v0,$v1) = ($key,$acc);
 | 
			
		||||
 | 
			
		||||
	&movz	($v0,&LB($s0));			#  3, 2, 1, 0*
 | 
			
		||||
	&rotr	($s2,8);			#  8,11,10, 9
 | 
			
		||||
@@ -427,7 +428,7 @@ sub sse_encbody()
 | 
			
		||||
######################################################################
 | 
			
		||||
 | 
			
		||||
sub enccompact()
 | 
			
		||||
{ my $Fn = mov;
 | 
			
		||||
{ my $Fn = \&mov;
 | 
			
		||||
  while ($#_>5) { pop(@_); $Fn=sub{}; }
 | 
			
		||||
  my ($i,$te,@s)=@_;
 | 
			
		||||
  my $tmp = $key;
 | 
			
		||||
@@ -476,24 +477,25 @@ sub enctransform()
 | 
			
		||||
  my $tmp = $tbl;
 | 
			
		||||
  my $r2  = $key ;
 | 
			
		||||
 | 
			
		||||
	&mov	($acc,$s[$i]);
 | 
			
		||||
	&and	($acc,0x80808080);
 | 
			
		||||
	&mov	($tmp,$acc);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&and	($tmp,$s[$i]);
 | 
			
		||||
	&lea	($r2,&DWP(0,$s[$i],$s[$i]));
 | 
			
		||||
	&sub	($acc,$tmp);
 | 
			
		||||
	&mov	($acc,$tmp);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&and	($r2,0xfefefefe);
 | 
			
		||||
	&and	($acc,0x1b1b1b1b);
 | 
			
		||||
	&sub	($acc,$tmp);
 | 
			
		||||
	&mov	($tmp,$s[$i]);
 | 
			
		||||
	&and	($acc,0x1b1b1b1b);
 | 
			
		||||
	&rotr	($tmp,16);
 | 
			
		||||
	&xor	($acc,$r2);	# r2
 | 
			
		||||
	&mov	($r2,$s[$i]);
 | 
			
		||||
 | 
			
		||||
	&xor	($s[$i],$acc);	# r0 ^ r2
 | 
			
		||||
	&rotr	($r2,16+8);
 | 
			
		||||
	&xor	($acc,$tmp);
 | 
			
		||||
	&rotl	($s[$i],24);
 | 
			
		||||
	&xor	($s[$i],$acc)	# ROTATE(r2^r0,24) ^ r2
 | 
			
		||||
	&rotr	($tmp,16);
 | 
			
		||||
	&xor	($s[$i],$tmp);
 | 
			
		||||
	&rotr	($tmp,8);
 | 
			
		||||
	&xor	($s[$i],$tmp);
 | 
			
		||||
	&xor	($acc,$r2);
 | 
			
		||||
	&mov	($tmp,0x80808080)	if ($i!=1);
 | 
			
		||||
	&xor	($s[$i],$acc);	# ROTATE(r2^r0,24) ^ r2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
&function_begin_B("_x86_AES_encrypt_compact");
 | 
			
		||||
@@ -526,6 +528,7 @@ sub enctransform()
 | 
			
		||||
		&enccompact(1,$tbl,$s1,$s2,$s3,$s0,1);
 | 
			
		||||
		&enccompact(2,$tbl,$s2,$s3,$s0,$s1,1);
 | 
			
		||||
		&enccompact(3,$tbl,$s3,$s0,$s1,$s2,1);
 | 
			
		||||
		&mov	($tbl,0x80808080);
 | 
			
		||||
		&enctransform(2);
 | 
			
		||||
		&enctransform(3);
 | 
			
		||||
		&enctransform(0);
 | 
			
		||||
@@ -607,82 +610,84 @@ sub sse_enccompact()
 | 
			
		||||
	&pshufw	("mm5","mm4",0x0d);		# 15,14,11,10
 | 
			
		||||
	&movd	("eax","mm1");			#  5, 4, 1, 0
 | 
			
		||||
	&movd	("ebx","mm5");			# 15,14,11,10
 | 
			
		||||
	&mov	($__key,$key);
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&LB("eax"));		#  0
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$acc,1));	#  0
 | 
			
		||||
	&pshufw	("mm2","mm0",0x0d);		#  7, 6, 3, 2
 | 
			
		||||
	&movz	("edx",&HB("eax"));		#  1
 | 
			
		||||
	&pshufw	("mm2","mm0",0x0d);		#  7, 6, 3, 2
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$acc,1));	#  0
 | 
			
		||||
	&movz	($key,&LB("ebx"));		# 10
 | 
			
		||||
	&movz	("edx",&BP(-128,$tbl,"edx",1));	#  1
 | 
			
		||||
	&shl	("edx",8);			#  1
 | 
			
		||||
	&shr	("eax",16);			#  5, 4
 | 
			
		||||
	&shl	("edx",8);			#  1
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&LB("ebx"));		# 10
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 10
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	# 10
 | 
			
		||||
	&movz	($key,&HB("ebx"));		# 11
 | 
			
		||||
	&shl	($acc,16);			# 10
 | 
			
		||||
	&or	("ecx",$acc);			# 10
 | 
			
		||||
	&pshufw	("mm6","mm4",0x08);		# 13,12, 9, 8
 | 
			
		||||
	&movz	($acc,&HB("ebx"));		# 11
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 11
 | 
			
		||||
	&or	("ecx",$acc);			# 10
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	# 11
 | 
			
		||||
	&movz	($key,&HB("eax"));		#  5
 | 
			
		||||
	&shl	($acc,24);			# 11
 | 
			
		||||
	&or	("edx",$acc);			# 11
 | 
			
		||||
	&shr	("ebx",16);			# 15,14
 | 
			
		||||
	&or	("edx",$acc);			# 11
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&HB("eax"));		#  5
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  5
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  5
 | 
			
		||||
	&movz	($key,&HB("ebx"));		# 15
 | 
			
		||||
	&shl	($acc,8);			#  5
 | 
			
		||||
	&or	("ecx",$acc);			#  5
 | 
			
		||||
	&movz	($acc,&HB("ebx"));		# 15
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 15
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	# 15
 | 
			
		||||
	&movz	($key,&LB("eax"));		#  4
 | 
			
		||||
	&shl	($acc,24);			# 15
 | 
			
		||||
	&or	("ecx",$acc);			# 15
 | 
			
		||||
	&movd	("mm0","ecx");			# t[0] collected
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&LB("eax"));		#  4
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$acc,1));	#  4
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  4
 | 
			
		||||
	&movz	($key,&LB("ebx"));		# 14
 | 
			
		||||
	&movd	("eax","mm2");			#  7, 6, 3, 2
 | 
			
		||||
	&movz	($acc,&LB("ebx"));		# 14
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 14
 | 
			
		||||
	&shl	($acc,16);			# 14
 | 
			
		||||
	&movd	("mm0","ecx");			# t[0] collected
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$key,1));	# 14
 | 
			
		||||
	&movz	($key,&HB("eax"));		#  3
 | 
			
		||||
	&shl	("ecx",16);			# 14
 | 
			
		||||
	&movd	("ebx","mm6");			# 13,12, 9, 8
 | 
			
		||||
	&or	("ecx",$acc);			# 14
 | 
			
		||||
 | 
			
		||||
	&movd	("ebx","mm6");			# 13,12, 9, 8
 | 
			
		||||
	&movz	($acc,&HB("eax"));		#  3
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  3
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  3
 | 
			
		||||
	&movz	($key,&HB("ebx"));		#  9
 | 
			
		||||
	&shl	($acc,24);			#  3
 | 
			
		||||
	&or	("ecx",$acc);			#  3
 | 
			
		||||
	&movz	($acc,&HB("ebx"));		#  9
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  9
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  9
 | 
			
		||||
	&movz	($key,&LB("ebx"));		#  8
 | 
			
		||||
	&shl	($acc,8);			#  9
 | 
			
		||||
	&or	("ecx",$acc);			#  9
 | 
			
		||||
	&movd	("mm1","ecx");			# t[1] collected
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&LB("ebx"));		#  8
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$acc,1));	#  8
 | 
			
		||||
	&shr	("ebx",16);			# 13,12
 | 
			
		||||
	&movz	($acc,&LB("eax"));		#  2
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  2
 | 
			
		||||
	&shl	($acc,16);			#  2
 | 
			
		||||
	&or	("ecx",$acc);			#  2
 | 
			
		||||
	&or	("ecx",$acc);			#  9
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  8
 | 
			
		||||
	&movz	($key,&LB("eax"));		#  2
 | 
			
		||||
	&shr	("eax",16);			#  7, 6
 | 
			
		||||
	&movd	("mm1","ecx");			# t[1] collected
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$key,1));	#  2
 | 
			
		||||
	&movz	($key,&HB("eax"));		#  7
 | 
			
		||||
	&shl	("ecx",16);			#  2
 | 
			
		||||
	&and	("eax",0xff);			#  6
 | 
			
		||||
	&or	("ecx",$acc);			#  2
 | 
			
		||||
 | 
			
		||||
	&punpckldq	("mm0","mm1");		# t[0,1] collected
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&HB("eax"));		#  7
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  7
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  7
 | 
			
		||||
	&movz	($key,&HB("ebx"));		# 13
 | 
			
		||||
	&shl	($acc,24);			#  7
 | 
			
		||||
	&or	("ecx",$acc);			#  7
 | 
			
		||||
	&and	("eax",0xff);			#  6
 | 
			
		||||
	&movz	("eax",&BP(-128,$tbl,"eax",1));	#  6
 | 
			
		||||
	&shl	("eax",16);			#  6
 | 
			
		||||
	&or	("edx","eax");			#  6
 | 
			
		||||
	&movz	($acc,&HB("ebx"));		# 13
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 13
 | 
			
		||||
	&shl	($acc,8);			# 13
 | 
			
		||||
	&or	("ecx",$acc);			# 13
 | 
			
		||||
	&movd	("mm4","ecx");			# t[2] collected
 | 
			
		||||
	&and	("ebx",0xff);			# 12
 | 
			
		||||
	&movz	("eax",&BP(-128,$tbl,"eax",1));	#  6
 | 
			
		||||
	&or	("ecx",$acc);			#  7
 | 
			
		||||
	&shl	("eax",16);			#  6
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	# 13
 | 
			
		||||
	&or	("edx","eax");			#  6
 | 
			
		||||
	&shl	($acc,8);			# 13
 | 
			
		||||
	&movz	("ebx",&BP(-128,$tbl,"ebx",1));	# 12
 | 
			
		||||
	&or	("ecx",$acc);			# 13
 | 
			
		||||
	&or	("edx","ebx");			# 12
 | 
			
		||||
	&mov	($key,$__key);
 | 
			
		||||
	&movd	("mm4","ecx");			# t[2] collected
 | 
			
		||||
	&movd	("mm5","edx");			# t[3] collected
 | 
			
		||||
 | 
			
		||||
	&punpckldq	("mm4","mm5");		# t[2,3] collected
 | 
			
		||||
@@ -1222,7 +1227,7 @@ sub enclast()
 | 
			
		||||
######################################################################
 | 
			
		||||
 | 
			
		||||
sub deccompact()
 | 
			
		||||
{ my $Fn = mov;
 | 
			
		||||
{ my $Fn = \&mov;
 | 
			
		||||
  while ($#_>5) { pop(@_); $Fn=sub{}; }
 | 
			
		||||
  my ($i,$td,@s)=@_;
 | 
			
		||||
  my $tmp = $key;
 | 
			
		||||
@@ -1270,30 +1275,30 @@ sub dectransform()
 | 
			
		||||
  my $tp4 = @s[($i+3)%4]; $tp4 = @s[3] if ($i==1);
 | 
			
		||||
  my $tp8 = $tbl;
 | 
			
		||||
 | 
			
		||||
	&mov	($acc,$s[$i]);
 | 
			
		||||
	&and	($acc,0x80808080);
 | 
			
		||||
	&mov	($tmp,$acc);
 | 
			
		||||
	&mov	($tmp,0x80808080);
 | 
			
		||||
	&and	($tmp,$s[$i]);
 | 
			
		||||
	&mov	($acc,$tmp);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&lea	($tp2,&DWP(0,$s[$i],$s[$i]));
 | 
			
		||||
	&sub	($acc,$tmp);
 | 
			
		||||
	&and	($tp2,0xfefefefe);
 | 
			
		||||
	&and	($acc,0x1b1b1b1b);
 | 
			
		||||
	&xor	($acc,$tp2);
 | 
			
		||||
	&mov	($tp2,$acc);
 | 
			
		||||
	&xor	($tp2,$acc);
 | 
			
		||||
	&mov	($tmp,0x80808080);
 | 
			
		||||
 | 
			
		||||
	&and	($acc,0x80808080);
 | 
			
		||||
	&mov	($tmp,$acc);
 | 
			
		||||
	&and	($tmp,$tp2);
 | 
			
		||||
	&mov	($acc,$tmp);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&lea	($tp4,&DWP(0,$tp2,$tp2));
 | 
			
		||||
	&sub	($acc,$tmp);
 | 
			
		||||
	&and	($tp4,0xfefefefe);
 | 
			
		||||
	&and	($acc,0x1b1b1b1b);
 | 
			
		||||
	 &xor	($tp2,$s[$i]);	# tp2^tp1
 | 
			
		||||
	&xor	($acc,$tp4);
 | 
			
		||||
	&mov	($tp4,$acc);
 | 
			
		||||
	&xor	($tp4,$acc);
 | 
			
		||||
	&mov	($tmp,0x80808080);
 | 
			
		||||
 | 
			
		||||
	&and	($acc,0x80808080);
 | 
			
		||||
	&mov	($tmp,$acc);
 | 
			
		||||
	&and	($tmp,$tp4);
 | 
			
		||||
	&mov	($acc,$tmp);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&lea	($tp8,&DWP(0,$tp4,$tp4));
 | 
			
		||||
	&sub	($acc,$tmp);
 | 
			
		||||
@@ -1305,13 +1310,13 @@ sub dectransform()
 | 
			
		||||
 | 
			
		||||
	&xor	($s[$i],$tp2);
 | 
			
		||||
	&xor	($tp2,$tp8);
 | 
			
		||||
	&rotl	($tp2,24);
 | 
			
		||||
	&xor	($s[$i],$tp4);
 | 
			
		||||
	&xor	($tp4,$tp8);
 | 
			
		||||
	&rotl	($tp4,16);
 | 
			
		||||
	&rotl	($tp2,24);
 | 
			
		||||
	&xor	($s[$i],$tp8);	# ^= tp8^(tp4^tp1)^(tp2^tp1)
 | 
			
		||||
	&rotl	($tp8,8);
 | 
			
		||||
	&rotl	($tp4,16);
 | 
			
		||||
	&xor	($s[$i],$tp2);	# ^= ROTATE(tp8^tp2^tp1,24)
 | 
			
		||||
	&rotl	($tp8,8);
 | 
			
		||||
	&xor	($s[$i],$tp4);	# ^= ROTATE(tp8^tp4^tp1,16)
 | 
			
		||||
	 &mov	($s[0],$__s0)			if($i==2); #prefetch $s0
 | 
			
		||||
	 &mov	($s[1],$__s1)			if($i==3); #prefetch $s1
 | 
			
		||||
@@ -1389,85 +1394,87 @@ sub dectransform()
 | 
			
		||||
sub sse_deccompact()
 | 
			
		||||
{
 | 
			
		||||
	&pshufw	("mm1","mm0",0x0c);		#  7, 6, 1, 0
 | 
			
		||||
	&movd	("eax","mm1");			#  7, 6, 1, 0
 | 
			
		||||
 | 
			
		||||
	&pshufw	("mm5","mm4",0x09);		# 13,12,11,10
 | 
			
		||||
	&movz	($acc,&LB("eax"));		#  0
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$acc,1));	#  0
 | 
			
		||||
	&movd	("eax","mm1");			#  7, 6, 1, 0
 | 
			
		||||
	&movd	("ebx","mm5");			# 13,12,11,10
 | 
			
		||||
	&mov	($__key,$key);
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&LB("eax"));		#  0
 | 
			
		||||
	&movz	("edx",&HB("eax"));		#  1
 | 
			
		||||
	&pshufw	("mm2","mm0",0x06);		#  3, 2, 5, 4
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$acc,1));	#  0
 | 
			
		||||
	&movz	($key,&LB("ebx"));		# 10
 | 
			
		||||
	&movz	("edx",&BP(-128,$tbl,"edx",1));	#  1
 | 
			
		||||
	&shr	("eax",16);			#  7, 6
 | 
			
		||||
	&shl	("edx",8);			#  1
 | 
			
		||||
 | 
			
		||||
	&pshufw	("mm2","mm0",0x06);		#  3, 2, 5, 4
 | 
			
		||||
	&movz	($acc,&LB("ebx"));		# 10
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 10
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	# 10
 | 
			
		||||
	&movz	($key,&HB("ebx"));		# 11
 | 
			
		||||
	&shl	($acc,16);			# 10
 | 
			
		||||
	&or	("ecx",$acc);			# 10
 | 
			
		||||
	&shr	("eax",16);			#  7, 6
 | 
			
		||||
	&movz	($acc,&HB("ebx"));		# 11
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 11
 | 
			
		||||
	&shl	($acc,24);			# 11
 | 
			
		||||
	&or	("edx",$acc);			# 11
 | 
			
		||||
	&shr	("ebx",16);			# 13,12
 | 
			
		||||
 | 
			
		||||
	&pshufw	("mm6","mm4",0x03);		# 9, 8,15,14
 | 
			
		||||
	&movz	($acc,&HB("eax"));		#  7
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  7
 | 
			
		||||
	&or	("ecx",$acc);			# 10
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	# 11
 | 
			
		||||
	&movz	($key,&HB("eax"));		#  7
 | 
			
		||||
	&shl	($acc,24);			# 11
 | 
			
		||||
	&shr	("ebx",16);			# 13,12
 | 
			
		||||
	&or	("edx",$acc);			# 11
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  7
 | 
			
		||||
	&movz	($key,&HB("ebx"));		# 13
 | 
			
		||||
	&shl	($acc,24);			#  7
 | 
			
		||||
	&or	("ecx",$acc);			#  7
 | 
			
		||||
	&movz	($acc,&HB("ebx"));		# 13
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 13
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	# 13
 | 
			
		||||
	&movz	($key,&LB("eax"));		#  6
 | 
			
		||||
	&shl	($acc,8);			# 13
 | 
			
		||||
	&or	("ecx",$acc);			# 13
 | 
			
		||||
	&movd	("mm0","ecx");			# t[0] collected
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&LB("eax"));		#  6
 | 
			
		||||
	&movd	("eax","mm2");			#  3, 2, 5, 4
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$acc,1));	#  6
 | 
			
		||||
	&shl	("ecx",16);			#  6
 | 
			
		||||
	&movz	($acc,&LB("ebx"));		# 12
 | 
			
		||||
	&or	("ecx",$acc);			# 13
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  6
 | 
			
		||||
	&movz	($key,&LB("ebx"));		# 12
 | 
			
		||||
	&shl	($acc,16);			#  6
 | 
			
		||||
	&movd	("ebx","mm6");			#  9, 8,15,14
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 12
 | 
			
		||||
	&movd	("mm0","ecx");			# t[0] collected
 | 
			
		||||
	&movz	("ecx",&BP(-128,$tbl,$key,1));	# 12
 | 
			
		||||
	&movz	($key,&LB("eax"));		#  4
 | 
			
		||||
	&or	("ecx",$acc);			# 12
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&LB("eax"));		#  4
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  4
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  4
 | 
			
		||||
	&movz	($key,&LB("ebx"));		# 14
 | 
			
		||||
	&or	("edx",$acc);			#  4
 | 
			
		||||
	&movz	($acc,&LB("ebx"));		# 14
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 14
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	# 14
 | 
			
		||||
	&movz	($key,&HB("eax"));		#  5
 | 
			
		||||
	&shl	($acc,16);			# 14
 | 
			
		||||
	&or	("edx",$acc);			# 14
 | 
			
		||||
	&movd	("mm1","edx");			# t[1] collected
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&HB("eax"));		#  5
 | 
			
		||||
	&movz	("edx",&BP(-128,$tbl,$acc,1));	#  5
 | 
			
		||||
	&shl	("edx",8);			#  5
 | 
			
		||||
	&movz	($acc,&HB("ebx"));		# 15
 | 
			
		||||
	&shr	("eax",16);			#  3, 2
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	# 15
 | 
			
		||||
	&shl	($acc,24);			# 15
 | 
			
		||||
	&or	("edx",$acc);			# 15
 | 
			
		||||
	&or	("edx",$acc);			# 14
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  5
 | 
			
		||||
	&movz	($key,&HB("ebx"));		# 15
 | 
			
		||||
	&shr	("ebx",16);			#  9, 8
 | 
			
		||||
	&shl	($acc,8);			#  5
 | 
			
		||||
	&movd	("mm1","edx");			# t[1] collected
 | 
			
		||||
	&movz	("edx",&BP(-128,$tbl,$key,1));	# 15
 | 
			
		||||
	&movz	($key,&HB("ebx"));		#  9
 | 
			
		||||
	&shl	("edx",24);			# 15
 | 
			
		||||
	&and	("ebx",0xff);			#  8
 | 
			
		||||
	&or	("edx",$acc);			# 15
 | 
			
		||||
 | 
			
		||||
	&punpckldq	("mm0","mm1");		# t[0,1] collected
 | 
			
		||||
 | 
			
		||||
	&movz	($acc,&HB("ebx"));		#  9
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  9
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  9
 | 
			
		||||
	&movz	($key,&LB("eax"));		#  2
 | 
			
		||||
	&shl	($acc,8);			#  9
 | 
			
		||||
	&or	("ecx",$acc);			#  9
 | 
			
		||||
	&and	("ebx",0xff);			#  8
 | 
			
		||||
	&movz	("ebx",&BP(-128,$tbl,"ebx",1));	#  8
 | 
			
		||||
	&or	("edx","ebx");			#  8
 | 
			
		||||
	&movz	($acc,&LB("eax"));		#  2
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$acc,1));	#  2
 | 
			
		||||
	&shl	($acc,16);			#  2
 | 
			
		||||
	&or	("edx",$acc);			#  2
 | 
			
		||||
	&movd	("mm4","edx");			# t[2] collected
 | 
			
		||||
	&movz	("eax",&HB("eax"));		#  3
 | 
			
		||||
	&movz	("ebx",&BP(-128,$tbl,"ebx",1));	#  8
 | 
			
		||||
	&or	("ecx",$acc);			#  9
 | 
			
		||||
	&movz	($acc,&BP(-128,$tbl,$key,1));	#  2
 | 
			
		||||
	&or	("edx","ebx");			#  8
 | 
			
		||||
	&shl	($acc,16);			#  2
 | 
			
		||||
	&movz	("eax",&BP(-128,$tbl,"eax",1));	#  3
 | 
			
		||||
	&or	("edx",$acc);			#  2
 | 
			
		||||
	&shl	("eax",24);			#  3
 | 
			
		||||
	&or	("ecx","eax");			#  3
 | 
			
		||||
	&mov	($key,$__key);
 | 
			
		||||
	&movd	("mm4","edx");			# t[2] collected
 | 
			
		||||
	&movd	("mm5","ecx");			# t[3] collected
 | 
			
		||||
 | 
			
		||||
	&punpckldq	("mm4","mm5");		# t[2,3] collected
 | 
			
		||||
@@ -2182,7 +2189,7 @@ my $mark=&DWP(76+240,"esp");	# copy of aes_key->rounds
 | 
			
		||||
	&xor	("eax","eax");
 | 
			
		||||
	&align	(4);
 | 
			
		||||
	&data_word(0xABF3F689);		# rep stosd
 | 
			
		||||
	&set_label("skip_ezero")
 | 
			
		||||
	&set_label("skip_ezero");
 | 
			
		||||
	&mov	("esp",$_esp);
 | 
			
		||||
	&popf	();
 | 
			
		||||
    &set_label("drop_out");
 | 
			
		||||
@@ -2302,7 +2309,7 @@ my $mark=&DWP(76+240,"esp");	# copy of aes_key->rounds
 | 
			
		||||
	&xor	("eax","eax");
 | 
			
		||||
	&align	(4);
 | 
			
		||||
	&data_word(0xABF3F689);		# rep stosd
 | 
			
		||||
	&set_label("skip_dzero")
 | 
			
		||||
	&set_label("skip_dzero");
 | 
			
		||||
	&mov	("esp",$_esp);
 | 
			
		||||
	&popf	();
 | 
			
		||||
	&function_end_A();
 | 
			
		||||
@@ -2854,43 +2861,43 @@ sub enckey()
 | 
			
		||||
    &set_label("exit");
 | 
			
		||||
&function_end("_x86_AES_set_encrypt_key");
 | 
			
		||||
 | 
			
		||||
# int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
# int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
#                        AES_KEY *key)
 | 
			
		||||
&function_begin_B("AES_set_encrypt_key");
 | 
			
		||||
&function_begin_B("private_AES_set_encrypt_key");
 | 
			
		||||
	&call	("_x86_AES_set_encrypt_key");
 | 
			
		||||
	&ret	();
 | 
			
		||||
&function_end_B("AES_set_encrypt_key");
 | 
			
		||||
&function_end_B("private_AES_set_encrypt_key");
 | 
			
		||||
 | 
			
		||||
sub deckey()
 | 
			
		||||
{ my ($i,$key,$tp1,$tp2,$tp4,$tp8) = @_;
 | 
			
		||||
  my $tmp = $tbl;
 | 
			
		||||
 | 
			
		||||
	&mov	($acc,$tp1);
 | 
			
		||||
	&and	($acc,0x80808080);
 | 
			
		||||
	&mov	($tmp,$acc);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&mov	($tmp,0x80808080);
 | 
			
		||||
	&and	($tmp,$tp1);
 | 
			
		||||
	&lea	($tp2,&DWP(0,$tp1,$tp1));
 | 
			
		||||
	&mov	($acc,$tmp);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&sub	($acc,$tmp);
 | 
			
		||||
	&and	($tp2,0xfefefefe);
 | 
			
		||||
	&and	($acc,0x1b1b1b1b);
 | 
			
		||||
	&xor	($acc,$tp2);
 | 
			
		||||
	&mov	($tp2,$acc);
 | 
			
		||||
	&xor	($tp2,$acc);
 | 
			
		||||
	&mov	($tmp,0x80808080);
 | 
			
		||||
 | 
			
		||||
	&and	($acc,0x80808080);
 | 
			
		||||
	&mov	($tmp,$acc);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&and	($tmp,$tp2);
 | 
			
		||||
	&lea	($tp4,&DWP(0,$tp2,$tp2));
 | 
			
		||||
	&mov	($acc,$tmp);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&sub	($acc,$tmp);
 | 
			
		||||
	&and	($tp4,0xfefefefe);
 | 
			
		||||
	&and	($acc,0x1b1b1b1b);
 | 
			
		||||
	 &xor	($tp2,$tp1);	# tp2^tp1
 | 
			
		||||
	&xor	($acc,$tp4);
 | 
			
		||||
	&mov	($tp4,$acc);
 | 
			
		||||
	&xor	($tp4,$acc);
 | 
			
		||||
	&mov	($tmp,0x80808080);
 | 
			
		||||
 | 
			
		||||
	&and	($acc,0x80808080);
 | 
			
		||||
	&mov	($tmp,$acc);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	&and	($tmp,$tp4);
 | 
			
		||||
	&lea	($tp8,&DWP(0,$tp4,$tp4));
 | 
			
		||||
	&mov	($acc,$tmp);
 | 
			
		||||
	&shr	($tmp,7);
 | 
			
		||||
	 &xor	($tp4,$tp1);	# tp4^tp1
 | 
			
		||||
	&sub	($acc,$tmp);
 | 
			
		||||
	&and	($tp8,0xfefefefe);
 | 
			
		||||
@@ -2916,9 +2923,9 @@ sub deckey()
 | 
			
		||||
	&mov	(&DWP(4*$i,$key),$tp1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
# int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
#                        AES_KEY *key)
 | 
			
		||||
&function_begin_B("AES_set_decrypt_key");
 | 
			
		||||
&function_begin_B("private_AES_set_decrypt_key");
 | 
			
		||||
	&call	("_x86_AES_set_encrypt_key");
 | 
			
		||||
	&cmp	("eax",0);
 | 
			
		||||
	&je	(&label("proceed"));
 | 
			
		||||
@@ -2974,7 +2981,7 @@ sub deckey()
 | 
			
		||||
	&jb	(&label("permute"));
 | 
			
		||||
 | 
			
		||||
	&xor	("eax","eax");			# return success
 | 
			
		||||
&function_end("AES_set_decrypt_key");
 | 
			
		||||
&function_end("private_AES_set_decrypt_key");
 | 
			
		||||
&asciz("AES for x86, CRYPTOGAMS by <appro\@openssl.org>");
 | 
			
		||||
 | 
			
		||||
&asm_finish();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
 | 
			
		||||
# ====================================================================
 | 
			
		||||
# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
 | 
			
		||||
# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
 | 
			
		||||
# project. The module is, however, dual licensed under OpenSSL and
 | 
			
		||||
# CRYPTOGAMS licenses depending on where you obtain it. For further
 | 
			
		||||
# details see http://www.openssl.org/~appro/cryptogams/.
 | 
			
		||||
@@ -51,9 +51,23 @@ $key="r11";
 | 
			
		||||
$rounds="r12";
 | 
			
		||||
 | 
			
		||||
$code=<<___;
 | 
			
		||||
#include "arm_arch.h"
 | 
			
		||||
#ifndef __KERNEL__
 | 
			
		||||
# include "arm_arch.h"
 | 
			
		||||
#else
 | 
			
		||||
# define __ARM_ARCH__ __LINUX_ARM_ARCH__
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
.text
 | 
			
		||||
#if __ARM_ARCH__<7
 | 
			
		||||
.code	32
 | 
			
		||||
#else
 | 
			
		||||
.syntax	unified
 | 
			
		||||
# ifdef __thumb2__
 | 
			
		||||
.thumb
 | 
			
		||||
# else
 | 
			
		||||
.code	32
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
.type	AES_Te,%object
 | 
			
		||||
.align	5
 | 
			
		||||
@@ -167,7 +181,11 @@ AES_Te:
 | 
			
		||||
.type   AES_encrypt,%function
 | 
			
		||||
.align	5
 | 
			
		||||
AES_encrypt:
 | 
			
		||||
#if __ARM_ARCH__<7
 | 
			
		||||
	sub	r3,pc,#8		@ AES_encrypt
 | 
			
		||||
#else
 | 
			
		||||
	adr	r3,AES_encrypt
 | 
			
		||||
#endif
 | 
			
		||||
	stmdb   sp!,{r1,r4-r12,lr}
 | 
			
		||||
	mov	$rounds,r0		@ inp
 | 
			
		||||
	mov	$key,r2
 | 
			
		||||
@@ -404,15 +422,26 @@ _armv4_AES_encrypt:
 | 
			
		||||
	ldr	pc,[sp],#4		@ pop and return
 | 
			
		||||
.size	_armv4_AES_encrypt,.-_armv4_AES_encrypt
 | 
			
		||||
 | 
			
		||||
.global AES_set_encrypt_key
 | 
			
		||||
.type   AES_set_encrypt_key,%function
 | 
			
		||||
.global private_AES_set_encrypt_key
 | 
			
		||||
.type   private_AES_set_encrypt_key,%function
 | 
			
		||||
.align	5
 | 
			
		||||
AES_set_encrypt_key:
 | 
			
		||||
private_AES_set_encrypt_key:
 | 
			
		||||
_armv4_AES_set_encrypt_key:
 | 
			
		||||
#if __ARM_ARCH__<7
 | 
			
		||||
	sub	r3,pc,#8		@ AES_set_encrypt_key
 | 
			
		||||
#else
 | 
			
		||||
	adr	r3,private_AES_set_encrypt_key
 | 
			
		||||
#endif
 | 
			
		||||
	teq	r0,#0
 | 
			
		||||
#if __ARM_ARCH__>=7
 | 
			
		||||
	itt	eq			@ Thumb2 thing, sanity check in ARM
 | 
			
		||||
#endif
 | 
			
		||||
	moveq	r0,#-1
 | 
			
		||||
	beq	.Labrt
 | 
			
		||||
	teq	r2,#0
 | 
			
		||||
#if __ARM_ARCH__>=7
 | 
			
		||||
	itt	eq			@ Thumb2 thing, sanity check in ARM
 | 
			
		||||
#endif
 | 
			
		||||
	moveq	r0,#-1
 | 
			
		||||
	beq	.Labrt
 | 
			
		||||
 | 
			
		||||
@@ -421,11 +450,14 @@ AES_set_encrypt_key:
 | 
			
		||||
	teq	r1,#192
 | 
			
		||||
	beq	.Lok
 | 
			
		||||
	teq	r1,#256
 | 
			
		||||
#if __ARM_ARCH__>=7
 | 
			
		||||
	itt	ne			@ Thumb2 thing, sanity check in ARM
 | 
			
		||||
#endif
 | 
			
		||||
	movne	r0,#-1
 | 
			
		||||
	bne	.Labrt
 | 
			
		||||
 | 
			
		||||
.Lok:	stmdb   sp!,{r4-r12,lr}
 | 
			
		||||
	sub	$tbl,r3,#AES_set_encrypt_key-AES_Te-1024	@ Te4
 | 
			
		||||
	sub	$tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024	@ Te4
 | 
			
		||||
 | 
			
		||||
	mov	$rounds,r0		@ inp
 | 
			
		||||
	mov	lr,r1			@ bits
 | 
			
		||||
@@ -575,6 +607,9 @@ AES_set_encrypt_key:
 | 
			
		||||
	str	$s2,[$key,#-16]
 | 
			
		||||
	subs	$rounds,$rounds,#1
 | 
			
		||||
	str	$s3,[$key,#-12]
 | 
			
		||||
#if __ARM_ARCH__>=7
 | 
			
		||||
	itt	eq				@ Thumb2 thing, sanity check in ARM
 | 
			
		||||
#endif
 | 
			
		||||
	subeq	r2,$key,#216
 | 
			
		||||
	beq	.Ldone
 | 
			
		||||
 | 
			
		||||
@@ -644,6 +679,9 @@ AES_set_encrypt_key:
 | 
			
		||||
	str	$s2,[$key,#-24]
 | 
			
		||||
	subs	$rounds,$rounds,#1
 | 
			
		||||
	str	$s3,[$key,#-20]
 | 
			
		||||
#if __ARM_ARCH__>=7
 | 
			
		||||
	itt	eq				@ Thumb2 thing, sanity check in ARM
 | 
			
		||||
#endif
 | 
			
		||||
	subeq	r2,$key,#256
 | 
			
		||||
	beq	.Ldone
 | 
			
		||||
 | 
			
		||||
@@ -673,48 +711,77 @@ AES_set_encrypt_key:
 | 
			
		||||
	str	$i3,[$key,#-4]
 | 
			
		||||
	b	.L256_loop
 | 
			
		||||
 | 
			
		||||
.align	2
 | 
			
		||||
.Ldone:	mov	r0,#0
 | 
			
		||||
	ldmia   sp!,{r4-r12,lr}
 | 
			
		||||
.Labrt:	tst	lr,#1
 | 
			
		||||
.Labrt:
 | 
			
		||||
#if defined(__thumb2__) && __ARM_ARCH__>=7
 | 
			
		||||
	.short	0x4770			@ bx lr in Thumb2 encoding
 | 
			
		||||
#else
 | 
			
		||||
	tst	lr,#1
 | 
			
		||||
	moveq	pc,lr			@ be binary compatible with V4, yet
 | 
			
		||||
	bx	lr			@ interoperable with Thumb ISA:-)
 | 
			
		||||
.size	AES_set_encrypt_key,.-AES_set_encrypt_key
 | 
			
		||||
#endif
 | 
			
		||||
.size	private_AES_set_encrypt_key,.-private_AES_set_encrypt_key
 | 
			
		||||
 | 
			
		||||
.global AES_set_decrypt_key
 | 
			
		||||
.type   AES_set_decrypt_key,%function
 | 
			
		||||
.global private_AES_set_decrypt_key
 | 
			
		||||
.type   private_AES_set_decrypt_key,%function
 | 
			
		||||
.align	5
 | 
			
		||||
AES_set_decrypt_key:
 | 
			
		||||
private_AES_set_decrypt_key:
 | 
			
		||||
	str	lr,[sp,#-4]!            @ push lr
 | 
			
		||||
	bl	AES_set_encrypt_key
 | 
			
		||||
	bl	_armv4_AES_set_encrypt_key
 | 
			
		||||
	teq	r0,#0
 | 
			
		||||
	ldrne	lr,[sp],#4              @ pop lr
 | 
			
		||||
	ldr	lr,[sp],#4              @ pop lr
 | 
			
		||||
	bne	.Labrt
 | 
			
		||||
 | 
			
		||||
	stmdb   sp!,{r4-r12}
 | 
			
		||||
	mov	r0,r2			@ AES_set_encrypt_key preserves r2,
 | 
			
		||||
	mov	r1,r2			@ which is AES_KEY *key
 | 
			
		||||
	b	_armv4_AES_set_enc2dec_key
 | 
			
		||||
.size	private_AES_set_decrypt_key,.-private_AES_set_decrypt_key
 | 
			
		||||
 | 
			
		||||
	ldr	$rounds,[r2,#240]	@ AES_set_encrypt_key preserves r2,
 | 
			
		||||
	mov	$key,r2			@ which is AES_KEY *key
 | 
			
		||||
	mov	$i1,r2
 | 
			
		||||
	add	$i2,r2,$rounds,lsl#4
 | 
			
		||||
@ void AES_set_enc2dec_key(const AES_KEY *inp,AES_KEY *out)
 | 
			
		||||
.global	AES_set_enc2dec_key
 | 
			
		||||
.type	AES_set_enc2dec_key,%function
 | 
			
		||||
.align	5
 | 
			
		||||
AES_set_enc2dec_key:
 | 
			
		||||
_armv4_AES_set_enc2dec_key:
 | 
			
		||||
	stmdb   sp!,{r4-r12,lr}
 | 
			
		||||
 | 
			
		||||
.Linv:	ldr	$s0,[$i1]
 | 
			
		||||
	ldr	$rounds,[r0,#240]
 | 
			
		||||
	mov	$i1,r0			@ input
 | 
			
		||||
	add	$i2,r0,$rounds,lsl#4
 | 
			
		||||
	mov	$key,r1			@ ouput
 | 
			
		||||
	add	$tbl,r1,$rounds,lsl#4
 | 
			
		||||
	str	$rounds,[r1,#240]
 | 
			
		||||
 | 
			
		||||
.Linv:	ldr	$s0,[$i1],#16
 | 
			
		||||
	ldr	$s1,[$i1,#-12]
 | 
			
		||||
	ldr	$s2,[$i1,#-8]
 | 
			
		||||
	ldr	$s3,[$i1,#-4]
 | 
			
		||||
	ldr	$t1,[$i2],#-16
 | 
			
		||||
	ldr	$t2,[$i2,#16+4]
 | 
			
		||||
	ldr	$t3,[$i2,#16+8]
 | 
			
		||||
	ldr	$i3,[$i2,#16+12]
 | 
			
		||||
	str	$s0,[$tbl],#-16
 | 
			
		||||
	str	$s1,[$tbl,#16+4]
 | 
			
		||||
	str	$s2,[$tbl,#16+8]
 | 
			
		||||
	str	$s3,[$tbl,#16+12]
 | 
			
		||||
	str	$t1,[$key],#16
 | 
			
		||||
	str	$t2,[$key,#-12]
 | 
			
		||||
	str	$t3,[$key,#-8]
 | 
			
		||||
	str	$i3,[$key,#-4]
 | 
			
		||||
	teq	$i1,$i2
 | 
			
		||||
	bne	.Linv
 | 
			
		||||
 | 
			
		||||
	ldr	$s0,[$i1]
 | 
			
		||||
	ldr	$s1,[$i1,#4]
 | 
			
		||||
	ldr	$s2,[$i1,#8]
 | 
			
		||||
	ldr	$s3,[$i1,#12]
 | 
			
		||||
	ldr	$t1,[$i2]
 | 
			
		||||
	ldr	$t2,[$i2,#4]
 | 
			
		||||
	ldr	$t3,[$i2,#8]
 | 
			
		||||
	ldr	$i3,[$i2,#12]
 | 
			
		||||
	str	$s0,[$i2],#-16
 | 
			
		||||
	str	$s1,[$i2,#16+4]
 | 
			
		||||
	str	$s2,[$i2,#16+8]
 | 
			
		||||
	str	$s3,[$i2,#16+12]
 | 
			
		||||
	str	$t1,[$i1],#16
 | 
			
		||||
	str	$t2,[$i1,#-12]
 | 
			
		||||
	str	$t3,[$i1,#-8]
 | 
			
		||||
	str	$i3,[$i1,#-4]
 | 
			
		||||
	teq	$i1,$i2
 | 
			
		||||
	bne	.Linv
 | 
			
		||||
	str	$s0,[$key]
 | 
			
		||||
	str	$s1,[$key,#4]
 | 
			
		||||
	str	$s2,[$key,#8]
 | 
			
		||||
	str	$s3,[$key,#12]
 | 
			
		||||
	sub	$key,$key,$rounds,lsl#3
 | 
			
		||||
___
 | 
			
		||||
$mask80=$i1;
 | 
			
		||||
$mask1b=$i2;
 | 
			
		||||
@@ -772,7 +839,7 @@ $code.=<<___;
 | 
			
		||||
	moveq	pc,lr			@ be binary compatible with V4, yet
 | 
			
		||||
	bx	lr			@ interoperable with Thumb ISA:-)
 | 
			
		||||
#endif
 | 
			
		||||
.size	AES_set_decrypt_key,.-AES_set_decrypt_key
 | 
			
		||||
.size	AES_set_enc2dec_key,.-AES_set_enc2dec_key
 | 
			
		||||
 | 
			
		||||
.type	AES_Td,%object
 | 
			
		||||
.align	5
 | 
			
		||||
@@ -882,7 +949,11 @@ AES_Td:
 | 
			
		||||
.type   AES_decrypt,%function
 | 
			
		||||
.align	5
 | 
			
		||||
AES_decrypt:
 | 
			
		||||
#if __ARM_ARCH__<7
 | 
			
		||||
	sub	r3,pc,#8		@ AES_decrypt
 | 
			
		||||
#else
 | 
			
		||||
	adr	r3,AES_decrypt
 | 
			
		||||
#endif
 | 
			
		||||
	stmdb   sp!,{r1,r4-r12,lr}
 | 
			
		||||
	mov	$rounds,r0		@ inp
 | 
			
		||||
	mov	$key,r2
 | 
			
		||||
@@ -1079,8 +1150,9 @@ _armv4_AES_decrypt:
 | 
			
		||||
	ldrb	$t3,[$tbl,$i3]		@ Td4[s0>>0]
 | 
			
		||||
	and	$i3,lr,$s1,lsr#8
 | 
			
		||||
 | 
			
		||||
	add	$s1,$tbl,$s1,lsr#24
 | 
			
		||||
	ldrb	$i1,[$tbl,$i1]		@ Td4[s1>>0]
 | 
			
		||||
	ldrb	$s1,[$tbl,$s1,lsr#24]	@ Td4[s1>>24]
 | 
			
		||||
	ldrb	$s1,[$s1]		@ Td4[s1>>24]
 | 
			
		||||
	ldrb	$i2,[$tbl,$i2]		@ Td4[s1>>16]
 | 
			
		||||
	eor	$s0,$i1,$s0,lsl#24
 | 
			
		||||
	ldrb	$i3,[$tbl,$i3]		@ Td4[s1>>8]
 | 
			
		||||
@@ -1093,7 +1165,8 @@ _armv4_AES_decrypt:
 | 
			
		||||
	ldrb	$i2,[$tbl,$i2]		@ Td4[s2>>0]
 | 
			
		||||
	and	$i3,lr,$s2,lsr#16
 | 
			
		||||
 | 
			
		||||
	ldrb	$s2,[$tbl,$s2,lsr#24]	@ Td4[s2>>24]
 | 
			
		||||
	add	$s2,$tbl,$s2,lsr#24
 | 
			
		||||
	ldrb	$s2,[$s2]		@ Td4[s2>>24]
 | 
			
		||||
	eor	$s0,$s0,$i1,lsl#8
 | 
			
		||||
	ldrb	$i3,[$tbl,$i3]		@ Td4[s2>>16]
 | 
			
		||||
	eor	$s1,$i2,$s1,lsl#16
 | 
			
		||||
@@ -1105,8 +1178,9 @@ _armv4_AES_decrypt:
 | 
			
		||||
	ldrb	$i2,[$tbl,$i2]		@ Td4[s3>>8]
 | 
			
		||||
	and	$i3,lr,$s3		@ i2
 | 
			
		||||
 | 
			
		||||
	add	$s3,$tbl,$s3,lsr#24
 | 
			
		||||
	ldrb	$i3,[$tbl,$i3]		@ Td4[s3>>0]
 | 
			
		||||
	ldrb	$s3,[$tbl,$s3,lsr#24]	@ Td4[s3>>24]
 | 
			
		||||
	ldrb	$s3,[$s3]		@ Td4[s3>>24]
 | 
			
		||||
	eor	$s0,$s0,$i1,lsl#16
 | 
			
		||||
	ldr	$i1,[$key,#0]
 | 
			
		||||
	eor	$s1,$s1,$i2,lsl#8
 | 
			
		||||
@@ -1129,5 +1203,14 @@ _armv4_AES_decrypt:
 | 
			
		||||
___
 | 
			
		||||
 | 
			
		||||
$code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm;	# make it possible to compile with -march=armv4
 | 
			
		||||
 | 
			
		||||
open SELF,$0;
 | 
			
		||||
while(<SELF>) {
 | 
			
		||||
	next if (/^#!/);
 | 
			
		||||
	last if (!s/^#/@/ and !/^$/);
 | 
			
		||||
	print;
 | 
			
		||||
}
 | 
			
		||||
close SELF;
 | 
			
		||||
 | 
			
		||||
print $code;
 | 
			
		||||
close STDOUT;	# enforce flush
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1016,6 +1016,7 @@ foreach (split("\n",$code)) {
 | 
			
		||||
		:            sprintf("extrd,u%s,%d,8,",$1,63-$2)/e;
 | 
			
		||||
 | 
			
		||||
	s/,\*/,/			if ($SIZE_T==4);
 | 
			
		||||
	s/\bbv\b(.*\(%r2\))/bve$1/	if ($SIZE_T==8);
 | 
			
		||||
	print $_,"\n";
 | 
			
		||||
}
 | 
			
		||||
close STDOUT;
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,8 @@ if ($flavour =~ /64/) {
 | 
			
		||||
	$PUSH	="stw";
 | 
			
		||||
} else { die "nonsense $flavour"; }
 | 
			
		||||
 | 
			
		||||
$LITTLE_ENDIAN = ($flavour=~/le$/) ? $SIZE_T : 0;
 | 
			
		||||
 | 
			
		||||
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
 | 
			
		||||
( $xlate="${dir}../../perlasm/ppc-xlate.pl" and -f $xlate) or
 | 
			
		||||
@@ -68,7 +70,7 @@ $key="r5";
 | 
			
		||||
$Tbl0="r3";
 | 
			
		||||
$Tbl1="r6";
 | 
			
		||||
$Tbl2="r7";
 | 
			
		||||
$Tbl3="r2";
 | 
			
		||||
$Tbl3=$out;	# stay away from "r2"; $out is offloaded to stack
 | 
			
		||||
 | 
			
		||||
$s0="r8";
 | 
			
		||||
$s1="r9";
 | 
			
		||||
@@ -76,7 +78,7 @@ $s2="r10";
 | 
			
		||||
$s3="r11";
 | 
			
		||||
 | 
			
		||||
$t0="r12";
 | 
			
		||||
$t1="r13";
 | 
			
		||||
$t1="r0";	# stay away from "r13";
 | 
			
		||||
$t2="r14";
 | 
			
		||||
$t3="r15";
 | 
			
		||||
 | 
			
		||||
@@ -100,9 +102,6 @@ $acc13="r29";
 | 
			
		||||
$acc14="r30";
 | 
			
		||||
$acc15="r31";
 | 
			
		||||
 | 
			
		||||
# stay away from TLS pointer
 | 
			
		||||
if ($SIZE_T==8)	{ die if ($t1 ne "r13");  $t1="r0";		}
 | 
			
		||||
else		{ die if ($Tbl3 ne "r2"); $Tbl3=$t0; $t0="r0";	}
 | 
			
		||||
$mask80=$Tbl2;
 | 
			
		||||
$mask1b=$Tbl3;
 | 
			
		||||
 | 
			
		||||
@@ -337,8 +336,7 @@ $code.=<<___;
 | 
			
		||||
	$STU	$sp,-$FRAME($sp)
 | 
			
		||||
	mflr	r0
 | 
			
		||||
 | 
			
		||||
	$PUSH	$toc,`$FRAME-$SIZE_T*20`($sp)
 | 
			
		||||
	$PUSH	r13,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
	$PUSH	$out,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
	$PUSH	r14,`$FRAME-$SIZE_T*18`($sp)
 | 
			
		||||
	$PUSH	r15,`$FRAME-$SIZE_T*17`($sp)
 | 
			
		||||
	$PUSH	r16,`$FRAME-$SIZE_T*16`($sp)
 | 
			
		||||
@@ -365,16 +363,61 @@ $code.=<<___;
 | 
			
		||||
	bne	Lenc_unaligned
 | 
			
		||||
 | 
			
		||||
Lenc_unaligned_ok:
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if (!$LITTLE_ENDIAN);
 | 
			
		||||
	lwz	$s0,0($inp)
 | 
			
		||||
	lwz	$s1,4($inp)
 | 
			
		||||
	lwz	$s2,8($inp)
 | 
			
		||||
	lwz	$s3,12($inp)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if ($LITTLE_ENDIAN);
 | 
			
		||||
	lwz	$t0,0($inp)
 | 
			
		||||
	lwz	$t1,4($inp)
 | 
			
		||||
	lwz	$t2,8($inp)
 | 
			
		||||
	lwz	$t3,12($inp)
 | 
			
		||||
	rotlwi	$s0,$t0,8
 | 
			
		||||
	rotlwi	$s1,$t1,8
 | 
			
		||||
	rotlwi	$s2,$t2,8
 | 
			
		||||
	rotlwi	$s3,$t3,8
 | 
			
		||||
	rlwimi	$s0,$t0,24,0,7
 | 
			
		||||
	rlwimi	$s1,$t1,24,0,7
 | 
			
		||||
	rlwimi	$s2,$t2,24,0,7
 | 
			
		||||
	rlwimi	$s3,$t3,24,0,7
 | 
			
		||||
	rlwimi	$s0,$t0,24,16,23
 | 
			
		||||
	rlwimi	$s1,$t1,24,16,23
 | 
			
		||||
	rlwimi	$s2,$t2,24,16,23
 | 
			
		||||
	rlwimi	$s3,$t3,24,16,23
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	bl	LAES_Te
 | 
			
		||||
	bl	Lppc_AES_encrypt_compact
 | 
			
		||||
	$POP	$out,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if ($LITTLE_ENDIAN);
 | 
			
		||||
	rotlwi	$t0,$s0,8
 | 
			
		||||
	rotlwi	$t1,$s1,8
 | 
			
		||||
	rotlwi	$t2,$s2,8
 | 
			
		||||
	rotlwi	$t3,$s3,8
 | 
			
		||||
	rlwimi	$t0,$s0,24,0,7
 | 
			
		||||
	rlwimi	$t1,$s1,24,0,7
 | 
			
		||||
	rlwimi	$t2,$s2,24,0,7
 | 
			
		||||
	rlwimi	$t3,$s3,24,0,7
 | 
			
		||||
	rlwimi	$t0,$s0,24,16,23
 | 
			
		||||
	rlwimi	$t1,$s1,24,16,23
 | 
			
		||||
	rlwimi	$t2,$s2,24,16,23
 | 
			
		||||
	rlwimi	$t3,$s3,24,16,23
 | 
			
		||||
	stw	$t0,0($out)
 | 
			
		||||
	stw	$t1,4($out)
 | 
			
		||||
	stw	$t2,8($out)
 | 
			
		||||
	stw	$t3,12($out)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if (!$LITTLE_ENDIAN);
 | 
			
		||||
	stw	$s0,0($out)
 | 
			
		||||
	stw	$s1,4($out)
 | 
			
		||||
	stw	$s2,8($out)
 | 
			
		||||
	stw	$s3,12($out)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	b	Lenc_done
 | 
			
		||||
 | 
			
		||||
Lenc_unaligned:
 | 
			
		||||
@@ -417,6 +460,7 @@ Lenc_xpage:
 | 
			
		||||
 | 
			
		||||
	bl	LAES_Te
 | 
			
		||||
	bl	Lppc_AES_encrypt_compact
 | 
			
		||||
	$POP	$out,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
 | 
			
		||||
	extrwi	$acc00,$s0,8,0
 | 
			
		||||
	extrwi	$acc01,$s0,8,8
 | 
			
		||||
@@ -449,8 +493,6 @@ Lenc_xpage:
 | 
			
		||||
 | 
			
		||||
Lenc_done:
 | 
			
		||||
	$POP	r0,`$FRAME+$LRSAVE`($sp)
 | 
			
		||||
	$POP	$toc,`$FRAME-$SIZE_T*20`($sp)
 | 
			
		||||
	$POP	r13,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
	$POP	r14,`$FRAME-$SIZE_T*18`($sp)
 | 
			
		||||
	$POP	r15,`$FRAME-$SIZE_T*17`($sp)
 | 
			
		||||
	$POP	r16,`$FRAME-$SIZE_T*16`($sp)
 | 
			
		||||
@@ -764,6 +806,7 @@ Lenc_compact_done:
 | 
			
		||||
	blr
 | 
			
		||||
	.long	0
 | 
			
		||||
	.byte	0,12,0x14,0,0,0,0,0
 | 
			
		||||
.size	.AES_encrypt,.-.AES_encrypt
 | 
			
		||||
 | 
			
		||||
.globl	.AES_decrypt
 | 
			
		||||
.align	7
 | 
			
		||||
@@ -771,8 +814,7 @@ Lenc_compact_done:
 | 
			
		||||
	$STU	$sp,-$FRAME($sp)
 | 
			
		||||
	mflr	r0
 | 
			
		||||
 | 
			
		||||
	$PUSH	$toc,`$FRAME-$SIZE_T*20`($sp)
 | 
			
		||||
	$PUSH	r13,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
	$PUSH	$out,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
	$PUSH	r14,`$FRAME-$SIZE_T*18`($sp)
 | 
			
		||||
	$PUSH	r15,`$FRAME-$SIZE_T*17`($sp)
 | 
			
		||||
	$PUSH	r16,`$FRAME-$SIZE_T*16`($sp)
 | 
			
		||||
@@ -799,16 +841,61 @@ Lenc_compact_done:
 | 
			
		||||
	bne	Ldec_unaligned
 | 
			
		||||
 | 
			
		||||
Ldec_unaligned_ok:
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if (!$LITTLE_ENDIAN);
 | 
			
		||||
	lwz	$s0,0($inp)
 | 
			
		||||
	lwz	$s1,4($inp)
 | 
			
		||||
	lwz	$s2,8($inp)
 | 
			
		||||
	lwz	$s3,12($inp)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if ($LITTLE_ENDIAN);
 | 
			
		||||
	lwz	$t0,0($inp)
 | 
			
		||||
	lwz	$t1,4($inp)
 | 
			
		||||
	lwz	$t2,8($inp)
 | 
			
		||||
	lwz	$t3,12($inp)
 | 
			
		||||
	rotlwi	$s0,$t0,8
 | 
			
		||||
	rotlwi	$s1,$t1,8
 | 
			
		||||
	rotlwi	$s2,$t2,8
 | 
			
		||||
	rotlwi	$s3,$t3,8
 | 
			
		||||
	rlwimi	$s0,$t0,24,0,7
 | 
			
		||||
	rlwimi	$s1,$t1,24,0,7
 | 
			
		||||
	rlwimi	$s2,$t2,24,0,7
 | 
			
		||||
	rlwimi	$s3,$t3,24,0,7
 | 
			
		||||
	rlwimi	$s0,$t0,24,16,23
 | 
			
		||||
	rlwimi	$s1,$t1,24,16,23
 | 
			
		||||
	rlwimi	$s2,$t2,24,16,23
 | 
			
		||||
	rlwimi	$s3,$t3,24,16,23
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	bl	LAES_Td
 | 
			
		||||
	bl	Lppc_AES_decrypt_compact
 | 
			
		||||
	$POP	$out,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if ($LITTLE_ENDIAN);
 | 
			
		||||
	rotlwi	$t0,$s0,8
 | 
			
		||||
	rotlwi	$t1,$s1,8
 | 
			
		||||
	rotlwi	$t2,$s2,8
 | 
			
		||||
	rotlwi	$t3,$s3,8
 | 
			
		||||
	rlwimi	$t0,$s0,24,0,7
 | 
			
		||||
	rlwimi	$t1,$s1,24,0,7
 | 
			
		||||
	rlwimi	$t2,$s2,24,0,7
 | 
			
		||||
	rlwimi	$t3,$s3,24,0,7
 | 
			
		||||
	rlwimi	$t0,$s0,24,16,23
 | 
			
		||||
	rlwimi	$t1,$s1,24,16,23
 | 
			
		||||
	rlwimi	$t2,$s2,24,16,23
 | 
			
		||||
	rlwimi	$t3,$s3,24,16,23
 | 
			
		||||
	stw	$t0,0($out)
 | 
			
		||||
	stw	$t1,4($out)
 | 
			
		||||
	stw	$t2,8($out)
 | 
			
		||||
	stw	$t3,12($out)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if (!$LITTLE_ENDIAN);
 | 
			
		||||
	stw	$s0,0($out)
 | 
			
		||||
	stw	$s1,4($out)
 | 
			
		||||
	stw	$s2,8($out)
 | 
			
		||||
	stw	$s3,12($out)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	b	Ldec_done
 | 
			
		||||
 | 
			
		||||
Ldec_unaligned:
 | 
			
		||||
@@ -851,6 +938,7 @@ Ldec_xpage:
 | 
			
		||||
 | 
			
		||||
	bl	LAES_Td
 | 
			
		||||
	bl	Lppc_AES_decrypt_compact
 | 
			
		||||
	$POP	$out,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
 | 
			
		||||
	extrwi	$acc00,$s0,8,0
 | 
			
		||||
	extrwi	$acc01,$s0,8,8
 | 
			
		||||
@@ -883,8 +971,6 @@ Ldec_xpage:
 | 
			
		||||
 | 
			
		||||
Ldec_done:
 | 
			
		||||
	$POP	r0,`$FRAME+$LRSAVE`($sp)
 | 
			
		||||
	$POP	$toc,`$FRAME-$SIZE_T*20`($sp)
 | 
			
		||||
	$POP	r13,`$FRAME-$SIZE_T*19`($sp)
 | 
			
		||||
	$POP	r14,`$FRAME-$SIZE_T*18`($sp)
 | 
			
		||||
	$POP	r15,`$FRAME-$SIZE_T*17`($sp)
 | 
			
		||||
	$POP	r16,`$FRAME-$SIZE_T*16`($sp)
 | 
			
		||||
@@ -1355,6 +1441,7 @@ Ldec_compact_done:
 | 
			
		||||
	blr
 | 
			
		||||
	.long	0
 | 
			
		||||
	.byte	0,12,0x14,0,0,0,0,0
 | 
			
		||||
.size	.AES_decrypt,.-.AES_decrypt
 | 
			
		||||
 | 
			
		||||
.asciz	"AES for PPC, CRYPTOGAMS by <appro\@openssl.org>"
 | 
			
		||||
.align	7
 | 
			
		||||
 
 | 
			
		||||
@@ -779,10 +779,11 @@ ___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
# void AES_set_encrypt_key(const unsigned char *in, int bits,
 | 
			
		||||
# 		 AES_KEY *key) {
 | 
			
		||||
.globl	AES_set_encrypt_key
 | 
			
		||||
.type	AES_set_encrypt_key,\@function
 | 
			
		||||
.globl	private_AES_set_encrypt_key
 | 
			
		||||
.type	private_AES_set_encrypt_key,\@function
 | 
			
		||||
.align	16
 | 
			
		||||
AES_set_encrypt_key:
 | 
			
		||||
private_AES_set_encrypt_key:
 | 
			
		||||
_s390x_AES_set_encrypt_key:
 | 
			
		||||
	lghi	$t0,0
 | 
			
		||||
	cl${g}r	$inp,$t0
 | 
			
		||||
	je	.Lminus1
 | 
			
		||||
@@ -836,7 +837,8 @@ $code.=<<___ if (!$softonly);
 | 
			
		||||
	je	1f
 | 
			
		||||
	lg	%r1,24($inp)
 | 
			
		||||
	stg	%r1,24($key)
 | 
			
		||||
1:	st	$bits,236($key)	# save bits
 | 
			
		||||
1:	st	$bits,236($key)	# save bits [for debugging purposes]
 | 
			
		||||
	lgr	$t0,%r5
 | 
			
		||||
	st	%r5,240($key)	# save km code
 | 
			
		||||
	lghi	%r2,0
 | 
			
		||||
	br	%r14
 | 
			
		||||
@@ -844,7 +846,7 @@ ___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.align	16
 | 
			
		||||
.Lekey_internal:
 | 
			
		||||
	stm${g}	%r6,%r13,6*$SIZE_T($sp)	# all non-volatile regs
 | 
			
		||||
	stm${g}	%r4,%r13,4*$SIZE_T($sp)	# all non-volatile regs and $key
 | 
			
		||||
 | 
			
		||||
	larl	$tbl,AES_Te+2048
 | 
			
		||||
 | 
			
		||||
@@ -904,8 +906,9 @@ $code.=<<___;
 | 
			
		||||
	la	$key,16($key)		# key+=4
 | 
			
		||||
	la	$t3,4($t3)		# i++
 | 
			
		||||
	brct	$rounds,.L128_loop
 | 
			
		||||
	lghi	$t0,10
 | 
			
		||||
	lghi	%r2,0
 | 
			
		||||
	lm${g}	%r6,%r13,6*$SIZE_T($sp)
 | 
			
		||||
	lm${g}	%r4,%r13,4*$SIZE_T($sp)
 | 
			
		||||
	br	$ra
 | 
			
		||||
 | 
			
		||||
.align	16
 | 
			
		||||
@@ -952,8 +955,9 @@ $code.=<<___;
 | 
			
		||||
	st	$s2,32($key)
 | 
			
		||||
	st	$s3,36($key)
 | 
			
		||||
	brct	$rounds,.L192_continue
 | 
			
		||||
	lghi	$t0,12
 | 
			
		||||
	lghi	%r2,0
 | 
			
		||||
	lm${g}	%r6,%r13,6*$SIZE_T($sp)
 | 
			
		||||
	lm${g}	%r4,%r13,4*$SIZE_T($sp)
 | 
			
		||||
	br	$ra
 | 
			
		||||
 | 
			
		||||
.align	16
 | 
			
		||||
@@ -1014,8 +1018,9 @@ $code.=<<___;
 | 
			
		||||
	st	$s2,40($key)
 | 
			
		||||
	st	$s3,44($key)
 | 
			
		||||
	brct	$rounds,.L256_continue
 | 
			
		||||
	lghi	$t0,14
 | 
			
		||||
	lghi	%r2,0
 | 
			
		||||
	lm${g}	%r6,%r13,6*$SIZE_T($sp)
 | 
			
		||||
	lm${g}	%r4,%r13,4*$SIZE_T($sp)
 | 
			
		||||
	br	$ra
 | 
			
		||||
 | 
			
		||||
.align	16
 | 
			
		||||
@@ -1058,42 +1063,34 @@ $code.=<<___;
 | 
			
		||||
.Lminus1:
 | 
			
		||||
	lghi	%r2,-1
 | 
			
		||||
	br	$ra
 | 
			
		||||
.size	AES_set_encrypt_key,.-AES_set_encrypt_key
 | 
			
		||||
.size	private_AES_set_encrypt_key,.-private_AES_set_encrypt_key
 | 
			
		||||
 | 
			
		||||
# void AES_set_decrypt_key(const unsigned char *in, int bits,
 | 
			
		||||
# 		 AES_KEY *key) {
 | 
			
		||||
.globl	AES_set_decrypt_key
 | 
			
		||||
.type	AES_set_decrypt_key,\@function
 | 
			
		||||
.globl	private_AES_set_decrypt_key
 | 
			
		||||
.type	private_AES_set_decrypt_key,\@function
 | 
			
		||||
.align	16
 | 
			
		||||
AES_set_decrypt_key:
 | 
			
		||||
	st${g}	$key,4*$SIZE_T($sp)	# I rely on AES_set_encrypt_key to
 | 
			
		||||
	st${g}	$ra,14*$SIZE_T($sp)	# save non-volatile registers!
 | 
			
		||||
	bras	$ra,AES_set_encrypt_key
 | 
			
		||||
	l${g}	$key,4*$SIZE_T($sp)
 | 
			
		||||
private_AES_set_decrypt_key:
 | 
			
		||||
	#st${g}	$key,4*$SIZE_T($sp)	# I rely on AES_set_encrypt_key to
 | 
			
		||||
	st${g}	$ra,14*$SIZE_T($sp)	# save non-volatile registers and $key!
 | 
			
		||||
	bras	$ra,_s390x_AES_set_encrypt_key
 | 
			
		||||
	#l${g}	$key,4*$SIZE_T($sp)
 | 
			
		||||
	l${g}	$ra,14*$SIZE_T($sp)
 | 
			
		||||
	ltgr	%r2,%r2
 | 
			
		||||
	bnzr	$ra
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___ if (!$softonly);
 | 
			
		||||
	l	$t0,240($key)
 | 
			
		||||
	#l	$t0,240($key)
 | 
			
		||||
	lhi	$t1,16
 | 
			
		||||
	cr	$t0,$t1
 | 
			
		||||
	jl	.Lgo
 | 
			
		||||
	oill	$t0,0x80	# set "decrypt" bit
 | 
			
		||||
	st	$t0,240($key)
 | 
			
		||||
	br	$ra
 | 
			
		||||
 | 
			
		||||
.align	16
 | 
			
		||||
.Ldkey_internal:
 | 
			
		||||
	st${g}	$key,4*$SIZE_T($sp)
 | 
			
		||||
	st${g}	$ra,14*$SIZE_T($sp)
 | 
			
		||||
	bras	$ra,.Lekey_internal
 | 
			
		||||
	l${g}	$key,4*$SIZE_T($sp)
 | 
			
		||||
	l${g}	$ra,14*$SIZE_T($sp)
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
 | 
			
		||||
.Lgo:	llgf	$rounds,240($key)
 | 
			
		||||
.align	16
 | 
			
		||||
.Lgo:	lgr	$rounds,$t0	#llgf	$rounds,240($key)
 | 
			
		||||
	la	$i1,0($key)
 | 
			
		||||
	sllg	$i2,$rounds,4
 | 
			
		||||
	la	$i2,0($i2,$key)
 | 
			
		||||
@@ -1173,7 +1170,7 @@ $code.=<<___;
 | 
			
		||||
	lm${g}	%r6,%r13,6*$SIZE_T($sp)# as was saved by AES_set_encrypt_key!
 | 
			
		||||
	lghi	%r2,0
 | 
			
		||||
	br	$ra
 | 
			
		||||
.size	AES_set_decrypt_key,.-AES_set_decrypt_key
 | 
			
		||||
.size	private_AES_set_decrypt_key,.-private_AES_set_decrypt_key
 | 
			
		||||
___
 | 
			
		||||
 | 
			
		||||
########################################################################
 | 
			
		||||
@@ -1601,11 +1598,11 @@ $code.=<<___ if(1);
 | 
			
		||||
	lghi	$s1,0x7f
 | 
			
		||||
	nr	$s1,%r0
 | 
			
		||||
	lghi	%r0,0			# query capability vector
 | 
			
		||||
	la	%r1,2*$SIZE_T($sp)
 | 
			
		||||
	la	%r1,$tweak-16($sp)
 | 
			
		||||
	.long	0xb92e0042		# km %r4,%r2
 | 
			
		||||
	llihh	%r1,0x8000
 | 
			
		||||
	srlg	%r1,%r1,32($s1)		# check for 32+function code
 | 
			
		||||
	ng	%r1,2*$SIZE_T($sp)
 | 
			
		||||
	ng	%r1,$tweak-16($sp)
 | 
			
		||||
	lgr	%r0,$s0			# restore the function code
 | 
			
		||||
	la	%r1,0($key1)		# restore $key1
 | 
			
		||||
	jz	.Lxts_km_vanilla
 | 
			
		||||
@@ -1631,7 +1628,7 @@ $code.=<<___ if(1);
 | 
			
		||||
 | 
			
		||||
	lrvg	$s0,$tweak+0($sp)	# load the last tweak
 | 
			
		||||
	lrvg	$s1,$tweak+8($sp)
 | 
			
		||||
	stmg	%r0,%r3,$tweak-32(%r1)	# wipe copy of the key
 | 
			
		||||
	stmg	%r0,%r3,$tweak-32($sp)	# wipe copy of the key
 | 
			
		||||
 | 
			
		||||
	nill	%r0,0xffdf		# switch back to original function code
 | 
			
		||||
	la	%r1,0($key1)		# restore pointer to $key1
 | 
			
		||||
@@ -1687,11 +1684,9 @@ $code.=<<___;
 | 
			
		||||
	lghi	$i1,0x87
 | 
			
		||||
	srag	$i2,$s1,63		# broadcast upper bit
 | 
			
		||||
	ngr	$i1,$i2			# rem
 | 
			
		||||
	srlg	$i2,$s0,63		# carry bit from lower half
 | 
			
		||||
	sllg	$s0,$s0,1
 | 
			
		||||
	sllg	$s1,$s1,1
 | 
			
		||||
	algr	$s0,$s0
 | 
			
		||||
	alcgr	$s1,$s1
 | 
			
		||||
	xgr	$s0,$i1
 | 
			
		||||
	ogr	$s1,$i2
 | 
			
		||||
.Lxts_km_start:
 | 
			
		||||
	lrvgr	$i1,$s0			# flip byte order
 | 
			
		||||
	lrvgr	$i2,$s1
 | 
			
		||||
@@ -1748,11 +1743,9 @@ $code.=<<___;
 | 
			
		||||
	lghi	$i1,0x87
 | 
			
		||||
	srag	$i2,$s1,63		# broadcast upper bit
 | 
			
		||||
	ngr	$i1,$i2			# rem
 | 
			
		||||
	srlg	$i2,$s0,63		# carry bit from lower half
 | 
			
		||||
	sllg	$s0,$s0,1
 | 
			
		||||
	sllg	$s1,$s1,1
 | 
			
		||||
	algr	$s0,$s0
 | 
			
		||||
	alcgr	$s1,$s1
 | 
			
		||||
	xgr	$s0,$i1
 | 
			
		||||
	ogr	$s1,$i2
 | 
			
		||||
 | 
			
		||||
	ltr	$len,$len		# clear zero flag
 | 
			
		||||
	br	$ra
 | 
			
		||||
@@ -1784,8 +1777,8 @@ $code.=<<___ if (!$softonly);
 | 
			
		||||
	clr	%r0,%r1
 | 
			
		||||
	jl	.Lxts_enc_software
 | 
			
		||||
 | 
			
		||||
	st${g}	$ra,5*$SIZE_T($sp)
 | 
			
		||||
	stm${g}	%r6,$s3,6*$SIZE_T($sp)
 | 
			
		||||
	st${g}	$ra,14*$SIZE_T($sp)
 | 
			
		||||
 | 
			
		||||
	sllg	$len,$len,4		# $len&=~15
 | 
			
		||||
	slgr	$out,$inp
 | 
			
		||||
@@ -1833,9 +1826,9 @@ $code.=<<___ if (!$softonly);
 | 
			
		||||
	stg	$i2,8($i3)
 | 
			
		||||
 | 
			
		||||
.Lxts_enc_km_done:
 | 
			
		||||
	l${g}	$ra,14*$SIZE_T($sp)
 | 
			
		||||
	st${g}	$sp,$tweak($sp)		# wipe tweak
 | 
			
		||||
	st${g}	$sp,$tweak($sp)
 | 
			
		||||
	stg	$sp,$tweak+0($sp)	# wipe tweak
 | 
			
		||||
	stg	$sp,$tweak+8($sp)
 | 
			
		||||
	l${g}	$ra,5*$SIZE_T($sp)
 | 
			
		||||
	lm${g}	%r6,$s3,6*$SIZE_T($sp)
 | 
			
		||||
	br	$ra
 | 
			
		||||
.align	16
 | 
			
		||||
@@ -1846,12 +1839,11 @@ $code.=<<___;
 | 
			
		||||
 | 
			
		||||
	slgr	$out,$inp
 | 
			
		||||
 | 
			
		||||
	xgr	$s0,$s0			# clear upper half
 | 
			
		||||
	xgr	$s1,$s1
 | 
			
		||||
	lrv	$s0,$stdframe+4($sp)	# load secno
 | 
			
		||||
	lrv	$s1,$stdframe+0($sp)
 | 
			
		||||
	xgr	$s2,$s2
 | 
			
		||||
	xgr	$s3,$s3
 | 
			
		||||
	l${g}	$s3,$stdframe($sp)	# ivp
 | 
			
		||||
	llgf	$s0,0($s3)		# load iv
 | 
			
		||||
	llgf	$s1,4($s3)
 | 
			
		||||
	llgf	$s2,8($s3)
 | 
			
		||||
	llgf	$s3,12($s3)
 | 
			
		||||
	stm${g}	%r2,%r5,2*$SIZE_T($sp)
 | 
			
		||||
	la	$key,0($key2)
 | 
			
		||||
	larl	$tbl,AES_Te
 | 
			
		||||
@@ -1867,11 +1859,9 @@ $code.=<<___;
 | 
			
		||||
	lghi	%r1,0x87
 | 
			
		||||
	srag	%r0,$s3,63		# broadcast upper bit
 | 
			
		||||
	ngr	%r1,%r0			# rem
 | 
			
		||||
	srlg	%r0,$s1,63		# carry bit from lower half
 | 
			
		||||
	sllg	$s1,$s1,1
 | 
			
		||||
	sllg	$s3,$s3,1
 | 
			
		||||
	algr	$s1,$s1
 | 
			
		||||
	alcgr	$s3,$s3
 | 
			
		||||
	xgr	$s1,%r1
 | 
			
		||||
	ogr	$s3,%r0
 | 
			
		||||
	lrvgr	$s1,$s1			# flip byte order
 | 
			
		||||
	lrvgr	$s3,$s3
 | 
			
		||||
	srlg	$s0,$s1,32		# smash the tweak to 4x32-bits 
 | 
			
		||||
@@ -1920,11 +1910,9 @@ $code.=<<___;
 | 
			
		||||
	lghi	%r1,0x87
 | 
			
		||||
	srag	%r0,$s3,63		# broadcast upper bit
 | 
			
		||||
	ngr	%r1,%r0			# rem
 | 
			
		||||
	srlg	%r0,$s1,63		# carry bit from lower half
 | 
			
		||||
	sllg	$s1,$s1,1
 | 
			
		||||
	sllg	$s3,$s3,1
 | 
			
		||||
	algr	$s1,$s1
 | 
			
		||||
	alcgr	$s3,$s3
 | 
			
		||||
	xgr	$s1,%r1
 | 
			
		||||
	ogr	$s3,%r0
 | 
			
		||||
	lrvgr	$s1,$s1			# flip byte order
 | 
			
		||||
	lrvgr	$s3,$s3
 | 
			
		||||
	srlg	$s0,$s1,32		# smash the tweak to 4x32-bits 
 | 
			
		||||
@@ -1959,7 +1947,8 @@ $code.=<<___;
 | 
			
		||||
.size	AES_xts_encrypt,.-AES_xts_encrypt
 | 
			
		||||
___
 | 
			
		||||
# void AES_xts_decrypt(const char *inp,char *out,size_t len,
 | 
			
		||||
#	const AES_KEY *key1, const AES_KEY *key2,u64 secno);
 | 
			
		||||
#	const AES_KEY *key1, const AES_KEY *key2,
 | 
			
		||||
#	const unsigned char iv[16]);
 | 
			
		||||
#
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.globl	AES_xts_decrypt
 | 
			
		||||
@@ -1991,8 +1980,8 @@ $code.=<<___ if (!$softonly);
 | 
			
		||||
	clr	%r0,%r1
 | 
			
		||||
	jl	.Lxts_dec_software
 | 
			
		||||
 | 
			
		||||
	st${g}	$ra,5*$SIZE_T($sp)
 | 
			
		||||
	stm${g}	%r6,$s3,6*$SIZE_T($sp)
 | 
			
		||||
	st${g}	$ra,14*$SIZE_T($sp)
 | 
			
		||||
 | 
			
		||||
	nill	$len,0xfff0		# $len&=~15
 | 
			
		||||
	slgr	$out,$inp
 | 
			
		||||
@@ -2031,11 +2020,9 @@ $code.=<<___ if (!$softonly);
 | 
			
		||||
	lghi	$i1,0x87
 | 
			
		||||
	srag	$i2,$s1,63		# broadcast upper bit
 | 
			
		||||
	ngr	$i1,$i2			# rem
 | 
			
		||||
	srlg	$i2,$s0,63		# carry bit from lower half
 | 
			
		||||
	sllg	$s0,$s0,1
 | 
			
		||||
	sllg	$s1,$s1,1
 | 
			
		||||
	algr	$s0,$s0
 | 
			
		||||
	alcgr	$s1,$s1
 | 
			
		||||
	xgr	$s0,$i1
 | 
			
		||||
	ogr	$s1,$i2
 | 
			
		||||
	lrvgr	$i1,$s0			# flip byte order
 | 
			
		||||
	lrvgr	$i2,$s1
 | 
			
		||||
 | 
			
		||||
@@ -2078,9 +2065,9 @@ $code.=<<___ if (!$softonly);
 | 
			
		||||
	stg	$s2,0($i3)
 | 
			
		||||
	stg	$s3,8($i3)
 | 
			
		||||
.Lxts_dec_km_done:
 | 
			
		||||
	l${g}	$ra,14*$SIZE_T($sp)
 | 
			
		||||
	st${g}	$sp,$tweak($sp)		# wipe tweak
 | 
			
		||||
	st${g}	$sp,$tweak($sp)
 | 
			
		||||
	stg	$sp,$tweak+0($sp)	# wipe tweak
 | 
			
		||||
	stg	$sp,$tweak+8($sp)
 | 
			
		||||
	l${g}	$ra,5*$SIZE_T($sp)
 | 
			
		||||
	lm${g}	%r6,$s3,6*$SIZE_T($sp)
 | 
			
		||||
	br	$ra
 | 
			
		||||
.align	16
 | 
			
		||||
@@ -2092,12 +2079,11 @@ $code.=<<___;
 | 
			
		||||
	srlg	$len,$len,4
 | 
			
		||||
	slgr	$out,$inp
 | 
			
		||||
 | 
			
		||||
	xgr	$s0,$s0			# clear upper half
 | 
			
		||||
	xgr	$s1,$s1
 | 
			
		||||
	lrv	$s0,$stdframe+4($sp)	# load secno
 | 
			
		||||
	lrv	$s1,$stdframe+0($sp)
 | 
			
		||||
	xgr	$s2,$s2
 | 
			
		||||
	xgr	$s3,$s3
 | 
			
		||||
	l${g}	$s3,$stdframe($sp)	# ivp
 | 
			
		||||
	llgf	$s0,0($s3)		# load iv
 | 
			
		||||
	llgf	$s1,4($s3)
 | 
			
		||||
	llgf	$s2,8($s3)
 | 
			
		||||
	llgf	$s3,12($s3)
 | 
			
		||||
	stm${g}	%r2,%r5,2*$SIZE_T($sp)
 | 
			
		||||
	la	$key,0($key2)
 | 
			
		||||
	larl	$tbl,AES_Te
 | 
			
		||||
@@ -2116,11 +2102,9 @@ $code.=<<___;
 | 
			
		||||
	lghi	%r1,0x87
 | 
			
		||||
	srag	%r0,$s3,63		# broadcast upper bit
 | 
			
		||||
	ngr	%r1,%r0			# rem
 | 
			
		||||
	srlg	%r0,$s1,63		# carry bit from lower half
 | 
			
		||||
	sllg	$s1,$s1,1
 | 
			
		||||
	sllg	$s3,$s3,1
 | 
			
		||||
	algr	$s1,$s1
 | 
			
		||||
	alcgr	$s3,$s3
 | 
			
		||||
	xgr	$s1,%r1
 | 
			
		||||
	ogr	$s3,%r0
 | 
			
		||||
	lrvgr	$s1,$s1			# flip byte order
 | 
			
		||||
	lrvgr	$s3,$s3
 | 
			
		||||
	srlg	$s0,$s1,32		# smash the tweak to 4x32-bits 
 | 
			
		||||
@@ -2159,11 +2143,9 @@ $code.=<<___;
 | 
			
		||||
	lghi	%r1,0x87
 | 
			
		||||
	srag	%r0,$s3,63		# broadcast upper bit
 | 
			
		||||
	ngr	%r1,%r0			# rem
 | 
			
		||||
	srlg	%r0,$s1,63		# carry bit from lower half
 | 
			
		||||
	sllg	$s1,$s1,1
 | 
			
		||||
	sllg	$s3,$s3,1
 | 
			
		||||
	algr	$s1,$s1
 | 
			
		||||
	alcgr	$s3,$s3
 | 
			
		||||
	xgr	$s1,%r1
 | 
			
		||||
	ogr	$s3,%r0
 | 
			
		||||
	lrvgr	$i2,$s1			# flip byte order
 | 
			
		||||
	lrvgr	$i3,$s3
 | 
			
		||||
	stmg	$i2,$i3,$tweak($sp)	# save the 1st tweak
 | 
			
		||||
@@ -2179,11 +2161,9 @@ $code.=<<___;
 | 
			
		||||
	lghi	%r1,0x87
 | 
			
		||||
	srag	%r0,$s3,63		# broadcast upper bit
 | 
			
		||||
	ngr	%r1,%r0			# rem
 | 
			
		||||
	srlg	%r0,$s1,63		# carry bit from lower half
 | 
			
		||||
	sllg	$s1,$s1,1
 | 
			
		||||
	sllg	$s3,$s3,1
 | 
			
		||||
	algr	$s1,$s1
 | 
			
		||||
	alcgr	$s3,$s3
 | 
			
		||||
	xgr	$s1,%r1
 | 
			
		||||
	ogr	$s3,%r0
 | 
			
		||||
	lrvgr	$s1,$s1			# flip byte order
 | 
			
		||||
	lrvgr	$s3,$s3
 | 
			
		||||
	srlg	$s0,$s1,32		# smash the tweak to 4x32-bits
 | 
			
		||||
 
 | 
			
		||||
@@ -1176,6 +1176,7 @@ ___
 | 
			
		||||
# As UltraSPARC T1, a.k.a. Niagara, has shared FPU, FP nops can have
 | 
			
		||||
# undesired effect, so just omit them and sacrifice some portion of
 | 
			
		||||
# percent in performance...
 | 
			
		||||
$code =~ s/fmovs.*$//gem;
 | 
			
		||||
$code =~ s/fmovs.*$//gm;
 | 
			
		||||
 | 
			
		||||
print $code;
 | 
			
		||||
close STDOUT;	# ensure flush
 | 
			
		||||
 
 | 
			
		||||
@@ -19,9 +19,10 @@
 | 
			
		||||
# Performance in number of cycles per processed byte for 128-bit key:
 | 
			
		||||
#
 | 
			
		||||
#		ECB encrypt	ECB decrypt	CBC large chunk
 | 
			
		||||
# AMD64		33		41		13.0
 | 
			
		||||
# EM64T		38		59		18.6(*)
 | 
			
		||||
# Core 2	30		43		14.5(*)
 | 
			
		||||
# AMD64		33		43		13.0
 | 
			
		||||
# EM64T		38		56		18.6(*)
 | 
			
		||||
# Core 2	30		42		14.5(*)
 | 
			
		||||
# Atom		65		86		32.1(*)
 | 
			
		||||
#
 | 
			
		||||
# (*) with hyper-threading off
 | 
			
		||||
 | 
			
		||||
@@ -36,7 +37,8 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 | 
			
		||||
die "can't locate x86_64-xlate.pl";
 | 
			
		||||
 | 
			
		||||
open STDOUT,"| $^X $xlate $flavour $output";
 | 
			
		||||
open OUT,"| \"$^X\" $xlate $flavour $output";
 | 
			
		||||
*STDOUT=*OUT;
 | 
			
		||||
 | 
			
		||||
$verticalspin=1;	# unlike 32-bit version $verticalspin performs
 | 
			
		||||
			# ~15% better on both AMD and Intel cores
 | 
			
		||||
@@ -365,68 +367,66 @@ $code.=<<___;
 | 
			
		||||
	movzb	`&lo("$s0")`,$t0
 | 
			
		||||
	movzb	`&lo("$s1")`,$t1
 | 
			
		||||
	movzb	`&lo("$s2")`,$t2
 | 
			
		||||
	movzb	($sbox,$t0,1),$t0
 | 
			
		||||
	movzb	($sbox,$t1,1),$t1
 | 
			
		||||
	movzb	($sbox,$t2,1),$t2
 | 
			
		||||
 | 
			
		||||
	movzb	`&lo("$s3")`,$t3
 | 
			
		||||
	movzb	`&hi("$s1")`,$acc0
 | 
			
		||||
	movzb	`&hi("$s2")`,$acc1
 | 
			
		||||
	movzb	($sbox,$t3,1),$t3
 | 
			
		||||
	movzb	($sbox,$acc0,1),$t4	#$t0
 | 
			
		||||
	movzb	($sbox,$acc1,1),$t5	#$t1
 | 
			
		||||
 | 
			
		||||
	movzb	`&hi("$s3")`,$acc2
 | 
			
		||||
	movzb	`&hi("$s0")`,$acc0
 | 
			
		||||
	shr	\$16,$s2
 | 
			
		||||
	movzb	`&hi("$s3")`,$acc2
 | 
			
		||||
	movzb	($sbox,$t0,1),$t0
 | 
			
		||||
	movzb	($sbox,$t1,1),$t1
 | 
			
		||||
	movzb	($sbox,$t2,1),$t2
 | 
			
		||||
	movzb	($sbox,$t3,1),$t3
 | 
			
		||||
 | 
			
		||||
	movzb	($sbox,$acc0,1),$t4	#$t0
 | 
			
		||||
	movzb	`&hi("$s0")`,$acc0
 | 
			
		||||
	movzb	($sbox,$acc1,1),$t5	#$t1
 | 
			
		||||
	movzb	`&lo("$s2")`,$acc1
 | 
			
		||||
	movzb	($sbox,$acc2,1),$acc2	#$t2
 | 
			
		||||
	movzb	($sbox,$acc0,1),$acc0	#$t3
 | 
			
		||||
	shr	\$16,$s3
 | 
			
		||||
 | 
			
		||||
	movzb	`&lo("$s2")`,$acc1
 | 
			
		||||
	shl	\$8,$t4
 | 
			
		||||
	shr	\$16,$s3
 | 
			
		||||
	shl	\$8,$t5
 | 
			
		||||
	movzb	($sbox,$acc1,1),$acc1	#$t0
 | 
			
		||||
	xor	$t4,$t0
 | 
			
		||||
	xor	$t5,$t1
 | 
			
		||||
 | 
			
		||||
	movzb	`&lo("$s3")`,$t4
 | 
			
		||||
	shr	\$16,$s0
 | 
			
		||||
	movzb	`&lo("$s3")`,$t4
 | 
			
		||||
	shr	\$16,$s1
 | 
			
		||||
	movzb	`&lo("$s0")`,$t5
 | 
			
		||||
	xor	$t5,$t1
 | 
			
		||||
	shl	\$8,$acc2
 | 
			
		||||
	shl	\$8,$acc0
 | 
			
		||||
	movzb	($sbox,$t4,1),$t4	#$t1
 | 
			
		||||
	movzb	($sbox,$t5,1),$t5	#$t2
 | 
			
		||||
	movzb	`&lo("$s0")`,$t5
 | 
			
		||||
	movzb	($sbox,$acc1,1),$acc1	#$t0
 | 
			
		||||
	xor	$acc2,$t2
 | 
			
		||||
	xor	$acc0,$t3
 | 
			
		||||
 | 
			
		||||
	shl	\$8,$acc0
 | 
			
		||||
	movzb	`&lo("$s1")`,$acc2
 | 
			
		||||
	movzb	`&hi("$s3")`,$acc0
 | 
			
		||||
	shl	\$16,$acc1
 | 
			
		||||
	movzb	($sbox,$acc2,1),$acc2	#$t3
 | 
			
		||||
	movzb	($sbox,$acc0,1),$acc0	#$t0
 | 
			
		||||
	xor	$acc0,$t3
 | 
			
		||||
	movzb	($sbox,$t4,1),$t4	#$t1
 | 
			
		||||
	movzb	`&hi("$s3")`,$acc0
 | 
			
		||||
	movzb	($sbox,$t5,1),$t5	#$t2
 | 
			
		||||
	xor	$acc1,$t0
 | 
			
		||||
 | 
			
		||||
	movzb	`&hi("$s0")`,$acc1
 | 
			
		||||
	shr	\$8,$s2
 | 
			
		||||
	movzb	`&hi("$s0")`,$acc1
 | 
			
		||||
	shl	\$16,$t4
 | 
			
		||||
	shr	\$8,$s1
 | 
			
		||||
	shl	\$16,$t5
 | 
			
		||||
	xor	$t4,$t1
 | 
			
		||||
	movzb	($sbox,$acc2,1),$acc2	#$t3
 | 
			
		||||
	movzb	($sbox,$acc0,1),$acc0	#$t0
 | 
			
		||||
	movzb	($sbox,$acc1,1),$acc1	#$t1
 | 
			
		||||
	movzb	($sbox,$s2,1),$s3	#$t3
 | 
			
		||||
	movzb	($sbox,$s1,1),$s2	#$t2
 | 
			
		||||
	shl	\$16,$t4
 | 
			
		||||
	shl	\$16,$t5
 | 
			
		||||
	shl	\$16,$acc2
 | 
			
		||||
	xor	$t4,$t1
 | 
			
		||||
	xor	$t5,$t2
 | 
			
		||||
	xor	$acc2,$t3
 | 
			
		||||
 | 
			
		||||
	shl	\$16,$acc2
 | 
			
		||||
	xor	$t5,$t2
 | 
			
		||||
	shl	\$24,$acc0
 | 
			
		||||
	xor	$acc2,$t3
 | 
			
		||||
	shl	\$24,$acc1
 | 
			
		||||
	shl	\$24,$s3
 | 
			
		||||
	xor	$acc0,$t0
 | 
			
		||||
	shl	\$24,$s2
 | 
			
		||||
	shl	\$24,$s3
 | 
			
		||||
	xor	$acc1,$t1
 | 
			
		||||
	shl	\$24,$s2
 | 
			
		||||
	mov	$t0,$s0
 | 
			
		||||
	mov	$t1,$s1
 | 
			
		||||
	xor	$t2,$s2
 | 
			
		||||
@@ -465,12 +465,12 @@ sub enctransform()
 | 
			
		||||
{ my ($t3,$r20,$r21)=($acc2,"%r8d","%r9d");
 | 
			
		||||
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	mov	$s0,$acc0
 | 
			
		||||
	mov	$s1,$acc1
 | 
			
		||||
	and	\$0x80808080,$acc0
 | 
			
		||||
	and	\$0x80808080,$acc1
 | 
			
		||||
	mov	$acc0,$t0
 | 
			
		||||
	mov	$acc1,$t1
 | 
			
		||||
	mov	\$0x80808080,$t0
 | 
			
		||||
	mov	\$0x80808080,$t1
 | 
			
		||||
	and	$s0,$t0
 | 
			
		||||
	and	$s1,$t1
 | 
			
		||||
	mov	$t0,$acc0
 | 
			
		||||
	mov	$t1,$acc1
 | 
			
		||||
	shr	\$7,$t0
 | 
			
		||||
	lea	($s0,$s0),$r20
 | 
			
		||||
	shr	\$7,$t1
 | 
			
		||||
@@ -488,25 +488,25 @@ $code.=<<___;
 | 
			
		||||
 | 
			
		||||
	xor	$r20,$s0
 | 
			
		||||
	xor	$r21,$s1
 | 
			
		||||
	 mov	$s2,$acc0
 | 
			
		||||
	 mov	$s3,$acc1
 | 
			
		||||
	 mov	\$0x80808080,$t2
 | 
			
		||||
	rol	\$24,$s0
 | 
			
		||||
	 mov	\$0x80808080,$t3
 | 
			
		||||
	rol	\$24,$s1
 | 
			
		||||
	 and	\$0x80808080,$acc0
 | 
			
		||||
	 and	\$0x80808080,$acc1
 | 
			
		||||
	 and	$s2,$t2
 | 
			
		||||
	 and	$s3,$t3
 | 
			
		||||
	xor	$r20,$s0
 | 
			
		||||
	xor	$r21,$s1
 | 
			
		||||
	 mov	$acc0,$t2
 | 
			
		||||
	 mov	$acc1,$t3
 | 
			
		||||
	 mov	$t2,$acc0
 | 
			
		||||
	ror	\$16,$t0
 | 
			
		||||
	 mov	$t3,$acc1
 | 
			
		||||
	ror	\$16,$t1
 | 
			
		||||
	 shr	\$7,$t2
 | 
			
		||||
	 lea	($s2,$s2),$r20
 | 
			
		||||
	 shr	\$7,$t2
 | 
			
		||||
	xor	$t0,$s0
 | 
			
		||||
	xor	$t1,$s1
 | 
			
		||||
	 shr	\$7,$t3
 | 
			
		||||
	 lea	($s3,$s3),$r21
 | 
			
		||||
	xor	$t1,$s1
 | 
			
		||||
	ror	\$8,$t0
 | 
			
		||||
	 lea	($s3,$s3),$r21
 | 
			
		||||
	ror	\$8,$t1
 | 
			
		||||
	 sub	$t2,$acc0
 | 
			
		||||
	 sub	$t3,$acc1
 | 
			
		||||
@@ -522,23 +522,23 @@ $code.=<<___;
 | 
			
		||||
	xor	$acc0,$r20
 | 
			
		||||
	xor	$acc1,$r21
 | 
			
		||||
 | 
			
		||||
	ror	\$16,$t2
 | 
			
		||||
	xor	$r20,$s2
 | 
			
		||||
	ror	\$16,$t3
 | 
			
		||||
	xor	$r21,$s3
 | 
			
		||||
	rol	\$24,$s2
 | 
			
		||||
	mov	0($sbox),$acc0			# prefetch Te4
 | 
			
		||||
	rol	\$24,$s3
 | 
			
		||||
	xor	$r20,$s2
 | 
			
		||||
	xor	$r21,$s3
 | 
			
		||||
	mov	0($sbox),$acc0			# prefetch Te4
 | 
			
		||||
	ror	\$16,$t2
 | 
			
		||||
	ror	\$16,$t3
 | 
			
		||||
	mov	64($sbox),$acc1
 | 
			
		||||
	xor	$t2,$s2
 | 
			
		||||
	xor	$t3,$s3
 | 
			
		||||
	xor	$r21,$s3
 | 
			
		||||
	mov	128($sbox),$r20
 | 
			
		||||
	ror	\$8,$t2
 | 
			
		||||
	ror	\$8,$t3
 | 
			
		||||
	mov	192($sbox),$r21
 | 
			
		||||
	xor	$t2,$s2
 | 
			
		||||
	ror	\$8,$t2
 | 
			
		||||
	xor	$t3,$s3
 | 
			
		||||
	ror	\$8,$t3
 | 
			
		||||
	xor	$t2,$s2
 | 
			
		||||
	mov	192($sbox),$r21
 | 
			
		||||
	xor	$t3,$s3
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
@@ -588,6 +588,9 @@ $code.=<<___;
 | 
			
		||||
.globl	AES_encrypt
 | 
			
		||||
.type	AES_encrypt,\@function,3
 | 
			
		||||
.align	16
 | 
			
		||||
.globl	asm_AES_encrypt
 | 
			
		||||
.hidden	asm_AES_encrypt
 | 
			
		||||
asm_AES_encrypt:
 | 
			
		||||
AES_encrypt:
 | 
			
		||||
	push	%rbx
 | 
			
		||||
	push	%rbp
 | 
			
		||||
@@ -932,70 +935,69 @@ $code.=<<___;
 | 
			
		||||
	movzb	`&lo("$s0")`,$t0
 | 
			
		||||
	movzb	`&lo("$s1")`,$t1
 | 
			
		||||
	movzb	`&lo("$s2")`,$t2
 | 
			
		||||
	movzb	($sbox,$t0,1),$t0
 | 
			
		||||
	movzb	($sbox,$t1,1),$t1
 | 
			
		||||
	movzb	($sbox,$t2,1),$t2
 | 
			
		||||
 | 
			
		||||
	movzb	`&lo("$s3")`,$t3
 | 
			
		||||
	movzb	`&hi("$s3")`,$acc0
 | 
			
		||||
	movzb	`&hi("$s0")`,$acc1
 | 
			
		||||
	movzb	($sbox,$t3,1),$t3
 | 
			
		||||
	movzb	($sbox,$acc0,1),$t4	#$t0
 | 
			
		||||
	movzb	($sbox,$acc1,1),$t5	#$t1
 | 
			
		||||
 | 
			
		||||
	shr	\$16,$s3
 | 
			
		||||
	movzb	`&hi("$s1")`,$acc2
 | 
			
		||||
	movzb	($sbox,$t0,1),$t0
 | 
			
		||||
	movzb	($sbox,$t1,1),$t1
 | 
			
		||||
	movzb	($sbox,$t2,1),$t2
 | 
			
		||||
	movzb	($sbox,$t3,1),$t3
 | 
			
		||||
 | 
			
		||||
	movzb	($sbox,$acc0,1),$t4	#$t0
 | 
			
		||||
	movzb	`&hi("$s2")`,$acc0
 | 
			
		||||
	shr	\$16,$s2
 | 
			
		||||
	movzb	($sbox,$acc1,1),$t5	#$t1
 | 
			
		||||
	movzb	($sbox,$acc2,1),$acc2	#$t2
 | 
			
		||||
	movzb	($sbox,$acc0,1),$acc0	#$t3
 | 
			
		||||
	shr	\$16,$s3
 | 
			
		||||
 | 
			
		||||
	movzb	`&lo("$s2")`,$acc1
 | 
			
		||||
	shl	\$8,$t4
 | 
			
		||||
	shr	\$16,$s2
 | 
			
		||||
	shl	\$8,$t5
 | 
			
		||||
	movzb	($sbox,$acc1,1),$acc1	#$t0
 | 
			
		||||
	xor	$t4,$t0
 | 
			
		||||
	xor	$t5,$t1
 | 
			
		||||
 | 
			
		||||
	movzb	`&lo("$s3")`,$t4
 | 
			
		||||
	shl	\$8,$t4
 | 
			
		||||
	movzb	`&lo("$s2")`,$acc1
 | 
			
		||||
	shr	\$16,$s0
 | 
			
		||||
	xor	$t4,$t0
 | 
			
		||||
	shr	\$16,$s1
 | 
			
		||||
	movzb	`&lo("$s0")`,$t5
 | 
			
		||||
	movzb	`&lo("$s3")`,$t4
 | 
			
		||||
 | 
			
		||||
	shl	\$8,$acc2
 | 
			
		||||
	xor	$t5,$t1
 | 
			
		||||
	shl	\$8,$acc0
 | 
			
		||||
	movzb	($sbox,$t4,1),$t4	#$t1
 | 
			
		||||
	movzb	($sbox,$t5,1),$t5	#$t2
 | 
			
		||||
	movzb	`&lo("$s0")`,$t5
 | 
			
		||||
	movzb	($sbox,$acc1,1),$acc1	#$t0
 | 
			
		||||
	xor	$acc2,$t2
 | 
			
		||||
	xor	$acc0,$t3
 | 
			
		||||
 | 
			
		||||
	movzb	`&lo("$s1")`,$acc2
 | 
			
		||||
	movzb	`&hi("$s1")`,$acc0
 | 
			
		||||
	shl	\$16,$acc1
 | 
			
		||||
	movzb	($sbox,$acc2,1),$acc2	#$t3
 | 
			
		||||
	movzb	($sbox,$acc0,1),$acc0	#$t0
 | 
			
		||||
	xor	$acc1,$t0
 | 
			
		||||
 | 
			
		||||
	shl	\$16,$acc1
 | 
			
		||||
	xor	$acc0,$t3
 | 
			
		||||
	movzb	($sbox,$t4,1),$t4	#$t1
 | 
			
		||||
	movzb	`&hi("$s1")`,$acc0
 | 
			
		||||
	movzb	($sbox,$acc2,1),$acc2	#$t3
 | 
			
		||||
	xor	$acc1,$t0
 | 
			
		||||
	movzb	($sbox,$t5,1),$t5	#$t2
 | 
			
		||||
	movzb	`&hi("$s2")`,$acc1
 | 
			
		||||
 | 
			
		||||
	shl	\$16,$acc2
 | 
			
		||||
	shl	\$16,$t4
 | 
			
		||||
	shl	\$16,$t5
 | 
			
		||||
	movzb	($sbox,$acc1,1),$s1	#$t1
 | 
			
		||||
	xor	$acc2,$t3
 | 
			
		||||
	movzb	`&hi("$s3")`,$acc2
 | 
			
		||||
	xor	$t4,$t1
 | 
			
		||||
	shr	\$8,$s0
 | 
			
		||||
	xor	$t5,$t2
 | 
			
		||||
 | 
			
		||||
	movzb	`&hi("$s3")`,$acc1
 | 
			
		||||
	shr	\$8,$s0
 | 
			
		||||
	shl	\$16,$acc2
 | 
			
		||||
	movzb	($sbox,$acc1,1),$s2	#$t2
 | 
			
		||||
	movzb	($sbox,$acc0,1),$acc0	#$t0
 | 
			
		||||
	movzb	($sbox,$acc1,1),$s1	#$t1
 | 
			
		||||
	movzb	($sbox,$acc2,1),$s2	#$t2
 | 
			
		||||
	movzb	($sbox,$s0,1),$s3	#$t3
 | 
			
		||||
	xor	$acc2,$t3
 | 
			
		||||
 | 
			
		||||
	mov	$t0,$s0
 | 
			
		||||
	shl	\$24,$acc0
 | 
			
		||||
	shl	\$24,$s1
 | 
			
		||||
	shl	\$24,$s2
 | 
			
		||||
	xor	$acc0,$t0
 | 
			
		||||
	xor	$acc0,$s0
 | 
			
		||||
	shl	\$24,$s3
 | 
			
		||||
	xor	$t1,$s1
 | 
			
		||||
	mov	$t0,$s0
 | 
			
		||||
	xor	$t2,$s2
 | 
			
		||||
	xor	$t3,$s3
 | 
			
		||||
___
 | 
			
		||||
@@ -1010,12 +1012,12 @@ sub dectransform()
 | 
			
		||||
  my $prefetch = shift;
 | 
			
		||||
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	mov	$tp10,$acc0
 | 
			
		||||
	mov	$tp18,$acc8
 | 
			
		||||
	and	$mask80,$acc0
 | 
			
		||||
	and	$mask80,$acc8
 | 
			
		||||
	mov	$acc0,$tp40
 | 
			
		||||
	mov	$acc8,$tp48
 | 
			
		||||
	mov	$mask80,$tp40
 | 
			
		||||
	mov	$mask80,$tp48
 | 
			
		||||
	and	$tp10,$tp40
 | 
			
		||||
	and	$tp18,$tp48
 | 
			
		||||
	mov	$tp40,$acc0
 | 
			
		||||
	mov	$tp48,$acc8
 | 
			
		||||
	shr	\$7,$tp40
 | 
			
		||||
	lea	($tp10,$tp10),$tp20
 | 
			
		||||
	shr	\$7,$tp48
 | 
			
		||||
@@ -1026,15 +1028,15 @@ $code.=<<___;
 | 
			
		||||
	and	$maskfe,$tp28
 | 
			
		||||
	and	$mask1b,$acc0
 | 
			
		||||
	and	$mask1b,$acc8
 | 
			
		||||
	xor	$tp20,$acc0
 | 
			
		||||
	xor	$tp28,$acc8
 | 
			
		||||
	mov	$acc0,$tp20
 | 
			
		||||
	mov	$acc8,$tp28
 | 
			
		||||
	xor	$acc0,$tp20
 | 
			
		||||
	xor	$acc8,$tp28
 | 
			
		||||
	mov	$mask80,$tp80
 | 
			
		||||
	mov	$mask80,$tp88
 | 
			
		||||
 | 
			
		||||
	and	$mask80,$acc0
 | 
			
		||||
	and	$mask80,$acc8
 | 
			
		||||
	mov	$acc0,$tp80
 | 
			
		||||
	mov	$acc8,$tp88
 | 
			
		||||
	and	$tp20,$tp80
 | 
			
		||||
	and	$tp28,$tp88
 | 
			
		||||
	mov	$tp80,$acc0
 | 
			
		||||
	mov	$tp88,$acc8
 | 
			
		||||
	shr	\$7,$tp80
 | 
			
		||||
	lea	($tp20,$tp20),$tp40
 | 
			
		||||
	shr	\$7,$tp88
 | 
			
		||||
@@ -1045,15 +1047,15 @@ $code.=<<___;
 | 
			
		||||
	and	$maskfe,$tp48
 | 
			
		||||
	and	$mask1b,$acc0
 | 
			
		||||
	and	$mask1b,$acc8
 | 
			
		||||
	xor	$tp40,$acc0
 | 
			
		||||
	xor	$tp48,$acc8
 | 
			
		||||
	mov	$acc0,$tp40
 | 
			
		||||
	mov	$acc8,$tp48
 | 
			
		||||
	xor	$acc0,$tp40
 | 
			
		||||
	xor	$acc8,$tp48
 | 
			
		||||
	mov	$mask80,$tp80
 | 
			
		||||
	mov	$mask80,$tp88
 | 
			
		||||
 | 
			
		||||
	and	$mask80,$acc0
 | 
			
		||||
	and	$mask80,$acc8
 | 
			
		||||
	mov	$acc0,$tp80
 | 
			
		||||
	mov	$acc8,$tp88
 | 
			
		||||
	and	$tp40,$tp80
 | 
			
		||||
	and	$tp48,$tp88
 | 
			
		||||
	mov	$tp80,$acc0
 | 
			
		||||
	mov	$tp88,$acc8
 | 
			
		||||
	shr	\$7,$tp80
 | 
			
		||||
	 xor	$tp10,$tp20		# tp2^=tp1
 | 
			
		||||
	shr	\$7,$tp88
 | 
			
		||||
@@ -1078,51 +1080,51 @@ $code.=<<___;
 | 
			
		||||
	mov	$tp10,$acc0
 | 
			
		||||
	mov	$tp18,$acc8
 | 
			
		||||
	xor	$tp80,$tp40		# tp4^tp1^=tp8
 | 
			
		||||
	xor	$tp88,$tp48		# tp4^tp1^=tp8
 | 
			
		||||
	shr	\$32,$acc0
 | 
			
		||||
	xor	$tp88,$tp48		# tp4^tp1^=tp8
 | 
			
		||||
	shr	\$32,$acc8
 | 
			
		||||
	xor	$tp20,$tp80		# tp8^=tp8^tp2^tp1=tp2^tp1
 | 
			
		||||
	xor	$tp28,$tp88		# tp8^=tp8^tp2^tp1=tp2^tp1
 | 
			
		||||
	rol	\$8,`&LO("$tp10")`	# ROTATE(tp1^tp8,8)
 | 
			
		||||
	xor	$tp28,$tp88		# tp8^=tp8^tp2^tp1=tp2^tp1
 | 
			
		||||
	rol	\$8,`&LO("$tp18")`	# ROTATE(tp1^tp8,8)
 | 
			
		||||
	xor	$tp40,$tp80		# tp2^tp1^=tp8^tp4^tp1=tp8^tp4^tp2
 | 
			
		||||
	rol	\$8,`&LO("$acc0")`	# ROTATE(tp1^tp8,8)
 | 
			
		||||
	xor	$tp48,$tp88		# tp2^tp1^=tp8^tp4^tp1=tp8^tp4^tp2
 | 
			
		||||
 | 
			
		||||
	rol	\$8,`&LO("$acc0")`	# ROTATE(tp1^tp8,8)
 | 
			
		||||
	rol	\$8,`&LO("$acc8")`	# ROTATE(tp1^tp8,8)
 | 
			
		||||
	xor	`&LO("$tp80")`,`&LO("$tp10")`
 | 
			
		||||
	xor	`&LO("$tp88")`,`&LO("$tp18")`
 | 
			
		||||
	shr	\$32,$tp80
 | 
			
		||||
	xor	`&LO("$tp88")`,`&LO("$tp18")`
 | 
			
		||||
	shr	\$32,$tp88
 | 
			
		||||
	xor	`&LO("$tp80")`,`&LO("$acc0")`
 | 
			
		||||
	xor	`&LO("$tp88")`,`&LO("$acc8")`
 | 
			
		||||
 | 
			
		||||
	mov	$tp20,$tp80
 | 
			
		||||
	mov	$tp28,$tp88
 | 
			
		||||
	shr	\$32,$tp80
 | 
			
		||||
	shr	\$32,$tp88
 | 
			
		||||
	rol	\$24,`&LO("$tp20")`	# ROTATE(tp2^tp1^tp8,24)
 | 
			
		||||
	mov	$tp28,$tp88
 | 
			
		||||
	rol	\$24,`&LO("$tp28")`	# ROTATE(tp2^tp1^tp8,24)
 | 
			
		||||
	rol	\$24,`&LO("$tp80")`	# ROTATE(tp2^tp1^tp8,24)
 | 
			
		||||
	rol	\$24,`&LO("$tp88")`	# ROTATE(tp2^tp1^tp8,24)
 | 
			
		||||
	shr	\$32,$tp80
 | 
			
		||||
	xor	`&LO("$tp20")`,`&LO("$tp10")`
 | 
			
		||||
	shr	\$32,$tp88
 | 
			
		||||
	xor	`&LO("$tp28")`,`&LO("$tp18")`
 | 
			
		||||
	rol	\$24,`&LO("$tp80")`	# ROTATE(tp2^tp1^tp8,24)
 | 
			
		||||
	mov	$tp40,$tp20
 | 
			
		||||
	rol	\$24,`&LO("$tp88")`	# ROTATE(tp2^tp1^tp8,24)
 | 
			
		||||
	mov	$tp48,$tp28
 | 
			
		||||
	shr	\$32,$tp20
 | 
			
		||||
	xor	`&LO("$tp80")`,`&LO("$acc0")`
 | 
			
		||||
	shr	\$32,$tp28
 | 
			
		||||
	xor	`&LO("$tp88")`,`&LO("$acc8")`
 | 
			
		||||
 | 
			
		||||
	`"mov	0($sbox),$mask80"	if ($prefetch)`
 | 
			
		||||
	shr	\$32,$tp20
 | 
			
		||||
	shr	\$32,$tp28
 | 
			
		||||
	`"mov	64($sbox),$maskfe"	if ($prefetch)`
 | 
			
		||||
	rol	\$16,`&LO("$tp40")`	# ROTATE(tp4^tp1^tp8,16)
 | 
			
		||||
	`"mov	64($sbox),$maskfe"	if ($prefetch)`
 | 
			
		||||
	rol	\$16,`&LO("$tp48")`	# ROTATE(tp4^tp1^tp8,16)
 | 
			
		||||
	`"mov	128($sbox),$mask1b"	if ($prefetch)`
 | 
			
		||||
	rol	\$16,`&LO("$tp20")`	# ROTATE(tp4^tp1^tp8,16)
 | 
			
		||||
	rol	\$16,`&LO("$tp28")`	# ROTATE(tp4^tp1^tp8,16)
 | 
			
		||||
	`"mov	192($sbox),$tp80"	if ($prefetch)`
 | 
			
		||||
	xor	`&LO("$tp40")`,`&LO("$tp10")`
 | 
			
		||||
	rol	\$16,`&LO("$tp28")`	# ROTATE(tp4^tp1^tp8,16)
 | 
			
		||||
	xor	`&LO("$tp48")`,`&LO("$tp18")`
 | 
			
		||||
	`"mov	256($sbox),$tp88"	if ($prefetch)`
 | 
			
		||||
	xor	`&LO("$tp20")`,`&LO("$acc0")`
 | 
			
		||||
@@ -1184,6 +1186,9 @@ $code.=<<___;
 | 
			
		||||
.globl	AES_decrypt
 | 
			
		||||
.type	AES_decrypt,\@function,3
 | 
			
		||||
.align	16
 | 
			
		||||
.globl	asm_AES_decrypt
 | 
			
		||||
.hidden	asm_AES_decrypt
 | 
			
		||||
asm_AES_decrypt:
 | 
			
		||||
AES_decrypt:
 | 
			
		||||
	push	%rbx
 | 
			
		||||
	push	%rbp
 | 
			
		||||
@@ -1277,13 +1282,13 @@ $code.=<<___;
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
# int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
#                        AES_KEY *key)
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.globl	AES_set_encrypt_key
 | 
			
		||||
.type	AES_set_encrypt_key,\@function,3
 | 
			
		||||
.globl	private_AES_set_encrypt_key
 | 
			
		||||
.type	private_AES_set_encrypt_key,\@function,3
 | 
			
		||||
.align	16
 | 
			
		||||
AES_set_encrypt_key:
 | 
			
		||||
private_AES_set_encrypt_key:
 | 
			
		||||
	push	%rbx
 | 
			
		||||
	push	%rbp
 | 
			
		||||
	push	%r12			# redundant, but allows to share 
 | 
			
		||||
@@ -1300,7 +1305,7 @@ AES_set_encrypt_key:
 | 
			
		||||
	add	\$56,%rsp
 | 
			
		||||
.Lenc_key_epilogue:
 | 
			
		||||
	ret
 | 
			
		||||
.size	AES_set_encrypt_key,.-AES_set_encrypt_key
 | 
			
		||||
.size	private_AES_set_encrypt_key,.-private_AES_set_encrypt_key
 | 
			
		||||
 | 
			
		||||
.type	_x86_64_AES_set_encrypt_key,\@abi-omnipotent
 | 
			
		||||
.align	16
 | 
			
		||||
@@ -1543,13 +1548,13 @@ $code.=<<___;
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
# int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 | 
			
		||||
#                        AES_KEY *key)
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.globl	AES_set_decrypt_key
 | 
			
		||||
.type	AES_set_decrypt_key,\@function,3
 | 
			
		||||
.globl	private_AES_set_decrypt_key
 | 
			
		||||
.type	private_AES_set_decrypt_key,\@function,3
 | 
			
		||||
.align	16
 | 
			
		||||
AES_set_decrypt_key:
 | 
			
		||||
private_AES_set_decrypt_key:
 | 
			
		||||
	push	%rbx
 | 
			
		||||
	push	%rbp
 | 
			
		||||
	push	%r12
 | 
			
		||||
@@ -1618,7 +1623,7 @@ $code.=<<___;
 | 
			
		||||
	add	\$56,%rsp
 | 
			
		||||
.Ldec_key_epilogue:
 | 
			
		||||
	ret
 | 
			
		||||
.size	AES_set_decrypt_key,.-AES_set_decrypt_key
 | 
			
		||||
.size	private_AES_set_decrypt_key,.-private_AES_set_decrypt_key
 | 
			
		||||
___
 | 
			
		||||
 | 
			
		||||
# void AES_cbc_encrypt (const void char *inp, unsigned char *out,
 | 
			
		||||
@@ -1644,6 +1649,9 @@ $code.=<<___;
 | 
			
		||||
.type	AES_cbc_encrypt,\@function,6
 | 
			
		||||
.align	16
 | 
			
		||||
.extern	OPENSSL_ia32cap_P
 | 
			
		||||
.globl	asm_AES_cbc_encrypt
 | 
			
		||||
.hidden	asm_AES_cbc_encrypt
 | 
			
		||||
asm_AES_cbc_encrypt:
 | 
			
		||||
AES_cbc_encrypt:
 | 
			
		||||
	cmp	\$0,%rdx	# check length
 | 
			
		||||
	je	.Lcbc_epilogue
 | 
			
		||||
@@ -2762,13 +2770,13 @@ cbc_se_handler:
 | 
			
		||||
	.rva	.LSEH_end_AES_decrypt
 | 
			
		||||
	.rva	.LSEH_info_AES_decrypt
 | 
			
		||||
 | 
			
		||||
	.rva	.LSEH_begin_AES_set_encrypt_key
 | 
			
		||||
	.rva	.LSEH_end_AES_set_encrypt_key
 | 
			
		||||
	.rva	.LSEH_info_AES_set_encrypt_key
 | 
			
		||||
	.rva	.LSEH_begin_private_AES_set_encrypt_key
 | 
			
		||||
	.rva	.LSEH_end_private_AES_set_encrypt_key
 | 
			
		||||
	.rva	.LSEH_info_private_AES_set_encrypt_key
 | 
			
		||||
 | 
			
		||||
	.rva	.LSEH_begin_AES_set_decrypt_key
 | 
			
		||||
	.rva	.LSEH_end_AES_set_decrypt_key
 | 
			
		||||
	.rva	.LSEH_info_AES_set_decrypt_key
 | 
			
		||||
	.rva	.LSEH_begin_private_AES_set_decrypt_key
 | 
			
		||||
	.rva	.LSEH_end_private_AES_set_decrypt_key
 | 
			
		||||
	.rva	.LSEH_info_private_AES_set_decrypt_key
 | 
			
		||||
 | 
			
		||||
	.rva	.LSEH_begin_AES_cbc_encrypt
 | 
			
		||||
	.rva	.LSEH_end_AES_cbc_encrypt
 | 
			
		||||
@@ -2784,11 +2792,11 @@ cbc_se_handler:
 | 
			
		||||
	.byte	9,0,0,0
 | 
			
		||||
	.rva	block_se_handler
 | 
			
		||||
	.rva	.Ldec_prologue,.Ldec_epilogue	# HandlerData[]
 | 
			
		||||
.LSEH_info_AES_set_encrypt_key:
 | 
			
		||||
.LSEH_info_private_AES_set_encrypt_key:
 | 
			
		||||
	.byte	9,0,0,0
 | 
			
		||||
	.rva	key_se_handler
 | 
			
		||||
	.rva	.Lenc_key_prologue,.Lenc_key_epilogue	# HandlerData[]
 | 
			
		||||
.LSEH_info_AES_set_decrypt_key:
 | 
			
		||||
.LSEH_info_private_AES_set_decrypt_key:
 | 
			
		||||
	.byte	9,0,0,0
 | 
			
		||||
	.rva	key_se_handler
 | 
			
		||||
	.rva	.Ldec_key_prologue,.Ldec_key_epilogue	# HandlerData[]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1231
									
								
								crypto/aes/asm/aesni-mb-x86_64.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1231
									
								
								crypto/aes/asm/aesni-mb-x86_64.pl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1352
									
								
								crypto/aes/asm/aesni-sha256-x86_64.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1352
									
								
								crypto/aes/asm/aesni-sha256-x86_64.pl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
 | 
			
		||||
# ====================================================================
 | 
			
		||||
# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
 | 
			
		||||
# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
 | 
			
		||||
# project. The module is, however, dual licensed under OpenSSL and
 | 
			
		||||
# CRYPTOGAMS licenses depending on where you obtain it. For further
 | 
			
		||||
# details see http://www.openssl.org/~appro/cryptogams/.
 | 
			
		||||
@@ -43,6 +43,17 @@
 | 
			
		||||
# Add aesni_xts_[en|de]crypt. Westmere spends 1.50 cycles processing
 | 
			
		||||
# one byte out of 8KB with 128-bit key, Sandy Bridge - 1.09.
 | 
			
		||||
 | 
			
		||||
######################################################################
 | 
			
		||||
# Current large-block performance in cycles per byte processed with
 | 
			
		||||
# 128-bit key (less is better).
 | 
			
		||||
#
 | 
			
		||||
#		CBC en-/decrypt	CTR	XTS	ECB
 | 
			
		||||
# Westmere	3.77/1.37	1.37	1.52	1.27
 | 
			
		||||
# * Bridge	5.07/0.98	0.99	1.09	0.91
 | 
			
		||||
# Haswell	4.44/0.80	0.97	1.03	0.72
 | 
			
		||||
# Atom		5.77/3.56	3.67	4.03	3.46
 | 
			
		||||
# Bulldozer	5.80/0.98	1.05	1.24	0.93
 | 
			
		||||
 | 
			
		||||
$PREFIX="aesni";	# if $PREFIX is set to "AES", the script
 | 
			
		||||
			# generates drop-in replacement for
 | 
			
		||||
			# crypto/aes/asm/aes-586.pl:-)
 | 
			
		||||
@@ -54,8 +65,8 @@ require "x86asm.pl";
 | 
			
		||||
 | 
			
		||||
&asm_init($ARGV[0],$0);
 | 
			
		||||
 | 
			
		||||
if ($PREFIX eq "aesni")	{ $movekey=*movups; }
 | 
			
		||||
else			{ $movekey=*movups; }
 | 
			
		||||
if ($PREFIX eq "aesni")	{ $movekey=\&movups; }
 | 
			
		||||
else			{ $movekey=\&movups; }
 | 
			
		||||
 | 
			
		||||
$len="eax";
 | 
			
		||||
$rounds="ecx";
 | 
			
		||||
@@ -196,37 +207,71 @@ sub aesni_generate1	# fully unrolled loop
 | 
			
		||||
# every *2nd* cycle. Thus 3x interleave was the one providing optimal
 | 
			
		||||
# utilization, i.e. when subroutine's throughput is virtually same as
 | 
			
		||||
# of non-interleaved subroutine [for number of input blocks up to 3].
 | 
			
		||||
# This is why it makes no sense to implement 2x subroutine.
 | 
			
		||||
# aes[enc|dec] latency in next processor generation is 8, but the
 | 
			
		||||
# instructions can be scheduled every cycle. Optimal interleave for
 | 
			
		||||
# new processor is therefore 8x, but it's unfeasible to accommodate it
 | 
			
		||||
# in XMM registers addreassable in 32-bit mode and therefore 6x is
 | 
			
		||||
# used instead...
 | 
			
		||||
# This is why it originally made no sense to implement 2x subroutine.
 | 
			
		||||
# But times change and it became appropriate to spend extra 192 bytes
 | 
			
		||||
# on 2x subroutine on Atom Silvermont account. For processors that
 | 
			
		||||
# can schedule aes[enc|dec] every cycle optimal interleave factor
 | 
			
		||||
# equals to corresponding instructions latency. 8x is optimal for
 | 
			
		||||
# * Bridge, but it's unfeasible to accommodate such implementation
 | 
			
		||||
# in XMM registers addreassable in 32-bit mode and therefore maximum
 | 
			
		||||
# of 6x is used instead...
 | 
			
		||||
 | 
			
		||||
sub aesni_generate2
 | 
			
		||||
{ my $p=shift;
 | 
			
		||||
 | 
			
		||||
    &function_begin_B("_aesni_${p}rypt2");
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&shl		($rounds,4);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
	&xorps		($inout0,$rndkey0);
 | 
			
		||||
	&pxor		($inout1,$rndkey0);
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(32,$key));
 | 
			
		||||
	&lea		($key,&DWP(32,$key,$rounds));
 | 
			
		||||
	&neg		($rounds);
 | 
			
		||||
	&add		($rounds,16);
 | 
			
		||||
 | 
			
		||||
    &set_label("${p}2_loop");
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey1)";
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(0,$key,$rounds));
 | 
			
		||||
	&add		($rounds,32);
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey0)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey0)";
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(-16,$key,$rounds));
 | 
			
		||||
	&jnz		(&label("${p}2_loop"));
 | 
			
		||||
    eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
    eval"&aes${p}	($inout1,$rndkey1)";
 | 
			
		||||
    eval"&aes${p}last	($inout0,$rndkey0)";
 | 
			
		||||
    eval"&aes${p}last	($inout1,$rndkey0)";
 | 
			
		||||
    &ret();
 | 
			
		||||
    &function_end_B("_aesni_${p}rypt2");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub aesni_generate3
 | 
			
		||||
{ my $p=shift;
 | 
			
		||||
 | 
			
		||||
    &function_begin_B("_aesni_${p}rypt3");
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&shr		($rounds,1);
 | 
			
		||||
	&shl		($rounds,4);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
	&lea		($key,&DWP(32,$key));
 | 
			
		||||
	&xorps		($inout0,$rndkey0);
 | 
			
		||||
	&pxor		($inout1,$rndkey0);
 | 
			
		||||
	&pxor		($inout2,$rndkey0);
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(32,$key));
 | 
			
		||||
	&lea		($key,&DWP(32,$key,$rounds));
 | 
			
		||||
	&neg		($rounds);
 | 
			
		||||
	&add		($rounds,16);
 | 
			
		||||
 | 
			
		||||
    &set_label("${p}3_loop");
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey1)";
 | 
			
		||||
	&dec		($rounds);
 | 
			
		||||
	eval"&aes${p}	($inout2,$rndkey1)";
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(0,$key,$rounds));
 | 
			
		||||
	&add		($rounds,32);
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey0)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey0)";
 | 
			
		||||
	&lea		($key,&DWP(32,$key));
 | 
			
		||||
	eval"&aes${p}	($inout2,$rndkey0)";
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(-16,$key,$rounds));
 | 
			
		||||
	&jnz		(&label("${p}3_loop"));
 | 
			
		||||
    eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
    eval"&aes${p}	($inout1,$rndkey1)";
 | 
			
		||||
@@ -248,27 +293,29 @@ sub aesni_generate4
 | 
			
		||||
    &function_begin_B("_aesni_${p}rypt4");
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
	&shr		($rounds,1);
 | 
			
		||||
	&lea		($key,&DWP(32,$key));
 | 
			
		||||
	&shl		($rounds,4);
 | 
			
		||||
	&xorps		($inout0,$rndkey0);
 | 
			
		||||
	&pxor		($inout1,$rndkey0);
 | 
			
		||||
	&pxor		($inout2,$rndkey0);
 | 
			
		||||
	&pxor		($inout3,$rndkey0);
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(32,$key));
 | 
			
		||||
	&lea		($key,&DWP(32,$key,$rounds));
 | 
			
		||||
	&neg		($rounds);
 | 
			
		||||
	&data_byte	(0x0f,0x1f,0x40,0x00);
 | 
			
		||||
	&add		($rounds,16);
 | 
			
		||||
 | 
			
		||||
    &set_label("${p}4_loop");
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey1)";
 | 
			
		||||
	&dec		($rounds);
 | 
			
		||||
	eval"&aes${p}	($inout2,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout3,$rndkey1)";
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(0,$key,$rounds));
 | 
			
		||||
	&add		($rounds,32);
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey0)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey0)";
 | 
			
		||||
	&lea		($key,&DWP(32,$key));
 | 
			
		||||
	eval"&aes${p}	($inout2,$rndkey0)";
 | 
			
		||||
	eval"&aes${p}	($inout3,$rndkey0)";
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(-16,$key,$rounds));
 | 
			
		||||
    &jnz		(&label("${p}4_loop"));
 | 
			
		||||
 | 
			
		||||
    eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
@@ -289,43 +336,43 @@ sub aesni_generate6
 | 
			
		||||
    &function_begin_B("_aesni_${p}rypt6");
 | 
			
		||||
    &static_label("_aesni_${p}rypt6_enter");
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&shr		($rounds,1);
 | 
			
		||||
	&shl		($rounds,4);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
	&lea		($key,&DWP(32,$key));
 | 
			
		||||
	&xorps		($inout0,$rndkey0);
 | 
			
		||||
	&pxor		($inout1,$rndkey0);	# pxor does better here
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
	&pxor		($inout2,$rndkey0);
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
	&pxor		($inout3,$rndkey0);
 | 
			
		||||
	&dec		($rounds);
 | 
			
		||||
	eval"&aes${p}	($inout2,$rndkey1)";
 | 
			
		||||
	&pxor		($inout4,$rndkey0);
 | 
			
		||||
	eval"&aes${p}	($inout3,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey1)";
 | 
			
		||||
	&lea		($key,&DWP(32,$key,$rounds));
 | 
			
		||||
	&neg		($rounds);
 | 
			
		||||
	eval"&aes${p}	($inout2,$rndkey1)";
 | 
			
		||||
	&pxor		($inout5,$rndkey0);
 | 
			
		||||
	&add		($rounds,16);
 | 
			
		||||
	eval"&aes${p}	($inout3,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout4,$rndkey1)";
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	eval"&aes${p}	($inout5,$rndkey1)";
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(-16,$key,$rounds));
 | 
			
		||||
	&jmp		(&label("_aesni_${p}rypt6_enter"));
 | 
			
		||||
 | 
			
		||||
    &set_label("${p}6_loop",16);
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey1)";
 | 
			
		||||
	&dec		($rounds);
 | 
			
		||||
	eval"&aes${p}	($inout2,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout3,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout4,$rndkey1)";
 | 
			
		||||
	eval"&aes${p}	($inout5,$rndkey1)";
 | 
			
		||||
    &set_label("_aesni_${p}rypt6_enter",16);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
    &set_label("_aesni_${p}rypt6_enter");
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(0,$key,$rounds));
 | 
			
		||||
	&add		($rounds,32);
 | 
			
		||||
	eval"&aes${p}	($inout0,$rndkey0)";
 | 
			
		||||
	eval"&aes${p}	($inout1,$rndkey0)";
 | 
			
		||||
	&lea		($key,&DWP(32,$key));
 | 
			
		||||
	eval"&aes${p}	($inout2,$rndkey0)";
 | 
			
		||||
	eval"&aes${p}	($inout3,$rndkey0)";
 | 
			
		||||
	eval"&aes${p}	($inout4,$rndkey0)";
 | 
			
		||||
	eval"&aes${p}	($inout5,$rndkey0)";
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(-16,$key,$rounds));
 | 
			
		||||
    &jnz		(&label("${p}6_loop"));
 | 
			
		||||
 | 
			
		||||
    eval"&aes${p}	($inout0,$rndkey1)";
 | 
			
		||||
@@ -343,6 +390,8 @@ sub aesni_generate6
 | 
			
		||||
    &ret();
 | 
			
		||||
    &function_end_B("_aesni_${p}rypt6");
 | 
			
		||||
}
 | 
			
		||||
&aesni_generate2("enc") if ($PREFIX eq "aesni");
 | 
			
		||||
&aesni_generate2("dec");
 | 
			
		||||
&aesni_generate3("enc") if ($PREFIX eq "aesni");
 | 
			
		||||
&aesni_generate3("dec");
 | 
			
		||||
&aesni_generate4("enc") if ($PREFIX eq "aesni");
 | 
			
		||||
@@ -446,8 +495,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&jmp	(&label("ecb_ret"));
 | 
			
		||||
 | 
			
		||||
&set_label("ecb_enc_two",16);
 | 
			
		||||
	&xorps	($inout2,$inout2);
 | 
			
		||||
	&call	("_aesni_encrypt3");
 | 
			
		||||
	&call	("_aesni_encrypt2");
 | 
			
		||||
	&movups	(&QWP(0,$out),$inout0);
 | 
			
		||||
	&movups	(&QWP(0x10,$out),$inout1);
 | 
			
		||||
	&jmp	(&label("ecb_ret"));
 | 
			
		||||
@@ -547,8 +595,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&jmp	(&label("ecb_ret"));
 | 
			
		||||
 | 
			
		||||
&set_label("ecb_dec_two",16);
 | 
			
		||||
	&xorps	($inout2,$inout2);
 | 
			
		||||
	&call	("_aesni_decrypt3");
 | 
			
		||||
	&call	("_aesni_decrypt2");
 | 
			
		||||
	&movups	(&QWP(0,$out),$inout0);
 | 
			
		||||
	&movups	(&QWP(0x10,$out),$inout1);
 | 
			
		||||
	&jmp	(&label("ecb_ret"));
 | 
			
		||||
@@ -610,11 +657,13 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&mov	(&DWP(24,"esp"),$key_);
 | 
			
		||||
	&mov	(&DWP(28,"esp"),$key_);
 | 
			
		||||
 | 
			
		||||
	&shr	($rounds,1);
 | 
			
		||||
	&shl	($rounds,4);
 | 
			
		||||
	&mov	($rounds_,16);
 | 
			
		||||
	&lea	($key_,&DWP(0,$key));
 | 
			
		||||
	&movdqa	($inout3,&QWP(0,"esp"));
 | 
			
		||||
	&movdqa	($inout0,$ivec);
 | 
			
		||||
	&mov	($rounds_,$rounds);
 | 
			
		||||
	&lea	($key,&DWP(32,$key,$rounds));
 | 
			
		||||
	&sub	($rounds_,$rounds);
 | 
			
		||||
	&pshufb	($ivec,$inout3);
 | 
			
		||||
 | 
			
		||||
&set_label("ccm64_enc_outer");
 | 
			
		||||
@@ -625,33 +674,31 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&xorps		($inout0,$rndkey0);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key_));
 | 
			
		||||
	&xorps		($rndkey0,$in0);
 | 
			
		||||
	&lea		($key,&DWP(32,$key_));
 | 
			
		||||
	&xorps		($cmac,$rndkey0);		# cmac^=inp
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(32,$key_));
 | 
			
		||||
 | 
			
		||||
&set_label("ccm64_enc2_loop");
 | 
			
		||||
	&aesenc		($inout0,$rndkey1);
 | 
			
		||||
	&dec		($rounds);
 | 
			
		||||
	&aesenc		($cmac,$rndkey1);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(0,$key,$rounds));
 | 
			
		||||
	&add		($rounds,32);
 | 
			
		||||
	&aesenc		($inout0,$rndkey0);
 | 
			
		||||
	&lea		($key,&DWP(32,$key));
 | 
			
		||||
	&aesenc		($cmac,$rndkey0);
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(-16,$key,$rounds));
 | 
			
		||||
	&jnz		(&label("ccm64_enc2_loop"));
 | 
			
		||||
	&aesenc		($inout0,$rndkey1);
 | 
			
		||||
	&aesenc		($cmac,$rndkey1);
 | 
			
		||||
	&paddq		($ivec,&QWP(16,"esp"));
 | 
			
		||||
	&dec		($len);
 | 
			
		||||
	&aesenclast	($inout0,$rndkey0);
 | 
			
		||||
	&aesenclast	($cmac,$rndkey0);
 | 
			
		||||
 | 
			
		||||
	&dec	($len);
 | 
			
		||||
	&lea	($inp,&DWP(16,$inp));
 | 
			
		||||
	&xorps	($in0,$inout0);			# inp^=E(ivec)
 | 
			
		||||
	&movdqa	($inout0,$ivec);
 | 
			
		||||
	&movups	(&QWP(0,$out),$in0);		# save output
 | 
			
		||||
	&lea	($out,&DWP(16,$out));
 | 
			
		||||
	&pshufb	($inout0,$inout3);
 | 
			
		||||
	&lea	($out,&DWP(16,$out));
 | 
			
		||||
	&jnz	(&label("ccm64_enc_outer"));
 | 
			
		||||
 | 
			
		||||
	&mov	("esp",&DWP(48,"esp"));
 | 
			
		||||
@@ -700,15 +747,19 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	{   &aesni_inline_generate1("enc");	}
 | 
			
		||||
	else
 | 
			
		||||
	{   &call	("_aesni_encrypt1");	}
 | 
			
		||||
	&shl	($rounds_,4);
 | 
			
		||||
	&mov	($rounds,16);
 | 
			
		||||
	&movups	($in0,&QWP(0,$inp));		# load inp
 | 
			
		||||
	&paddq	($ivec,&QWP(16,"esp"));
 | 
			
		||||
	&lea	($inp,&QWP(16,$inp));
 | 
			
		||||
	&sub	($rounds,$rounds_);
 | 
			
		||||
	&lea	($key,&DWP(32,$key_,$rounds_));
 | 
			
		||||
	&mov	($rounds_,$rounds);
 | 
			
		||||
	&jmp	(&label("ccm64_dec_outer"));
 | 
			
		||||
 | 
			
		||||
&set_label("ccm64_dec_outer",16);
 | 
			
		||||
	&xorps	($in0,$inout0);			# inp ^= E(ivec)
 | 
			
		||||
	&movdqa	($inout0,$ivec);
 | 
			
		||||
	&mov	($rounds,$rounds_);
 | 
			
		||||
	&movups	(&QWP(0,$out),$in0);		# save output
 | 
			
		||||
	&lea	($out,&DWP(16,$out));
 | 
			
		||||
	&pshufb	($inout0,$inout3);
 | 
			
		||||
@@ -717,34 +768,33 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&jz	(&label("ccm64_dec_break"));
 | 
			
		||||
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key_));
 | 
			
		||||
	&shr		($rounds,1);
 | 
			
		||||
	&mov		($rounds,$rounds_);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key_));
 | 
			
		||||
	&xorps		($in0,$rndkey0);
 | 
			
		||||
	&lea		($key,&DWP(32,$key_));
 | 
			
		||||
	&xorps		($inout0,$rndkey0);
 | 
			
		||||
	&xorps		($cmac,$in0);		# cmac^=out
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(32,$key_));
 | 
			
		||||
 | 
			
		||||
&set_label("ccm64_dec2_loop");
 | 
			
		||||
	&aesenc		($inout0,$rndkey1);
 | 
			
		||||
	&dec		($rounds);
 | 
			
		||||
	&aesenc		($cmac,$rndkey1);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key));
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(0,$key,$rounds));
 | 
			
		||||
	&add		($rounds,32);
 | 
			
		||||
	&aesenc		($inout0,$rndkey0);
 | 
			
		||||
	&lea		($key,&DWP(32,$key));
 | 
			
		||||
	&aesenc		($cmac,$rndkey0);
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(-16,$key,$rounds));
 | 
			
		||||
	&jnz		(&label("ccm64_dec2_loop"));
 | 
			
		||||
	&movups		($in0,&QWP(0,$inp));	# load inp
 | 
			
		||||
	&paddq		($ivec,&QWP(16,"esp"));
 | 
			
		||||
	&aesenc		($inout0,$rndkey1);
 | 
			
		||||
	&aesenc		($cmac,$rndkey1);
 | 
			
		||||
	&lea		($inp,&QWP(16,$inp));
 | 
			
		||||
	&aesenclast	($inout0,$rndkey0);
 | 
			
		||||
	&aesenclast	($cmac,$rndkey0);
 | 
			
		||||
	&lea		($inp,&QWP(16,$inp));
 | 
			
		||||
	&jmp	(&label("ccm64_dec_outer"));
 | 
			
		||||
 | 
			
		||||
&set_label("ccm64_dec_break",16);
 | 
			
		||||
	&mov	($rounds,&DWP(240,$key_));
 | 
			
		||||
	&mov	($key,$key_);
 | 
			
		||||
	if ($inline)
 | 
			
		||||
	{   &aesni_inline_generate1("enc",$cmac,$in0);	}
 | 
			
		||||
@@ -763,7 +813,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
#                         const char *ivec);
 | 
			
		||||
#
 | 
			
		||||
# Handles only complete blocks, operates on 32-bit counter and
 | 
			
		||||
# does not update *ivec! (see engine/eng_aesni.c for details)
 | 
			
		||||
# does not update *ivec! (see crypto/modes/ctr128.c for details)
 | 
			
		||||
#
 | 
			
		||||
# stack layout:
 | 
			
		||||
#	0	pshufb mask
 | 
			
		||||
@@ -810,66 +860,61 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
 | 
			
		||||
	# compose 2 vectors of 3x32-bit counters
 | 
			
		||||
	&bswap	($rounds_);
 | 
			
		||||
	&pxor	($rndkey1,$rndkey1);
 | 
			
		||||
	&pxor	($rndkey0,$rndkey0);
 | 
			
		||||
	&pxor	($rndkey1,$rndkey1);
 | 
			
		||||
	&movdqa	($inout0,&QWP(0,"esp"));	# load byte-swap mask
 | 
			
		||||
	&pinsrd	($rndkey1,$rounds_,0);
 | 
			
		||||
	&pinsrd	($rndkey0,$rounds_,0);
 | 
			
		||||
	&lea	($key_,&DWP(3,$rounds_));
 | 
			
		||||
	&pinsrd	($rndkey0,$key_,0);
 | 
			
		||||
	&pinsrd	($rndkey1,$key_,0);
 | 
			
		||||
	&inc	($rounds_);
 | 
			
		||||
	&pinsrd	($rndkey1,$rounds_,1);
 | 
			
		||||
	&pinsrd	($rndkey0,$rounds_,1);
 | 
			
		||||
	&inc	($key_);
 | 
			
		||||
	&pinsrd	($rndkey0,$key_,1);
 | 
			
		||||
	&pinsrd	($rndkey1,$key_,1);
 | 
			
		||||
	&inc	($rounds_);
 | 
			
		||||
	&pinsrd	($rndkey1,$rounds_,2);
 | 
			
		||||
	&pinsrd	($rndkey0,$rounds_,2);
 | 
			
		||||
	&inc	($key_);
 | 
			
		||||
	&pinsrd	($rndkey0,$key_,2);
 | 
			
		||||
	&movdqa	(&QWP(48,"esp"),$rndkey1);	# save 1st triplet
 | 
			
		||||
	&pshufb	($rndkey1,$inout0);		# byte swap
 | 
			
		||||
	&movdqa	(&QWP(64,"esp"),$rndkey0);	# save 2nd triplet
 | 
			
		||||
	&pinsrd	($rndkey1,$key_,2);
 | 
			
		||||
	&movdqa	(&QWP(48,"esp"),$rndkey0);	# save 1st triplet
 | 
			
		||||
	&pshufb	($rndkey0,$inout0);		# byte swap
 | 
			
		||||
	&movdqu	($inout4,&QWP(0,$key));		# key[0]
 | 
			
		||||
	&movdqa	(&QWP(64,"esp"),$rndkey1);	# save 2nd triplet
 | 
			
		||||
	&pshufb	($rndkey1,$inout0);		# byte swap
 | 
			
		||||
 | 
			
		||||
	&pshufd	($inout0,$rndkey1,3<<6);	# place counter to upper dword
 | 
			
		||||
	&pshufd	($inout1,$rndkey1,2<<6);
 | 
			
		||||
	&pshufd	($inout0,$rndkey0,3<<6);	# place counter to upper dword
 | 
			
		||||
	&pshufd	($inout1,$rndkey0,2<<6);
 | 
			
		||||
	&cmp	($len,6);
 | 
			
		||||
	&jb	(&label("ctr32_tail"));
 | 
			
		||||
	&movdqa	(&QWP(32,"esp"),$inout5);	# save counter-less ivec
 | 
			
		||||
	&shr	($rounds,1);
 | 
			
		||||
	&pxor	($inout5,$inout4);		# counter-less ivec^key[0]
 | 
			
		||||
	&shl	($rounds,4);
 | 
			
		||||
	&mov	($rounds_,16);
 | 
			
		||||
	&movdqa	(&QWP(32,"esp"),$inout5);	# save counter-less ivec^key[0]
 | 
			
		||||
	&mov	($key_,$key);			# backup $key
 | 
			
		||||
	&mov	($rounds_,$rounds);		# backup $rounds
 | 
			
		||||
	&sub	($rounds_,$rounds);		# backup twisted $rounds
 | 
			
		||||
	&lea	($key,&DWP(32,$key,$rounds));
 | 
			
		||||
	&sub	($len,6);
 | 
			
		||||
	&jmp	(&label("ctr32_loop6"));
 | 
			
		||||
 | 
			
		||||
&set_label("ctr32_loop6",16);
 | 
			
		||||
	&pshufd	($inout2,$rndkey1,1<<6);
 | 
			
		||||
	&movdqa	($rndkey1,&QWP(32,"esp"));	# pull counter-less ivec
 | 
			
		||||
	&pshufd	($inout3,$rndkey0,3<<6);
 | 
			
		||||
	&por	($inout0,$rndkey1);		# merge counter-less ivec
 | 
			
		||||
	&pshufd	($inout4,$rndkey0,2<<6);
 | 
			
		||||
	&por	($inout1,$rndkey1);
 | 
			
		||||
	&pshufd	($inout5,$rndkey0,1<<6);
 | 
			
		||||
	&por	($inout2,$rndkey1);
 | 
			
		||||
	&por	($inout3,$rndkey1);
 | 
			
		||||
	&por	($inout4,$rndkey1);
 | 
			
		||||
	&por	($inout5,$rndkey1);
 | 
			
		||||
 | 
			
		||||
	# inlining _aesni_encrypt6's prologue gives ~4% improvement...
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key_));
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key_));
 | 
			
		||||
	&lea		($key,&DWP(32,$key_));
 | 
			
		||||
	&dec		($rounds);
 | 
			
		||||
	&pxor		($inout0,$rndkey0);
 | 
			
		||||
	# inlining _aesni_encrypt6's prologue gives ~6% improvement...
 | 
			
		||||
	&pshufd	($inout2,$rndkey0,1<<6);
 | 
			
		||||
	&movdqa	($rndkey0,&QWP(32,"esp"));	# pull counter-less ivec
 | 
			
		||||
	&pshufd	($inout3,$rndkey1,3<<6);
 | 
			
		||||
	&pxor		($inout0,$rndkey0);	# merge counter-less ivec
 | 
			
		||||
	&pshufd	($inout4,$rndkey1,2<<6);
 | 
			
		||||
	&pxor		($inout1,$rndkey0);
 | 
			
		||||
	&aesenc		($inout0,$rndkey1);
 | 
			
		||||
	&pshufd	($inout5,$rndkey1,1<<6);
 | 
			
		||||
	&$movekey	($rndkey1,&QWP(16,$key_));
 | 
			
		||||
	&pxor		($inout2,$rndkey0);
 | 
			
		||||
	&aesenc		($inout1,$rndkey1);
 | 
			
		||||
	&pxor		($inout3,$rndkey0);
 | 
			
		||||
	&aesenc		($inout2,$rndkey1);
 | 
			
		||||
	&aesenc		($inout0,$rndkey1);
 | 
			
		||||
	&pxor		($inout4,$rndkey0);
 | 
			
		||||
	&aesenc		($inout3,$rndkey1);
 | 
			
		||||
	&pxor		($inout5,$rndkey0);
 | 
			
		||||
	&aesenc		($inout1,$rndkey1);
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(32,$key_));
 | 
			
		||||
	&mov		($rounds,$rounds_);
 | 
			
		||||
	&aesenc		($inout2,$rndkey1);
 | 
			
		||||
	&aesenc		($inout3,$rndkey1);
 | 
			
		||||
	&aesenc		($inout4,$rndkey1);
 | 
			
		||||
	&$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	&aesenc		($inout5,$rndkey1);
 | 
			
		||||
 | 
			
		||||
	&call		(&label("_aesni_encrypt6_enter"));
 | 
			
		||||
@@ -882,12 +927,12 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&movups	(&QWP(0,$out),$inout0);
 | 
			
		||||
	&movdqa	($rndkey0,&QWP(16,"esp"));	# load increment
 | 
			
		||||
	&xorps	($inout2,$rndkey1);
 | 
			
		||||
	&movdqa	($rndkey1,&QWP(48,"esp"));	# load 1st triplet
 | 
			
		||||
	&movdqa	($rndkey1,&QWP(64,"esp"));	# load 2nd triplet
 | 
			
		||||
	&movups	(&QWP(0x10,$out),$inout1);
 | 
			
		||||
	&movups	(&QWP(0x20,$out),$inout2);
 | 
			
		||||
 | 
			
		||||
	&paddd	($rndkey1,$rndkey0);		# 1st triplet increment
 | 
			
		||||
	&paddd	($rndkey0,&QWP(64,"esp"));	# 2nd triplet increment
 | 
			
		||||
	&paddd	($rndkey1,$rndkey0);		# 2nd triplet increment
 | 
			
		||||
	&paddd	($rndkey0,&QWP(48,"esp"));	# 1st triplet increment
 | 
			
		||||
	&movdqa	($inout0,&QWP(0,"esp"));	# load byte swap mask
 | 
			
		||||
 | 
			
		||||
	&movups	($inout1,&QWP(0x30,$inp));
 | 
			
		||||
@@ -895,44 +940,44 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&xorps	($inout3,$inout1);
 | 
			
		||||
	&movups	($inout1,&QWP(0x50,$inp));
 | 
			
		||||
	&lea	($inp,&DWP(0x60,$inp));
 | 
			
		||||
	&movdqa	(&QWP(48,"esp"),$rndkey1);	# save 1st triplet
 | 
			
		||||
	&pshufb	($rndkey1,$inout0);		# byte swap
 | 
			
		||||
	&movdqa	(&QWP(48,"esp"),$rndkey0);	# save 1st triplet
 | 
			
		||||
	&pshufb	($rndkey0,$inout0);		# byte swap
 | 
			
		||||
	&xorps	($inout4,$inout2);
 | 
			
		||||
	&movups	(&QWP(0x30,$out),$inout3);
 | 
			
		||||
	&xorps	($inout5,$inout1);
 | 
			
		||||
	&movdqa	(&QWP(64,"esp"),$rndkey0);	# save 2nd triplet
 | 
			
		||||
	&pshufb	($rndkey0,$inout0);		# byte swap
 | 
			
		||||
	&movdqa	(&QWP(64,"esp"),$rndkey1);	# save 2nd triplet
 | 
			
		||||
	&pshufb	($rndkey1,$inout0);		# byte swap
 | 
			
		||||
	&movups	(&QWP(0x40,$out),$inout4);
 | 
			
		||||
	&pshufd	($inout0,$rndkey1,3<<6);
 | 
			
		||||
	&pshufd	($inout0,$rndkey0,3<<6);
 | 
			
		||||
	&movups	(&QWP(0x50,$out),$inout5);
 | 
			
		||||
	&lea	($out,&DWP(0x60,$out));
 | 
			
		||||
 | 
			
		||||
	&mov	($rounds,$rounds_);
 | 
			
		||||
	&pshufd	($inout1,$rndkey1,2<<6);
 | 
			
		||||
	&pshufd	($inout1,$rndkey0,2<<6);
 | 
			
		||||
	&sub	($len,6);
 | 
			
		||||
	&jnc	(&label("ctr32_loop6"));
 | 
			
		||||
 | 
			
		||||
	&add	($len,6);
 | 
			
		||||
	&jz	(&label("ctr32_ret"));
 | 
			
		||||
	&movdqu	($inout5,&QWP(0,$key_));
 | 
			
		||||
	&mov	($key,$key_);
 | 
			
		||||
	&lea	($rounds,&DWP(1,"",$rounds,2));	# restore $rounds
 | 
			
		||||
	&movdqa	($inout5,&QWP(32,"esp"));	# pull count-less ivec
 | 
			
		||||
	&pxor	($inout5,&QWP(32,"esp"));	# restore count-less ivec
 | 
			
		||||
	&mov	($rounds,&DWP(240,$key_));	# restore $rounds
 | 
			
		||||
 | 
			
		||||
&set_label("ctr32_tail");
 | 
			
		||||
	&por	($inout0,$inout5);
 | 
			
		||||
	&cmp	($len,2);
 | 
			
		||||
	&jb	(&label("ctr32_one"));
 | 
			
		||||
 | 
			
		||||
	&pshufd	($inout2,$rndkey1,1<<6);
 | 
			
		||||
	&pshufd	($inout2,$rndkey0,1<<6);
 | 
			
		||||
	&por	($inout1,$inout5);
 | 
			
		||||
	&je	(&label("ctr32_two"));
 | 
			
		||||
 | 
			
		||||
	&pshufd	($inout3,$rndkey0,3<<6);
 | 
			
		||||
	&pshufd	($inout3,$rndkey1,3<<6);
 | 
			
		||||
	&por	($inout2,$inout5);
 | 
			
		||||
	&cmp	($len,4);
 | 
			
		||||
	&jb	(&label("ctr32_three"));
 | 
			
		||||
 | 
			
		||||
	&pshufd	($inout4,$rndkey0,2<<6);
 | 
			
		||||
	&pshufd	($inout4,$rndkey1,2<<6);
 | 
			
		||||
	&por	($inout3,$inout5);
 | 
			
		||||
	&je	(&label("ctr32_four"));
 | 
			
		||||
 | 
			
		||||
@@ -970,7 +1015,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&jmp	(&label("ctr32_ret"));
 | 
			
		||||
 | 
			
		||||
&set_label("ctr32_two",16);
 | 
			
		||||
	&call	("_aesni_encrypt3");
 | 
			
		||||
	&call	("_aesni_encrypt2");
 | 
			
		||||
	&movups	($inout3,&QWP(0,$inp));
 | 
			
		||||
	&movups	($inout4,&QWP(0x10,$inp));
 | 
			
		||||
	&xorps	($inout0,$inout3);
 | 
			
		||||
@@ -1057,8 +1102,10 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&sub	($len,16*6);
 | 
			
		||||
	&jc	(&label("xts_enc_short"));
 | 
			
		||||
 | 
			
		||||
	&shr	($rounds,1);
 | 
			
		||||
	&mov	($rounds_,$rounds);
 | 
			
		||||
	&shl	($rounds,4);
 | 
			
		||||
	&mov	($rounds_,16);
 | 
			
		||||
	&sub	($rounds_,$rounds);
 | 
			
		||||
	&lea	($key,&DWP(32,$key,$rounds));
 | 
			
		||||
	&jmp	(&label("xts_enc_loop6"));
 | 
			
		||||
 | 
			
		||||
&set_label("xts_enc_loop6",16);
 | 
			
		||||
@@ -1080,6 +1127,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&pxor	($inout5,$tweak);
 | 
			
		||||
 | 
			
		||||
	# inline _aesni_encrypt6 prologue and flip xor with tweak and key[0]
 | 
			
		||||
	&mov	($rounds,$rounds_);		# restore $rounds
 | 
			
		||||
	&movdqu	($inout1,&QWP(16*1,$inp));
 | 
			
		||||
	 &xorps		($inout0,$rndkey0);	# input^=rndkey[0]
 | 
			
		||||
	&movdqu	($inout2,&QWP(16*2,$inp));
 | 
			
		||||
@@ -1096,19 +1144,17 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&pxor	($inout5,$rndkey1);
 | 
			
		||||
 | 
			
		||||
	 &$movekey	($rndkey1,&QWP(16,$key_));
 | 
			
		||||
	 &lea		($key,&DWP(32,$key_));
 | 
			
		||||
	&pxor	($inout1,&QWP(16*1,"esp"));
 | 
			
		||||
	 &aesenc	($inout0,$rndkey1);
 | 
			
		||||
	&pxor	($inout2,&QWP(16*2,"esp"));
 | 
			
		||||
	 &aesenc	($inout1,$rndkey1);
 | 
			
		||||
	 &aesenc	($inout0,$rndkey1);
 | 
			
		||||
	&pxor	($inout3,&QWP(16*3,"esp"));
 | 
			
		||||
	 &dec		($rounds);
 | 
			
		||||
	 &aesenc	($inout2,$rndkey1);
 | 
			
		||||
	&pxor	($inout4,&QWP(16*4,"esp"));
 | 
			
		||||
	 &aesenc	($inout3,$rndkey1);
 | 
			
		||||
	 &aesenc	($inout1,$rndkey1);
 | 
			
		||||
	&pxor		($inout5,$rndkey0);
 | 
			
		||||
	 &$movekey	($rndkey0,&QWP(32,$key_));
 | 
			
		||||
	 &aesenc	($inout2,$rndkey1);
 | 
			
		||||
	 &aesenc	($inout3,$rndkey1);
 | 
			
		||||
	 &aesenc	($inout4,$rndkey1);
 | 
			
		||||
	 &$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	 &aesenc	($inout5,$rndkey1);
 | 
			
		||||
	&call		(&label("_aesni_encrypt6_enter"));
 | 
			
		||||
 | 
			
		||||
@@ -1135,13 +1181,12 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&paddq	($tweak,$tweak);		# &psllq($tweak,1);
 | 
			
		||||
	&pand	($twres,$twmask);		# isolate carry and residue
 | 
			
		||||
	&pcmpgtd($twtmp,$tweak);		# broadcast upper bits
 | 
			
		||||
	&mov	($rounds,$rounds_);		# restore $rounds
 | 
			
		||||
	&pxor	($tweak,$twres);
 | 
			
		||||
 | 
			
		||||
	&sub	($len,16*6);
 | 
			
		||||
	&jnc	(&label("xts_enc_loop6"));
 | 
			
		||||
 | 
			
		||||
	&lea	($rounds,&DWP(1,"",$rounds,2));	# restore $rounds
 | 
			
		||||
	&mov	($rounds,&DWP(240,$key_));	# restore $rounds
 | 
			
		||||
	&mov	($key,$key_);			# restore $key
 | 
			
		||||
	&mov	($rounds_,$rounds);
 | 
			
		||||
 | 
			
		||||
@@ -1241,9 +1286,8 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&lea	($inp,&DWP(16*2,$inp));
 | 
			
		||||
	&xorps	($inout0,$inout3);		# input^=tweak
 | 
			
		||||
	&xorps	($inout1,$inout4);
 | 
			
		||||
	&xorps	($inout2,$inout2);
 | 
			
		||||
 | 
			
		||||
	&call	("_aesni_encrypt3");
 | 
			
		||||
	&call	("_aesni_encrypt2");
 | 
			
		||||
 | 
			
		||||
	&xorps	($inout0,$inout3);		# output^=tweak
 | 
			
		||||
	&xorps	($inout1,$inout4);
 | 
			
		||||
@@ -1399,8 +1443,10 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&sub	($len,16*6);
 | 
			
		||||
	&jc	(&label("xts_dec_short"));
 | 
			
		||||
 | 
			
		||||
	&shr	($rounds,1);
 | 
			
		||||
	&mov	($rounds_,$rounds);
 | 
			
		||||
	&shl	($rounds,4);
 | 
			
		||||
	&mov	($rounds_,16);
 | 
			
		||||
	&sub	($rounds_,$rounds);
 | 
			
		||||
	&lea	($key,&DWP(32,$key,$rounds));
 | 
			
		||||
	&jmp	(&label("xts_dec_loop6"));
 | 
			
		||||
 | 
			
		||||
&set_label("xts_dec_loop6",16);
 | 
			
		||||
@@ -1422,6 +1468,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&pxor	($inout5,$tweak);
 | 
			
		||||
 | 
			
		||||
	# inline _aesni_encrypt6 prologue and flip xor with tweak and key[0]
 | 
			
		||||
	&mov	($rounds,$rounds_);
 | 
			
		||||
	&movdqu	($inout1,&QWP(16*1,$inp));
 | 
			
		||||
	 &xorps		($inout0,$rndkey0);	# input^=rndkey[0]
 | 
			
		||||
	&movdqu	($inout2,&QWP(16*2,$inp));
 | 
			
		||||
@@ -1438,19 +1485,17 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&pxor	($inout5,$rndkey1);
 | 
			
		||||
 | 
			
		||||
	 &$movekey	($rndkey1,&QWP(16,$key_));
 | 
			
		||||
	 &lea		($key,&DWP(32,$key_));
 | 
			
		||||
	&pxor	($inout1,&QWP(16*1,"esp"));
 | 
			
		||||
	 &aesdec	($inout0,$rndkey1);
 | 
			
		||||
	&pxor	($inout2,&QWP(16*2,"esp"));
 | 
			
		||||
	 &aesdec	($inout1,$rndkey1);
 | 
			
		||||
	 &aesdec	($inout0,$rndkey1);
 | 
			
		||||
	&pxor	($inout3,&QWP(16*3,"esp"));
 | 
			
		||||
	 &dec		($rounds);
 | 
			
		||||
	 &aesdec	($inout2,$rndkey1);
 | 
			
		||||
	&pxor	($inout4,&QWP(16*4,"esp"));
 | 
			
		||||
	 &aesdec	($inout3,$rndkey1);
 | 
			
		||||
	 &aesdec	($inout1,$rndkey1);
 | 
			
		||||
	&pxor		($inout5,$rndkey0);
 | 
			
		||||
	 &$movekey	($rndkey0,&QWP(32,$key_));
 | 
			
		||||
	 &aesdec	($inout2,$rndkey1);
 | 
			
		||||
	 &aesdec	($inout3,$rndkey1);
 | 
			
		||||
	 &aesdec	($inout4,$rndkey1);
 | 
			
		||||
	 &$movekey	($rndkey0,&QWP(0,$key));
 | 
			
		||||
	 &aesdec	($inout5,$rndkey1);
 | 
			
		||||
	&call		(&label("_aesni_decrypt6_enter"));
 | 
			
		||||
 | 
			
		||||
@@ -1477,13 +1522,12 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&paddq	($tweak,$tweak);		# &psllq($tweak,1);
 | 
			
		||||
	&pand	($twres,$twmask);		# isolate carry and residue
 | 
			
		||||
	&pcmpgtd($twtmp,$tweak);		# broadcast upper bits
 | 
			
		||||
	&mov	($rounds,$rounds_);		# restore $rounds
 | 
			
		||||
	&pxor	($tweak,$twres);
 | 
			
		||||
 | 
			
		||||
	&sub	($len,16*6);
 | 
			
		||||
	&jnc	(&label("xts_dec_loop6"));
 | 
			
		||||
 | 
			
		||||
	&lea	($rounds,&DWP(1,"",$rounds,2));	# restore $rounds
 | 
			
		||||
	&mov	($rounds,&DWP(240,$key_));	# restore $rounds
 | 
			
		||||
	&mov	($key,$key_);			# restore $key
 | 
			
		||||
	&mov	($rounds_,$rounds);
 | 
			
		||||
 | 
			
		||||
@@ -1584,7 +1628,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&xorps	($inout0,$inout3);		# input^=tweak
 | 
			
		||||
	&xorps	($inout1,$inout4);
 | 
			
		||||
 | 
			
		||||
	&call	("_aesni_decrypt3");
 | 
			
		||||
	&call	("_aesni_decrypt2");
 | 
			
		||||
 | 
			
		||||
	&xorps	($inout0,$inout3);		# output^=tweak
 | 
			
		||||
	&xorps	($inout1,$inout4);
 | 
			
		||||
@@ -1816,7 +1860,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&movups	(&QWP(0x10,$out),$inout1);
 | 
			
		||||
	&lea	($inp,&DWP(0x60,$inp));
 | 
			
		||||
	&movups	(&QWP(0x20,$out),$inout2);
 | 
			
		||||
	&mov	($rounds,$rounds_)		# restore $rounds
 | 
			
		||||
	&mov	($rounds,$rounds_);		# restore $rounds
 | 
			
		||||
	&movups	(&QWP(0x30,$out),$inout3);
 | 
			
		||||
	&mov	($key,$key_);			# restore $key
 | 
			
		||||
	&movups	(&QWP(0x40,$out),$inout4);
 | 
			
		||||
@@ -1884,8 +1928,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&jmp	(&label("cbc_dec_tail_collected"));
 | 
			
		||||
 | 
			
		||||
&set_label("cbc_dec_two",16);
 | 
			
		||||
	&xorps	($inout2,$inout2);
 | 
			
		||||
	&call	("_aesni_decrypt3");
 | 
			
		||||
	&call	("_aesni_decrypt2");
 | 
			
		||||
	&xorps	($inout0,$ivec);
 | 
			
		||||
	&xorps	($inout1,$in0);
 | 
			
		||||
	&movups	(&QWP(0,$out),$inout0);
 | 
			
		||||
@@ -2015,7 +2058,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
&set_label("12rounds",16);
 | 
			
		||||
	&movq		("xmm2",&QWP(16,"eax"));	# remaining 1/3 of *userKey
 | 
			
		||||
	&mov		($rounds,11);
 | 
			
		||||
	&$movekey	(&QWP(-16,$key),"xmm0")		# round 0
 | 
			
		||||
	&$movekey	(&QWP(-16,$key),"xmm0");	# round 0
 | 
			
		||||
	&aeskeygenassist("xmm1","xmm2",0x01);		# round 1,2
 | 
			
		||||
	&call		(&label("key_192a_cold"));
 | 
			
		||||
	&aeskeygenassist("xmm1","xmm2",0x02);		# round 2,3
 | 
			
		||||
@@ -2152,7 +2195,7 @@ if ($PREFIX eq "aesni") {
 | 
			
		||||
	&mov	($key,&wparam(2));
 | 
			
		||||
	&call	("_aesni_set_encrypt_key");
 | 
			
		||||
	&mov	($key,&wparam(2));
 | 
			
		||||
	&shl	($rounds,4)	# rounds-1 after _aesni_set_encrypt_key
 | 
			
		||||
	&shl	($rounds,4);	# rounds-1 after _aesni_set_encrypt_key
 | 
			
		||||
	&test	("eax","eax");
 | 
			
		||||
	&jnz	(&label("dec_key_ret"));
 | 
			
		||||
	&lea	("eax",&DWP(16,$key,$rounds));	# end of key schedule
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										919
									
								
								crypto/aes/asm/aest4-sparcv9.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										919
									
								
								crypto/aes/asm/aest4-sparcv9.pl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,919 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
 | 
			
		||||
# ====================================================================
 | 
			
		||||
# Written by David S. Miller <davem@devemloft.net> and Andy Polyakov
 | 
			
		||||
# <appro@openssl.org>. The module is licensed under 2-clause BSD
 | 
			
		||||
# license. October 2012. All rights reserved.
 | 
			
		||||
# ====================================================================
 | 
			
		||||
 | 
			
		||||
######################################################################
 | 
			
		||||
# AES for SPARC T4.
 | 
			
		||||
#
 | 
			
		||||
# AES round instructions complete in 3 cycles and can be issued every
 | 
			
		||||
# cycle. It means that round calculations should take 4*rounds cycles,
 | 
			
		||||
# because any given round instruction depends on result of *both*
 | 
			
		||||
# previous instructions:
 | 
			
		||||
#
 | 
			
		||||
#	|0 |1 |2 |3 |4
 | 
			
		||||
#	|01|01|01|
 | 
			
		||||
#	   |23|23|23|
 | 
			
		||||
#	            |01|01|...
 | 
			
		||||
#	               |23|...
 | 
			
		||||
#
 | 
			
		||||
# Provided that fxor [with IV] takes 3 cycles to complete, critical
 | 
			
		||||
# path length for CBC encrypt would be 3+4*rounds, or in other words
 | 
			
		||||
# it should process one byte in at least (3+4*rounds)/16 cycles. This
 | 
			
		||||
# estimate doesn't account for "collateral" instructions, such as
 | 
			
		||||
# fetching input from memory, xor-ing it with zero-round key and
 | 
			
		||||
# storing the result. Yet, *measured* performance [for data aligned
 | 
			
		||||
# at 64-bit boundary!] deviates from this equation by less than 0.5%:
 | 
			
		||||
#
 | 
			
		||||
#		128-bit key	192-		256-
 | 
			
		||||
# CBC encrypt	2.70/2.90(*)	3.20/3.40	3.70/3.90
 | 
			
		||||
#			 (*) numbers after slash are for
 | 
			
		||||
#			     misaligned data.
 | 
			
		||||
#
 | 
			
		||||
# Out-of-order execution logic managed to fully overlap "collateral"
 | 
			
		||||
# instructions with those on critical path. Amazing!
 | 
			
		||||
#
 | 
			
		||||
# As with Intel AES-NI, question is if it's possible to improve
 | 
			
		||||
# performance of parallelizeable modes by interleaving round
 | 
			
		||||
# instructions. Provided round instruction latency and throughput
 | 
			
		||||
# optimal interleave factor is 2. But can we expect 2x performance
 | 
			
		||||
# improvement? Well, as round instructions can be issued one per
 | 
			
		||||
# cycle, they don't saturate the 2-way issue pipeline and therefore
 | 
			
		||||
# there is room for "collateral" calculations... Yet, 2x speed-up
 | 
			
		||||
# over CBC encrypt remains unattaintable:
 | 
			
		||||
#
 | 
			
		||||
#		128-bit key	192-		256-
 | 
			
		||||
# CBC decrypt	1.64/2.11	1.89/2.37	2.23/2.61
 | 
			
		||||
# CTR		1.64/2.08(*)	1.89/2.33	2.23/2.61
 | 
			
		||||
#			 (*) numbers after slash are for
 | 
			
		||||
#			     misaligned data.
 | 
			
		||||
#
 | 
			
		||||
# Estimates based on amount of instructions under assumption that
 | 
			
		||||
# round instructions are not pairable with any other instruction
 | 
			
		||||
# suggest that latter is the actual case and pipeline runs
 | 
			
		||||
# underutilized. It should be noted that T4 out-of-order execution
 | 
			
		||||
# logic is so capable that performance gain from 2x interleave is
 | 
			
		||||
# not even impressive, ~7-13% over non-interleaved code, largest
 | 
			
		||||
# for 256-bit keys.
 | 
			
		||||
 | 
			
		||||
# To anchor to something else, software implementation processes
 | 
			
		||||
# one byte in 29 cycles with 128-bit key on same processor. Intel
 | 
			
		||||
# Sandy Bridge encrypts byte in 5.07 cycles in CBC mode and decrypts
 | 
			
		||||
# in 0.93, naturally with AES-NI.
 | 
			
		||||
 | 
			
		||||
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 | 
			
		||||
push(@INC,"${dir}","${dir}../../perlasm");
 | 
			
		||||
require "sparcv9_modes.pl";
 | 
			
		||||
 | 
			
		||||
&asm_init(@ARGV);
 | 
			
		||||
 | 
			
		||||
$::evp=1;	# if $evp is set to 0, script generates module with
 | 
			
		||||
# AES_[en|de]crypt, AES_set_[en|de]crypt_key and AES_cbc_encrypt entry
 | 
			
		||||
# points. These however are not fully compatible with openssl/aes.h,
 | 
			
		||||
# because they expect AES_KEY to be aligned at 64-bit boundary. When
 | 
			
		||||
# used through EVP, alignment is arranged at EVP layer. Second thing
 | 
			
		||||
# that is arranged by EVP is at least 32-bit alignment of IV.
 | 
			
		||||
 | 
			
		||||
######################################################################
 | 
			
		||||
# single-round subroutines
 | 
			
		||||
#
 | 
			
		||||
{
 | 
			
		||||
my ($inp,$out,$key,$rounds,$tmp,$mask)=map("%o$_",(0..5));
 | 
			
		||||
 | 
			
		||||
$code.=<<___ if ($::abibits==64);
 | 
			
		||||
.register	%g2,#scratch
 | 
			
		||||
.register	%g3,#scratch
 | 
			
		||||
 | 
			
		||||
___
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.text
 | 
			
		||||
 | 
			
		||||
.globl	aes_t4_encrypt
 | 
			
		||||
.align	32
 | 
			
		||||
aes_t4_encrypt:
 | 
			
		||||
	andcc		$inp, 7, %g1		! is input aligned?
 | 
			
		||||
	andn		$inp, 7, $inp
 | 
			
		||||
 | 
			
		||||
	ldx		[$key + 0], %g4
 | 
			
		||||
	ldx		[$key + 8], %g5
 | 
			
		||||
 | 
			
		||||
	ldx		[$inp + 0], %o4
 | 
			
		||||
	bz,pt		%icc, 1f
 | 
			
		||||
	ldx		[$inp + 8], %o5
 | 
			
		||||
	ldx		[$inp + 16], $inp
 | 
			
		||||
	sll		%g1, 3, %g1
 | 
			
		||||
	sub		%g0, %g1, %o3
 | 
			
		||||
	sllx		%o4, %g1, %o4
 | 
			
		||||
	sllx		%o5, %g1, %g1
 | 
			
		||||
	srlx		%o5, %o3, %o5
 | 
			
		||||
	srlx		$inp, %o3, %o3
 | 
			
		||||
	or		%o5, %o4, %o4
 | 
			
		||||
	or		%o3, %g1, %o5
 | 
			
		||||
1:
 | 
			
		||||
	ld		[$key + 240], $rounds
 | 
			
		||||
	ldd		[$key + 16], %f12
 | 
			
		||||
	ldd		[$key + 24], %f14
 | 
			
		||||
	xor		%g4, %o4, %o4
 | 
			
		||||
	xor		%g5, %o5, %o5
 | 
			
		||||
	movxtod		%o4, %f0
 | 
			
		||||
	movxtod		%o5, %f2
 | 
			
		||||
	srl		$rounds, 1, $rounds
 | 
			
		||||
	ldd		[$key + 32], %f16
 | 
			
		||||
	sub		$rounds, 1, $rounds
 | 
			
		||||
	ldd		[$key + 40], %f18
 | 
			
		||||
	add		$key, 48, $key
 | 
			
		||||
 | 
			
		||||
.Lenc:
 | 
			
		||||
	aes_eround01	%f12, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f14, %f0, %f2, %f2
 | 
			
		||||
	ldd		[$key + 0], %f12
 | 
			
		||||
	ldd		[$key + 8], %f14
 | 
			
		||||
	sub		$rounds,1,$rounds
 | 
			
		||||
	aes_eround01	%f16, %f4, %f2, %f0
 | 
			
		||||
	aes_eround23	%f18, %f4, %f2, %f2
 | 
			
		||||
	ldd		[$key + 16], %f16
 | 
			
		||||
	ldd		[$key + 24], %f18
 | 
			
		||||
	brnz,pt		$rounds, .Lenc
 | 
			
		||||
	add		$key, 32, $key
 | 
			
		||||
 | 
			
		||||
	andcc		$out, 7, $tmp		! is output aligned?
 | 
			
		||||
	aes_eround01	%f12, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f14, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01_l	%f16, %f4, %f2, %f0
 | 
			
		||||
	aes_eround23_l	%f18, %f4, %f2, %f2
 | 
			
		||||
 | 
			
		||||
	bnz,pn		%icc, 2f
 | 
			
		||||
	nop
 | 
			
		||||
 | 
			
		||||
	std		%f0, [$out + 0]
 | 
			
		||||
	retl
 | 
			
		||||
	std		%f2, [$out + 8]
 | 
			
		||||
 | 
			
		||||
2:	alignaddrl	$out, %g0, $out
 | 
			
		||||
	mov		0xff, $mask
 | 
			
		||||
	srl		$mask, $tmp, $mask
 | 
			
		||||
 | 
			
		||||
	faligndata	%f0, %f0, %f4
 | 
			
		||||
	faligndata	%f0, %f2, %f6
 | 
			
		||||
	faligndata	%f2, %f2, %f8
 | 
			
		||||
 | 
			
		||||
	stda		%f4, [$out + $mask]0xc0	! partial store
 | 
			
		||||
	std		%f6, [$out + 8]
 | 
			
		||||
	add		$out, 16, $out
 | 
			
		||||
	orn		%g0, $mask, $mask
 | 
			
		||||
	retl
 | 
			
		||||
	stda		%f8, [$out + $mask]0xc0	! partial store
 | 
			
		||||
.type	aes_t4_encrypt,#function
 | 
			
		||||
.size	aes_t4_encrypt,.-aes_t4_encrypt
 | 
			
		||||
 | 
			
		||||
.globl	aes_t4_decrypt
 | 
			
		||||
.align	32
 | 
			
		||||
aes_t4_decrypt:
 | 
			
		||||
	andcc		$inp, 7, %g1		! is input aligned?
 | 
			
		||||
	andn		$inp, 7, $inp
 | 
			
		||||
 | 
			
		||||
	ldx		[$key + 0], %g4
 | 
			
		||||
	ldx		[$key + 8], %g5
 | 
			
		||||
 | 
			
		||||
	ldx		[$inp + 0], %o4
 | 
			
		||||
	bz,pt		%icc, 1f
 | 
			
		||||
	ldx		[$inp + 8], %o5
 | 
			
		||||
	ldx		[$inp + 16], $inp
 | 
			
		||||
	sll		%g1, 3, %g1
 | 
			
		||||
	sub		%g0, %g1, %o3
 | 
			
		||||
	sllx		%o4, %g1, %o4
 | 
			
		||||
	sllx		%o5, %g1, %g1
 | 
			
		||||
	srlx		%o5, %o3, %o5
 | 
			
		||||
	srlx		$inp, %o3, %o3
 | 
			
		||||
	or		%o5, %o4, %o4
 | 
			
		||||
	or		%o3, %g1, %o5
 | 
			
		||||
1:
 | 
			
		||||
	ld		[$key + 240], $rounds
 | 
			
		||||
	ldd		[$key + 16], %f12
 | 
			
		||||
	ldd		[$key + 24], %f14
 | 
			
		||||
	xor		%g4, %o4, %o4
 | 
			
		||||
	xor		%g5, %o5, %o5
 | 
			
		||||
	movxtod		%o4, %f0
 | 
			
		||||
	movxtod		%o5, %f2
 | 
			
		||||
	srl		$rounds, 1, $rounds
 | 
			
		||||
	ldd		[$key + 32], %f16
 | 
			
		||||
	sub		$rounds, 1, $rounds
 | 
			
		||||
	ldd		[$key + 40], %f18
 | 
			
		||||
	add		$key, 48, $key
 | 
			
		||||
 | 
			
		||||
.Ldec:
 | 
			
		||||
	aes_dround01	%f12, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f14, %f0, %f2, %f2
 | 
			
		||||
	ldd		[$key + 0], %f12
 | 
			
		||||
	ldd		[$key + 8], %f14
 | 
			
		||||
	sub		$rounds,1,$rounds
 | 
			
		||||
	aes_dround01	%f16, %f4, %f2, %f0
 | 
			
		||||
	aes_dround23	%f18, %f4, %f2, %f2
 | 
			
		||||
	ldd		[$key + 16], %f16
 | 
			
		||||
	ldd		[$key + 24], %f18
 | 
			
		||||
	brnz,pt		$rounds, .Ldec
 | 
			
		||||
	add		$key, 32, $key
 | 
			
		||||
 | 
			
		||||
	andcc		$out, 7, $tmp		! is output aligned?
 | 
			
		||||
	aes_dround01	%f12, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f14, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01_l	%f16, %f4, %f2, %f0
 | 
			
		||||
	aes_dround23_l	%f18, %f4, %f2, %f2
 | 
			
		||||
 | 
			
		||||
	bnz,pn		%icc, 2f
 | 
			
		||||
	nop
 | 
			
		||||
 | 
			
		||||
	std		%f0, [$out + 0]
 | 
			
		||||
	retl
 | 
			
		||||
	std		%f2, [$out + 8]
 | 
			
		||||
 | 
			
		||||
2:	alignaddrl	$out, %g0, $out
 | 
			
		||||
	mov		0xff, $mask
 | 
			
		||||
	srl		$mask, $tmp, $mask
 | 
			
		||||
 | 
			
		||||
	faligndata	%f0, %f0, %f4
 | 
			
		||||
	faligndata	%f0, %f2, %f6
 | 
			
		||||
	faligndata	%f2, %f2, %f8
 | 
			
		||||
 | 
			
		||||
	stda		%f4, [$out + $mask]0xc0	! partial store
 | 
			
		||||
	std		%f6, [$out + 8]
 | 
			
		||||
	add		$out, 16, $out
 | 
			
		||||
	orn		%g0, $mask, $mask
 | 
			
		||||
	retl
 | 
			
		||||
	stda		%f8, [$out + $mask]0xc0	! partial store
 | 
			
		||||
.type	aes_t4_decrypt,#function
 | 
			
		||||
.size	aes_t4_decrypt,.-aes_t4_decrypt
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
######################################################################
 | 
			
		||||
# key setup subroutines
 | 
			
		||||
#
 | 
			
		||||
{
 | 
			
		||||
my ($inp,$bits,$out,$tmp)=map("%o$_",(0..5));
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.globl	aes_t4_set_encrypt_key
 | 
			
		||||
.align	32
 | 
			
		||||
aes_t4_set_encrypt_key:
 | 
			
		||||
.Lset_encrypt_key:
 | 
			
		||||
	and		$inp, 7, $tmp
 | 
			
		||||
	alignaddr	$inp, %g0, $inp
 | 
			
		||||
	cmp		$bits, 192
 | 
			
		||||
	ldd		[$inp + 0], %f0
 | 
			
		||||
	bl,pt		%icc,.L128
 | 
			
		||||
	ldd		[$inp + 8], %f2
 | 
			
		||||
 | 
			
		||||
	be,pt		%icc,.L192
 | 
			
		||||
	ldd		[$inp + 16], %f4
 | 
			
		||||
	brz,pt		$tmp, .L256aligned
 | 
			
		||||
	ldd		[$inp + 24], %f6
 | 
			
		||||
 | 
			
		||||
	ldd		[$inp + 32], %f8
 | 
			
		||||
	faligndata	%f0, %f2, %f0
 | 
			
		||||
	faligndata	%f2, %f4, %f2
 | 
			
		||||
	faligndata	%f4, %f6, %f4
 | 
			
		||||
	faligndata	%f6, %f8, %f6
 | 
			
		||||
.L256aligned:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<6; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	std		%f0, [$out + `32*$i+0`]
 | 
			
		||||
	aes_kexpand1	%f0, %f6, $i, %f0
 | 
			
		||||
	std		%f2, [$out + `32*$i+8`]
 | 
			
		||||
	aes_kexpand2	%f2, %f0, %f2
 | 
			
		||||
	std		%f4, [$out + `32*$i+16`]
 | 
			
		||||
	aes_kexpand0	%f4, %f2, %f4
 | 
			
		||||
	std		%f6, [$out + `32*$i+24`]
 | 
			
		||||
	aes_kexpand2	%f6, %f4, %f6
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	std		%f0, [$out + `32*$i+0`]
 | 
			
		||||
	aes_kexpand1	%f0, %f6, $i, %f0
 | 
			
		||||
	std		%f2, [$out + `32*$i+8`]
 | 
			
		||||
	aes_kexpand2	%f2, %f0, %f2
 | 
			
		||||
	std		%f4, [$out + `32*$i+16`]
 | 
			
		||||
	std		%f6, [$out + `32*$i+24`]
 | 
			
		||||
	std		%f0, [$out + `32*$i+32`]
 | 
			
		||||
	std		%f2, [$out + `32*$i+40`]
 | 
			
		||||
 | 
			
		||||
	mov		14, $tmp
 | 
			
		||||
	st		$tmp, [$out + 240]
 | 
			
		||||
	retl
 | 
			
		||||
	xor		%o0, %o0, %o0
 | 
			
		||||
 | 
			
		||||
.align	16
 | 
			
		||||
.L192:
 | 
			
		||||
	brz,pt		$tmp, .L192aligned
 | 
			
		||||
	nop
 | 
			
		||||
 | 
			
		||||
	ldd		[$inp + 24], %f6
 | 
			
		||||
	faligndata	%f0, %f2, %f0
 | 
			
		||||
	faligndata	%f2, %f4, %f2
 | 
			
		||||
	faligndata	%f4, %f6, %f4
 | 
			
		||||
.L192aligned:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<7; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	std		%f0, [$out + `24*$i+0`]
 | 
			
		||||
	aes_kexpand1	%f0, %f4, $i, %f0
 | 
			
		||||
	std		%f2, [$out + `24*$i+8`]
 | 
			
		||||
	aes_kexpand2	%f2, %f0, %f2
 | 
			
		||||
	std		%f4, [$out + `24*$i+16`]
 | 
			
		||||
	aes_kexpand2	%f4, %f2, %f4
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	std		%f0, [$out + `24*$i+0`]
 | 
			
		||||
	aes_kexpand1	%f0, %f4, $i, %f0
 | 
			
		||||
	std		%f2, [$out + `24*$i+8`]
 | 
			
		||||
	aes_kexpand2	%f2, %f0, %f2
 | 
			
		||||
	std		%f4, [$out + `24*$i+16`]
 | 
			
		||||
	std		%f0, [$out + `24*$i+24`]
 | 
			
		||||
	std		%f2, [$out + `24*$i+32`]
 | 
			
		||||
 | 
			
		||||
	mov		12, $tmp
 | 
			
		||||
	st		$tmp, [$out + 240]
 | 
			
		||||
	retl
 | 
			
		||||
	xor		%o0, %o0, %o0
 | 
			
		||||
 | 
			
		||||
.align	16
 | 
			
		||||
.L128:
 | 
			
		||||
	brz,pt		$tmp, .L128aligned
 | 
			
		||||
	nop
 | 
			
		||||
 | 
			
		||||
	ldd		[$inp + 16], %f4
 | 
			
		||||
	faligndata	%f0, %f2, %f0
 | 
			
		||||
	faligndata	%f2, %f4, %f2
 | 
			
		||||
.L128aligned:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<10; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	std		%f0, [$out + `16*$i+0`]
 | 
			
		||||
	aes_kexpand1	%f0, %f2, $i, %f0
 | 
			
		||||
	std		%f2, [$out + `16*$i+8`]
 | 
			
		||||
	aes_kexpand2	%f2, %f0, %f2
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	std		%f0, [$out + `16*$i+0`]
 | 
			
		||||
	std		%f2, [$out + `16*$i+8`]
 | 
			
		||||
 | 
			
		||||
	mov		10, $tmp
 | 
			
		||||
	st		$tmp, [$out + 240]
 | 
			
		||||
	retl
 | 
			
		||||
	xor		%o0, %o0, %o0
 | 
			
		||||
.type	aes_t4_set_encrypt_key,#function
 | 
			
		||||
.size	aes_t4_set_encrypt_key,.-aes_t4_set_encrypt_key
 | 
			
		||||
 | 
			
		||||
.globl	aes_t4_set_decrypt_key
 | 
			
		||||
.align	32
 | 
			
		||||
aes_t4_set_decrypt_key:
 | 
			
		||||
	mov		%o7, %o5
 | 
			
		||||
	call		.Lset_encrypt_key
 | 
			
		||||
	nop
 | 
			
		||||
 | 
			
		||||
	mov		%o5, %o7
 | 
			
		||||
	sll		$tmp, 4, $inp		! $tmp is number of rounds
 | 
			
		||||
	add		$tmp, 2, $tmp
 | 
			
		||||
	add		$out, $inp, $inp	! $inp=$out+16*rounds
 | 
			
		||||
	srl		$tmp, 2, $tmp		! $tmp=(rounds+2)/4
 | 
			
		||||
 | 
			
		||||
.Lkey_flip:
 | 
			
		||||
	ldd		[$out + 0],  %f0
 | 
			
		||||
	ldd		[$out + 8],  %f2
 | 
			
		||||
	ldd		[$out + 16], %f4
 | 
			
		||||
	ldd		[$out + 24], %f6
 | 
			
		||||
	ldd		[$inp + 0],  %f8
 | 
			
		||||
	ldd		[$inp + 8],  %f10
 | 
			
		||||
	ldd		[$inp - 16], %f12
 | 
			
		||||
	ldd		[$inp - 8],  %f14
 | 
			
		||||
	sub		$tmp, 1, $tmp
 | 
			
		||||
	std		%f0, [$inp + 0]
 | 
			
		||||
	std		%f2, [$inp + 8]
 | 
			
		||||
	std		%f4, [$inp - 16]
 | 
			
		||||
	std		%f6, [$inp - 8]
 | 
			
		||||
	std		%f8, [$out + 0]
 | 
			
		||||
	std		%f10, [$out + 8]
 | 
			
		||||
	std		%f12, [$out + 16]
 | 
			
		||||
	std		%f14, [$out + 24]
 | 
			
		||||
	add		$out, 32, $out
 | 
			
		||||
	brnz		$tmp, .Lkey_flip
 | 
			
		||||
	sub		$inp, 32, $inp
 | 
			
		||||
 | 
			
		||||
	retl
 | 
			
		||||
	xor		%o0, %o0, %o0
 | 
			
		||||
.type	aes_t4_set_decrypt_key,#function
 | 
			
		||||
.size	aes_t4_set_decrypt_key,.-aes_t4_set_decrypt_key
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
{{{
 | 
			
		||||
my ($inp,$out,$len,$key,$ivec,$enc)=map("%i$_",(0..5));
 | 
			
		||||
my ($ileft,$iright,$ooff,$omask,$ivoff)=map("%l$_",(1..7));
 | 
			
		||||
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.align	32
 | 
			
		||||
_aes128_encrypt_1x:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<4; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f4, %f2, %f0
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f4, %f2, %f2
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_eround01	%f48, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f50, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01_l	%f52, %f4, %f2, %f0
 | 
			
		||||
	retl
 | 
			
		||||
	aes_eround23_l	%f54, %f4, %f2, %f2
 | 
			
		||||
.type	_aes128_encrypt_1x,#function
 | 
			
		||||
.size	_aes128_encrypt_1x,.-_aes128_encrypt_1x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes128_encrypt_2x:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<4; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f0, %f2, %f8
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f4, %f6, %f10
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f4, %f6, %f6
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f8, %f2, %f0
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f8, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f10, %f6, %f4
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f10, %f6, %f6
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_eround01	%f48, %f0, %f2, %f8
 | 
			
		||||
	aes_eround23	%f50, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f48, %f4, %f6, %f10
 | 
			
		||||
	aes_eround23	%f50, %f4, %f6, %f6
 | 
			
		||||
	aes_eround01_l	%f52, %f8, %f2, %f0
 | 
			
		||||
	aes_eround23_l	%f54, %f8, %f2, %f2
 | 
			
		||||
	aes_eround01_l	%f52, %f10, %f6, %f4
 | 
			
		||||
	retl
 | 
			
		||||
	aes_eround23_l	%f54, %f10, %f6, %f6
 | 
			
		||||
.type	_aes128_encrypt_2x,#function
 | 
			
		||||
.size	_aes128_encrypt_2x,.-_aes128_encrypt_2x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes128_loadkey:
 | 
			
		||||
	ldx		[$key + 0], %g4
 | 
			
		||||
	ldx		[$key + 8], %g5
 | 
			
		||||
___
 | 
			
		||||
for ($i=2; $i<22;$i++) {			# load key schedule
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	ldd		[$key + `8*$i`], %f`12+2*$i`
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	retl
 | 
			
		||||
	nop
 | 
			
		||||
.type	_aes128_loadkey,#function
 | 
			
		||||
.size	_aes128_loadkey,.-_aes128_loadkey
 | 
			
		||||
_aes128_load_enckey=_aes128_loadkey
 | 
			
		||||
_aes128_load_deckey=_aes128_loadkey
 | 
			
		||||
 | 
			
		||||
___
 | 
			
		||||
 | 
			
		||||
&alg_cbc_encrypt_implement("aes",128);
 | 
			
		||||
if ($::evp) {
 | 
			
		||||
    &alg_ctr32_implement("aes",128);
 | 
			
		||||
    &alg_xts_implement("aes",128,"en");
 | 
			
		||||
    &alg_xts_implement("aes",128,"de");
 | 
			
		||||
}
 | 
			
		||||
&alg_cbc_decrypt_implement("aes",128);
 | 
			
		||||
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.align	32
 | 
			
		||||
_aes128_decrypt_1x:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<4; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f4, %f2, %f0
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f4, %f2, %f2
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_dround01	%f48, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f50, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01_l	%f52, %f4, %f2, %f0
 | 
			
		||||
	retl
 | 
			
		||||
	aes_dround23_l	%f54, %f4, %f2, %f2
 | 
			
		||||
.type	_aes128_decrypt_1x,#function
 | 
			
		||||
.size	_aes128_decrypt_1x,.-_aes128_decrypt_1x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes128_decrypt_2x:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<4; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f0, %f2, %f8
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f4, %f6, %f10
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f4, %f6, %f6
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f8, %f2, %f0
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f8, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f10, %f6, %f4
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f10, %f6, %f6
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_dround01	%f48, %f0, %f2, %f8
 | 
			
		||||
	aes_dround23	%f50, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f48, %f4, %f6, %f10
 | 
			
		||||
	aes_dround23	%f50, %f4, %f6, %f6
 | 
			
		||||
	aes_dround01_l	%f52, %f8, %f2, %f0
 | 
			
		||||
	aes_dround23_l	%f54, %f8, %f2, %f2
 | 
			
		||||
	aes_dround01_l	%f52, %f10, %f6, %f4
 | 
			
		||||
	retl
 | 
			
		||||
	aes_dround23_l	%f54, %f10, %f6, %f6
 | 
			
		||||
.type	_aes128_decrypt_2x,#function
 | 
			
		||||
.size	_aes128_decrypt_2x,.-_aes128_decrypt_2x
 | 
			
		||||
___
 | 
			
		||||
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.align	32
 | 
			
		||||
_aes192_encrypt_1x:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<5; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f4, %f2, %f0
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f4, %f2, %f2
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_eround01	%f56, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f58, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01_l	%f60, %f4, %f2, %f0
 | 
			
		||||
	retl
 | 
			
		||||
	aes_eround23_l	%f62, %f4, %f2, %f2
 | 
			
		||||
.type	_aes192_encrypt_1x,#function
 | 
			
		||||
.size	_aes192_encrypt_1x,.-_aes192_encrypt_1x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes192_encrypt_2x:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<5; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f0, %f2, %f8
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f4, %f6, %f10
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f4, %f6, %f6
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f8, %f2, %f0
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f8, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f10, %f6, %f4
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f10, %f6, %f6
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_eround01	%f56, %f0, %f2, %f8
 | 
			
		||||
	aes_eround23	%f58, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f56, %f4, %f6, %f10
 | 
			
		||||
	aes_eround23	%f58, %f4, %f6, %f6
 | 
			
		||||
	aes_eround01_l	%f60, %f8, %f2, %f0
 | 
			
		||||
	aes_eround23_l	%f62, %f8, %f2, %f2
 | 
			
		||||
	aes_eround01_l	%f60, %f10, %f6, %f4
 | 
			
		||||
	retl
 | 
			
		||||
	aes_eround23_l	%f62, %f10, %f6, %f6
 | 
			
		||||
.type	_aes192_encrypt_2x,#function
 | 
			
		||||
.size	_aes192_encrypt_2x,.-_aes192_encrypt_2x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes256_encrypt_1x:
 | 
			
		||||
	aes_eround01	%f16, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f18, %f0, %f2, %f2
 | 
			
		||||
	ldd		[$key + 208], %f16
 | 
			
		||||
	ldd		[$key + 216], %f18
 | 
			
		||||
	aes_eround01	%f20, %f4, %f2, %f0
 | 
			
		||||
	aes_eround23	%f22, %f4, %f2, %f2
 | 
			
		||||
	ldd		[$key + 224], %f20
 | 
			
		||||
	ldd		[$key + 232], %f22
 | 
			
		||||
___
 | 
			
		||||
for ($i=1; $i<6; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f4, %f2, %f0
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f4, %f2, %f2
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_eround01	%f16, %f0, %f2, %f4
 | 
			
		||||
	aes_eround23	%f18, %f0, %f2, %f2
 | 
			
		||||
	ldd		[$key + 16], %f16
 | 
			
		||||
	ldd		[$key + 24], %f18
 | 
			
		||||
	aes_eround01_l	%f20, %f4, %f2, %f0
 | 
			
		||||
	aes_eround23_l	%f22, %f4, %f2, %f2
 | 
			
		||||
	ldd		[$key + 32], %f20
 | 
			
		||||
	retl
 | 
			
		||||
	ldd		[$key + 40], %f22
 | 
			
		||||
.type	_aes256_encrypt_1x,#function
 | 
			
		||||
.size	_aes256_encrypt_1x,.-_aes256_encrypt_1x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes256_encrypt_2x:
 | 
			
		||||
	aes_eround01	%f16, %f0, %f2, %f8
 | 
			
		||||
	aes_eround23	%f18, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f16, %f4, %f6, %f10
 | 
			
		||||
	aes_eround23	%f18, %f4, %f6, %f6
 | 
			
		||||
	ldd		[$key + 208], %f16
 | 
			
		||||
	ldd		[$key + 216], %f18
 | 
			
		||||
	aes_eround01	%f20, %f8, %f2, %f0
 | 
			
		||||
	aes_eround23	%f22, %f8, %f2, %f2
 | 
			
		||||
	aes_eround01	%f20, %f10, %f6, %f4
 | 
			
		||||
	aes_eround23	%f22, %f10, %f6, %f6
 | 
			
		||||
	ldd		[$key + 224], %f20
 | 
			
		||||
	ldd		[$key + 232], %f22
 | 
			
		||||
___
 | 
			
		||||
for ($i=1; $i<6; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f0, %f2, %f8
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+0`, %f4, %f6, %f10
 | 
			
		||||
	aes_eround23	%f`16+8*$i+2`, %f4, %f6, %f6
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f8, %f2, %f0
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f8, %f2, %f2
 | 
			
		||||
	aes_eround01	%f`16+8*$i+4`, %f10, %f6, %f4
 | 
			
		||||
	aes_eround23	%f`16+8*$i+6`, %f10, %f6, %f6
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_eround01	%f16, %f0, %f2, %f8
 | 
			
		||||
	aes_eround23	%f18, %f0, %f2, %f2
 | 
			
		||||
	aes_eround01	%f16, %f4, %f6, %f10
 | 
			
		||||
	aes_eround23	%f18, %f4, %f6, %f6
 | 
			
		||||
	ldd		[$key + 16], %f16
 | 
			
		||||
	ldd		[$key + 24], %f18
 | 
			
		||||
	aes_eround01_l	%f20, %f8, %f2, %f0
 | 
			
		||||
	aes_eround23_l	%f22, %f8, %f2, %f2
 | 
			
		||||
	aes_eround01_l	%f20, %f10, %f6, %f4
 | 
			
		||||
	aes_eround23_l	%f22, %f10, %f6, %f6
 | 
			
		||||
	ldd		[$key + 32], %f20
 | 
			
		||||
	retl
 | 
			
		||||
	ldd		[$key + 40], %f22
 | 
			
		||||
.type	_aes256_encrypt_2x,#function
 | 
			
		||||
.size	_aes256_encrypt_2x,.-_aes256_encrypt_2x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes192_loadkey:
 | 
			
		||||
	ldx		[$key + 0], %g4
 | 
			
		||||
	ldx		[$key + 8], %g5
 | 
			
		||||
___
 | 
			
		||||
for ($i=2; $i<26;$i++) {			# load key schedule
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	ldd		[$key + `8*$i`], %f`12+2*$i`
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	retl
 | 
			
		||||
	nop
 | 
			
		||||
.type	_aes192_loadkey,#function
 | 
			
		||||
.size	_aes192_loadkey,.-_aes192_loadkey
 | 
			
		||||
_aes256_loadkey=_aes192_loadkey
 | 
			
		||||
_aes192_load_enckey=_aes192_loadkey
 | 
			
		||||
_aes192_load_deckey=_aes192_loadkey
 | 
			
		||||
_aes256_load_enckey=_aes192_loadkey
 | 
			
		||||
_aes256_load_deckey=_aes192_loadkey
 | 
			
		||||
___
 | 
			
		||||
 | 
			
		||||
&alg_cbc_encrypt_implement("aes",256);
 | 
			
		||||
&alg_cbc_encrypt_implement("aes",192);
 | 
			
		||||
if ($::evp) {
 | 
			
		||||
    &alg_ctr32_implement("aes",256);
 | 
			
		||||
    &alg_xts_implement("aes",256,"en");
 | 
			
		||||
    &alg_xts_implement("aes",256,"de");
 | 
			
		||||
    &alg_ctr32_implement("aes",192);
 | 
			
		||||
}
 | 
			
		||||
&alg_cbc_decrypt_implement("aes",192);
 | 
			
		||||
&alg_cbc_decrypt_implement("aes",256);
 | 
			
		||||
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.align	32
 | 
			
		||||
_aes256_decrypt_1x:
 | 
			
		||||
	aes_dround01	%f16, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f18, %f0, %f2, %f2
 | 
			
		||||
	ldd		[$key + 208], %f16
 | 
			
		||||
	ldd		[$key + 216], %f18
 | 
			
		||||
	aes_dround01	%f20, %f4, %f2, %f0
 | 
			
		||||
	aes_dround23	%f22, %f4, %f2, %f2
 | 
			
		||||
	ldd		[$key + 224], %f20
 | 
			
		||||
	ldd		[$key + 232], %f22
 | 
			
		||||
___
 | 
			
		||||
for ($i=1; $i<6; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f4, %f2, %f0
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f4, %f2, %f2
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_dround01	%f16, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f18, %f0, %f2, %f2
 | 
			
		||||
	ldd		[$key + 16], %f16
 | 
			
		||||
	ldd		[$key + 24], %f18
 | 
			
		||||
	aes_dround01_l	%f20, %f4, %f2, %f0
 | 
			
		||||
	aes_dround23_l	%f22, %f4, %f2, %f2
 | 
			
		||||
	ldd		[$key + 32], %f20
 | 
			
		||||
	retl
 | 
			
		||||
	ldd		[$key + 40], %f22
 | 
			
		||||
.type	_aes256_decrypt_1x,#function
 | 
			
		||||
.size	_aes256_decrypt_1x,.-_aes256_decrypt_1x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes256_decrypt_2x:
 | 
			
		||||
	aes_dround01	%f16, %f0, %f2, %f8
 | 
			
		||||
	aes_dround23	%f18, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f16, %f4, %f6, %f10
 | 
			
		||||
	aes_dround23	%f18, %f4, %f6, %f6
 | 
			
		||||
	ldd		[$key + 208], %f16
 | 
			
		||||
	ldd		[$key + 216], %f18
 | 
			
		||||
	aes_dround01	%f20, %f8, %f2, %f0
 | 
			
		||||
	aes_dround23	%f22, %f8, %f2, %f2
 | 
			
		||||
	aes_dround01	%f20, %f10, %f6, %f4
 | 
			
		||||
	aes_dround23	%f22, %f10, %f6, %f6
 | 
			
		||||
	ldd		[$key + 224], %f20
 | 
			
		||||
	ldd		[$key + 232], %f22
 | 
			
		||||
___
 | 
			
		||||
for ($i=1; $i<6; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f0, %f2, %f8
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f4, %f6, %f10
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f4, %f6, %f6
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f8, %f2, %f0
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f8, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f10, %f6, %f4
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f10, %f6, %f6
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_dround01	%f16, %f0, %f2, %f8
 | 
			
		||||
	aes_dround23	%f18, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f16, %f4, %f6, %f10
 | 
			
		||||
	aes_dround23	%f18, %f4, %f6, %f6
 | 
			
		||||
	ldd		[$key + 16], %f16
 | 
			
		||||
	ldd		[$key + 24], %f18
 | 
			
		||||
	aes_dround01_l	%f20, %f8, %f2, %f0
 | 
			
		||||
	aes_dround23_l	%f22, %f8, %f2, %f2
 | 
			
		||||
	aes_dround01_l	%f20, %f10, %f6, %f4
 | 
			
		||||
	aes_dround23_l	%f22, %f10, %f6, %f6
 | 
			
		||||
	ldd		[$key + 32], %f20
 | 
			
		||||
	retl
 | 
			
		||||
	ldd		[$key + 40], %f22
 | 
			
		||||
.type	_aes256_decrypt_2x,#function
 | 
			
		||||
.size	_aes256_decrypt_2x,.-_aes256_decrypt_2x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes192_decrypt_1x:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<5; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f4, %f2, %f0
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f4, %f2, %f2
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_dround01	%f56, %f0, %f2, %f4
 | 
			
		||||
	aes_dround23	%f58, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01_l	%f60, %f4, %f2, %f0
 | 
			
		||||
	retl
 | 
			
		||||
	aes_dround23_l	%f62, %f4, %f2, %f2
 | 
			
		||||
.type	_aes192_decrypt_1x,#function
 | 
			
		||||
.size	_aes192_decrypt_1x,.-_aes192_decrypt_1x
 | 
			
		||||
 | 
			
		||||
.align	32
 | 
			
		||||
_aes192_decrypt_2x:
 | 
			
		||||
___
 | 
			
		||||
for ($i=0; $i<5; $i++) {
 | 
			
		||||
    $code.=<<___;
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f0, %f2, %f8
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+0`, %f4, %f6, %f10
 | 
			
		||||
	aes_dround23	%f`16+8*$i+2`, %f4, %f6, %f6
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f8, %f2, %f0
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f8, %f2, %f2
 | 
			
		||||
	aes_dround01	%f`16+8*$i+4`, %f10, %f6, %f4
 | 
			
		||||
	aes_dround23	%f`16+8*$i+6`, %f10, %f6, %f6
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
	aes_dround01	%f56, %f0, %f2, %f8
 | 
			
		||||
	aes_dround23	%f58, %f0, %f2, %f2
 | 
			
		||||
	aes_dround01	%f56, %f4, %f6, %f10
 | 
			
		||||
	aes_dround23	%f58, %f4, %f6, %f6
 | 
			
		||||
	aes_dround01_l	%f60, %f8, %f2, %f0
 | 
			
		||||
	aes_dround23_l	%f62, %f8, %f2, %f2
 | 
			
		||||
	aes_dround01_l	%f60, %f10, %f6, %f4
 | 
			
		||||
	retl
 | 
			
		||||
	aes_dround23_l	%f62, %f10, %f6, %f6
 | 
			
		||||
.type	_aes192_decrypt_2x,#function
 | 
			
		||||
.size	_aes192_decrypt_2x,.-_aes192_decrypt_2x
 | 
			
		||||
___
 | 
			
		||||
}}}
 | 
			
		||||
 | 
			
		||||
if (!$::evp) {
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.global	AES_encrypt
 | 
			
		||||
AES_encrypt=aes_t4_encrypt
 | 
			
		||||
.global	AES_decrypt
 | 
			
		||||
AES_decrypt=aes_t4_decrypt
 | 
			
		||||
.global	AES_set_encrypt_key
 | 
			
		||||
.align	32
 | 
			
		||||
AES_set_encrypt_key:
 | 
			
		||||
	andcc		%o2, 7, %g0		! check alignment
 | 
			
		||||
	bnz,a,pn	%icc, 1f
 | 
			
		||||
	mov		-1, %o0
 | 
			
		||||
	brz,a,pn	%o0, 1f
 | 
			
		||||
	mov		-1, %o0
 | 
			
		||||
	brz,a,pn	%o2, 1f
 | 
			
		||||
	mov		-1, %o0
 | 
			
		||||
	andncc		%o1, 0x1c0, %g0
 | 
			
		||||
	bnz,a,pn	%icc, 1f
 | 
			
		||||
	mov		-2, %o0
 | 
			
		||||
	cmp		%o1, 128
 | 
			
		||||
	bl,a,pn		%icc, 1f
 | 
			
		||||
	mov		-2, %o0
 | 
			
		||||
	b		aes_t4_set_encrypt_key
 | 
			
		||||
	nop
 | 
			
		||||
1:	retl
 | 
			
		||||
	nop
 | 
			
		||||
.type	AES_set_encrypt_key,#function
 | 
			
		||||
.size	AES_set_encrypt_key,.-AES_set_encrypt_key
 | 
			
		||||
 | 
			
		||||
.global	AES_set_decrypt_key
 | 
			
		||||
.align	32
 | 
			
		||||
AES_set_decrypt_key:
 | 
			
		||||
	andcc		%o2, 7, %g0		! check alignment
 | 
			
		||||
	bnz,a,pn	%icc, 1f
 | 
			
		||||
	mov		-1, %o0
 | 
			
		||||
	brz,a,pn	%o0, 1f
 | 
			
		||||
	mov		-1, %o0
 | 
			
		||||
	brz,a,pn	%o2, 1f
 | 
			
		||||
	mov		-1, %o0
 | 
			
		||||
	andncc		%o1, 0x1c0, %g0
 | 
			
		||||
	bnz,a,pn	%icc, 1f
 | 
			
		||||
	mov		-2, %o0
 | 
			
		||||
	cmp		%o1, 128
 | 
			
		||||
	bl,a,pn		%icc, 1f
 | 
			
		||||
	mov		-2, %o0
 | 
			
		||||
	b		aes_t4_set_decrypt_key
 | 
			
		||||
	nop
 | 
			
		||||
1:	retl
 | 
			
		||||
	nop
 | 
			
		||||
.type	AES_set_decrypt_key,#function
 | 
			
		||||
.size	AES_set_decrypt_key,.-AES_set_decrypt_key
 | 
			
		||||
___
 | 
			
		||||
 | 
			
		||||
my ($inp,$out,$len,$key,$ivec,$enc)=map("%o$_",(0..5));
 | 
			
		||||
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.globl	AES_cbc_encrypt
 | 
			
		||||
.align	32
 | 
			
		||||
AES_cbc_encrypt:
 | 
			
		||||
	ld		[$key + 240], %g1
 | 
			
		||||
	nop
 | 
			
		||||
	brz		$enc, .Lcbc_decrypt
 | 
			
		||||
	cmp		%g1, 12
 | 
			
		||||
 | 
			
		||||
	bl,pt		%icc, aes128_t4_cbc_encrypt
 | 
			
		||||
	nop
 | 
			
		||||
	be,pn		%icc, aes192_t4_cbc_encrypt
 | 
			
		||||
	nop
 | 
			
		||||
	ba		aes256_t4_cbc_encrypt
 | 
			
		||||
	nop
 | 
			
		||||
 | 
			
		||||
.Lcbc_decrypt:
 | 
			
		||||
	bl,pt		%icc, aes128_t4_cbc_decrypt
 | 
			
		||||
	nop
 | 
			
		||||
	be,pn		%icc, aes192_t4_cbc_decrypt
 | 
			
		||||
	nop
 | 
			
		||||
	ba		aes256_t4_cbc_decrypt
 | 
			
		||||
	nop
 | 
			
		||||
.type	AES_cbc_encrypt,#function
 | 
			
		||||
.size	AES_cbc_encrypt,.-AES_cbc_encrypt
 | 
			
		||||
___
 | 
			
		||||
}
 | 
			
		||||
$code.=<<___;
 | 
			
		||||
.asciz	"AES for SPARC T4, David S. Miller, Andy Polyakov"
 | 
			
		||||
.align	4
 | 
			
		||||
___
 | 
			
		||||
 | 
			
		||||
&emit_assembler();
 | 
			
		||||
 | 
			
		||||
close STDOUT;
 | 
			
		||||
							
								
								
									
										2467
									
								
								crypto/aes/asm/bsaes-armv7.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2467
									
								
								crypto/aes/asm/bsaes-armv7.pl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user