mirror of https://github.com/openssl/openssl.git
				
				
				
			
		
			
	
	
		
			159 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			159 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								From ssl-lists-owner@mincom.com Mon Sep 30 02:37:40 1996
							 | 
						||
| 
								 | 
							
								Received: from cygnus.mincom.oz.au by orb.mincom.oz.au with SMTP id AA11782
							 | 
						||
| 
								 | 
							
								  (5.65c/IDA-1.4.4 for eay); Mon, 30 Sep 1996 11:46:21 +1000
							 | 
						||
| 
								 | 
							
								Received: (from daemon@localhost) by cygnus.mincom.oz.au (8.7.5/8.7.3) id LAA18980 for ssl-users-outgoing; Mon, 30 Sep 1996 11:44:56 +1000 (EST)
							 | 
						||
| 
								 | 
							
								Received: from minbne.mincom.oz.au (minbne.mincom.oz.au [192.55.196.247]) by cygnus.mincom.oz.au (8.7.5/8.7.3) with SMTP id LAA18962 for <ssl-users@listserv.mincom.oz.au>; Mon, 30 Sep 1996 11:44:51 +1000 (EST)
							 | 
						||
| 
								 | 
							
								Received: by minbne.mincom.oz.au id AA22230
							 | 
						||
| 
								 | 
							
								  (5.65c/IDA-1.4.4 for ssl-users@listserv.mincom.oz.au); Mon, 30 Sep 1996 11:38:41 +1000
							 | 
						||
| 
								 | 
							
								Received: from brutus.neuronio.pt (brutus.neuronio.pt [193.126.253.2]) by bunyip.cc.uq.oz.au (8.7.6/8.7.3) with SMTP id LAA15824 for <ssl-users@mincom.com>; Mon, 30 Sep 1996 11:40:07 +1000
							 | 
						||
| 
								 | 
							
								Received: (from sampo@localhost) by brutus.neuronio.pt (8.6.11/8.6.11) id BAA08729; Mon, 30 Sep 1996 01:37:40 +0100
							 | 
						||
| 
								 | 
							
								Date: Mon, 30 Sep 1996 01:37:40 +0100
							 | 
						||
| 
								 | 
							
								Message-Id: <199609300037.BAA08729@brutus.neuronio.pt>
							 | 
						||
| 
								 | 
							
								From: Sampo Kellomaki <sampo@neuronio.pt>
							 | 
						||
| 
								 | 
							
								To: ssl-users@mincom.com
							 | 
						||
| 
								 | 
							
								Cc: sampo@brutus.neuronio.pt
							 | 
						||
| 
								 | 
							
								Subject: Signing with envelope routines
							 | 
						||
| 
								 | 
							
								Sender: ssl-lists-owner@mincom.com
							 | 
						||
| 
								 | 
							
								Precedence: bulk
							 | 
						||
| 
								 | 
							
								Status: RO
							 | 
						||
| 
								 | 
							
								X-Status: D
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I have been trying to figure out how to produce signatures with EVP_
							 | 
						||
| 
								 | 
							
								routines. I seem to be able to read in private key and sign some
							 | 
						||
| 
								 | 
							
								data ok, but I can't figure out how I am supposed to read in
							 | 
						||
| 
								 | 
							
								public key so that I could verify my signature. I use self signed
							 | 
						||
| 
								 | 
							
								certificate.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I figured I should use
							 | 
						||
| 
								 | 
							
									EVP_PKEY* pkey = PEM_ASN1_read(d2i_PrivateKey, PEM_STRING_EVP_PKEY,
							 | 
						||
| 
								 | 
							
									                               fp, NULL, NULL);
							 | 
						||
| 
								 | 
							
								to read in private key and this seems to work Ok.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								However when I try analogous
							 | 
						||
| 
								 | 
							
									EVP_PKEY* pkey = PEM_ASN1_read(d2i_PublicKey, PEM_STRING_X509,
							 | 
						||
| 
								 | 
							
									                               fp, NULL, NULL);
							 | 
						||
| 
								 | 
							
								the program fails with
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								error:0D09508D:asn1 encoding routines:D2I_PUBLICKEY:unknown public key type:d2i_pu.c:93
							 | 
						||
| 
								 | 
							
								error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_lib.c:232
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I figured that the second argument to PEM_ASN1_read should match the
							 | 
						||
| 
								 | 
							
								name in my PEM encoded object, hence PEM_STRING_X509.
							 | 
						||
| 
								 | 
							
								PEM_STRING_EVP_PKEY seems to be somehow magical
							 | 
						||
| 
								 | 
							
								because it matches whatever private key there happens to be. I could
							 | 
						||
