@@ -921,11 +921,43 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
921921 pgp_packet_body_t pktbody (PGP_PKT_SK_SESSION_KEY);
922922 /* version and algorithm fields */
923923 pktbody.add_byte (version);
924+ #if defined(ENABLE_CRYPTO_REFRESH)
925+ uint8_t s2k_len;
926+ /* A one-octet scalar octet count for the 5 fields following this octet. */
927+ /* TODO: unify with pgp_key_pkt_t::s2k_specifier_len() */
928+ if (version == PGP_SKSK_V6) {
929+ switch (s2k.specifier ) {
930+ case PGP_S2KS_SIMPLE:
931+ s2k_len = 2 ;
932+ break ;
933+ case PGP_S2KS_SALTED:
934+ s2k_len = 10 ;
935+ break ;
936+ case PGP_S2KS_ITERATED_AND_SALTED:
937+ s2k_len = 11 ;
938+ break ;
939+ default :
940+ RNP_LOG (" invalid specifier" );
941+ throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
942+ }
943+ pktbody.add_byte (3 + s2k_len + ivlen);
944+ }
945+ #endif
924946 pktbody.add_byte (alg);
925- if (version == PGP_SKSK_V5) {
947+ if (version == PGP_SKSK_V5
948+ #if defined(ENABLE_CRYPTO_REFRESH)
949+ || version == PGP_SKSK_V6
950+ #endif
951+ ) {
926952 pktbody.add_byte (aalg);
927953 }
928- /* S2K specifier */
954+ /* S2K specifier */
955+ #if defined(ENABLE_CRYPTO_REFRESH)
956+ /* A one-octet scalar octet count of the following field. */
957+ if (version == PGP_SKSK_V6) {
958+ pktbody.add_byte (s2k_len);
959+ }
960+ #endif
929961 pktbody.add_byte (s2k.specifier );
930962 pktbody.add_byte (s2k.hash_alg );
931963
@@ -944,7 +976,11 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
944976 throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
945977 }
946978 /* v5 : iv */
947- if (version == PGP_SKSK_V5) {
979+ if (version == PGP_SKSK_V5
980+ #if defined(ENABLE_CRYPTO_REFRESH)
981+ || version == PGP_SKSK_V6
982+ #endif
983+ ) {
948984 pktbody.add (iv, ivlen);
949985 }
950986 /* encrypted key and auth tag for v5 */
@@ -955,6 +991,81 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
955991 pktbody.write (dst);
956992}
957993
994+ #if defined(ENABLE_CRYPTO_REFRESH)
995+ rnp_result_t
996+ pgp_sk_sesskey_t ::parse_v6(pgp_packet_body_t &pkt) {
997+ uint8_t bt;
998+ uint8_t octet_count;
999+ uint8_t s2k_len;
1000+
1001+ /* A one-octet scalar octet count for the 5 fields following this octet. */
1002+ /* TODO: do we need to check octet_count? */
1003+ if (!pkt.get (octet_count)) {
1004+ RNP_LOG (" failed to get octet count of next 5 fields" );
1005+ return RNP_ERROR_BAD_FORMAT;
1006+ }
1007+
1008+ /* symmetric algorithm */
1009+ if (!pkt.get (bt)) {
1010+ RNP_LOG (" failed to get symm alg" );
1011+ return RNP_ERROR_BAD_FORMAT;
1012+ }
1013+ alg = (pgp_symm_alg_t ) bt;
1014+
1015+ /* aead algorithm */
1016+ if (!pkt.get (bt)) {
1017+ RNP_LOG (" failed to get aead alg" );
1018+ return RNP_ERROR_BAD_FORMAT;
1019+ }
1020+ aalg = (pgp_aead_alg_t ) bt;
1021+ if ((aalg != PGP_AEAD_EAX) && (aalg != PGP_AEAD_OCB)) {
1022+ RNP_LOG (" unsupported AEAD algorithm : %d" , (int ) aalg);
1023+ return RNP_ERROR_BAD_PARAMETERS;
1024+ }
1025+
1026+ /* A one-octet scalar octet count of the following field. */
1027+ /* TODO: do we need to check s2k_len? */
1028+ if (!pkt.get (s2k_len)) {
1029+ RNP_LOG (" failed to get octet count of next 5 fields" );
1030+ return RNP_ERROR_BAD_FORMAT;
1031+ }
1032+
1033+ /* s2k */
1034+ if (!pkt.get (s2k)) {
1035+ RNP_LOG (" failed to parse s2k" );
1036+ return RNP_ERROR_BAD_FORMAT;
1037+ }
1038+
1039+ size_t noncelen = pgp_cipher_aead_nonce_len (aalg);
1040+ size_t taglen = pgp_cipher_aead_tag_len (aalg);
1041+ size_t keylen = 0 ;
1042+
1043+ if (pkt.left () > noncelen + taglen + PGP_MAX_KEY_SIZE) {
1044+ RNP_LOG (" too long esk" );
1045+ return RNP_ERROR_BAD_FORMAT;
1046+ }
1047+ if (pkt.left () < noncelen + taglen + 8 ) {
1048+ RNP_LOG (" too short esk" );
1049+ return RNP_ERROR_BAD_FORMAT;
1050+ }
1051+ /* iv */
1052+ if (!pkt.get (iv, noncelen)) {
1053+ RNP_LOG (" failed to get iv" );
1054+ return RNP_ERROR_BAD_FORMAT;
1055+ }
1056+ ivlen = noncelen;
1057+
1058+ /* key */
1059+ keylen = pkt.left ();
1060+ if (!pkt.get (enckey, keylen)) {
1061+ RNP_LOG (" failed to get key" );
1062+ return RNP_ERROR_BAD_FORMAT;
1063+ }
1064+ enckeylen = keylen;
1065+ return RNP_SUCCESS;
1066+ }
1067+ #endif
1068+
9581069rnp_result_t
9591070pgp_sk_sesskey_t ::parse(pgp_source_t &src)
9601071{
@@ -967,6 +1078,12 @@ pgp_sk_sesskey_t::parse(pgp_source_t &src)
9671078 /* version */
9681079 uint8_t bt;
9691080 if (!pkt.get (bt) || ((bt != PGP_SKSK_V4) && (bt != PGP_SKSK_V5))) {
1081+ #if defined(ENABLE_CRYPTO_REFRESH)
1082+ if (bt == PGP_SKSK_V6) {
1083+ version = bt;
1084+ return parse_v6 (pkt);
1085+ }
1086+ #endif
9701087 RNP_LOG (" wrong packet version" );
9711088 return RNP_ERROR_BAD_FORMAT;
9721089 }
0 commit comments