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-----
|
||
|
------------------------------------------------
|
||
|
|