| 
								 | 
							
								not find a similar constant to use with getting the certificate, however.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Is my approach of using PEM_ASN1_read correct? What should I pass in
							 | 
						||
| 
								 | 
							
								as name?  Can I use normal (or even self signed) X509 certificate for
							 | 
						||
| 
								 | 
							
								verifying the signature?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When will SSLeay documentation be written ;-)? If I would contribute
							 | 
						||
| 
								 | 
							
								comments to the code, would Eric take time to review them and include
							 | 
						||
| 
								 | 
							
								them in distribution?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I'm using SSLeay-0.6.4. My program is included below along with the
							 | 
						||
| 
								 | 
							
								key and cert that I use.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--Sampo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-----------------------------------
							 | 
						||
| 
								 | 
							
								/* sign-it.cpp  -  Simple test app using SSLeay envelopes to sign data
							 | 
						||
| 
								 | 
							
								   29.9.1996, Sampo Kellomaki <sampo@iki.fi> */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include "rsa.h"
							 | 
						||
| 
								 | 
							
								#include "evp.h"
							 | 
						||
| 
								 | 
							
								#include "objects.h"
							 | 
						||
| 
								 | 
							
								#include "x509.h"
							 | 
						||
| 
								 | 
							
								#include "err.h"
							 | 
						||
| 
								 | 
							
								#include "pem.h"
							 | 
						||
| 
								 | 
							
								#include "ssl.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void main ()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  int err;
							 | 
						||
| 
								 | 
							
								  int sig_len;
							 | 
						||
| 
								 | 
							
								  unsigned char sig_buf [4096];
							 | 
						||
| 
								 | 
							
								  const char certfile[] = "plain-cert.pem";
							 | 
						||
| 
								 | 
							
								  const char keyfile[]  = "plain-key.pem";
							 | 
						||
| 
								 | 
							
								  const char data[]     = "I owe you...";
							 | 
						||
| 
								 | 
							
								  EVP_MD_CTX     md_ctx;
							 | 
						||
| 
								 | 
							
								  EVP_PKEY*      pkey;
							 | 
						||
| 
								 | 
							
								  FILE*          fp;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SSL_load_error_strings();
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  /* Read private key */
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  fp = fopen (keyfile, "r");   if (fp == NULL) exit (1);
							 | 
						||
| 
								 | 
							
								  pkey = (EVP_PKEY*)PEM_ASN1_read ((char *(*)())d2i_PrivateKey,
							 | 
						||
| 
								 | 
							
												   PEM_STRING_EVP_PKEY,
							 | 
						||
| 
								 | 
							
												   fp,
							 | 
						||
| 
								 | 
							
												   NULL, NULL);
							 | 
						||
| 
								 | 
							
								  if (pkey == NULL) {  ERR_print_errors_fp (stderr);    exit (1);  }
							 | 
						||
| 
								 | 
							
								  fclose (fp);
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  /* Do the signature */
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  EVP_SignInit   (&md_ctx, EVP_md5());
							 | 
						||
| 
								 | 
							
								  EVP_SignUpdate (&md_ctx, data, strlen(data));
							 | 
						||
| 
								 | 
							
								  sig_len = sizeof(sig_buf);
							 | 
						||
| 
								 | 
							
								  err = EVP_SignFinal (&md_ctx,
							 | 
						||
| 
								 | 
							
										       sig_buf, 
							 | 
						||
| 
								 | 
							
										       &sig_len,
							 | 
						||
| 
								 | 
							
										       pkey);
							 | 
						||
| 
								 | 
							
								  if (err != 1) {  ERR_print_errors_fp (stderr);    exit (1);  }
							 | 
						||
| 
								 | 
							
								  EVP_PKEY_free (pkey);
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  /* Read public key */
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  fp = fopen (certfile, "r");   if (fp == NULL) exit (1);
							 | 
						||
| 
								 | 
							
								  pkey = (EVP_PKEY*)PEM_ASN1_read ((char *(*)())d2i_PublicKey,
							 | 
						||
| 
								 | 
							
												   PEM_STRING_X509,
							 | 
						||
| 
								 | 
							
												   fp,
							 | 
						||
| 
								 | 
							
												   NULL, NULL);
							 | 
						||
| 
								 | 
							
								  if (pkey == NULL) {  ERR_print_errors_fp (stderr);    exit (1);  }
							 | 
						||
| 
								 | 
							
								  fclose (fp);
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  /* Verify the signature */
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  EVP_VerifyInit   (&md_ctx, EVP_md5());
							 | 
						||
| 
								 | 
							
								  EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data));
							 | 
						||
| 
								 | 
							
								  err = EVP_VerifyFinal (&md_ctx,
							 | 
						||
| 
								 | 
							
											 sig_buf,
							 | 
						||
| 
								 | 
							
											 sig_len,
							 | 
						||
| 
								 | 
							
											 pkey);
							 | 
						||
