155714SkrisFrom ssl-lists-owner@mincom.com Mon Sep 30 02:37:40 1996
255714SkrisReceived: from cygnus.mincom.oz.au by orb.mincom.oz.au with SMTP id AA11782
355714Skris  (5.65c/IDA-1.4.4 for eay); Mon, 30 Sep 1996 11:46:21 +1000
455714SkrisReceived: (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)
555714SkrisReceived: 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)
655714SkrisReceived: by minbne.mincom.oz.au id AA22230
755714Skris  (5.65c/IDA-1.4.4 for ssl-users@listserv.mincom.oz.au); Mon, 30 Sep 1996 11:38:41 +1000
855714SkrisReceived: 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
955714SkrisReceived: (from sampo@localhost) by brutus.neuronio.pt (8.6.11/8.6.11) id BAA08729; Mon, 30 Sep 1996 01:37:40 +0100
1055714SkrisDate: Mon, 30 Sep 1996 01:37:40 +0100
1155714SkrisMessage-Id: <199609300037.BAA08729@brutus.neuronio.pt>
1255714SkrisFrom: Sampo Kellomaki <sampo@neuronio.pt>
1355714SkrisTo: ssl-users@mincom.com
1455714SkrisCc: sampo@brutus.neuronio.pt
1555714SkrisSubject: Signing with envelope routines
1655714SkrisSender: ssl-lists-owner@mincom.com
1755714SkrisPrecedence: bulk
1855714SkrisStatus: RO
1955714SkrisX-Status: D
2055714Skris
2155714Skris
2255714SkrisI have been trying to figure out how to produce signatures with EVP_
2355714Skrisroutines. I seem to be able to read in private key and sign some
2455714Skrisdata ok, but I can't figure out how I am supposed to read in
2555714Skrispublic key so that I could verify my signature. I use self signed
2655714Skriscertificate.
2755714Skris
2855714SkrisI figured I should use
2955714Skris	EVP_PKEY* pkey = PEM_ASN1_read(d2i_PrivateKey, PEM_STRING_EVP_PKEY,
3055714Skris	                               fp, NULL, NULL);
3155714Skristo read in private key and this seems to work Ok.
3255714Skris
3355714SkrisHowever when I try analogous
3455714Skris	EVP_PKEY* pkey = PEM_ASN1_read(d2i_PublicKey, PEM_STRING_X509,
3555714Skris	                               fp, NULL, NULL);
3655714Skristhe program fails with
3755714Skris
3855714Skriserror:0D09508D:asn1 encoding routines:D2I_PUBLICKEY:unknown public key type:d2i_pu.c:93
3955714Skriserror:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_lib.c:232
4055714Skris
4155714SkrisI figured that the second argument to PEM_ASN1_read should match the
4255714Skrisname in my PEM encoded object, hence PEM_STRING_X509.
4355714SkrisPEM_STRING_EVP_PKEY seems to be somehow magical
4455714Skrisbecause it matches whatever private key there happens to be. I could
4555714Skrisnot find a similar constant to use with getting the certificate, however.
4655714Skris
4755714SkrisIs my approach of using PEM_ASN1_read correct? What should I pass in
4855714Skrisas name?  Can I use normal (or even self signed) X509 certificate for
4955714Skrisverifying the signature?
5055714Skris
5155714SkrisWhen will SSLeay documentation be written ;-)? If I would contribute
5255714Skriscomments to the code, would Eric take time to review them and include
5355714Skristhem in distribution?
5455714Skris
5555714SkrisI'm using SSLeay-0.6.4. My program is included below along with the
5655714Skriskey and cert that I use.
5755714Skris
5855714Skris--Sampo
5955714Skris
6055714Skris-----------------------------------
6155714Skris/* sign-it.cpp  -  Simple test app using SSLeay envelopes to sign data
6255714Skris   29.9.1996, Sampo Kellomaki <sampo@iki.fi> */
6355714Skris
6455714Skris#include <stdio.h>
6555714Skris#include "rsa.h"
6655714Skris#include "evp.h"
6755714Skris#include "objects.h"
6855714Skris#include "x509.h"
6955714Skris#include "err.h"
7055714Skris#include "pem.h"
7155714Skris#include "ssl.h"
7255714Skris
7355714Skrisvoid main ()
7455714Skris{
7555714Skris  int err;
7655714Skris  int sig_len;
7755714Skris  unsigned char sig_buf [4096];
7855714Skris  const char certfile[] = "plain-cert.pem";
7955714Skris  const char keyfile[]  = "plain-key.pem";
8055714Skris  const char data[]     = "I owe you...";
8155714Skris  EVP_MD_CTX     md_ctx;
8255714Skris  EVP_PKEY*      pkey;
8355714Skris  FILE*          fp;
8455714Skris
8555714Skris  SSL_load_error_strings();
8655714Skris  
8755714Skris  /* Read private key */
8855714Skris  
8955714Skris  fp = fopen (keyfile, "r");   if (fp == NULL) exit (1);
9055714Skris  pkey = (EVP_PKEY*)PEM_ASN1_read ((char *(*)())d2i_PrivateKey,
9155714Skris				   PEM_STRING_EVP_PKEY,
9255714Skris				   fp,
9355714Skris				   NULL, NULL);
9455714Skris  if (pkey == NULL) {  ERR_print_errors_fp (stderr);    exit (1);  }
9555714Skris  fclose (fp);
9655714Skris  
9755714Skris  /* Do the signature */
9855714Skris  
9955714Skris  EVP_SignInit   (&md_ctx, EVP_md5());
10055714Skris  EVP_SignUpdate (&md_ctx, data, strlen(data));
10155714Skris  sig_len = sizeof(sig_buf);
10255714Skris  err = EVP_SignFinal (&md_ctx,
10355714Skris		       sig_buf, 
10455714Skris		       &sig_len,
10555714Skris		       pkey);
10655714Skris  if (err != 1) {  ERR_print_errors_fp (stderr);    exit (1);  }
10755714Skris  EVP_PKEY_free (pkey);
10855714Skris  
10955714Skris  /* Read public key */
11055714Skris  
11155714Skris  fp = fopen (certfile, "r");   if (fp == NULL) exit (1);
11255714Skris  pkey = (EVP_PKEY*)PEM_ASN1_read ((char *(*)())d2i_PublicKey,
11355714Skris				   PEM_STRING_X509,
11455714Skris				   fp,
11555714Skris				   NULL, NULL);
11655714Skris  if (pkey == NULL) {  ERR_print_errors_fp (stderr);    exit (1);  }
11755714Skris  fclose (fp);
11855714Skris  
11955714Skris  /* Verify the signature */
12055714Skris  
12155714Skris  EVP_VerifyInit   (&md_ctx, EVP_md5());
12255714Skris  EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data));
12355714Skris  err = EVP_VerifyFinal (&md_ctx,
12455714Skris			 sig_buf,
12555714Skris			 sig_len,
12655714Skris			 pkey);
12755714Skris  if (err != 1) {  ERR_print_errors_fp (stderr);    exit (1);  }
12855714Skris  EVP_PKEY_free (pkey);
12955714Skris  printf ("Signature Verified Ok.\n");
13055714Skris}
13155714Skris/* EOF */
13255714Skris--------------- plain-cert.pem -----------------
13355714Skris-----BEGIN CERTIFICATE-----
13455714SkrisMIICLDCCAdYCAQAwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlBUMRMwEQYD
13555714SkrisVQQIEwpRdWVlbnNsYW5kMQ8wDQYDVQQHEwZMaXNib2ExFzAVBgNVBAoTDk5ldXJv
13655714SkrisbmlvLCBMZGEuMRgwFgYDVQQLEw9EZXNlbnZvbHZpbWVudG8xGzAZBgNVBAMTEmJy
13755714SkrisdXR1cy5uZXVyb25pby5wdDEbMBkGCSqGSIb3DQEJARYMc2FtcG9AaWtpLmZpMB4X
13855714SkrisDTk2MDkwNTAzNDI0M1oXDTk2MTAwNTAzNDI0M1owgaAxCzAJBgNVBAYTAlBUMRMw
13955714SkrisEQYDVQQIEwpRdWVlbnNsYW5kMQ8wDQYDVQQHEwZMaXNib2ExFzAVBgNVBAoTDk5l
14055714SkrisdXJvbmlvLCBMZGEuMRgwFgYDVQQLEw9EZXNlbnZvbHZpbWVudG8xGzAZBgNVBAMT
14155714SkrisEmJydXR1cy5uZXVyb25pby5wdDEbMBkGCSqGSIb3DQEJARYMc2FtcG9AaWtpLmZp
14255714SkrisMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL7+aty3S1iBA/+yxjxv4q1MUTd1kjNw
14355714SkrisL4lYKbpzzlmC5beaQXeQ2RmGMTXU+mDvuqItjVHOK3DvPK7lTcSGftUCAwEAATAN
14455714SkrisBgkqhkiG9w0BAQQFAANBAFqPEKFjk6T6CKTHvaQeEAsX0/8YHPHqH/9AnhSjrwuX
14555714Skris9EBc0n6bVGhN7XaXd6sJ7dym9sbsWxb+pJdurnkxjx4=
14655714Skris-----END CERTIFICATE-----
14755714Skris---------------- plain-key.pem -----------------
14855714Skris-----BEGIN RSA PRIVATE KEY-----
14955714SkrisMIIBPAIBAAJBAL7+aty3S1iBA/+yxjxv4q1MUTd1kjNwL4lYKbpzzlmC5beaQXeQ
15055714Skris2RmGMTXU+mDvuqItjVHOK3DvPK7lTcSGftUCAwEAAQJBALjkK+jc2+iihI98riEF
15155714SkrisoudmkNziSRTYjnwjx8mCoAjPWviB3c742eO3FG4/soi1jD9A5alihEOXfUzloenr
15255714Skris8IECIQD3B5+0l+68BA/6d76iUNqAAV8djGTzvxnCxycnxPQydQIhAMXt4trUI3nc
15355714Skrisa+U8YL2HPFA3gmhBsSICbq2OptOCnM7hAiEA6Xi3JIQECob8YwkRj29DU3/4WYD7
15455714SkrisWLPgsQpwo1GuSpECICGsnWH5oaeD9t9jbFoSfhJvv0IZmxdcLpRcpslpeWBBAiEA
15555714Skris6/5B8J0GHdJq89FHwEG/H2eVVUYu5y/aD6sgcm+0Avg=
15655714Skris-----END RSA PRIVATE KEY-----
15755714Skris------------------------------------------------
15855714Skris
159