@@ -921,11 +921,43 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
921
921
pgp_packet_body_t pktbody (PGP_PKT_SK_SESSION_KEY);
922
922
/* version and algorithm fields */
923
923
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
924
946
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
+ ) {
926
952
pktbody.add_byte (aalg);
927
953
}
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
929
961
pktbody.add_byte (s2k.specifier );
930
962
pktbody.add_byte (s2k.hash_alg );
931
963
@@ -944,7 +976,11 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
944
976
throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
945
977
}
946
978
/* 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
+ ) {
948
984
pktbody.add (iv, ivlen);
949
985
}
950
986
/* encrypted key and auth tag for v5 */
@@ -955,6 +991,82 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
955
991
pktbody.write (dst);
956
992
}
957
993
994
+ #if defined(ENABLE_CRYPTO_REFRESH)
995
+ rnp_result_t
996
+ pgp_sk_sesskey_t ::parse_v6(pgp_packet_body_t &pkt)
997
+ {
998
+ uint8_t bt;
999
+ uint8_t octet_count;
1000
+ uint8_t s2k_len;
1001
+
1002
+ /* A one-octet scalar octet count for the 5 fields following this octet. */
1003
+ /* TODO: do we need to check octet_count? */
1004
+ if (!pkt.get (octet_count)) {
1005
+ RNP_LOG (" failed to get octet count of next 5 fields" );
1006
+ return RNP_ERROR_BAD_FORMAT;
1007
+ }
1008
+
1009
+ /* symmetric algorithm */
1010
+ if (!pkt.get (bt)) {
1011
+ RNP_LOG (" failed to get symm alg" );
1012
+ return RNP_ERROR_BAD_FORMAT;
1013
+ }
1014
+ alg = (pgp_symm_alg_t ) bt;
1015
+
1016
+ /* aead algorithm */
1017
+ if (!pkt.get (bt)) {
1018
+ RNP_LOG (" failed to get aead alg" );
1019
+ return RNP_ERROR_BAD_FORMAT;
1020
+ }
1021
+ aalg = (pgp_aead_alg_t ) bt;
1022
+ if ((aalg != PGP_AEAD_EAX) && (aalg != PGP_AEAD_OCB)) {
1023
+ RNP_LOG (" unsupported AEAD algorithm : %d" , (int ) aalg);
1024
+ return RNP_ERROR_BAD_PARAMETERS;
1025
+ }
1026
+
1027
+ /* A one-octet scalar octet count of the following field. */
1028
+ /* TODO: do we need to check s2k_len? */
1029
+ if (!pkt.get (s2k_len)) {
1030
+ RNP_LOG (" failed to get octet count of next 5 fields" );
1031
+ return RNP_ERROR_BAD_FORMAT;
1032
+ }
1033
+
1034
+ /* s2k */
1035
+ if (!pkt.get (s2k)) {
1036
+ RNP_LOG (" failed to parse s2k" );
1037
+ return RNP_ERROR_BAD_FORMAT;
1038
+ }
1039
+
1040
+ size_t noncelen = pgp_cipher_aead_nonce_len (aalg);
1041
+ size_t taglen = pgp_cipher_aead_tag_len (aalg);
1042
+ size_t keylen = 0 ;
1043
+
1044
+ if (pkt.left () > noncelen + taglen + PGP_MAX_KEY_SIZE) {
1045
+ RNP_LOG (" too long esk" );
1046
+ return RNP_ERROR_BAD_FORMAT;
1047
+ }
1048
+ if (pkt.left () < noncelen + taglen + 8 ) {
1049
+ RNP_LOG (" too short esk" );
1050
+ return RNP_ERROR_BAD_FORMAT;
1051
+ }
1052
+ /* iv */
1053
+ if (!pkt.get (iv, noncelen)) {
1054
+ RNP_LOG (" failed to get iv" );
1055
+ return RNP_ERROR_BAD_FORMAT;
1056
+ }
1057
+ ivlen = noncelen;
1058
+
1059
+ /* key */
1060
+ keylen = pkt.left ();
1061
+ if (!pkt.get (enckey, keylen)) {
1062
+ RNP_LOG (" failed to get key" );
1063
+ return RNP_ERROR_BAD_FORMAT;
1064
+ }
1065
+ enckeylen = keylen;
1066
+ return RNP_SUCCESS;
1067
+ }
1068
+ #endif
1069
+
958
1070
rnp_result_t
959
1071
pgp_sk_sesskey_t ::parse(pgp_source_t &src)
960
1072
{
@@ -967,6 +1079,12 @@ pgp_sk_sesskey_t::parse(pgp_source_t &src)
967
1079
/* version */
968
1080
uint8_t bt;
969
1081
if (!pkt.get (bt) || ((bt != PGP_SKSK_V4) && (bt != PGP_SKSK_V5))) {
1082
+ #if defined(ENABLE_CRYPTO_REFRESH)
1083
+ if (bt == PGP_SKSK_V6) {
1084
+ version = bt;
1085
+ return parse_v6 (pkt);
1086
+ }
1087
+ #endif
970
1088
RNP_LOG (" wrong packet version" );
971
1089
return RNP_ERROR_BAD_FORMAT;
972
1090
}
@@ -1134,7 +1252,7 @@ pgp_pk_sesskey_t::parse(pgp_source_t &src)
1134
1252
return RNP_ERROR_BAD_FORMAT;
1135
1253
}
1136
1254
fp.length = fp_len;
1137
- if (fp.length && (fp.length != (unsigned )(fp_and_key_ver_len - 1 ))) {
1255
+ if (fp.length && (fp.length != (unsigned ) (fp_and_key_ver_len - 1 ))) {
1138
1256
RNP_LOG (" size mismatch (fingerprint size and fp+key version length field)" );
1139
1257
return RNP_ERROR_BAD_FORMAT;
1140
1258
}
0 commit comments