| 
								 | 
							
								  if (err != 1) {  ERR_print_errors_fp (stderr);    exit (1);  }
							 | 
						||
| 
								 | 
							
								  EVP_PKEY_free (pkey);
							 | 
						||
| 
								 | 
							
								  printf ("Signature Verified Ok.\n");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/* EOF */
							 | 
						||
| 
								 | 
							
								--------------- plain-cert.pem -----------------
							 | 
						||
| 
								 | 
							
								-----BEGIN CERTIFICATE-----
							 | 
						||
| 
								 | 
							
								MIICLDCCAdYCAQAwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlBUMRMwEQYD
							 | 
						||
| 
								 | 
							
								VQQIEwpRdWVlbnNsYW5kMQ8wDQYDVQQHEwZMaXNib2ExFzAVBgNVBAoTDk5ldXJv
							 | 
						||
| 
								 | 
							
								bmlvLCBMZGEuMRgwFgYDVQQLEw9EZXNlbnZvbHZpbWVudG8xGzAZBgNVBAMTEmJy
							 | 
						||
| 
								 | 
							
								dXR1cy5uZXVyb25pby5wdDEbMBkGCSqGSIb3DQEJARYMc2FtcG9AaWtpLmZpMB4X
							 | 
						||
| 
								 | 
							
								DTk2MDkwNTAzNDI0M1oXDTk2MTAwNTAzNDI0M1owgaAxCzAJBgNVBAYTAlBUMRMw
							 | 
						||
| 
								 | 
							
								EQYDVQQIEwpRdWVlbnNsYW5kMQ8wDQYDVQQHEwZMaXNib2ExFzAVBgNVBAoTDk5l
							 | 
						||
| 
								 | 
							
								dXJvbmlvLCBMZGEuMRgwFgYDVQQLEw9EZXNlbnZvbHZpbWVudG8xGzAZBgNVBAMT
							 | 
						||
| 
								 | 
							
								EmJydXR1cy5uZXVyb25pby5wdDEbMBkGCSqGSIb3DQEJARYMc2FtcG9AaWtpLmZp
							 | 
						||
| 
								 | 
							
								MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL7+aty3S1iBA/+yxjxv4q1MUTd1kjNw
							 | 
						||
| 
								 | 
							
								L4lYKbpzzlmC5beaQXeQ2RmGMTXU+mDvuqItjVHOK3DvPK7lTcSGftUCAwEAATAN
							 | 
						||
| 
								 | 
							
								BgkqhkiG9w0BAQQFAANBAFqPEKFjk6T6CKTHvaQeEAsX0/8YHPHqH/9AnhSjrwuX
							 | 
						||
| 
								 | 
							
								9EBc0n6bVGhN7XaXd6sJ7dym9sbsWxb+pJdurnkxjx4=
							 | 
						||
| 
								 | 
							
								-----END CERTIFICATE-----
							 | 
						||
| 
								 | 
							
								---------------- plain-key.pem -----------------
							 | 
						||
| 
								 | 
							
								-----BEGIN RSA PRIVATE KEY-----
							 | 
						||
| 
								 | 
							
								MIIBPAIBAAJBAL7+aty3S1iBA/+yxjxv4q1MUTd1kjNwL4lYKbpzzlmC5beaQXeQ
							 | 
						||
| 
								 | 
							
								2RmGMTXU+mDvuqItjVHOK3DvPK7lTcSGftUCAwEAAQJBALjkK+jc2+iihI98riEF
							 | 
						||
| 
								 | 
							
								oudmkNziSRTYjnwjx8mCoAjPWviB3c742eO3FG4/soi1jD9A5alihEOXfUzloenr
							 | 
						||
| 
								 | 
							
								8IECIQD3B5+0l+68BA/6d76iUNqAAV8djGTzvxnCxycnxPQydQIhAMXt4trUI3nc
							 | 
						||
| 
								 | 
							
								a+U8YL2HPFA3gmhBsSICbq2OptOCnM7hAiEA6Xi3JIQECob8YwkRj29DU3/4WYD7
							 | 
						||
| 
								 | 
							
								WLPgsQpwo1GuSpECICGsnWH5oaeD9t9jbFoSfhJvv0IZmxdcLpRcpslpeWBBAiEA
							 | 
						||
| 
								 | 
							
								6/5B8J0GHdJq89FHwEG/H2eVVUYu5y/aD6sgcm+0Avg=
							 | 
						||
| 
								 | 
							
								-----END RSA PRIVATE KEY-----
							 | 
						||
| 
								 | 
							
								------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 |