Zum Hauptinhalt springen

MemSign

obj -> MemSign(int1, alpha2, var alpha3[, int4[, int5]]) : int

Ausführbar von Clients mit grafischer Oberfläche Ausführbar vom Server Ausführbar von Clients mit Programmierschnittstelle Ausführbar von der Web-Schnittstelle Ausführbar vom Druckprozessor Ausführbar von der ODBC-Schnittstelle Ausführbar vom SOA-Service

Signatur erstellen

Details

Dieser Befehl signiert eine Nachricht nach dem in (int1) angegebenen Verfahren. Die Signatur wird aus dem Inhalt des übergebenen Memory -Objektes (obj), dem Verfahren (int1) und dem privaten Schlüssel (alpha2) gebildet. Im Parameter (int1) wird ebenfalls der zu verwendete Hash-Algorithmus, die Codierung des privaten Schlüssels und die Codierung der Signatur angegeben.

Folgende Optionen (int1) sind möglich:

Der Paramter (int1) setzt sich aus der Kombination je einer Konstanten der Bereiche zusammen.

Die ermittelte Signatur wird in (alpha3) zurückgegeben.

Der private Schlüssel (alpha2) muss im PKCS #1- (RSA oder DSA) oder im PKCS #8-Format (RSA oder DSA) vorliegen. Die Begin- und Endmarkierung dürfen nicht enthalten sein.

Ein RSA-Schlüsselpaar mit 2048 Bit Länge kann beispielsweise wie folgt angelegt werden:

tMemPrivate->MemGenKeyPair(tMemPublic, 2048);

Alternativ ist dies mit OpenSSL wie folgt möglich:

openssl genrsa -out rsa_priv_key.pem 2048
openssl rsa -in rsa_priv_key.pem -pubout -out rsa_pub_key.pem

Mit der folgenden Funktion kann der Schlüssel eingelesen werden:

sub ReadKey
(
aKeyFile : alpha(250);
var aKey : alpha;
opt aPublic : logic;
)
: int;

local
{
tFsi : handle;
tResult : int;
tLine : alpha(4096);
tBeginOfKey : logic;
tEndOfKey : logic;
tSigBegKey : alpha;
tSigEndKey : alpha;
}

{
aKey # '';

if (aPublic)
{
tSigBegKey # '-----BEGIN PUBLIC KEY-----';
tSigEndKey # '-----END PUBLIC KEY-----';
}
else
{
tSigBegKey # '-----BEGIN RSA PRIVATE KEY-----';
tSigEndKey # '-----END RSA PRIVATE KEY-----';
}

tFsi # FsiOpen(aKeyFile, _FsiStdRead);

if (tFsi > 0)
{
tFsi->FsiMark(0x0a);

tResult # tFsi->FsiRead(tLine);
tBeginOfKey # false;
tEndOfKey # false;

while (tResult > 0 and !tEndOfKey)
{
if (!tBeginOfKey)
{
if (tLine = tSigBegKey)
tBeginOfKey # true;
}
else
{
if (tLine = tSigEndKey)
tEndOfKey # true;
else
aKey # aKey + tLine;
}

tResult # tFsi->FsiRead(tLine);
}

if (tBeginOfKey and tEndOfKey)
tResult # _ErrOk;
else
tResult # _ErrData;

tFsi->FsiClose();
}
else
tResult # tFsi;

return(tResult);
}

Optional kann mit den Argumenten (int4) die Position und (int5) die Länge der zu verwendenden Nachricht angegeben werden.

Mögliche Laufzeitfehler:

  • _ErrHdlInvalid: Der übergeben Deskriptor (obj) ist ungültig.
  • _ErrMemExhausted: Nicht genug Speicher für kodierte Signatur (vor der Rückgabe) vorhanden.
  • _ErrStringOverflow: Der Schlüssel (alpha2) ist länger als 8192 Zeichen oder die in (alpha3) übergebene Variable ist nicht lang genug zum Speichern der Signatur.
  • _ErrValueInvalid: In den Optionen (int1) wurde eine ungültige oder unvollständige Kombination angegeben.
  • _ErrValueRange: Die angegeben Startposition (int4) oder die Länge des Bereiches (int5) ist zu groß.