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