Public-Key Cryptography Standards #1

La norme Public-Key Cryptography Standards #1 (PKCS#1) présente les algorithmes de cryptage, décryptage, signature et de vérification d'une signature d'un message à partir d'une clé privée ou publique concervé dans un certificat X.509 de base.

Pour plus de précisions sur les conventions concernant la paire de clés privée et publique ((D, N), (E, N)), merci de se référer à la fiche Public-Key Infrastructure (PKI).

Algorithmes utilisés par Up ! Security Manager

Contexte

Les algorithmes utilisent un contexte composé de la constante et du type global suivant :

Constante
/*******/


Type ClePki Defaut
/****************/
Fin Type

Génération d'une paire de clés privée et publique

/******************************************************************/
Fonction GenererClePkiRsa(VersionCle : Entier, NbBits : Entier, MessageErreur : Caractere Sortie) Retourner Nul Ou ClePki
/* Objet : Genere une cle de Pki pour Rsa. */
/******************************************************************/
Variable
/******/

Debut
Cle=ClePki();
Cle.VersionCle=VersionCle;
Cle.NbBits=NbBits;
Cle.Forme=1;
/* Calcul des tailles de P et Q. */
TailleP=(NbBits/2)-(CO_DifferencePQ/2);
TailleQ=NbBits-TailleP;
/* Tire aleatoirement P et Q. */
TantQue Vrai Faire Fin TantQue
Cle.N=P*Q;
TantQue Vrai Faire Fin TantQue
Retourner Cle;
Fin Fonction

Cryptage RSAEP

