System SSL also known as GS kit provides an API for doing
- TLS handshakes
- Keyring manipulation
- Encryption and signing of data
This blog post covers how to access a keyring and use the information in it. I wrote it because I could not find useful samples to get me started.
Introduction
It took me some time to understand how System SSL has been written. Now I understand it, I think it is a good API. They can be more than one way of doing something, so working out what you want to to can be hard.
- First steps in using system ssl gives some introductions to gskit.
- Compiling a gsk program
- Example of using system ssl to print certificate information.
- Example of using system ssl to sign some data.
List the certificates in a keyring
// #include <gskssl.h> // only used for TLS and SSL <gskcms.h> <stdio.h> <stdlib.h> <string.h> <errno.h> <printhex.h>int main(int argc, char * argv[]) { int rc; gsk_status gskrc; gsk_handle hRing ; int count = 0;// the number of certs is put here char * ring = "START1/TN3270"; printf("Open keyring %s\n",ring); gskrc= gsk_open_keyring (ring, &hRing, &count ); if (gskrc != 0) { printf("gsk_open_keyring %s\n", gsk_strerror(gskrc)); return 8; } printf("Number of certs in the ring %i\n",count); // // Get the default label (if it exists) // char * default_label; gskrc = gsk_get_default_label(hRing,&default_label); if (gskrc != 0) { else printf("gsk_get_default_label error %s\n",gsk_strerror(gskrc)); return 8; } printf("gsk_get_default_label %s\n",default_label); // // now get the record with this label (or by number) // gskdb_record * pRecord = 0; gskrc = gsk_get_record_by_label(hRing,default_label,&pRecord); //gskrc = gsk_get_record_by_id(hRing,4,&pRecord); // by number if (gskrc != 0) { printf("gsk_get_record_by_label worked %s\n",gsk_strerror(gskrc)); return 8; } // The value is a half work enum printf("Record Type %hi\n",pRecord ->recordType); <readLabels.h> <listall.> gskrc = gsk_close_database(&hRing); return 0 ;}
ReadLabels
With gsk_get_record_labels you can request those with private keys (1) or those without private keys(0)
If you want all certificates on the ring use without private_keys(0).
gskrc = gsk_get_default_label ( hRing,&default_label);if (gskrc == 0) printf("gsk_get_default_label %s\n",default_label);else printf("gsk_get_default_label error %s\n",gsk_strerror(gskrc));char ** pl = 0;int countL = 0;int whichRecords = 0;printf("/nGet records with no private key (%i)\n",whichRecords);gskrc = gsk_get_record_labels (hRing, whichRecords, // those with public keys only // 1 for this with private key &countL, // How many returned &pl); // char *** labelsif ( gskrc != 0){ printf("gsk_get_record_labels%s\n",gsk_strerror(gskrc)); return 8} for (int j = 0; j<countL ;j++) { printf("Label %i,%s\n",j,*pl); pl++; } printf("============\n");
It took me some time to get the list of labels printed out. The value is a char ***;
- If you had char * p; p is a pointer to a string so is a char *.
- char * q[10]; pl = &q[0]
- pl is a pointer to the elements in the array. pl is addr(a char * ) so char **;
- the address of pl is passed to the function, so it is addr( a char **) so is a char ***
- In the loop we get what pl points to (*pl). This is a pointer to a string. so we have printf(“…”,*pl);
Listall
printf("Number of records %i\n",count);for (int j = 1 ; j<count+1 ;j++) // starts at 1 { gskrc = gsk_get_record_by_index(hRing,j,&pRecord); printf("Record %i:n",j); printRecord(pRecord); } printf("============\n");
printRecord
void printRecord( gskdb_record * pRecord){ printf("Record Type %hi\n",pRecord ->recordType); printf("Record Flags %2.2x\n",pRecord ->recordFlags); printf("Record ID %i\n",pRecord ->recordId); printf("Record Issuer ID %i\n",pRecord ->issuerRecordId ); printf("Record Label %s\n",pRecord ->recordLabel); printf("============\n");}
Output
The program printed out
Open keyring START1/TN3270
Number of certs in the ring 9
gsk_get_default_label NISTEC256
gsk_get_record_by_label worked
precrd 2 20a2e6e0
Sizeof gskdb_record_type 2
gsk_get_default_label NISTEC256
Get records with no private key (0)
Label 0,DOCZOSCA
Label 1,JUN24CA
Label 2,DocZosCADSA
Label 3,CA256
============
Number of records 9
Record 1:
Record Type 2
Record Flags 80
Record ID 1
Record Issuer ID 1
Record Label DOCZOSCA
...
Record 9:
Record Type 3
Record Flags c0
Record ID 9
Record Issuer ID 1
Record Label NISTEC256
============
- The value of Record 1 type gskdb_rectype_certificate = 2, /* Certificate */
- Flags is
- GSKDB_RECFLAG_TRUSTED = The certificate is trusted ( 0x80);
- GSKDB_RECFLAG_DEFAULT = This is the default key
- ID 1 – record 1
- Issuer ID 1 – it is self signed
- Label DOCZOSCA
Record 9:
Record Type 3
Record Flags c0
Record ID 9
Record Issuer ID 1
Record Label NISTEC256
- The record type is 3 gskdb_rectype_certKey = 3, /* Certificate with key */
- Flags is
- GSKDB_RECFLAG_TRUSTED = The certificate is trusted.
- GSKDB_RECFLAG_DEFAULT = This is the default key
- ID 9 – it is record 9 in the keyring
- Issuer ID 1- it was signed by the certificate with position 1 (DOCZOSCA)
- Its label is NISTEC256
One thought on “Example of system ssl to display keyring information”