Pour ce cryptage de base, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Procedure CrypterRsaEp(Cle : Nul Ou ClePki, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Crypte un binaire en Rsa - RSAEP. */
/****************************************************************/
Variable
/******/


Debut
/* Equivalent de OS2IP. */
M=Decimal(BufferEntree);
/* Calcul de C=M^E % N. */
C=ExponentiationModulaire(M,Cle.E,Cle.N);
/* Equivalent de I2OSP. */
BufferSortie=C.VersBinaire();
Fin Procedure

Cryptage RSADP

Pour ce décryptage de base, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Procedure DecrypterRsaDp(Cle : Nul Ou ClePki, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Decrypte un binaire en Rsa - RSADP. */
/****************************************************************/
Variable
/******/


Debut
/* Equivalent de OS2IP. */
C=Decimal(BufferEntree);
Selon Cle.Forme Faire Fin Selon
/* Equivalent de I2OSP. */
BufferSortie=M.VersBinaire();
Fin Procedure

Signature RSASP1

Pour cette signature de base, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Procedure SignerRsaSp1(Cle : Nul Ou ClePki, BufferEntree : Binaire, BufferSignature : Binaire Sortie)
/* Objet : Signe un binaire en Rsa - RSSP1. */
/****************************************************************/
Debut
DecrypterRsaDp(Cle,BufferEntree,BufferSignature);
Fin Procedure

Vérification de la signature RSAVP1

Pour cette vérification de signature de base, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Fonction VerifierSignatureRsaVp1(Cle : Nul Ou ClePki, BufferEntree : Binaire, BufferSignature : Binaire) Retourner Booleen
/* Objet : Verifie la signature d'un binaire en Rsa - RSVP1. */
/****************************************************************/
Variable
/******/


Debut
CrypterRsaEp(Cle,BufferEntree,BufferSignature2);
Retourner BufferSignature==BufferSignature2;
Fin Fonction

Génération d'un masque MGF1

/****************************************************************/
Procedure GenererMasqueMgf1(Graine : Binaire, SousJacent : ModeSignatureFlux, Masque : Binaire Sortie)
/* Objet : Genere un masque en Rsa - MGF1. */
/****************************************************************/
Variable
/******/

Debut
/* Calcul de la taille de la signature. */
TailleSignature=CalculerTailleSignature(SousJacent);
/* Ouverture du flux concatene Graine||C. */
TF[0]=IFlux(FluxBinaire(Graine,Vrai));
C=Binaire(0x00,4);
TF[1]=IFlux(FluxBinaire(C,Vrai));
F=FluxConcatene(TF);
/* Calcul de la taille du masque. */
Si TailleMasque%TailleSignature Alors Sinon Masque=Binaire();
Pour I=0 JusquA IMax-1 Faire Fin Pour
Fin Procedure

Cryptage RSAES-OAEP

Pour ce cryptage Optimal Asymmetric Encryption Padding (OAEP), la taille du message est limitée à NbBits/8-2*(TailleSignature+1)TailleSignature est la taille de la signature de l'algorithme sous-jacent.

/****************************************************************/
Procedure CrypterRsaOaep(Cle : Nul Ou ClePki, L : Binaire, SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Crypte un binaire en Rsa - RSAES-OAEP-ENCRYPT. */
/****************************************************************/
Variable
/******/


Debut
K=Cle.NbBits/8;
/* Calcule la signature H(L). */
Signer(SousJacent,L,DB);
TailleSignature=DB.Longueur();
/* Calcule DB=H(L)||PS||0x1||M. */
TaillePS=K-BufferEntree.Longueur()-2*(TailleDB+1);
DB+=Binaire(0x00,TaillePS)+Binaire(0x01,1)+BufferEntree;
TailleDB=DB.Longueur(); /* Genere le contenu Graine de taille TailleSignature. */
Graine=Binaire(0x00,TailleSignature);
Pour I=0 JusquA TailleSignature-1 Faire Fin Pour
/* Genere le masque DBMasque. */
TailleDBMasque=K-TailleSignature-1;
GenererMasqueMgf1(Graine,SousJacent,DBMasque);
/* Calcul de DB^=DBMasque. */
Pour I=0 JusquA TailleDBMasque-1 Faire Fin Pour
/* Genere le masque GraineMasque. */
GenererMasqueMgf1(DB,SousJacent,GraineMasque);
/* Calcul de Graine^=GraineMasque. */
Pour I=0 JusquA TailleSignature-1 Faire Fin Pour
/* Calcul de EM=0x00||Graine^GraineMasque||DB^DBMasque. */
EM=Binaire(0x00,1)+Graine+DB;
/* Calcul C=RSAEP(Cle,EM). */
CrypterRsa(Cle,EM,BufferSortie);
Fin Procedure

Decryptage RSAES-OAEP

Pour ce décryptage Optimal Asymmetric Encryption Padding (OAEP), la taille du message est limitée à NbBits/8-2*(TailleSignature+1)TailleSignature est la taille de la signature de l'algorithme sous-jacent.

/****************************************************************/
Procedure DecrypterRsaOaep(Cle : Nul Ou ClePki, L : Binaire, SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Decrypte un binaire en Rsa - RSAES-OAEP-DECRYPT. */
/****************************************************************/
Variable
/******/


Debut
K=Cle.NbBits/8;
/* Calcule la signature H(L). */
Signer(SousJacent,L,DB);
TailleSignature=DB.Longueur();
/* Calcul EM=RSADP(Cle,C). */
DecrypterRsa(Cle,BufferEntree,EM);
/* Separation de EM=0x00||Graine^GraineMasque||DB^DBMasque. */ TailleDBMasque=K-TailleSignature-1;
Graine=EM.Milieu(1,TailleSignature);
DB=EM.Milieu(1+TailleSignature,TailleDBMasque);
/* Genere le masque GraineMasque. */ GenererMasqueMgf1(DB,SousJacent,GraineMasque);
/* Calcul de Graine^=GraineMasque. */
Pour I=0 JusquA TailleSignature-1 Faire Fin Pour
/* Genere le masque DBMasque. */
TailleBufferDBMasque=K-TailleSignature-1;
GenererMasqueMgf1(Graine,SousJacent,DBMasque);
/* Calcul de DB^=DBMasque. */
Pour I=0 JusquA TailleDBMasque-1 Faire Fin Pour
/* Separation de DB=H(L)||PS||0x1||M. */
Pour TailleDB=TailleSignature JusquA TailleDBMasque-1 Faire Fin Pour
TailleDB++;
TailleM=TailleDBMasque-TailleDB);
BufferSortie=BufferDB.Milieu(TailleDB,TailleM);
Fin Procedure

Cryptage RSAES-PKCS1-v1_5

Pour ce cryptage, la taille du message est limitée à NbBits/8-11.

/****************************************************************/
Procedure CrypterRsaPkcs1V1_5(Cle : Nul Ou ClePki, L : Binaire, SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Crypte un binaire en Rsa - RSAES-PKCS1-v1_5-ENCRYPT. */
/****************************************************************/
Variable
/******/


Debut
K=Cle.NbBits/8;
/* Calcul de EM=0x00||0x02||PS||0x00||Message. */
TaillePS=K-BufferEntree.Longueur()-3;
EM=Binaire(0x00,1)+Binaire(0x02,1)+Binaire(0x00,TaillePS);
Pour I=0 JusquA TaillePS-1 Faire Fin Pour
EM+=Binaire(0x00,1)+BufferEntree;
/* Calcul C=RSAEP(Cle,EM). */
CrypterRsa(Cle,EM,BufferSortie); Fin Procedure

Décryptage RSAES-PKCS1-v1_5

Pour ce décryptage, la taille du message est limitée à NbBits/8-11.

/****************************************************************/
Procedure DecrypterRsaPkcs1V1_5(Cle : Nul Ou ClePki, L : Binaire, SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Decrypte un binaire en Rsa - RSAES-PKCS1-v1_5-ENCRYPT. */
/****************************************************************/
Variable
/******/


Debut
K=Cle.NbBits/8;
/* Calcul EM=RSADP(Cle,C). */
DecrypterRsa(Cle,BufferEntree,EM);
/* Separation de EM=0x00||0x02||PS||0x00||Message. */
Pour TaillePS=0 JusquA EM.LOngueur()-1 Faire Fin Pour
TailleM=TailleEM-(TaillePS+2);
BufferSortie=EM.Milieu(2+TaillePS+1,TailleM);
Fin Procedure

Signature EMSA-PSS

Pour cette signature, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Procedure SignerRsaEmsaPss(SousJacent : ModeSignatureFlux, TailleSalt : Entier, NbBits : Entier, BufferEntree : Binaire, TailleSignature : Entier, BufferSignature : Binaire Sortie)
/* Objet : Signe un binaire en Rsa - EMSA-PSS-ENCODE. */
/****************************************************************/
Variable
/******/


Debut
/* Calcule la signature de M. */
Signer(SousJacent,BufferEntree,Signature);
/* Calcule 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00||H(M)||Salt. */
Salt=Binaire(0x00,8);
Pour I=0 JusquA TailleSalt-1 Faire Fin Pour
M2=Binaire(0x00,8)+Signature+Salt;
/* Calcule la signature de M2. */
Signer(SousJacent,M2,Signature);
/* Calcule DB=PS||0x01||Salt. */
TaillePS=TailleSignature-TailleSalt-Signature.Longueur()-2;
DB=Binaire(0x00,TaillePS)+Binaire(0x01,1)+Salt;
/* Calcule MasqueDB=MGF(H,TailleBufferDB). */
GenererMasqueMgf1(Signature,SousJacent,MasqueDB);
/* Calcule DB^=MasqueDB. */
Pour I=0 JusquA DB.Longueur()-1 Faire Fin Pour
/* Blanchit les premiers bits. */
NbBits2=8*TailleSignature-NbBits;
I=NbBits2/8;
J=NbBits2%8;
Pour K=0 JusquA I-1 Faire Fin Pour
Selon J Faire Fin Selon
/* Calcule EM=MasqueDB||H||0xBC. */
BufferSignature=DB+Signature+Binaire(0xBC,1);
Fin Procedure

Vérification de la signature EMSA-PSS

Pour cette vérification de signature, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Fonction VerifierSignatureRsaEmsaPss(SousJacent : ModeSignatureFlux, TailleSalt : Entier, NbBits : Entier, BufferEntree : Binaire, BufferSignature : Binaire) Retourner Booleen
/* Objet : Verifie la signature d'un binaire en Rsa - EMSA-PSS-VERIFY. */
/****************************************************************/
Variable
/******/


Debut
TailleSignature=BufferSignature.Longueur();
/* Calcule la signature de M. */
Signer(SousJacent,BufferEntree,Signature);
/* Separation de EM=MasqueDB||H||0xBC. */
TailleSignature2=Signature.Longueur();
TailleDB=BufferSignature.Longueur()-TailleSignature2-1;
DB=BufferSignature.Gauche(TailleDB);
Signature=BufferSignature.Milieu(TailleSignature2,TailleDB,TailleSignature2);
/* Calcule MasqueDB=MGF(H,TailleBufferDB). */
GenererMasqueMgf1(Signature,SousJacent,MasqueDB);
/* Calcule DB^=MasqueDB. */
Pour I=0 JusquA TailleDB-1 Faire Fin Pour
/* Blanchit les premiers bits. */
I=NbBits/8;
J=NbBits%8;
Pour K=0 JusquA I-1 Faire Fin Pour
Selon J Faire Fin Selon
/* Calcule M2=0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00||H(M)||Salt. */
M2=Binaire(0x00,8)+BufferSignature+DB.Droite(TailleSalt);
/* Calcule la signature de M2. */
Signer(SousJacent,M2,Signature2);
/* Verifie que H(M)==H(M2). */
Retourner Signature==Signature2;
Fin Fonction

Signature EMSA-PKCS1-V1_5-ENCODE

Pour cette signature, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Procedure SignerRsaEmsaPkcs1V1_5(SousJacent : ModeSignatureFlux, BufferEntree : Binaire, TailleSignature : Entier, BufferSignature : Binaire Sortie)
/* Objet : Signe un binaire en Rsa - EMSA-PKCS1-V1_5-ENCODE. */
/****************************************************************/
Variable
/******/


Debut
/* Calcule la signature de M. */
CalculerSignature(BufferEntree,SousJacent,Signature);
TailleSignature=Signature.Longueur();
Selon SousJacent Faire Fin Selon
/* Calcule EM=0x00 0x01||PS||0x00||T. */
BufferSignature=Binaire(0x00,1)+Binaire(0x01,1)+Binaire(0xFF,TailleSignature-T.Longueur()-1)+T;
Fin Procedure

Vérification de la signature RSASSA-PSS

Pour cette vérification de signature, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Fonction VerifierSignatureRsaEmsaPkcs1V1_5(SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSignature : Binaire) Retourner Booleen
/* Objet : Verifie la signature d'un binaire en Rsa - EMSA-PKCS1-V1_5-VERIFY. */
/****************************************************************/
Variable
/******/


Debut
/* Signe le message. */
SignerRsaEmsaPkcs1V1_5(SousJacent,BufferEntree,BufferSignature.Longueur(),BufferSignature2);
/* Verifie que S(M)==S(M2). */
Retourner BufferSignature==BufferSignature2;
Fin Fonction

Signature RSASSA-PSS

Pour cette signature, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Procedure SignerRsaSsaPss(Cle : Nul Ou ClePki, SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSignature : Binaire Sortie)
/* Objet : Signe un binaire en Rsa - RSASSA-PSS-SIGN. */
/****************************************************************/
Variable
/******/


Debut
/* Calcul la taille du buffer intermediaire. */
Si (Cle.NbBits-1)%8!=0 Alors Sinon Fin Si
/* Appel de EMSA-PSS-ENCODE. */
SignerRsaEmsaPss(SousJacent,0,Cle.NbBits-1,BufferEntree,TailleBuffer,Buffer);
/* Appel de RSASP1. */
SignerRsaSp1(Cle,Buffer,BufferSignature);
Fin Procedure

Vérification de la signature RSASSA-PSS

Pour cette vérification de signature, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Fonction VerifierSignatureRsaSsaPss(Cle : Nul Ou ClePki, SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSignature : Binaire) Retourner Booleen
/* Objet : Verifie la signature d'un binaire en Rsa - RSASSA-PSS-VERIFY. */
/****************************************************************/
Variable
/******/


Debut
K=Cle.NbBits/8;
/* Calcul la taille du buffer intermediaire. */
Si (Cle.NbBits-1)%8!=0 Alors Sinon Fin Si
/* Appel de RSAVP1. */
Si Non VerifierSignatureRsaVp1(Session,Signature,Buffer) Alors Fin Si
/* Appel de EMSA-PSS-VERIFY. */
Si Buffer.Longueur!=TailleBuffer Alors Fin Si
Retourner VerifierSignatureRsaEmsaPss(SousJacent,0,Cle.NbBits-1,BufferEntree,Buffer);
Fin Fonction

Signature RSASSA-PKCS1-V1_5

Pour cette signature, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Procedure SignerRsaSsaPkcs11V1_5(Cle : Nul Ou ClePki, SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSignature : Binaire Sortie)
/* Objet : Signe un binaire en Rsa - RSASSA-PKCS1-V1_5-SIGN. */
/****************************************************************/
Variable
/******/


Debut
/* Calcul la taille du buffer intermediaire. */
TailleBuffer=Cle.NbBits/8;
/* Appel de EMSA-PKCS1-V1_5-ENCODE. */
SignerRsaEmsaPkcs1V15(SousJacent,BufferEntree,TailleBuffer,Buffer);
/* Appel de RSASP1. */
SignerRsaSp1(Cle,Buffer,BufferSignature);
Fin Procedure

Vérification de la signature RSASSA-PKCS1-V1_5

Pour cette vérification de signature, la taille du message est limitée à NbBits/8 octets.

/****************************************************************/
Fonction VerifierSignatureRsaSsaPkcs11V1_5(Cle : Nul Ou ClePki, SousJacent : ModeSignatureFlux, BufferEntree : Binaire, BufferSignature : Binaire) Retourner Booleen
/* Objet : Verifie la signature d'un binaire en Rsa - RSASSA-PKCS1-V1_5-VERIFY. */
/****************************************************************/
Variable
/******/


Debut
K=Cle.NbBits/8;
/* Calcul la taille du buffer intermediaire. */
TailleBuffer=Cle.NbBits/8;
/* Appel de RSAVP1. */
Si Non VerifierSignatureRsaVp1(Session,Signature,Buffer) Alors Fin Si
/* Appel de EMSA-PSS-VERIFY. */
Si Buffer.Longueur()!=TailleBuffer Alors Fin Si
Retourner VerifierSignatureRsaEmsaPkcs1V15(SousJacent,BufferEntree,Buffer);
Fin Fonction

Format utilisé par Up ! Security Manager

Le format Public-Key Cryptography Standards #1 (PKCS#1) du laboratoire Rsa spécifie le format de persistance des certificats décrivant les clés publiques ou privées.

Les certificats sont conservés dans des fichiers, dans une base de donnees ou dans un annuaire selon l'application.

La norme utilisée utilisée est Abstract Syntax Notation One (ASN.1) de l'International Telecommunication Union (ITU) compilée en Basic Encoding Rules (BER).

PKCS-1 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) modules(0) pkcs-1(1) }

-- $ Revision: 2.1r1 $

-- This module has been checked for conformance with the ASN.1
-- standard by the OSS ASN.1 Tools

DEFINITIONS EXPLICIT TAGS ::=
BEGIN

-- EXPORTS ALL
-- All types and values defined in this module are exported for use
-- in other ASN.1 modules.

IMPORTS


-- ============================
-- Basic object identifiers
-- ============================

-- The DER encoding of this in hexadecimal is:
-- (0x)06 08
-- 2A 86 48 86 F7 0D 01 01
--

pkcs-1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 }

--
-- When rsaEncryption is used in an AlgorithmIdentifier the
-- parameters MUST be present and MUST be NULL.
--
rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 }

--
-- When id-RSAES-OAEP is used in an AlgorithmIdentifier the
-- parameters MUST be present and MUST be RSAES-OAEP-params.
--
id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 }

--
-- When id-pSpecified is used in an AlgorithmIdentifier the
-- parameters MUST be an OCTET STRING.
--
id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 }

-- When id-RSASSA-PSS is used in an AlgorithmIdentifier the
-- parameters MUST be present and MUST be RSASSA-PSS-params.
--
id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 }

--
-- When the following OIDs are used in an AlgorithmIdentifier the
-- parameters MUST be present and MUST be NULL.
--
md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 }
md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 }
sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 }
sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 }
sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 }
sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 }

--
-- This OID really belongs in a module with the secsig OIDs.
--
id-sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 }

--
-- OIDs for MD2 and MD5, allowed only in EMSA-PKCS1-v1_5.
--

id-md2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 }

id-md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 }

--
-- When id-mgf1 is used in an AlgorithmIdentifier the parameters MUST
-- be present and MUST be a HashAlgorithm, for example sha1.
--
id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 }

-- ================
-- Useful types
-- ================

ALGORITHM-IDENTIFIER ::= CLASS WITH SYNTAX { OID &id [PARAMETERS &Type] }

--
-- Note: the parameter InfoObjectSet in the following definitions
-- allows a distinct information object set to be specified for sets
-- of algorithms such as:
-- DigestAlgorithms ALGORITHM-IDENTIFIER ::= {
-- { OID id-md2 PARAMETERS NULL }|
-- { OID id-md5 PARAMETERS NULL }|
-- { OID id-sha1 PARAMETERS NULL }
-- }
--

AlgorithmIdentifier { ALGORITHM-IDENTIFIER:InfoObjectSet } ::= SEQUENCE
-- ==============
-- Algorithms
-- ==============

--
-- Allowed EME-OAEP and EMSA-PSS digest algorithms.
--
OAEP-PSSDigestAlgorithms ALGORITHM-IDENTIFIER ::=
--
-- Allowed EMSA-PKCS1-v1_5 digest algorithms.
--
PKCS1-v1-5DigestAlgorithms ALGORITHM-IDENTIFIER ::=
-- When id-md2 and id-md5 are used in an AlgorithmIdentifier the
-- parameters MUST be present and MUST be NULL.

-- When id-sha1, id-sha256, id-sha384 and id-sha512 are used in an
-- AlgorithmIdentifier the parameters (which are optional) SHOULD
-- be omitted. However, an implementation MUST also accept
-- AlgorithmIdentifier values where the parameters are NULL.

sha1 HashAlgorithm ::=
HashAlgorithm ::= AlgorithmIdentifier { {OAEP-PSSDigestAlgorithms} }

SHA1Parameters ::= NULL
--
-- Allowed mask generation function algorithms.
-- If the identifier is id-mgf1, the parameters are a HashAlgorithm.
--
PKCS1MGFAlgorithms ALGORITHM-IDENTIFIER ::=
--
-- Default AlgorithmIdentifier for id-RSAES-OAEP.maskGenAlgorithm and
-- id-RSASSA-PSS.maskGenAlgorithm.
--
mgf1SHA1 MaskGenAlgorithm ::=
MaskGenAlgorithm ::= AlgorithmIdentifier { {PKCS1MGFAlgorithms} }

--
-- Allowed algorithms for pSourceAlgorithm.
--
PKCS1PSourceAlgorithms ALGORITHM-IDENTIFIER ::=
EncodingParameters ::= OCTET STRING(SIZE(0..MAX))

--
-- This identifier means that the label L is an empty string, so the
-- digest of the empty string appears in the RSA block before
-- masking.
--
pSpecifiedEmpty PSourceAlgorithm ::=
PSourceAlgorithm ::= AlgorithmIdentifier { {PKCS1PSourceAlgorithms} }

emptyString EncodingParameters ::= ''H

--
-- Type identifier definitions for the PKCS #1 OIDs.
--
PKCS1Algorithms ALGORITHM-IDENTIFIER ::=
-- ===================
-- Main structures
-- ===================

RSAPublicKey ::= SEQUENCE
--
-- Representation of RSA private key with information for the CRT
-- algorithm.
--
RSAPrivateKey ::= SEQUENCE
Version ::= INTEGER { two-prime(0), multi(1) }
OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo

OtherPrimeInfo ::= SEQUENCE
--
-- AlgorithmIdentifier.parameters for id-RSAES-OAEP.
-- Note that the tags in this Sequence are explicit.
--
RSAES-OAEP-params ::= SEQUENCE
--
-- Identifier for default RSAES-OAEP algorithm identifier.
-- The DER Encoding of this is in hexadecimal:
-- (0x)30 0D
-- 06 09
-- 2A 86 48 86 F7 0D 01 01 07
-- 30 00
-- Notice that the DER encoding of default values is "empty".
--

rSAES-OAEP-Default-Identifier RSAES-AlgorithmIdentifier ::=
RSAES-AlgorithmIdentifier ::= AlgorithmIdentifier { {PKCS1Algorithms} }

--
-- AlgorithmIdentifier.parameters for id-RSASSA-PSS.
-- Note that the tags in this Sequence are explicit.
--
RSASSA-PSS-params ::= SEQUENCE
TrailerField ::= INTEGER { trailerFieldBC(1) }

--
-- Identifier for default RSASSA-PSS algorithm identifier
-- The DER Encoding of this is in hexadecimal:
-- (0x)30 0D
-- 06 09
-- 2A 86 48 86 F7 0D 01 01 0A
-- 30 00
-- Notice that the DER encoding of default values is "empty".
--

rSASSA-PSS-Default-Identifier RSASSA-AlgorithmIdentifier ::=
RSASSA-AlgorithmIdentifier ::= AlgorithmIdentifier { {PKCS1Algorithms} }

--
-- Syntax for the EMSA-PKCS1-v1_5 hash identifier.
--
DigestInfo ::= SEQUENCE
DigestAlgorithm ::= AlgorithmIdentifier { {PKCS1-v1-5DigestAlgorithms} }

END -- PKCS1Definitions